gpt4 book ai didi

bazel - cc_library deps 中的 C++ 代码生成规则?

转载 作者:行者123 更新时间:2023-12-04 11:00:04 25 4
gpt4 key购买 nike

我已经自动生成 .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的deps?

(我意识到 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

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

    最佳答案

    规则不能调用其他规则。但是,最近添加了对规则的支持,以重用大多数 native 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来自 compileCcLinkingContext用于创建 CcInfo返回。

    您可以选择从 CcCompilationOutputs 中提取部分/全部文件。和 CcLinkingOutputs作为您的规则返回 DefaultInfo ,取决于您的用例。
    create_linking_context_from_compilation_outputs返回 ( CcLinkingContext , CcLinkingOutputs ) 以供引用。我创建了 bazel#10253只是现在将其添加到文档中。

    关于bazel - cc_library deps 中的 C++ 代码生成规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58873462/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com