В принципе вам нужно правило 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",
],
)