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

时间:2017-07-11 08:46:03

标签: bazel

我有一个代码生成器,可以生成三个输出文件:

  • client.cpp
  • server.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'和'server.cpp'都有自己的 cc_library 规则。

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

我所做的是创建一个定义 genrule 的宏,并将特定的 out 设置为所需的文件,但这导致多次执行 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)')

BUILD

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让它运行一次然后只使用它的选定输出?

1 个答案:

答案 0 :(得分:1)

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