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

查尔斯·尼科尔森

我正在使用自定义CROSSTOOL从Bazel构建ARM Cortex-M固件。我已成功构建elf文件,并objcopy使用通常的方法将其手动转换为二进制文件:

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

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

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

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

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

克里斯蒂娜

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何对宏规则的参数对进行操作?

Rust - 宏规则问题

如何使用提供的工具而不是规则构建的工具编写 Bazel 测试规则?

如何从 Bazel 规则中查询兄弟规则

如何检查Clojure,宏规格?

如何列出bazel规则的输出组?

无法编译此宏规则:需要类型注释

简化用于嵌套循环的Rust宏规则

如何在bazel规则中获取WORKSPACE目录

bazel,python 规则,创建的文件如何获取它们

如何在bazel build中获得每个规则的时间成本

Bazel CROSSTOOL文件中的C编译器选项

如何在Bazel v0.19 +中使用JAR工具?

宏规则仅匹配第一个模式

您如何在Bazel规则中运行其他规则的可执行文件?

如何从Bazel中的另一个规则中创建规则

如何将自定义规则的输出放在bazel-genfiles /中而不是bazel-out /中?

如何集中引导工具提示调用?

如何创建使用另一个规则的runfiles路径的自定义bazel构建规则?

如何调试通过“ ctx.actions.run(...)”由Bazel规则执行的“ java_binary”目标?

Bazel:如何使用nodeJS_binary规则执行“ npm run start”

如何通过单个java_test()规则在Bazel中运行所有测试?

从Bazel Genrule调用gcloud

如何识别HTML 5中调用无效事件的验证规则?

规则调用脚本时如何定义Makefile目标?

Java如何调用以JNI命名规则命名的JNI函数?

protobuf C ++编译器的bazel规则

如何使用crosstool-ng为SystemV构建OS / ABI

如何在不使用相对路径的情况下从另一个规则访问bazel规则的输出?