用于非gnu TI DSP编译器的Bazel cc_toolchain。

问题描述 投票:0回答:1

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

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

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

  1. 用来指定输出文件的标志。-fr=filename 以及 -fs=filename-o filename
  2. 隐性依赖的产生:有人告诉我。cc_rules 产生 .d 文件来检测你是否有缺失的依赖关系。 我不确定这是否是真的,但如果是的话,我需要修改一下使用的标志和扩展名
  3. 对象文件和库文件的扩展:如上所述,我们为多个CPU建立相同的文件,需要自定义规则输出的扩展。

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

我们目前正处于 v1.1.0,我把我们从 v0.12 六个月前。我很惊讶,主枝已经在。 v3.???!!!

任何帮助都是非常感激的。 如果我遗漏了什么重要的东西,请提醒我。

EDIT: 需要注意的是,编译器似乎是基于...。clangllvm. 如果有以下例子: clangllvm-基于工具链的工具链(我很肯定有),那么我可以从那里开始。

我知道 enscriptem 文档中的例子从技术上讲是一个基于LLVM的编译器,但它使用了一个脚本来对参数等进行魔法处理。 如果这样做是正确的,我可以这样做,但我想确保我的方向是正确的。

build cross-compiling bazel
1个回答
1
投票

这不是对你所有问题的完整回答,但这也超出了可以格式化并作为评论发布的范围。对于你最近的咨询。这段代码将重新定义用于输出文件的选项(而非 -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}"],
                    ),
                ],
            ),
        ],
    )

至于可用的和已使用的动作,你可以查看 这个 出。对于功能,你已经发现了:禁用遗留功能,看看自己需要什么是一种选择。还有一种是 列表 在你偶然发现的文档中。除此以外(包括哪些变量在哪一点上是可用的),这有点像 "使用源码,卢克",至少这就是我通常或好或坏地结束了对细节的处理。对于行动来说,一个好点是 此处.

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


1
投票

我认为,添加自己的自定义规则,提供了 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],
)

我已经发布了一个 关于在Bazel中使用GCC嵌入式工具链的例子。 Github上,你可以用它作为模板。这个例子适用于 arm-none-eabi-gcc 编译器,但原则上,它在使用 clang.

© www.soinside.com 2019 - 2024. All rights reserved.