cc_library
(например, другие правила, включая pkg_tar
) не должны иметь никаких источников. Это также верно:
cc_library(
name = "empty",
srcs = [],
)
И на самом деле это тоже весьма полезно. У вас могут быть настраиваемые атрибуты, такие как deps
(или srcs
), где фактическое содержимое применимо только для определенных условий:
cc_binary(
name = "mybinary",
srcs = ["main.c"],
deps = select({
":platform1": [":some_plat1_only_lib"],
":platform2": [":empty"], # as defined in the above snippet
}),
)
Или (поскольку выше вы могли бы также использовать []
для :platform2
deps
) если у вас дерево большего размера и вы ожидаете, что разработчики будут зависеть только от //somelib:somelib
, вы можете использовать эту пустую библиотеку через alias
, чтобы дать им один ярлык, не беспокоясь о всей платформе Подробности c и то, как осуществляется предоставление определенной функции, где:
# somelib/BUILD:
alias(
name = "somelib",
actual = select({
":platform1": [":some_plat1_only_lib"],
":platform2": [":empty"], # as defined in the above snippet
}),
visibility = ["//visibility:public"], # set appropriately
)
И mybinary
или любая другая цель теперь может сказать:
cc_binary(
name = "mybinary",
srcs = ["main.c"],
deps = ["//somelib"],
)
И, конечно, как другой ответ здесь гласит, что есть библиотеки только для заголовков.
Также в примере, который вы использовали в своем вопросе. (bazel
или нет), как правило, вы не собирались (и это было бы не очень полезно) компилировать заголовочный файл самостоятельно. Вы будете использовать только его содержимое и только тогда увидите, что компилятор потерпит неудачу, когда вы попытаетесь построить источник, заголовок которого #include
d. То есть, чтобы bazel build
потерпел неудачу, другая цель должна зависеть от test
и #include "test.h"
.