b2 release link=static toolset=clang
有效,但它没有显示我发现在 clang 的输出中有用的漂亮颜色。
2 回答
免责声明:这不是解决您问题的答案,但将其放在评论中需要太多空间。
这是一个简短的 Holmesian 消除过程。首先,根据Clang 文档,仅当检测到具有颜色功能的终端时才启用颜色。其次,根据Boost.Jam 文档,所有环境变量都会自动导入到其内置.ENVIRON
模块中。最后,您确实有一个支持颜色的终端。然而它不起作用。甚至使用显式的 Clang 命令行参数来强制解决问题
./b2 install --toolset=clang --cxxflag=-fcolor-diagnostics
无法显示彩色诊断。我唯一的结论是,b2
它不会以某种方式在颜色编码的终端内启动它的构建。根据您的评论进一步挖掘后,我在另一个构建系统上发现了一个相关问题:
原因是 ninja 将子进程 stdout/stderr 设置为管道(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”发出颜色转义代码,但这很棘手。据我所知,make似乎没有覆盖unix上的stderr,child_execute_job()在工作中。 C)
结论:您可能需要深入了解b2
内部结构,看看是否发生了一些输出重定向,从而阻止了颜色编码。或者,您可以在Boost.Build 邮件列表中询问。希望这可以进一步帮助您。
更新:Boost SVN 网站上有一张长期存在的票可以处理这个问题。
似乎核心问题以某种方式解决了,但还有一点需要解释。
如果你想要颜色,你可以使用它user-config.jam
:
using clang : : : <compileflags>-fcolor-diagnostics ;
但是,我个人的偏好是通过使用项目要求在我的 Jamroot 中处理这个问题,这样其他人就不需要处理它:
project my_project : requirements
<toolset>clang:<cflags>-fcolor-diagnostics
<toolset>clang:<cxxflags>-fcolor-diagnostics
;