1

在 Bazel 处理的任意文件中引用外部包路径的最佳方法是什么?

我试图了解 Bazel 如何预处理 BUILD 和 .bzl 文件。我看到字符串包含对 package() 的调用的实例,我想知道它是如何工作的(并且找不到任何相关文档)。这是一个例子:

我有一个工具链,其中 BUILD 文件包含以下表达式:

cc_toolchain_config(
    name = "cc-toolchain-config",
    abi_libc_version = "glibc_" + host_gcc8_bundle()["pkg_version"]["glibc"],
    abi_version = "gcc-" + host_gcc8_bundle()["version"],
    compiler = "gcc-" + host_gcc8_bundle()["version"],
    cpu = "x86_64",
    cxx_builtin_include_directories = [
        "%package(@host_gcc8_toolchain//include/c++/8)%",
        "%package(@host_gcc8_toolchain//lib64/gcc/x86_64-unknown-linux-gnu/8/include-fixed)%",
        "%package(@host_gcc8_kernel_headers//include)%",
        "%package(@host_gcc8_glibc//include)%",
    ],
    host_system_name = "x86_64-unknown-linux-gnu",
    target_libc = "glibc_" + host_gcc8_bundle()["pkg_version"]["glibc"],
    target_system_name = "x86_64-unknown-linux-gnu",
    toolchain_identifier = "host_linux_gcc8",
)

据我了解,cxx_builtin_include_directories定义了一个字符串列表作为--sysroot传递给 GCC 的选项,详见https://docs.bazel.build/versions/0.23.0/skylark/lib/cc_common.html这些字符串的格式为%sysroot%.

例如,由于package(@host_gcc8_toolchain//include/c++/8)对 GCC 没有任何意义,因此 bazel 必须以某种方式扩展此函数以生成包中包含的文件的实际路径,然后再将它们传递给编译器驱动程序。

但是它如何确定这需要扩展并且它不是常规字符串?那么 Bazel 是如何预处理 BUILD 文件的呢?是因为% ... %图案吗?这是在哪里记录的?

"%package(@external_package//target)%"一种可以在其他地方使用的模式吗?在任何 BUILD 文件中?我在哪里可以找到显示其工作原理的 Bazel 文档?

4

1 回答 1

2

这些指令是cc_common.create_cc_toolchain_config_infocc_toolchain_config规则实现中扩展的,而不是对文件进行任何类型的预处理BUILD(即,"%package(@host_gcc8_glibc//include)%"实际上是传递到cc_toolchain_config规则中。)我不知道这些特殊扩展在除 source 之外的任何地方都被完整记录。

于 2020-09-18T17:45:05.967 回答