使用 genrule 输出的不同子集的 Bazel 规则
Bazel rules that use different subsets of genrule outputs
我有一个生成三个输出文件的代码生成器:
- 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 使其 运行 一次,然后只使用它的选定输出?
您应该能够仅使用文件名(例如 :server.cpp
)来依赖规则的特定输出。
我有一个生成三个输出文件的代码生成器:
- 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 使其 运行 一次,然后只使用它的选定输出?
您应该能够仅使用文件名(例如 :server.cpp
)来依赖规则的特定输出。