如何让Clang颜色在boost-bjam中工作?

时间:2013-04-30 15:24:31

标签: c++ boost clang boost-bjam

b2 release link=static toolset=clang有效,但它没有显示我在clang的输出中有用的漂亮颜色。

2 个答案:

答案 0 :(得分:2)

免责声明:这不是解决问题的答案,但要将其置于评论中需要太多空间。

这是一个简短的Holmesian淘汰过程。首先,根据Clang documentation,仅当检测到具有颜色功能的终端时才启用颜色。其次,根据Boost.Jam documentation,所有环境变量都会自动导入其内置的.ENVIRON模块。最后,你确实有一个支持颜色的终端。但它不起作用。甚至用明确的Clang命令行参数强制解决问题

./b2 install --toolset=clang --cxxflag=-fcolor-diagnostics

无法显示彩色诊断。我唯一的结论是,不知怎的b2没有在彩色编码终端内启动它的构建。根据您的评论进一步挖掘后,我找到了related problem on another build system

  

原因是ninja将subprocess stdout / stderr设置为a   pipe(Subprocess :: Start(),subprocess.cc)和clang检查是否   StandardErrHasColors()(tools / clang / lib / Driver / Tools.cpp),即   假如果!isatty(2)(lib / Support / Unix / Process.inc)。

     

我环顾四周,这样做的方式似乎是打电话   fork_pty()在伪终端中运行子进程。我不知道是不是这个   会影响子进程创建时间,如果打开~4000伪   ttys(-j10000处的chrome版本)被认为是好的形式。

     

(可以强制clang始终使用发送颜色转义代码   “-Xclang -fcolor-diagnostics”,但这很糟糕。制造没有   据我所知,似乎在unix上覆盖了stderr,   job.c中的child_execute_job())

结论:您可能需要深入了解b2内部,看看是否有一些阻止颜色编码的输出重定向。或者,您可以在Boost.Build mailinglist上询问。希望这会对你有所帮助。

更新:Boost SVN网站上有long standing ticket处理此问题。

答案 1 :(得分:1)

似乎核心问题已经以某种方式解决了,但还有一些解释要做。

如果您想要颜色,可以在user-config.jam

中使用它
using clang : : : <compileflags>-fcolor-diagnostics ;

但是,我个人的偏好是通过使用项目要求在我的Jamroot中处理这个问题,以便其他人不需要处理它:

project my_project : requirements
  <toolset>clang:<cflags>-fcolor-diagnostics
  <toolset>clang:<cxxflags>-fcolor-diagnostics
;