【问题标题】:c++ code-generating rule in cc_library deps?cc_library deps 中的 c++ 代码生成规则?
【发布时间】:2019-11-15 09:00:21
【问题描述】:

我已自动生成 .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. 返回cc_library返回的CcInfo提供程序

如(假设的.bzl 文件):

def generate_cc_impl(ctx):
  # generate .h, .cc files
  # ...
  cc_info = native.cc_library(...)  # wrap .h, .cc files
  return cc_info

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

【问题讨论】:

    标签: bazel


    【解决方案1】:

    规则不能调用其他规则。但是,最近添加了对规则的支持,以重用支持此用例的大多数本机 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 会将 CcCompilationOutputscompile 转换为 CcLinkingContext 以创建 CcInfo 以返回。

    您可以选择从CcCompilationOutputsCcLinkingOutputs 中提取部分/全部文件以作为您的规则的DefaultInfo 返回,具体取决于您的用例。

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

    【讨论】:

      猜你喜欢
      • 2011-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 2010-10-31
      相关资源
      最近更新 更多