Skip to content

24bit-xjkp/toolchains

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GCC和LLVM工具链

工具链

本项目提供开发版的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 $^{[1]}$ 链接器脚本,用于代替autotools生成的带有绝对路径的链接器脚本以得到可移植的工具链
.gdbinit gdb配置文件,用于自动配置pretty-print
auto_gcc.py gcc构建脚本的接口,可以获取各种信息和实现全自动构建 $^{[2]}$
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 $^{[3]}$ LLVM工具链构建脚本 $^{[4]}$
plat_native_gcc.py $^{[3]}$ GCC本地工具链/加拿大工具链构建脚本 $^{[4]}$
plat_host_plat_target_gcc.py $^{[3]}$ GCC交叉工具链/加拿大交叉工具链构建脚本 $^{[4]}$

注释:

[1] 字段说明如下表所示:

字段 说明
prefix 一般为arch,若存在多个target则会增加vendor字段(如loongnix)或abi字段(如hf),取决于target间差异
lib glibc中库名称,如libclibm,取决于哪些库使用了链接器脚本而非软链接
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支持

本项目为受支持的工具链提供了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-clangtarget-gcc工具链。使用这两个工具链时脚本会尝试根据platarch推导出目标平台,若无法推导则配置失败,此时应该指定一个具体的工具链。 在常用平台上编译时可以直接使用这两个工具链,而无需在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支持文件位于xmake文件夹下,下面是各个文件的说明:

文件 说明
option.lua 提供各种xmake配置选项,包含utility/utility.lua文件
rule.lua 提供4种常用xmake规则,包含option.lua文件
toolchain.lua 提供各种xmake工具链,包含option.luautility/target.lua文件
utility/target.lua 受支持的目标平台表,内部文件
utility/utility.lua 提供各种配置工具,内部文件

其中option.lua可以单独使用,此时需要使用add_options来关联选项和目标。如果使用toolchain.lua中定义的工具链,这些选项会自动添加到相应工具链中。 utility/target.lua可以通过includes函数引入到描述域中,此时函数和变量均可使用;也可以通过import函数引入脚本域,此时仅函数接口可用。

xmake选项说明

下面是option.lua提供的xmake配置选项说明:

  • march 设置工具链的-march选项,默认为default

    选项 说明
    no 不添加-march选项
    detect 如果可以则添加-march=native选项,否则不添加-march选项
    arch 添加-march=arch选项,arch不能为nodetect
  • sysroot 设置工具链的--sysroot选项,默认为detect

    选项 说明
    no 不添加--sysroot选项
    detect 工具链为clang则自动探测sysroot,为gcc则不添加选项 $^*$
    path 添加--sysroot=path选项,path可以是绝对路径或不为nodetect的相对路径

    *:关于自动探测支持请参阅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 设置在具有发布属性的规则(如releaseminsizerelreleasedbg)中是否启用链接时优化(LTO),默认为true

    选项 说明
    true 启用LTO
    false 禁用LTO

    该选项在编译器与链接器不匹配时特别有用,因为此时需要禁用LTO才能正常完成构建流程。例如使用clang进行编译而使用ld.bfd进行链接,此时若启用LTO则会提示无法识别文件格式。 通常,clang使用lld进行链接,但如果lld不支持目标平台,则可能发生上述情况。使用该选项可以方便地根据需求设置或禁用LTO。

xmake工具链说明

可以使用xmake show -l toolchains命令查看所有受支持的工具链名称,具体工具链的信息可以参阅受支持的工具链。 工具链的命名规则和说明如下:

名称 说明
native-tool 本地工具链,对于clang不会添加--target选项,对于gcc会查找gcc工具
target-tool 根据xmake的archplat选项自动推导出目标平台工具链
plat-tool 目标平台为plat的工具链,对于clang会添加--target=plat选项,对于gcc会查找plat-gcc工具

注解:tool表示工具链类型,为clanggcc

xmake工具链还会根据目标平台的特性添加一些选项,如为loongarch64-loongnix-linux-gnu平台添加-Wl,-dynamic-linker=/lib64/ld.so.1选项以修改动态库加载器路径。

About

GCC and LLVM toolchains

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages