我正在将一个TI C6000 DSP的构建从Makefile移植到Bazel上。 这个DSP运行在一个非常复杂的嵌入式系统上,我们已经在使用Bazel为其他多个处理器构建相同的代码,但这些处理器使用的是GNU风味(如 gcc
-为基础的)编译器。
该 cc_rules
包似乎对标志、文件名扩展名等做了假设。 我希望能够避免创建一个完全自定义的工具链,这将涉及到移植所有现有的BUILD文件,根据工具链使用不同的规则。
我似乎找不到任何关于自定义这些属性或其他属性的文档。 我已经知道我需要定制的东西。
-fr=filename
以及 -fs=filename
与 -o filename
cc_rules
产生 .d
文件来检测你是否有缺失的依赖关系。 我不确定这是否是真的,但如果是的话,我需要修改一下使用的标志和扩展名可能还有其他我还不知道的要求。 很可能是我做错了,应该采取不同的方法。我们从早期就开始使用Bazel(v0.12
),还可能有当时的遗留问题。
我们目前正处于 v1.1.0
,我把我们从 v0.12
六个月前。我很惊讶,主枝已经在。 v3.???
!!!
任何帮助都是非常感激的。 如果我遗漏了什么重要的东西,请提醒我。
EDIT: 需要注意的是,编译器似乎是基于...。clang
和 llvm
. 如果有以下例子: 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}"],
),
],
),
],
)
至于可用的和已使用的动作,你可以查看 这个 出。对于功能,你已经发现了:禁用遗留功能,看看自己需要什么是一种选择。还有一种是 列表 在你偶然发现的文档中。除此以外(包括哪些变量在哪一点上是可用的),这有点像 "使用源码,卢克",至少这就是我通常或好或坏地结束了对细节的处理。对于行动来说,一个好点是 此处.
但我也发现检查其他预包装的工具链配置(特别是。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],
)
我已经发布了一个 关于在Bazel中使用GCC嵌入式工具链的例子。 Github上,你可以用它作为模板。这个例子适用于 arm-none-eabi-gcc
编译器,但原则上,它在使用 clang
.