Bazel 默认添加 -MD -MF -frandom-seed 标志 - 为什么?

问题描述

我有一个专有 c 编译器的 cc_toolchain 配置,并且我使用“-s”标志确保了来自 bazel 输出的编译命令是正确的。

但是,除了我指定的之外,bazel 添加了三个编译标志“-MD -MF 和 -frandom-seed”。

我的编译器无法识别 -MD 和 -MF 标志。 -frandom-seed 没有问题。

如何指定 bazel 不添加这些标志?

解决方法

要不添加随机种子,禁用相应功能,添加:

random_seed_feature = feature(
    name = "random_seed",enabled = False,)

并将 random_seed_feature 添加到您传递给 featurescc_common.create_cc_toolchain_config_info() 列表中。

对于 -MD -MF,它变得更加复杂。您可以以类似的方式禁用 dependency_file 功能,但是 hdrs_check 将无法期望找到依赖项转储,我不相信您实际上可以根据当前实现(或想不到现成的方法)。

问题是,您的编译器是否仍然支持转储依赖项,只是使用不同的标志?然后您可以(甚至应该)重新定义该功能,以供参考 https://github.com/bazelbuild/rules_cc 中的 U*X 类系统目前看起来像这样:

dependency_file_feature = feature(
    name = "dependency_file",enabled = True,flag_sets = [
        flag_set(
            actions = [
                ACTION_NAMES.assemble,ACTION_NAMES.preprocess_assemble,ACTION_NAMES.c_compile,ACTION_NAMES.cpp_compile,ACTION_NAMES.cpp_module_compile,ACTION_NAMES.objc_compile,ACTION_NAMES.objcpp_compile,ACTION_NAMES.cpp_header_parsing,ACTION_NAMES.clif_match,],flag_groups = [
                flag_group(
                    flags = ["-MD","-MF","%{dependency_file}"],expand_if_available = "dependency_file",),)

如果您的编译器根本不生成此文件,恐怕除了禁用该功能外,您还需要包装其调用并将空文件转储到预期 dependency_file 的位置(基本上使用标志包装器理解,获取文件名并从编译器调用中删除两者,为检查编写一个空文件)。您会丢失检查通过绕过它正确声明的依赖项的标头,但它会允许构建继续进行。

或者,从头开始新的 cc_toolchain 具有自己的不包含标头检查的操作可能是一种选择。