如何解决在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必须以某种方式扩展此功能以生成包中包含的文件的实际路径,然后再将其传递给编译器驱动程序。
但是如何确定它需要扩展并且它不是常规字符串呢?那么,Bazel如何预处理BUILD文件?是因为% ... %
模式吗?这在哪里记录?
"%package(@external_package//target)%"
是可以在其他地方使用的模式吗?在任何BUILD文件中?在哪里可以找到Bazel文档,说明其工作原理?
解决方法
这些指令在cc_toolchain_config
规则实现中由cc_common.create_cc_toolchain_config_info
扩展,而不是对BUILD
文件进行任何形式的预处理(即"%package(@host_gcc8_glibc//include)%"
实际上是传递到{{ 1}}规则。)除the source以外,我不知道这些特殊扩展是否已完全记录。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。