Я хочу сослаться на DirectX SDK в файле BUILD. Проблема в том, что (насколько я понимаю) Bazel поддерживает передачу переменных среды только через аргумент --action_env=DXSDK_DIR для Bazel и предназначен для использования в действиях, которые должны быть определены в плагине (файл .bzl).
Есть ли более простой способ обратиться к переменной среды, используя ее как переменную Make (includes = [ "$(DXSDK_DIR)/Include" ]), или мне нужно написать плагин?





В принципе, вам нужно правило cc_library, атрибут hdrs которого включает заголовки DirectX. Для этого вам нужно представить, что DX SDK является частью вашего дерева исходных текстов. Для этого Bazel предлагает «правила репозитория».
В зависимости от того, известно ли местонахождение SDK или его необходимо обнаружить, у вас есть два варианта.
Вы можете использовать этот подход, если вам не нужно читать какие-либо переменные среды, запускать какие-либо двоичные файлы или запрашивать реестр, чтобы найти, где находится SDK. Это тот случай, если каждый, кто создает ваши правила, установит SDK в одно и то же место.
Просто добавьте правило new_local_repository в свой файл WORKSPACE, укажите path правила в каталоге SDK и напишите для него простой build_file_content.
Пример:
new_local_repository(
name = "directx_sdk",
path = "c:/program files/directx/sdk/includes",
build_file_contents = """
cc_library(
name = "sdk",
hdrs = glob(["**/*.h"]),
visibility = ["//visibility:public"],
)
""")
Это правило создает репозиторий @directx_sdk с одним правилом в корневом пакете, @directx_sdk//:sdk.
Вам необходимо следовать этому подходу, если вам нужно читать переменные среды, запускать двоичные файлы или запрашивать реестр, чтобы найти, где находится SDK.
Вместо использования правила new_local_repository вам нужно реализовать собственное. Дополнительная информация и примеры здесь.
Ключевые моменты:
если ваше правило репозитория должно читать переменные среды, добавьте их в список repository_rule(environ), например repository_rule(..., environ = ["DXSDK_DIR"])
если вам нужно запустить некоторые двоичные файлы, которые сообщают вам, где находится SDK, используйте repository_ctx.execute. Вы можете использовать repository_ctx.which для поиска двоичных файлов на PATH.
если вам нужно делать запросы к реестру, используйте repository_ctx.execute с reg.exe /query <args>
cc_library SDKВ своем проекте просто полагайтесь на библиотеку SDK, как если бы это был обычный cc_library:
cc_library(
name = "render",
...
deps = [
...
"@directx_sdk//:sdk",
],
)