本项目提供开发版的GCC和LLVM工具链。它们具有如下特征:
- 带有Python支持的GDB
- 带有Python支持的libstdc++
- 支持pretty-printer的.gdbinit
- 使用相对路径,可重新部署
- 已配置rpath并带有必要的动态库
- 支持调试符号
支持如下工具链:
工具链 | Host | Target |
---|---|---|
gcc | x86_64-linux-gnu | x86_64-linux-gnu |
gcc | x86_64-linux-gnu | i686-linux-gnu |
gcc | x86_64-linux-gnu | x86_64-w64-mingw32 |
gcc | x86_64-linux-gnu | i686-w64-mingw32 |
gcc | x86_64-linux-gnu | arm-none-eabi |
gcc | x86_64-linux-gnu | x86_64-elf |
gcc | x86_64-linux-gnu | loongarch64-linux-gnu |
gcc | x86_64-linux-gnu | loongarch64-loongnix-linux-gnu |
gcc | x86_64-linux-gnu | riscv64-linux-gnu |
gcc | x86_64-linux-gnu | aarch64-linux-gnu |
gcc | x86_64-linux-gnu | arm-linux-gnueabi |
gcc | x86_64-linux-gnu | arm-linux-gnueabihf |
gcc | x86_64-w64-mingw32 | x86_64-w64-mingw32 |
gcc | x86_64-w64-mingw32 | i686-w64-mingw32 |
gcc | x86_64-w64-mingw32 | x86_64-linux-gnu |
gcc | x86_64-w64-mingw32 | i686-linux-gnu |
gcc | x86_64-w64-mingw32 | arm-none-eabi |
gcc | x86_64-w64-mingw32 | x86_64-elf |
gcc | x86_64-w64-mingw32 | loongarch64-linux-gnu |
gcc | x86_64-w64-mingw32 | loongarch64-loongnix-linux-gnu |
gcc | x86_64-w64-mingw32 | riscv64-linux-gnu |
gcc | x86_64-w64-mingw32 | aarch64-linux-gnu |
gcc | x86_64-w64-mingw32 | arm-linux-gnueabi |
gcc | x86_64-w64-mingw32 | arm-linux-gnueabihf |
llvm | x86_64-linux-gnu | X86, ARM, AArch64, LoongArch, RISCV |
llvm | x86_64-w64-mingw32 | X86, ARM, AArch64, LoongArch, RISCV |
本项目提供GCC和LLVM工具链的构建流程说明,可以参阅下表中的文件了解工具链构建流程。
文件 | 说明 |
---|---|
build_gcc.md | GCC工具链构建流程说明 |
build_llvm.md | LLVM工具链构建流程说明 |
本项目在script
目录下也提供了一组Python脚本用于自动化构建工具链,下表是相关文件说明:
文件 | 说明 |
---|---|
prefix-lib.suffix |
链接器脚本,用于代替autotools生成的带有绝对路径的链接器脚本以得到可移植的工具链 |
.gdbinit | gdb配置文件,用于自动配置pretty-print |
auto_gcc.py | gcc构建脚本的接口,可以获取各种信息和实现全自动构建 |
common.py | GCC和LLVM构建脚本共用的一些构建环境和实用函数 |
gcc_environment.py | GCC构建环境,所有GCC构建脚本均通过该环境完成构建流程 |
llvm_environment.py | LLVM构建环境,所有LLVM构建脚本均通过该环境完成构建流程 |
python_config.py | 在交叉编译gdb时用于获取Python库所在路径 |
python_config.sh | 将Python脚本包装为sh脚本,因为binutils-gdb的configure脚本仅支持sh脚本 |
sysroot.py | 制作构建LLVM工具链所需的初始sysroot,仅包含libc和GNU相关库文件 |
plat_clang.py |
LLVM工具链构建脚本 |
plat_native_gcc.py |
GCC本地工具链/加拿大工具链构建脚本 |
plat_host_plat_target_gcc.py |
GCC交叉工具链/加拿大交叉工具链构建脚本 |
注释:
[1] 字段说明如下表所示:
字段 | 说明 |
---|---|
prefix | 一般为arch,若存在多个target则会增加vendor字段(如loongnix )或abi字段(如hf ),取决于target间差异 |
lib | glibc中库名称,如libc 和libm ,取决于哪些库使用了链接器脚本而非软链接 |
suffix | glibc中库文件名后缀,如.so 和.a ,取决于哪些类型的库使用了链接器脚本而非软链接 |
[2] 该脚本支持如下选项:
选项 | 说明 |
---|---|
--build | 全自动构建所有GCC工具链 |
--dump_info | 打印所有构建脚本、目标和构建顺序信息 |
--dump_path | 以shell脚本形式打印所有存在的工具链的bin目录列表,可用于设置PATH环境变量 |
--help | 打印帮助信息 |
作为库包含 | 可以通过scripts 对象获取构建脚本、目标和已安装工具链相关信息 |
[3] plat字段表示一个triplet,用于描述一个目标平台,如x86_6-linux-gnu
[4] 构建脚本可作为库使用,也可直接执行。引用这些脚本可以获取工具链的构建环境和一些实用函数,直接执行可以完成自动化构建
在readme
目录下可以找到各个工具链的说明文件,构建脚本会将说明文件和工具链一同打包。在使用工具链前请参阅工具链目录下的README.md
文件,
或参阅构建流程说明。
本项目为受支持的工具链提供了xmake支持,下面是一个示例:
-- 导入所有文件
includes("xmake/*.lua")
-- 设置允许的xmake模式
set_allowedmodes(support_rules_table)
-- 根据mode选项添加规则
add_rules(get_config("mode"))
target("test")
add_files("*.cpp")
target_end()
通过toolchain
选项可以轻松地选取要使用的工具链,并完成--sysroot
等选项的配置,下面是一个示例:
# 使用clang进行交叉编译
xmake f --toolchain=aarch64-linux-gnu-clang -a arm64-v8a -p linux
# 使用gcc进行交叉编译
xmake f --toolchain=aarch64-linux-gnu-gcc -a arm64-v8a -p linux
xmake支持也提供了target-clang
和target-gcc
工具链。使用这两个工具链时脚本会尝试根据plat
和arch
推导出目标平台,若无法推导则配置失败,此时应该指定一个具体的工具链。
在常用平台上编译时可以直接使用这两个工具链,而无需在xmake选项和工具链间重复指定目标平台。下面是一个示例:
# 根据arch和plat自动推导工具链,相当于--toolchain=aarch64-linux-gnu-clang
xmake f --toolchain=target-clang -a arm64-v8a -p linux
如果使用cross
平台,则需要通过--target_os
选项指定目标平台。下面是一个示例:
# 相当于--toolchain=loongarch64-linux-gnu-clang
xmake f --toolchain=target-clang -a loong64 -p cross --target_os=linux
使用cross
平台并且不指定--target_os
选项则会推导出独立工具链,下面是一个示例:
# 推导出独立工具链,相当于--toolchain=arm-none-eabi
xmake f --toolchain=target-clang -a arm -p cross
xmake支持文件位于xmake
文件夹下,下面是各个文件的说明:
文件 | 说明 |
---|---|
option.lua | 提供各种xmake配置选项,包含utility/utility.lua 文件 |
rule.lua | 提供4种常用xmake规则,包含option.lua 文件 |
toolchain.lua | 提供各种xmake工具链,包含option.lua 和utility/target.lua 文件 |
utility/target.lua | 受支持的目标平台表,内部文件 |
utility/utility.lua | 提供各种配置工具,内部文件 |
其中option.lua
可以单独使用,此时需要使用add_options
来关联选项和目标。如果使用toolchain.lua
中定义的工具链,这些选项会自动添加到相应工具链中。
utility/target.lua
可以通过includes
函数引入到描述域中,此时函数和变量均可使用;也可以通过import
函数引入脚本域,此时仅函数接口可用。
下面是option.lua
提供的xmake配置选项说明:
-
march 设置工具链的
-march
选项,默认为default
选项 说明 no 不添加 -march
选项detect 如果可以则添加 -march=native
选项,否则不添加-march
选项arch 添加 -march=arch
选项,arch
不能为no
和detect
-
sysroot 设置工具链的
--sysroot
选项,默认为detect
选项 说明 no 不添加 --sysroot
选项detect 工具链为clang则自动探测sysroot,为gcc则不添加选项 $^*$ path 添加 --sysroot=path
选项,path
可以是绝对路径或不为no
和detect
的相对路径*:关于自动探测支持请参阅sysroot说明。
-
rtlib 设置clang的
-rtlib
选项,默认为default
选项 说明 default 不添加 -rtlib
选项,即使用构建clang时指定的默认选项libgcc 添加 -rtlib=libgcc
,指定使用libgcc
compiler-rt 添加 -rtlib=compiler-rt
,指定使用compiler-rt
platform 添加 -rtlib=platform
,即使用目标平台的默认选项 -
unwindlib 设置clang的
-unwindlib
选项,默认为default
选项 说明 default 不添加 -unwind
选项,即使用构建clang时指定的默认选项libgcc 添加 -unwind=libgcc
,指定使用libgcc
$^*$ libunwind 添加 -unwind=libunwind
,指定使用libunwind
$^*$ platform 添加 -unwind=platform
,即使用目标平台的默认选项$^*$ force_libgcc 强制添加 -unwind=libgcc
,指定使用libgcc
$^*$ force_libunwind 强制添加 -unwind=libunwind
,指定使用libunwind
$^*$ force_platform 强制添加 -unwind=platform
,即使用目标平台的默认选项$^*$ *:为避免
argument unused
警告,默认情况下仅在rtlib
选项为compiler-rt
时添加该选项,可以使用force版本强制添加 -
debug_strip 设置在启用调试符号的规则中是否要剥离符号表,默认为
no
选项 说明 no 如果可能,不剥离任何符号 debug 剥离调试符号到独立符号文件 all 剥离调试符号到独立符号文件,然后去除目标文件中所有符号 -
enable_lto 设置在具有发布属性的规则(如
release
,minsizerel
和releasedbg
)中是否启用链接时优化(LTO),默认为true
选项 说明 true 启用LTO false 禁用LTO 该选项在编译器与链接器不匹配时特别有用,因为此时需要禁用LTO才能正常完成构建流程。例如使用
clang
进行编译而使用ld.bfd
进行链接,此时若启用LTO则会提示无法识别文件格式。 通常,clang
使用lld
进行链接,但如果lld
不支持目标平台,则可能发生上述情况。使用该选项可以方便地根据需求设置或禁用LTO。
可以使用xmake show -l toolchains
命令查看所有受支持的工具链名称,具体工具链的信息可以参阅受支持的工具链。
工具链的命名规则和说明如下:
名称 | 说明 |
---|---|
native-tool | 本地工具链,对于clang不会添加--target 选项,对于gcc会查找gcc 工具 |
target-tool | 根据xmake的arch 和plat 选项自动推导出目标平台工具链 |
plat-tool | 目标平台为plat的工具链,对于clang会添加--target=plat 选项,对于gcc会查找plat-gcc 工具 |
注解:tool
表示工具链类型,为clang
或gcc
xmake工具链还会根据目标平台的特性添加一些选项,如为loongarch64-loongnix-linux-gnu
平台添加-Wl,-dynamic-linker=/lib64/ld.so.1
选项以修改动态库加载器路径。