本项目提供开发版的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 | arm-fpv4-none-eabi |
| gcc | x86_64-linux-gnu | arm-nonewlib-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 | riscv64-none-elf |
| 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-linux-gnu | mips64el-linux-gnuabi64 |
| 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 | arm-fpv4-none-eabi |
| gcc | x86_64-w64-mingw32 | arm-nonewlib-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 | riscv64-none-elf |
| gcc | x86_64-w64-mingw32 | aarch64-linux-gnu |
| gcc | x86_64-w64-mingw32 | arm-linux-gnueabi |
| gcc | x86_64-w64-mingw32 | arm-linux-gnueabihf |
| gcc | x86_64-w64-mingw32 | mips64el-linux-gnuabi64 |
| llvm | x86_64-linux-gnu | X86, ARM, AArch64, LoongArch, RISCV, Mips |
| llvm | x86_64-w64-mingw32 | X86, ARM, AArch64, LoongArch, RISCV, Mips |
本项目提供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交叉工具链/加拿大交叉工具链构建脚本 |
| download.py |
自动从github和其他源下载构建GCC和LLVM所需的包 |
注释:
[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] 构建脚本可作为库使用,也可直接执行。引用这些脚本可以获取工具链的构建环境和一些实用函数,直接执行可以完成自动化构建
[5] 该脚本支持如下选项:
| 选项 | 说明 |
|---|---|
| --glibc_version | 设置目标平台的Glibc版本,默认为系统Glibc版本 |
| --home | 设置源码树的根目录,默认为$HOME |
| --clone_type | Git克隆类型,默认为部分克隆 |
| --depth | 使用Git进行浅克隆时的克隆深度,默认为1 |
| --ssh | 是否在从github克隆时使用SSH,默认为否 |
| --extra_libs | 要下载或更新的额外包 |
| --retry | 网络操作失败时最大重试次数,默认为5次 |
| --remote | 设置首选git源,在源可用时使用源以加速克隆,默认为github |
| --update | 更新已安装的包,要求所有包均已安装 |
| --download | 下载缺失的包,不会更新已安装的包 |
| --auto | 先下载缺失的包,然后更新已安装的包。由于二次检查,可能会需要更多时间。 |
| --system | 打印需要的系统包 |
| --remove | 删除已经安装的包,不指定包名则删除所有安装的包 |
| --import | 从文件中导入配置 |
| --export | 将配置导出到文件 |
| --help | 打印帮助信息 |
remote选项支持的git源如下:
| 源 | 说明 |
|---|---|
| github | 默认远程源,部分为仓库镜像,支持ssh克隆 |
| native | 各个git库的原生远程源,可以克隆最新的提交,但可能访问较慢,部分仓库使用git协议 |
| nju | 南京大学开源镜像站,包含gcc、binutils、linux、glibc、llvm仓库镜像 |
| tuna | 清华大学开源软件镜像站,镜像同上 |
| bfsu | 北京外国语大学开源软件镜像站,镜像同上 |
| nyist | 南阳理工学院开源软件镜像站,镜像同上 |
| cernet | 校园网联合镜像站,mirrorz-302 智能选择,镜像同上 |
在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 linuxxmake支持也提供了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 crossxmake支持文件位于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,指定使用libgcccompiler-rt 添加 -rtlib=compiler-rt,指定使用compiler-rtplatform 添加 -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选项以修改动态库加载器路径。