如何查看 Bazel 中使用的所有 copts(C/C++ 构建选项)?

How can I see all copts (C/C++ build options) used in Bazel?

我想查看我的 bazel build //my/target/... 构建命令使用的所有 copts。我该怎么做?我尝试添加 -s --verbose_explanations --explain=out.txt:

bazel build -s --verbose_explanations --explain=out.txt //my/target/...

...但它只是将所有 bazel 构建选项输出到“out.txt”,而不是传递给编译器的 C 选项。

参考文献:

  1. 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 已经构建了所有这些东西并缓存了它的输出! Once Bazel构建一些东西,如果它被缓存并且没有改变,它不会再次构建它,所以 运行 bazel build //my/target/... 后跟 bazel build -s //my/target/... 将显示没有新内容!

我所知道的强制 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/...

构建将再次re-done,因为刚刚更改了构建文件,这次将通过,您将看到每个 bazel 构建命令的详细子命令,每个子命令都显示了 copts (C 或 C++ 构建选项)正在用于该构建命令。

查看您的 Bazel 命令日志(command.log 文件),发现 some place like here:

home/username/.cache/bazel/_bazel_username/3e8af127f8b488324cdf41111355ff4c/command.log

或者在这里,相对于你的 git 回购根目录:

build/bin/../../../../../command.log

根据需要调整上面的路径。请注意,build/bin~/.cache/bazel 目录中较长路径的符号 link。

无论如何,所有输出都将在这个 command.log 文件中找到。在关闭换行的编辑器中查看此文件以使其更易于查看,并找到您感兴趣的 *.cpp 源文件的编译命令。找到该编译命令后,将该行复制到一个新文件中,重新打开换行,并在文件中执行正则表达式搜索模式 -W[^ ]* (source).

这一行可能包含数百行带有换行的命令和选项,并且此正则表达式搜索模式将查找所有编译器警告,例如,匹配 space 后跟 -W 后跟任意数量的字符,除了 space。换句话说,它将找到所有编译器警告选项,如 -Werror=switch-Wno-error=switch-Wall-Weverything-Werror

总结:

无论如何,在启用 -s--subcommands bazel 构建选项的情况下,在您刚刚更改了感兴趣的源文件的全新构建中,您的 Bazel command.log 上面的文件包含 Bazel 使用的所有最终编译命令,显示传递给 gccclang 或您正在使用的任何编译器的所有最终选项,您可以查看此文件以查看编译期间您刚刚更改并正在通过此构建命令构建的任何给定感兴趣文件的所有设置:

bazel build --subcommands --color=no //my/target/...