使用生成规则输出的不同子集的Bazel规则

  • 本文关键字:规则 子集 Bazel 输出 bazel
  • 更新时间 :
  • 英文 :


我有一个生成三个输出文件的代码生成器:

  • 客户端.cpp
  • 服务器.cpp
  • data.h

genrule看起来像这样:

genrule(
name = 'code_gen',
tools = [ '//tools:code_gen.sh' ],
outs = [ 'client.cpp', 'server.cpp', 'data.h' ],
local = True,
cmd = '$(location //tools:code_gen.sh) $(@D)')

"client.cpp"one_answers"server.cpp"都有自己的cc_library规则。

我的问题是如何依赖genrule,但只使用特定的输出文件。

我所做的是创建一个宏,定义genrule,并将特定的outs设置为所需的文件,但这导致多次执行genrule:

gen.bzl:

def code_generator(
name,
out):
native.genrule(
name = name,
tools = [ '//bazel:gen.sh' ],
outs = [ out ],
local = True,
cmd = '$(location //bazel:gen.sh) $(@D)')

构建

load(':gen.bzl', 'code_generator')
code_generator('client_cpp', 'client.cpp')
code_generator('server_cpp', 'server.cpp')
code_generator('data_h', 'data.h')
cc_library(
name = 'client',
srcs = [ ':client_cpp' ],
hdrs = [ ':data_h' ],
)
cc_library(
name = 'server',
srcs = [ ':server_cpp' ],
hdrs = [ ':data_h' ],
)

有没有一种方法可以依赖于genrule,使其运行一次,然后只使用其中选定的输出?

您应该能够仅使用文件名(例如:server.cpp)来依赖于规则的特定输出。

最新更新