在Bazel工具链配置文件中获取包的运行时路径



在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定义了一个字符串列表,用作传递给GCC的--sysroot选项,如中所述https://docs.bazel.build/versions/0.23.0/skylark/lib/cc_common.html这些字符串的格式为%sysroot%

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

但是,它如何确定这需要扩展,并且它不是一个常规字符串?那么巴泽尔是如何预处理BUILD文件的呢?是因为% ... %模式吗?这些记录在哪里?

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

这些指令由cc_common.create_cc_toolchain_config_infocc_toolchain_config规则实现中展开,而不是对BUILD文件进行任何预处理(即,"%package(@host_gcc8_glibc//include)%"实际上被传递到cc_toolchain_config规则中。

最新更新