[使用sbt构建凿子时,作为批处理运行时,如何关闭进度条等,以使输出像大多数编译器一样干净?
也就是说,我喜欢在makefile中使用sbt构建凿子,如下所示:
${VLOG_DIR}/${NAME}.v: ${NAME}.scala
setsid sbt \
'runMain ${NAME}.${NAME} --top-name ${NAME} --target-dir ${VLOG_DIR}'
但是sbt / scala / chisel喜欢在构建时尝试生成某种进度条,该进度条发出终端转义码以尝试在适当位置更新输出。当在我的shell中运行时,效果不佳,但是在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
如何关闭所有功能,并获得正常的输出以及干净的错误消息?
sbt
sbt FAQ:$ sbt -no-colors 'test:runMain gcd.GCDMain'
尽管名称为“ no colors”,但它会禁止所有终端转义内容,包括进度条。其他替代方法
该选项也可以拼写为
--no-colors
(两个连字符),这是它在sbt --help
(和sbt -help
)的输出中的显示方式。如
-Dsbt.log.noformat=true
中所示,通过将sbt
传递到java
(或直接调用this answer,则传递到$ 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
最后,当$ sbt 'test:runMain gcd.GCDMain' | cat
检测到其标准输出不是TTY时,它将抑制颜色输出:
sbt
尽管在Makefile中,这不是一个好选择,因为您丢失了shenanigans的退出状态(不再有sbt
)。不幸的是,
NO_COLOR
确实不是尊重
凿子输出仍然有一些颜色NO_COLOR
。[使用Chisel,例如chisel template时,即使使用
-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无条件地打印了颜色转义序列(请参阅tag
函数),这在Chisel中可以说是一个错误,因为它的输出显然看起来类似于sbt
输出。setid的作用
在您的示例Makefile中,您正在通过
sbt
调用setsid
。据我所知,我所说的一切都同样适用于这种情况。但是,您可能希望将setsid
传递给--wait
,因此它将在退出之前等待setsid
完成。在我的测试中,sbt
仅在stdout不是TTY时才隐式等待,但我怀疑您实际上是否想要该隐藏的可变性。