我有自动生成的.cc
源和运行.cc
生成器的Starlark规则:
BUILD
文件:
generate_cc(
name = "foo_generated"
) # runs an executable that generates foo.h, foo.cc
我希望以上的foo_generated
也可以充当cc_library
,以便它可以成为后续cc_library
的有效依赖项:
cc_library(
name = "bar",
deps = [":foo_generated"] # foo_generated used like a cc_library()
)
generate_cc
可以在没有宏的单个规则中实现,以便generate_cc
类型的目标像其他cc_library
的部门一样工作吗?
(我意识到generate_cc可以是一个宏,它调用实际规则,然后调用cc_library
规则,从而创建两个单独的目标/标签-这是我要避免的事情。)
如果某个规则实现可以调用另一个规则,那么generate_cc
的实现可以
cc_library
CcInfo
返回的cc_library
提供者如(假设的.bzl
文件中的内容):
def generate_cc_impl(ctx):
# generate .h, .cc files
# ...
cc_info = native.cc_library(...) # wrap .h, .cc files
return cc_info
但是我想不可能从另一个规则中调用一个规则?
答案 0 :(得分:0)
规则不能调用其他规则。但是,最近才增加了对规则的支持,以重用大多数支持此用例的本机C ++功能。有关于implementing Starlark rules that depend on C++ rules and/or that C++ rules can depend on的文档部分。
my_c_archive示例显示了很多使用此功能的样板(特别是找到cc_toolchain
和feature_configuration
)。 cc_common.compile是用于创建用于编译源文件的操作的功能。 cc_common.create_linking_context_from_compilation_outputs会将CcCompilationOutputs
的{{1}}转换为compile
,以创建CcLinkingContext
返回。
根据使用情况,您可以选择从CcInfo
和CcCompilationOutputs
中提取部分/全部文件以作为规则的DefaultInfo返回。
CcLinkingOutputs
返回(create_linking_context_from_compilation_outputs
,CcLinkingContext
)供参考。我刚刚创建了bazel#10253,将其添加到文档中。