Bazel cc_toolchain 用于非 GNU TI DSP 编译器

Bazel cc_toolchain for non-gnu TI DSP compiler

我正在将 TI C6000 DSP 构建从 Makefile 移植到 Bazel。这个 DSP 运行 在一个非常复杂的嵌入式系统上,我们已经在使用 Bazel 为多个其他处理器构建相同的代码,但是那些其他处理器使用 GNU 风格(例如 gcc-based)编译器。

cc_rules 包似乎对标志、文件扩展名等做出了假设。我希望我可以避免创建一个完全自定义的工具链,这将涉及移植所有现有的 BUILD 文件以使用不同的规则取决于工具链。

我似乎找不到任何关于自定义这些属性或其他属性的文档。我已经知道我需要定制的东西:

  1. 用于指定输出文件的标志:-fr=filename-fs=filename-o filename
  2. 隐式依赖生成:有人告诉我 cc_rules 在后台生成 .d 文件来检测您是否缺少依赖。我不确定这是不是真的,但如果是这样,我需要更改使用的标志和扩展名
  3. 目标文件和库文件的扩展名:如上所述,我们为多个CPU构建相同的文件,需要自定义规则输出的扩展名。

可能还有其他我还不知道的要求。很可能是我做错了,应该采取不同的方法。我们从早期 (v0.12) 开始就一直在使用 Bazel,并且从那时起可能仍有遗留问题。

我们目前在 v1.1.0,这是我六个月前从 v0.12 移植到的。我很惊讶 master 分支已经在 v3.???!!!

非常感谢任何帮助。如果我遗漏了任何重要内容,请提醒我。

编辑:需要注意的一件事是编译器似乎是基于clangllvm。如果有基于 clang/llvm 的工具链示例(我很确定有),那么我可以从那里开始。

我知道文档中的 enscriptem 示例在技术上是基于 LLVM 的编译器,但它使用脚本对参数等进行魔法处理。如果这是正确的,我可以这样做做,但我想确保我走在正确的道路上。

这不是您所有问题的完整答案,但这也超出了可以格式化和作为评论发布的范围。您最近的询问。此代码段将重新定义用于输出文件的选项(而不是 -o OUTPUT-fr=OUTPUT):

    compiler_output_flags_feature = feature(
        name = "compiler_output_flags",
        flag_sets = [
            flag_set(
                actions = [
                    ACTION_NAMES.assemble,
                    ACTION_NAMES.c_compile,
                    ACTION_NAMES.cpp_compile,
                    ACTION_NAMES.cpp_header_parsing,
                    ACTION_NAMES.cpp_module_compile,
                    ACTION_NAMES.cpp_module_codegen,
                ],
                flag_groups = [
                    flag_group(
                        flags = ["-fr=%{output_file}"],
                    ),
                ],
            ),
        ],
    )

关于可用和已使用的操作,您可以查看this out. For features, as you've already discovered: disabling legacy features and see what you need is one option. There is also this list in the docs that you've stumbled upon. Beyond that (incl. what variables are available at which point), it's a bit of "use the source, Luke" at least that's where I usually for better or worse ended heading for details. For action a good point would be here

但我也发现检查其他预打包的工具链配置(特别是 MSVC 因为...不同)很有见地。

我认为添加您自己的提供 CcToolchainConfigInfo 的自定义规则会解决您遇到的问题。

def _impl(ctx):
    tool_paths = [
        tool_path(name = "gcc", path = "/<abs>/<path>/clang"),
        tool_path(name = "ld", path = "/<abs>/<path>/ld"),
        tool_path(name = "ar", path = "/<abs>/<path>/ar"),
        tool_path(name = "cop", path = "/bin/false"),
        tool_path(name = "gcov", path = "/bin/false"),
        tool_path(name = "nm", path = "/bin/false"),
        tool_path(name = "objdump", path = "/bin/false"),
        tool_path(name = "strip", path = "/bin/false"),
    ]

    toolchain_compiler_flags = feature(
        name = "compiler_flags",
        enabled = True,
        flag_sets = [
            flag_set(
                actions = [
                    ACTION_NAMES.assemble,
                    ACTION_NAMES.preprocess_assemble,
                    ACTION_NAMES.linkstamp_compile,
                    ACTION_NAMES.c_compile,
                    ACTION_NAMES.cpp_compile,
                    ACTION_NAMES.cpp_header_parsing,
                    ACTION_NAMES.cpp_module_compile,
                    ACTION_NAMES.cpp_module_codegen,
                    ACTION_NAMES.lto_backend,
                    ACTION_NAMES.clif_match,
                ],
                flag_groups = [
                    flag_group(flags = ["<compiler-flags>"]),
                ],
            ),
        ],
    )

    toolchain_linker_flags = feature(
        name = "linker_flags",
        enabled = True,
        flag_sets = [
            flag_set(
                actions = [
                    ACTION_NAMES.linkstamp_compile,
                ],
                flag_groups = [
                    flag_group(flags = ["<linker-flags>"]),
                ],
            ),
        ],
    )

    return cc_common.create_cc_toolchain_config_info(
        ctx = ctx,
        toolchain_identifier = ctx.attr.toolchain_identifier,
        host_system_name = ctx.attr.host_system_name,
        target_system_name = "<your-system-name>",
        target_cpu = "<your-cpu>",
        target_libc = "<your-libc>",
        compiler = "<your-compiler>,
        abi_version = "<your-eabiu>",
        abi_libc_version = <your-version>,
        tool_paths = tool_paths,
        features = [
            toolchain_compiler_flags,
            toolchain_linker_flags,
            <more-custom-features>,
        ],
    )

cc_arm_none_eabi_config = rule(
    implementation = _impl,
    attrs = {
        "toolchain_identifier": attr.string(default = ""),
        "host_system_name": attr.string(default = ""),
    },
    provides = [CcToolchainConfigInfo],
)

我在 Github 上发布了一个 example about using GCC embedded toolchains with Bazel,您可以将其用作模板。该示例适用于 arm-none-eabi-gcc 编译器,但原则上,它也适用于 clang.