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

获取Bazel工具链配置文件中包的运行时路径,bazel,starlark,Bazel,Starlark,在Bazel处理的任意文件中引用外部包路径的最佳方法是什么 我试图了解Bazel如何预处理BUILD和.bzl文件。我看到字符串包含对package()的调用,我想知道它是如何工作的(并且找不到任何相关文档)。以下是一个例子: 我有一个工具链,其中构建文件包含以下表达式: cc\u工具链\u配置( name=“cc toolchain config”, abi_libc_version=“glibc_”+主机gcc8_bundle()[“pkg_version”][“glibc”], abi_v

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

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

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

cc\u工具链\u配置(
name=“cc toolchain config”,
abi_libc_version=“glibc_”+主机gcc8_bundle()[“pkg_version”][“glibc”],
abi_version=“gcc-”+host_gcc8_bundle()[“version”],
compiler=“gcc-”+host\u gcc8\u bundle()[“version”],
cpu=“x86_64”,
cxx\u内置\u包含\u目录=[
“%package(@host\u gcc8\u toolchain//include/c++/8)%”,
“%package(@host_gcc8_toolchain//lib64/gcc/x86_64-unknown-linux-gnu/8/include fixed)%”,
“%package(@host\u gcc8\u kernel\u headers//include)%”,
“%package(@host\u gcc8\u 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”,
工具链\u identifier=“主机\u linux\u gcc8”,
)
据我所知,
cxx\u builtin\u include\u目录
定义了一个字符串列表,用作传递给GCC的
--sysroot
选项,这些字符串的详细格式为
%sysroot%

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

但它如何确定这需要扩展,并且它不是一个常规字符串呢?那么Bazel如何预处理构建文件呢?是因为
%…%模式?这在哪里有记录


“%package(@external\u package//target)%”
是一种可以在其他地方使用的模式吗?在任何构建文件中?我在哪里可以找到Bazel文档来说明它是如何工作的?

这些指令是通过
cc\u toolchain\u config
规则实现来扩展的,而不是对
构建
文件(即,
%包(@host\u gcc8\u glibc//include)%进行任何类型的预处理。”
被逐字地传递到
cc\u toolchain\u config
规则中。)我不知道这些特殊的扩展在任何地方都有完整的文档记录,除了