【问题标题】:How to invoke CROSSTOOL tools from Bazel macros / rules?如何从 Bazel 宏/规则调用 CROSSTOOL 工具?
【发布时间】:2023-03-15 04:43:01
【问题描述】:

我正在使用自定义 CROSSTOOL 从 Bazel 构建 ARM Cortex-M 固件。我正在成功构建 elf 文件并手动将它们objcopying 到二进制文件中:

path/to/my/objcopy -o binary hello.elf hello.bin

我想创建一个名为 cc_firmware 的 Bazel 宏或规则:

  • 添加-Wl,-Map=hello.map 标志以生成映射文件
  • 将输出精灵名称从hello 更改为hello.elf
  • 调用path/to/my/objcopy 将精灵转换为垃圾箱。

我不知道如何获取 CROSSTOOL 工具的名称(objcopy)来调用它,让规则知道工具可执行文件的路径感觉不对。

有没有办法使用我已经在我的 CROSSTOOL 文件中告诉 Bazel 的 objcopy?

【问题讨论】:

    标签: bazel objcopy


    【解决方案1】:

    您实际上可以通过自定义规则访问它。基本上你需要告诉Bazel你想要访问cpp的配置信息(fragments = ["cpp"]),然后通过ctx.fragments.cpp.objcopy_executable访问它的路径,例如:

    def _impl(ctx):
        print("path: {}".format(ctx.fragments.cpp.objcopy_executable))
        # TODO: actually do something with the path...
    
    cc_firmware = rule(
        implementation = _impl,
        fragments = ["cpp"],
        attrs = {
             "src" : attr.label(allow_single_file = True),
             "map" : attr.label(allow_single_file = True),
        },
        outputs = {"elf" : "%{name}.elf"}
    )
    

    然后使用(未经测试)之类的内容创建您想要的输出:

    def _impl(ctx):
      src = ctx.attr.src.files.to_list()[0]
      m = ctx.attr.map.files.to_list()[0]
    
      ctx.action(
        command = "{objcopy} -Wl,-Map={map} -o binary {elf_out} {cc_bin}".format(
            objcopy=ctx.fragments.cpp.objcopy_executable,
            map=m,
            elf_out=ctx.outputs.elf.path,
            cc_bin=src,
        ),
        outputs = [ctx.outputs.elf],
        inputs = [src, m],
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多