Связывание неизвестного списка аутов с cc_library - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть genrule, который принимает «в» файле конфигурации и выплевывает «большое количество встроенных файлов (*.so* s и *.h файлов):

genrule(
    name = "ros_auto",
    local = True,
    srcs = [":package_list"],
    outs = ["ros_built.tgz"],
    tools = [":build_packages.bash"],
    cmd = "$(location :build_packages.bash) $< $@"
    )

Далее мне нужно взять все файлы, которые выводятся из вышеупомянутого genrule, и создать из них cc_library, как показано ниже (на данный момент единственный управляемый способ, которым я могу найти, - зарегистрировать выходные файлы в * 1009).* архивирует их и объявляет смолу):

cc_library(
    name = "ros",
    srcs = glob(["lib/*.so*"]),
    hdrs = glob([
        "include/**/*.h",
        "include/**/*.hpp",
        ]),
    strip_include_prefix = "include",
    visibility = ["//visibility:public"],
    )

Независимо от того, куда я смотрю, я, похоже, продолжаю находить deadend после deadend (http_archive использует метод download_and_extract, который предполагает, что *tgzудаленная реализация cc_library недоступна / не может быть расширена Java и т. д.).

Я бы подумал, что проблема "У меня есть узел A, который генерирует тонну выходных файлов, от которого зависит узел B" был бы чрезвычайно распространенным и имел бы простое решение.Я что-то упускаю из виду?

Контекст:

Я работаю с правилом локального репозитория, которое принимает локальный каталог и использует правило cc_library вышев качестве параметра build_file (но это означает, что сборка первого шага этого процесса должна выполняться полностью вне процесса сборки Bazel, а это не так, как это должно быть сделано):

new_local_repository(
    name = "ros",
    path = "/tmp/ros_debug",
    build_file = "//ros:BUILD.bazel",
    licenses = ["https://docs.ros.org/diamondback/api/licenses.html"]
    )

1 Ответ

2 голосов
/ 26 сентября 2019

Основная философия Bazel заключается в том, что сборка должна зависеть от однозначных входных данных / зависимостей и выводить строго определенные файлы, чтобы гарантировать воспроизводимые сборки.Наличие genrule, генерирующего «случайное» количество файлов, от которых должна зависеть цель, противоречит этой философии.Вот почему вы не можете найти хороший способ для достижения этой цели.

Чтобы обойти это, нужно иметь один outs файл в вашем жанре, где вы записываете имена сгенерированных файлов (или журналвашего сценария или что-то).Затем вы можете определить дополнительную файловую группу, содержащую все сгенерированные файлы, используя glob.Затем добавьте свой genrule в качестве зависимости к правилу узла B и файловой группе к srcs.Поэтому гарантируется, что файлы генерируются до сборки узла B

.
...