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

使用genrule输出的不同子集的Bazel规则,bazel,Bazel,我有一个生成三个输出文件的代码生成器: client.cpp server.cpp 数据.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)') “clien

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

client.cpp server.cpp 数据.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”和“server.cpp”都有自己的cc_库规则

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

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

bzl代:

建造


有没有办法依靠genrule使其运行一次,然后只使用其中选定的输出?

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

我不知道bazel如何将sever.cpp绑定到由genrule生成的文件?如果您的代码将是一个规则有3个输出:client.cpp、server.cpp和data.h,由于文件有相应的标签,它们将被表示为//:client.cpp、//:server.cpp和//:data.h,其中是代码包。
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' ],
)