巴泽尔。在构建过程中生成 bazel 构建之前不可用的文件

问题描述 投票:0回答:1

我在构建目标时遇到问题,因为它需要构建在 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
)中使用它,因此我无法将生成的文件添加到我的项目树中。

也许有完全不同的更好的解决方案?也许其他人已经面临类似的问题?

bazel swig bazel-rules bazel-cpp
1个回答
0
投票

好的,我找到了解决问题的方法:

我使用了这个 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
命令来实现我想要的一切。

© www.soinside.com 2019 - 2024. All rights reserved.