在 ubuntu 20.04 中源码编译 llvm-clang 15.0.7

举报
maijun 发表于 2023/02/05 00:14:12 2023/02/05
【摘要】 本文主要介绍如何在 ubuntu 20.04 中,使用 cmake 方式构建 llvm clang 15.0.7.

本文主要介绍在 Ubuntu 20.04 中,如何基于源码方式编译 llvm 和 clang 当前的最新版本 15.0.7(有多种构建方式,比如 cmake 和 ninja 等,本文介绍如何使用 cmake 构建). 使用的 Ubuntu 20.04 是运行在 Windows 10 的 wsl2 中。

1. 准备工作

1.1 源码下载

本文介绍安装 llvm 和 clang,主要目的是基于 llvm 和 clang 进行二次开发,因此我们只安装 llvm 和 clang。需要下载下面的三个包(下载的地址:Release LLVM 15.0.7 · llvm/llvm-project · GitHub):

说明:llvm 15.0.7 和 之前版本在安装的时候的一个很大的区别,就在于必须同时下载 cmake,否在在编译时会报各种错误,这里就不给大家展示具体报错了,可以参考下面链接(LLVM 15.0.0-rc1: CMake Error at cmake/modules/CMakeLists.txt · Issue #56971 · llvm/llvm-project · GitHub)了解。

1.2 源码解压

主要操作如下:

  • 解压前面一步下载到的三个文件
  • llvm-15.0.7.src 重命名为 llvm(图好看,这一步可以不做)
  • clang-15.0.7.src 重命名为 clang,放到 llvm 源码的 tools 目录下
  • cmake-15.0.7.src 的 Modules 目录下面的文件,都拷贝到 llvm 源码的 cmake/modules 下面

脚本如下:

tar -xf clang-15.0.7.src.tar.xz
tar -xf cmake-15.0.7.src.tar.xz
tar -xf llvm-15.0.7.src.tar.xz

mv llvm-15.0.7.src llvm

mv clang-15.0.7.src clang
mv clang llvm/tools/

cp cmake-15.0.7.src/Modules/* llvm/cmake/modules/

1.3 依赖库安装

llvm 在安装时,需要依赖如下的部分组件(均可以直接通过 apt install,基于 ubuntu 20.04,安装的版本都可以直接符合要求):

  • gcc和g++(直接安装的是 9.4.0版本)
  • cmake(3.16.3)
  • make(4.2.1)
  • python3(3.8.10)

其他的库暂时也没有遇到。

2. 安装 llvm 15.0.7

2.1 基本执行命令

如下面的脚本所示:

cd llvm
mkdir build
cd build
cmake ../ -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_INCLUDE_BENCHMARKS=OFF
		 
make -j8 && make install

说明:

在上面,相对于之前构建  llvm 10 等版本,新增了一个参数 LLVM_INCLUDE_BENCHMARKS 设置为 OFF,其实我也不是很清楚这个参数的含义,只是不设置这个参数,会报下面的错误:

CMake Error at CMakeLists.txt:1294 (add_subdirectory):
  add_subdirectory given source
  "/mnt/d/wsl/test/llvm/install/llvm/../third-party/benchmark" which is not
  an existing directory.

2.2 cmake 参数扩展

编译 llvm,除了上面的基本的 cmake 的参数,还有大量的其他参数,大家可以参考 llvm 官方文档:Building LLVM with CMake — LLVM 17.0.0git documentation

这里,介绍一部分我们使用的参数,给大家参考:

cmake ../ -G "Unix Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ \
         -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_LINK_LLVM_DYLIB=ON \
		 -DCMAKE_INSTALL_PREFIX=/mnt/d/wsl/tools/llvm-15.0.7.obj \
		 -DCMAKE_MODULE_LINKER_FLAGS_RELEASE="-Wl,-z,relro,-z,now,-z,noexecstack -fstack-protector-strong" \
		 -DCMAKE_SHARED_LINKER_FLAGS_RELEASE="-Wl,-z,relro,-z,now,-z,noexecstack -fstack-protector-strong" \
		 -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-pie -Wl,-z,relro,-z,now,-z,noexecstack -fstack-protector-strong" \
		 -DLLVM_ENABLE_LIBCXX=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF \
		 -DCMAKE_CXX_FLAGS_RELEASE="-O3 -fPIE -fstack-protector-strong"

如上,最主要的配置,是新增了一部分编译器的安全编译选项。大家可以参考 gcc 的官方文档,了解编译器的安全编译选项的内容。

3. 安装完成确认

maijun@LAPTOP-EEQ9H1QS:/mnt/d/wsl/tools/llvm-15.0.7.obj/bin$ ./clang -v
clang version 15.0.7
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /mnt/d/wsl/tools/llvm-15.0.7.obj/bin/.
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Candidate multilib: x32;@mx32
Selected multilib: .;@m64
maijun@LAPTOP-EEQ9H1QS:/mnt/d/wsl/tools/llvm-15.0.7.obj/bin$ ./llvm-config --version
15.0.7

4. 安装问题解决

4.1 collect2: fatal error: ld terminated with signal 9

这个报错是在编译 Debug 版本的时候遇到的,在编译 Release 或者 MinSizeRel 时并没有遇到。报错的原因:swap空间不够,需要创建更多的 swap 空间。

查看可用的swapon空间:

sudo swapon --show

创建更多的 swap 空间的方法:

# 创建 swapfile 文件夹
sudo mkdir /swapfile

cd /swapfile
# 在 swapfile 文件夹下,创建一个大小为20000000的空文件
sudo dd if=/dev/zero of=swap bs=1024 count=20000000

# 将生成的文件转换成swap类型的文件
sudo mkswap -f swap

# 激活 swap 文件
sudo swapon swap

如果使用完,要卸载的话,使用 swapoff:

sudo swapoff swap

5. 参考

① llvm 官方安装文档:Building LLVM with CMake — LLVM 17.0.0git documentation

② 问题解决:ubuntu增加swap交换空间_ubuntu swap_littleRpl的博客-CSDN博客

6. 后记

其实 llvm 15.0.7 安装并不复杂,但是前后也花了一段时间,最主要是下面的三点问题:

  • cmake必须下载并放到llvm源码中
  • benchmark的报错
  • 我使用的wsl2 ubuntu 20.04 性能太差,安装 llvm 需要的时间太长(关闭 windows defender 也没用,感觉直接在里面执行 shell命令,还不如 clion + wsl2 运行的快)

如果大家有针对 wsl2 ubuntu 20.04 操作提升性能的方法,可以留言告诉我。




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。