首页 > 解决方案 > 使用 sbt 构建凿子时,如何关闭进度条等以使输出干净?

问题描述

使用 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

如何关闭所有这些并获得具有干净错误消息的正常输出?

标签: scalasbtchisel

解决方案


简短的回答

根据sbt FAQ传递-no-colorssbt命令行 :

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

尽管名称为“无颜色”,但它会抑制所有终端转义内容,包括进度条。

其他选择

该选项也可以拼写--no-colors(两个连字符),这就是它在sbt --help(and sbt -help) 的输出中的显示方式。

可以通过传递-Dsbt.log.noformat=truesbt(或者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-launch.jar,那么您必须使用-D开关,因为-no-colors在该上下文中无法识别(sbtshell脚本是识别的-no-colors):

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

最后,当sbt检测到它的 stdout 不是 TTY 时,它会抑制颜色输出:

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

不过,这在 Makefile 中不是一个好的选择,因为您失去了sbt(没有进一步的恶作剧)的退出状态。

可惜sbt不尊重。_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输出。

设置的效果

在您的示例 Makefile 中,您sbt通过setsid. 据我所知,我所说的一切都同样适用于这种情况。但是,您可能想要传递--wait给它,setsid所以它会在退出之前等待sbt完成。在我的测试中,setsid仅当 stdout 不是 TTY 时才会隐式等待,但我怀疑您是否真的想要隐藏的可变性。


推荐阅读