Базель cc_library без srcs не компилируется самостоятельно - PullRequest
1 голос
/ 16 февраля 2020

У меня есть cc_library, которая только для заголовка. Всякий раз, когда я пытаюсь скомпилировать такую ​​библиотеку самостоятельно, она на самом деле ничего не скомпилирует. Я намеренно добавил несколько ошибок, чтобы попытаться получить такие ошибки при компиляции, но Bazel на самом деле ничего не компилирует. Вот небольшой пример.

// test.h

This should not compile fdsafdsafdsa
int foo() { return 1; }
# BUILD

cc_library(
  name = 'test',
  hdrs = ['test.h']
)
// bazel build :test
INFO: Analyzed target //:test (2 packages loaded, 3 targets configured).
INFO: Found 1 target...
Target //:test up-to-date (nothing to build)
INFO: Elapsed time: 0.083s, Critical Path: 0.00s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action

Предназначено ли это поведение?

Я также провел тот же эксперимент, но разбил файлы .h и. cc, и в этом случае я получил ошибку при компиляции.

Ответы [ 2 ]

3 голосов
/ 16 февраля 2020

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".

2 голосов
/ 16 февраля 2020

Библиотека только для заголовка означает, что вам не нужно ничего строить. Просто включите нужные заголовки в вашу программу и используйте их.

...