[英]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
我想制作一個Bazel宏或一個稱為cc_firmware
規則:
-Wl,-Map=hello.map
標志以生成-Wl,-Map=hello.map
hello
更改為hello.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],
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.