簡體   English   中英

如何從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

我想制作一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM