Переменные среды Bazel в правилах сборки - PullRequest
0 голосов
/ 25 апреля 2018

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

Есть ли более простой способ обратиться к переменной среды, используя ее как переменную Make (includes = [ "$(DXSDK_DIR)/Include" ]), или мне нужно написать плагин?

1 Ответ

0 голосов
/ 25 апреля 2018

В принципе вам нужно правило cc_library, атрибут которого hdrs содержит глобальные заголовки DirectX. Для этого вам нужно сделать вид, что DX SDK является частью вашего исходного дерева. Для этой цели Bazel предлагает «правила хранилища».

1. Создайте правило хранилища для DirectX SDK

В зависимости от того, известно ли местоположение SDK или его нужно обнаружить, у вас есть два варианта.

а. Фиксированное местоположение 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 discovery

Вы должны следовать этому подходу, если вам нужно прочитать переменные среды, запустить двоичные файлы или запросить реестр, чтобы найти, где находится 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>

2. Зависит от SDK cc_library

В вашем проекте просто зависите от библиотеки SDK, как если бы она была обычной cc_library:

cc_library(
    name = "render",
    ...
    deps = [
        ...
        "@directx_sdk//:sdk",
    ],
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...