【问题标题】:Bazel rules that use different subsets of genrule outputs使用不同类型输出子集的 Bazel 规则
【发布时间】:2017-07-11 08:46:02
【问题描述】:

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

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

【问题讨论】:

    标签: bazel


    【解决方案1】:

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

    【讨论】:

    • 我不确定我是否理解 bazel 如何将 sever.cpp 绑定到由 genrule 生成的文件?
    • 如果您的code_gen genrule 是具有 3 个输出的规则:client.cppserver.cppdata.h,那么,由于文件具有相应的标签,它们将被表示为 //<pkg>:client.cpp//<pkg>:server.cpp//<pkg>:data.h 其中<pkg>code_gen 的包。
    • 在我的例子中,repo 中还有一个文件example.pb.go(我正在尝试关注dev.to/bazel/bazel-can-write-to-the-source-folder-b9b),bazel 在使用:example.pb.go 时正在使用repo 副本。有什么方法可以引用缓存中的那个吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多