我在构建目标时遇到问题,因为它需要构建在 bazel 构建之前不可用的文件。我想在构建目标期间生成这些文件。问题是很难知道会生成多少个文件。 我想创建更大的 monorepo,可以构建多种语言/平台,但现在我陷入困境,因为我正在尝试使用使用 SWIG 的脚本来生成 cpp/java 胶水代码,这些代码放置在未知数量的文件中。 此外,我需要这些文件成为我的项目树的一部分,因为我希望能够在运行时调试它们,并有可能在其中提交更改。
这是我对这个问题的解决方案。 (https://github.com/AnDevi/bazel-generate-files-example)
此示例 (BUILD.bazel) 仅使用
cc_library
、cc_binary
和 genrule
。
在
cc_libary
中,我想编译通过脚本generator.sh在genrule
中创建的文件(我们需要假设该脚本可能会生成未知数量的文件)。
由于genrule
不能将目录作为输出,它会生成虚拟文件作为输出,但它的主要目标是运行脚本并生成其他文件。
(
genrule
也适用于local mode
,因为我需要将生成的文件放在我的项目树中并能够调试它们。)
我的
cc_libarary
使用这个genrule
作为其srcs
的一部分,但其srcs
的另一部分是脚本在路径source/Generated/*
下生成的文件。问题是 cc_libarary
可能想要在创建之前使用 source/Generated/*
下的文件,这就是为什么这个解决方案不幸不完整的原因。
所以我想知道这种方法是否注定会失败(?)因为我无法以任何方式确保由此
genrule
生成的那些文件将在cc_library
想要在给定路径下使用它们之前准备好。
作为不同的方法,我尝试使用 aspect-build 和 run_binary 但我认为它不能解决我的问题。我尝试使用
run_binary
运行脚本生成文件,但失败了。尽管如此,我认为它不适合我的问题还有第二个原因,因为我无法在local mode
(如genrule
)中使用它,因此我无法将生成的文件添加到我的项目树中。
也许有完全不同的更好的解决方案?也许其他人已经面临类似的问题?
好的,我找到了解决问题的方法:
我使用了这个 github.com/bazelbuild/bazelisk?tab=readme-ov-file#toolsbazel
在这个包装器二进制文件中
tools/bazel
我正在运行单独的步骤
#!/usr/bin/env bash
$BAZEL_REAL build //target_with_genrule_in_here
$BAZEL_REAL $@
在实际构建之前,我正在运行
genrule
,它运行创建我想要创建的所有文件的脚本(genrule
已设置 local=True
,因此我可以在我的项目树中创建这些文件)并在下一步中构建它们.
感谢我仍然可以通过仅调用一个
bazel build
命令来实现我想要的一切。