Bazel cc_library 依赖于其他 cc_library 当每次使用不同的 crosstool 编译时

Bazel cc_library dependency on other cc_library when each compile with a different crosstool

我有一个代码生成器工具可以生成 C/C++ 代码。此代码生成器工具是使用 crosstool1 编译的。生成的C/C++代码需要用crosstool2编译。

所以操作是:

  • Using Crosstool1 compile 'code_generator'.
  • Execute 'code_generator' and generate 'generated_code.cpp'
  • Using Crosstool2 compile 'generated_code.cpp'

是否可以让 cc_library() 确定要使用的交叉工具?我看到 Skylark 规则现在允许一个 'toolchains' 参数,我不确定它是如何使用的,而且我不想做 C/C++ 的繁重工作,用 Skylark 编译裸机。

除了 Tenserflow 示例之外,是否有使用适当的 Host Crosstool 和 Target Crosstool 的示例?每次看都头疼:D

假设 //crosstool1:toolchain 是描述第一个交叉工具的 cc_toolchain_suite 规则的标签,//crosstool2:toolchain 是第二个交叉工具的 cc_toolchain_suite 的标签,以及项目的构建文件是:

cc_binary(
    name = "generator",
    srcs = [ "main.cc" ],
)

genrule(
    name = "generate",
    outs = ["generated.cc"],
    cmd = "$(location :generator) > $@",
    tools = [":generator"],
)

cc_binary(
    name = "generated",
    srcs = [ "generated.cc" ],
)

然后运行:

bazel build --host_crosstool_top=//crosstool1:toolchain --crosstool_top=//crosstool2:toolchain :generated

将完全按照您的描述进行操作,它将使用 crosstool1 构建 :generator,并使用 crosstool2 构建 generated。 Genrules 默认使用主机配置,所以一切都应该正常工作。