问题描述
我想查看bazel build //my/target/...
构建命令使用的所有副本。我该怎么办?我尝试添加-s --verbose_explanations --explain=out.txt
:
bazel build -s --verbose_explanations --explain=out.txt //my/target/...
...但是它只是将所有bazel构建选项输出到“ out.txt”中,而不是传递给编译器的C选项。
参考文献:
- Bazel build verbose compiler commands logging
- Bazel用户手册:https://docs.bazel.build/versions/master/user-manual.html
解决方法
原来的答案是使用-s
选项:
bazel build -s //my/target/...
您可能还想使用--color=no
禁用向bazel命令日志文件输出颜色,因此其中没有特殊的颜色转义字符。
bazel build -s --color=no //my/target/...
但是,我没有看到任何有用的输出的原因仅是因为 bazel已经构建了所有这些东西并缓存了其输出! 一旦Bazel构建了一些东西(如果已缓存)并保持不变,因此不会再次构建,因此在运行bazel build //my/target/...
后再运行bazel build -s //my/target/...
将会显示NOTHING NEW!
我知道(不删除整个构建缓存)强制Bazel重建的唯一解决方法是对要构建的文件进行真正的代码更改,然后再次进行构建。最简单的方法是在目标文件中更改单个字符,以使构建被破坏,例如:
// In a file of interest,change this:
int i;
// to this:
intt i;
// really,ANY change which breaks the build will do
然后构建:
bazel build -s --color=no //my/target/...
文件已更改,因此缓存无效,因此将重建bazel,现在-s
将生效,您将看到所有其他详细的bazel构建输出。请注意,-s
的意思是--subcommands
。参见此处:https://docs.bazel.build/versions/master/user-manual.html#flag--subcommands。
现在,修复上面的文件,然后重新构建:
bazel build -s --color=no //my/target/...
由于刚刚更改了构建文件,因此将再次重新执行构建,这次将通过,您将看到每个bazel构建命令的详细子命令,每个子命令都显示了副本(C或C ++)构建选项)。
查看您的Bazel命令日志( command.log 文件),找到some place like here:
home/username/.cache/bazel/_bazel_username/3e8af127f8b488324cdf41111355ff4c/command.log
或者相对于您的git repo根目录:
build/bin/../../../../../command.log
根据需要在上方调整此路径。请注意,build/bin
是指向~/.cache/bazel
目录中上方较长路径的符号链接。
无论如何,所有输出都将在此 command.log 文件中找到。在关闭了换行符的编辑器中查看此文件,以使其更易于查看,并找到您感兴趣的* .cpp源文件的编译命令。找到该编译命令后,请将该行复制到一个新文件中,重新打开换行,然后在文件中进行正则表达式搜索,以查找模式 -W[^ ]*
(source)。
这一行可能是几百行命令和选项,其中包含换行符,并且此正则表达式搜索模式将找到所有编译器警告,例如,它们匹配一个空格,后跟-W
,后跟任意数量的字符,除了空格。换句话说,它将找到所有编译器警告选项,例如-Werror=switch
,-Wno-error=switch
,-Wall
,-Weverything
,-Werror
等。
摘要:
无论如何,在-s
或--subcommands
bazel构建选项为ON的情况下,在新的构建中,您只是更改了Bazel command.log 文件的兴趣源文件上面包含了Bazel使用的所有最终编译命令,显示了传递给gcc
或clang
或您正在使用的任何编译器的所有最终选项,您可以浏览此文件以查看究竟是什么设置在编译过程中针对您刚刚更改的任何给定感兴趣的文件,现在通过此构建命令进行构建:
bazel build --subcommands --color=no //my/target/...