如何从 Bazel 宏/规则调用 CROSSTOOL 工具?
How to invoke CROSSTOOL tools from Bazel macros / rules?
我正在使用自定义 CROSSTOOL 从 Bazel 构建 ARM Cortex-M 固件。我成功地构建了 elf 文件并使用通常的方式手动 objcopy
将它们转换为二进制文件:
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 您想要访问 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],
)
我正在使用自定义 CROSSTOOL 从 Bazel 构建 ARM Cortex-M 固件。我成功地构建了 elf 文件并使用通常的方式手动 objcopy
将它们转换为二进制文件:
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 您想要访问 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],
)