cc_library deps中的c ++代码生成规则?

时间:2019-11-15 09:00:21

标签: bazel

我有自动生成的.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的实现可以

  1. 将其生成的源包装在cc_library
  2. 返回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

但是我想不可能从另一个规则中调用一个规则?

1 个答案:

答案 0 :(得分:0)

规则不能调用其他规则。但是,最近才增加了对规则的支持,以重用大多数支持此用例的本机C ++功能。有关于implementing Starlark rules that depend on C++ rules and/or that C++ rules can depend on的文档部分。

my_c_archive示例显示了很多使用此功能的样板(特别是找到cc_toolchainfeature_configuration)。 cc_common.compile是用于创建用于编译源文件的操作的功能。 cc_common.create_linking_context_from_compilation_outputs会将CcCompilationOutputs的{​​{1}}转换为compile,以创建CcLinkingContext返回。

根据使用情况,您可以选择从CcInfoCcCompilationOutputs中提取部分/全部文件以作为规则的DefaultInfo返回。

CcLinkingOutputs返回(create_linking_context_from_compilation_outputsCcLinkingContext)供参考。我刚刚创建了bazel#10253,将其添加到文档中。