Bazel 默认添加 -MD -MF -frandom-seed 标志 - 为什么?
Bazel adds -MD -MF -frandom-seed flags by default - Why?
我有一个专有 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
添加到您传递给 cc_common.create_cc_toolchain_config_info()
的 features
列表中。
对于-MD -MF
,它变得更加复杂。您可以以类似的方式禁用 dependency_file
功能,但是 hdrs_check
无法期望找到依赖项转储,我不相信您实际上可以禁用 cc_toolchain 的 C++ 操作基于当前实施(或没有现成的方法想到)。
问题是,您的编译器是否仍然支持转储依赖项,只是使用不同的标志?然后您可以(甚至应该)重新定义该功能,以供参考 https://github.com/bazelbuild/rules_cc 它目前对于 U*X-like 系统看起来像这样:
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
的位置(基本上使用包装器理解的标志,获取文件名并从编译器调用中剥离,为检查写入一个空文件)。您将失去 header 对 by-passing 正确声明的依赖项的检查,但它会允许构建继续进行。
或者,从头开始新 cc_toolchain 自己的操作不包含 header 检查可能是一个选项。
我有一个专有 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
添加到您传递给 cc_common.create_cc_toolchain_config_info()
的 features
列表中。
对于-MD -MF
,它变得更加复杂。您可以以类似的方式禁用 dependency_file
功能,但是 hdrs_check
无法期望找到依赖项转储,我不相信您实际上可以禁用 cc_toolchain 的 C++ 操作基于当前实施(或没有现成的方法想到)。
问题是,您的编译器是否仍然支持转储依赖项,只是使用不同的标志?然后您可以(甚至应该)重新定义该功能,以供参考 https://github.com/bazelbuild/rules_cc 它目前对于 U*X-like 系统看起来像这样:
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
的位置(基本上使用包装器理解的标志,获取文件名并从编译器调用中剥离,为检查写入一个空文件)。您将失去 header 对 by-passing 正确声明的依赖项的检查,但它会允许构建继续进行。
或者,从头开始新 cc_toolchain 自己的操作不包含 header 检查可能是一个选项。