Получение пути выполнения к пакету в файлах конфигурации цепочки инструментов Bazel

#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 правило).) Я не знаю, что эти специальные расширения полностью документированы где угодно, кроме источника.