Вместо того, чтобы создавать свой собственный 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_cc
make
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
и другие правила не должны изменять состояние ваших источников во время сборки, а только собирать выходные файлы.Попробуйте запустить отдельный скрипт для обновления подмодулей перед сборкой.