在 Bazel 工具链配置文件中获取包的运行时路径
Getting runtime path to a package in Bazel toolchain configuration files
在 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 必须以某种方式扩展此函数以生成包中包含的文件的实际路径,然后再将它们传递给编译器驱动程序。
但是怎么判断这个需要展开,不是普通字符串呢?那么 Bazel 如何预处理 BUILD 文件呢?是因为 % ... %
模式吗?这记录在哪里?
是"%package(@external_package//target)%"
一种可以在别处使用的模式吗?在任何 BUILD 文件中?我在哪里可以找到说明其工作原理的 Bazel 文档?
这些指令由 cc_common.create_cc_toolchain_config_info
within the cc_toolchain_config
rule implementation not any sort of preprocessing on the BUILD
file (I.e., "%package(@host_gcc8_glibc//include)%"
is literally passed into the cc_toolchain_config
rule.) I'm not aware that these special expansions are completely documented anywhere but the source 扩展。
在 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 必须以某种方式扩展此函数以生成包中包含的文件的实际路径,然后再将它们传递给编译器驱动程序。
但是怎么判断这个需要展开,不是普通字符串呢?那么 Bazel 如何预处理 BUILD 文件呢?是因为 % ... %
模式吗?这记录在哪里?
是"%package(@external_package//target)%"
一种可以在别处使用的模式吗?在任何 BUILD 文件中?我在哪里可以找到说明其工作原理的 Bazel 文档?
这些指令由 cc_common.create_cc_toolchain_config_info
within the cc_toolchain_config
rule implementation not any sort of preprocessing on the BUILD
file (I.e., "%package(@host_gcc8_glibc//include)%"
is literally passed into the cc_toolchain_config
rule.) I'm not aware that these special expansions are completely documented anywhere but the source 扩展。