При построении долота с использованием sbt как отключить индикаторы выполнения и т. Д. c. так что вывод чистый? - PullRequest
3 голосов
/ 15 февраля 2020

При создании долота с использованием sbt, при запуске в виде пакетного процесса, как отключить индикаторы выполнения и т. Д. c. так, чтобы вывод был чистым, как я получаю с большинством компиляторов?

То есть мне нравится собирать долото с использованием sbt из make-файла, например:

${VLOG_DIR}/${NAME}.v: ${NAME}.scala
        setsid sbt \
          'runMain ${NAME}.${NAME} --top-name ${NAME} --target-dir ${VLOG_DIR}'

Однако sbt / scala / chisel нравится пытаться генерировать какие-то индикаторы выполнения при создании, которые генерируют управляющие коды терминала, чтобы попытаться обновить вывод на месте. При запуске внутри моей оболочки это работает не очень хорошо, но при запуске внутри emacs возникает огромный беспорядок:

make
setsid sbt \
  'runMain HelloWorld.HelloWorld --top-name HelloWorld --target-dir Gen_HelloWor\
ld.verilog_dir'
^[[0m[^[[0m^[[0minfo^[[0m] ^[[0m^[[0mLoading project definition from /home/user/h\
ello-chisel/project^[[0m
^[[2K
^[[2K
^[[2K
^[[2K
^[[2K
^[[5A^[[2K
^[[2K
^[[2K
^[[2K
^[[2K
^[[2K  | => hello-chisel-build / update 0s
^[[6A^[[2K
^[[2K

Особенно, когда появляется сообщение об ошибке:

^[[2K
^[[2K
^[[2K  | => hello-chisel / Compile / compileIncremental 1s
^[[6A^[[2K^[[0m[^[[0m^[[31merror^[[0m] ^[[0m^[[0m/home/user/hello-chisel/HelloWor\
ld.scala:46:17: overloaded method value apply with alternatives:^[[0m
^[[2K

Как отключить все это и получить нормально выглядящий вывод с чистыми сообщениями об ошибках?

1 Ответ

3 голосов
/ 15 февраля 2020

Краткий ответ

Передача -no-colors в sbt в командной строке, в соответствии с sbt FAQ :

$ sbt -no-colors 'test:runMain gcd.GCDMain'

Несмотря на название «нет цветов» ", он подавляет все экранирующие элементы терминала, включая индикаторы выполнения.

Другие альтернативы

Параметр также может быть записан --no-colors (два дефиса), как это выглядит в выходных данных. sbt --helpsbt -help).

Тот же эффект может быть достигнут путем передачи -Dsbt.log.noformat=true в sbt (или в java, если он вызывается напрямую), как указано в this ответ :

$ sbt -Dsbt.log.noformat=true 'test:runMain gcd.GCDMain'

Этого также можно добиться, установив для переменной среды JAVA_OPTS значение -Dsbt.log.noformat=true:

$ JAVA_OPTS=-Dsbt.log.noformat=true sbt 'test:runMain gcd.GCDMain'

Если вы используете sbt-launch.jar, тогда вы должны использовать переключатель -D, потому что -no-colors не распознается в этом контексте (сценарий оболочки sbt - это то, что распознает -no-colors):

$ java -jar ~/opt/sbt-1.3.4/bin/sbt-launch.jar -Dsbt.log.noformat=true 'test:runMain gcd.GCDMain'

Наконец когда sbt обнаруживает, что его стандартный вывод не является TTY, он подавляет вывод цвета:

$ sbt 'test:runMain gcd.GCDMain' | cat

Это не очень хороший вариант в файле Makefile. h, потому что вы теряете статус выхода sbt (без дальнейших махинаций ).

К сожалению, sbt не не уважают NO_COLOR.

Выход стамески в любом случае имеет несколько цветов

При использовании Стамеска , например, шаблон Стамеска , даже с -no-colors, некоторые Коды выхода терминала все равно появляются на выходе:

$ sbt -no-colors 'test:runMain gcd.GCDMain' | cat -tev
[info] Loading settings for project chisel-template-build from plugins.sbt ...$
[info] Loading project definition from /home/scott/wrk/learn/chisel/chisel-template/project$
[info] Loading settings for project chisel-template from build.sbt ...$
[info] Set current project to chisel-module-template (in build file:/home/scott/wrk/learn/chisel/chisel-template/)$
[warn] Multiple main classes detected.  Run 'show discoveredMainClasses' to see the list$
[info] running gcd.GCDMain $
[^[[35minfo^[[0m] [0.001] Elaborating design...$
[^[[35minfo^[[0m] [1.064] Done elaborating.$
Total FIRRTL Compile Time: 512.0 ms$
file loaded in 0.114380184 seconds, 22 symbols, 17 statements$
[^[[35minfo^[[0m] [0.001] SEED 1581769687441$
test GCD Success: 168 tests passed in 1107 cycles in 0.047873 seconds 23123.91 Hz$
[^[[35minfo^[[0m] [0.037] RAN 1102 CYCLES PASSED$
[success] Total time: 3 s, completed Feb 15, 2020 4:28:09 AM$

Обратите внимание на вывод [^[[35minfo^[[0m] ближе к концу. Это происходит потому, что chiselFrontend / src / main / scala / chisel3 / internal / Error. scala безоговорочно печатает escape-последовательности цветов (см. Функцию tag), что, возможно, является ошибкой в ​​Chisel с момента ее вывода явно выглядит как sbt output.

Эффект setsid

В вашем примере Makefile вы вызываете sbt через setsid. Насколько я могу судить, все, что я сказал, в равной степени относится к этому обстоятельству. Однако вы, вероятно, захотите передать --wait в setsid, поэтому он будет ждать завершения sbt перед выходом. В моем тестировании setsid будет неявно ждать только тогда, когда stdout не является TTY, но я сомневаюсь, что вы действительно хотите эту скрытую изменчивость.

...