如何从Bazel宏/规则调用CROSSTOOL工具?

时间:2017-08-06 19:15:02

标签: bazel objcopy

我使用定制的CROSSTOOL从Bazel构建ARM Cortex-M固件。我成功构建了精灵文件,并通常使用objcopy手动path/to/my/objcopy -o binary hello.elf hello.bin二进制文件:

cc_firmware

我想创建一个名为-Wl,-Map=hello.map的Bazel宏或规则:

  • 添加hello标志以生成mapfile
  • 将输出精灵名称从hello.elf更改为path/to/my/objcopy
  • 调用{{1}}将精灵转换为垃圾箱。

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

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

1 个答案:

答案 0 :(得分:3)

您实际上可以从自定义规则中访问它。基本上,您需要告诉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],
  )