clang/llvm 编译工具链支持¶
本章介绍如何使用 clang/llvm 编译工具链构建 openEuler Embedded。
clang/llvm 介绍¶
LLVM 项目是模块化和可重用编译器以及工具链的集合,clang 是其编译器前端。相比较于GNU编译工具链,其优势在于编译速度更快,静态检查工具更加完善,可拓展性更强等等。
GNU工具链与LLVM工具链主要区别如下表:
项目 |
GNU工具链 |
LLVM工具链 |
---|---|---|
C编译器 |
gcc |
clang |
C++编译器 |
g++ |
clang++ |
binutils |
GNU binutils |
LLVM binutils |
汇编器 |
GNU as |
集成汇编器 |
链接器 |
ld.bfd,ld.gold |
LLVM linker ld.lld |
运行时 |
libgcc |
compiler-rt |
原子操作 |
libatomic |
compiler-rt |
C语言库 |
GNU libc glibc |
LLVM libc |
C++标准库 |
libstdc++ |
libc++ |
C++ABI |
libsupcxx |
libc++abi |
栈展开 |
libgcc_s |
LLVM libunwind |
meta-clang 层介绍¶
meta-clang
层包含使用 clang/llvm 编译器工具链所需要的recipes和bbclass文件,由于 openeuler 使用 external-toolchain 机制,无需在 yocto 工程中编译 clang/llvm 工具链。
meta-clang层中主要起作用的是clang.bbclass文件,该文件用来控制编译时传入clang/llvm编译器工具链变量和依赖,除此之外,目前还有一小部分软件包并不完美支持使用clang/llvm来编译,nonclangable.conf文件记录了这些软件包的情况。
构建指导¶
clang/llvm 编译工具链获取:
源码构建
获取编译容器
docker pull swr.cn-north-4.myhuaweicloud.com/openeuler-embedded/cross-compile-bisheng:v0.1
进入容器
docker run -idt --network host --name clang_compile swr.cn-north-4.myhuaweicloud.com/openeuler-embedded/cross-compile-bisheng:v0.1 bash docker exec -it clang_compile bash
下载llvm-project
cd ~ git clone https://gitee.com/openeuler/llvm-project.git -b dev_15x
初始化环境并编译
source /etc/profile cd llvm-project ./build.sh -e -o -s -i -b release
预编译发布
直接从预编译发布网站获取 LLVM
构建环境
参考 基于 oebuild 快速构建 初始化容器环境,生成配置文件时使用如下命令
oebuild generate -p platform -d build_direction -t /path/to/clang-llvm-15.0.3 -f clang
键入
oebuild bitbake
进入容器环境后,拷贝arm64架构GCC库至编译器目录/usr1/openeuler/native_gcc/
为oebuild默认挂载的编译器目录sudo cp /usr1/openeuler/gcc/openeuler_gcc_arm64le/* /usr1/openeuler/native_gcc/
Attention
当前只支持arm64架构
构建命令
bitbake openeuler-image-llvm
SDK生成
bitbake openeuler-image-llvm -c populate_sdk