#bazel #starlark
#базел #starlark #bazel
Вопрос:
Каков наилучший способ ссылаться на путь внешнего пакета в любых произвольных файлах, обрабатываемых Bazel?
Я пытаюсь понять, как Bazel предварительно обрабатывает файлы BUILD и .bzl. Я вижу случаи, когда строки содержат вызовы package(), и мне интересно, как это работает (и не смог найти никакой соответствующей документации). Вот пример этого:
У меня есть набор инструментов, файл сборки которого содержит следующее выражение :
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 предварительно обрабатывает файл сборки? Это из-за % ... %
шаблона? Где это задокументировано?
есть "%package(@external_package//target)%"
ли шаблон , который можно использовать в другом месте? В любом файле СБОРКИ? Где я могу найти документацию Bazel, показывающую, как это работает?
Ответ №1:
Эти директивы расширяются за cc_common.create_cc_toolchain_config_info
счет реализации cc_toolchain_config
правила, а не какой-либо предварительной обработки BUILD
файла (т.Е. "%package(@host_gcc8_glibc//include)%"
Буквально Передаются в cc_toolchain_config
правило).) Я не знаю, что эти специальные расширения полностью документированы где угодно, кроме источника.