Сборка Makefile с использованием Bazel - PullRequest
3 голосов
/ 21 сентября 2019

Я пытаюсь собрать Makefile подмодуля в проекте Bazel.Я вижу, что bazel предоставляет genrule для выполнения команды bash.В настоящее время я сталкиваюсь с двумя проблемами -

1.Как перейти в каталог перед выполнением команды, что-то вроде -

genrule(
    name = "hello-make",
    srcs = ["hello"] + glob(["hello/**"]),
    outs = ["hello/main"],
    cmd = "(cd $(location :hello) && make)",
)

2.Как обновить подмодуль обновления перед выполнением genrule?

Добавление cmd = "(git submodule init && git submodule update)" дает fatal: Not a git repository (or any of the parent directories): .git

Шаг для воспроизведения:

  1. git clone git@github.com:bazelbuild/examples.git
  2. cd examples/ && git submodule add git@github.com:mucsi96/cpp-hello-world.git cpp-tutorial/stage1/main/hello
  3. cd cpp-tutorial/stage1/ && bazel build //main:hello-world

После этого шага я хочу добавить правило, которое позволяет мне инициализировать, обновлять и создавать подмодуль hello.

Есть ли лучший способ собрать git@github.com:mucsi96/cpp-hello-world.git, чем создать его как подмодуль git clone git@github.com:bazelbuild/examples.git?

Реальные проекты более сложны, и создание файла BUILD для cpp-hello-world.gitне осуществимо.

1 Ответ

4 голосов
/ 23 сентября 2019

Вместо того, чтобы создавать свой собственный genrule для создания (предположительно C ++) проекта, в котором используется Makefile, вместо этого выберите rules_foreign_cc.rules_foreign_cc используется envoy и другими различными большими программами на C ++ для построения внешних зависимостей CMake и Make.

См. Пример simple_make.В нем вы сначала сделаете filegroup, чтобы собрать все исходные файлы и файлы, относящиеся к проекту, который нужно построить, включая сам Makefile:

filegroup(
    name = "sources",
    srcs = glob(["**"]),
    visibility = ["//simple_make:__subpackages__"],
)

Затем вызовите rules_foreign_ccmake rule , которое также поставляется с другими make -специфичными атрибутами, такими как prefix, make_env_vars, и даже с возможностью переопределения всей команды make с помощью make_commands.В этом примере мы просто используем атрибуты lib_source и static_libraries:

load("@rules_foreign_cc//tools/build_defs:make.bzl", "make")

make(
    name = "make_lib",
    lib_source = "//simple_make/code:sources",
    static_libraries = ["liba.a"],
)

Наконец, запустите bazel build //package/to:make_lib, чтобы вызвать правило make.

Как обновить субмодуль обновления перед выполнением genrule?

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

...