Gwok HiujinGwok Hiujin

The Bird of Hermes is my name, eating my wings to make me tame.

Aug 23, 2023CSA1043 words in 5 min


『CSA』从0构建Clang前端

比起从 0 构建 Clang 前端更应该叫如何重装 LLVM …… 🤡 少说也从头重装过五六次了。


操作系统:Ubuntu 18.04

配置 C++ 环境和必要工具

根据 LLVM 官网指引 Getting Started with the LLVM System ,截至 23/8/19 时对软件环境的要求如下(一般来说安装当时最新版应该没问题):

pPYPn2Q.png

安装 GCC、G++ 和必要的库

1
2
3
sudo apt-get install gcc
sudo apt-get install g++
sudo apt install libssl-dev

从源码构建 CMake

  • 从 CMake 官网 https://cmake.org/download/ 下载最新的 CMake 源码包
  • 解压源码包后进入该文件夹目录,在该目录下开启终端,运行以下代码
1
2
3
./bootstrap
make
sudo make install

从源码构建 Zlib

pPYPMKs.png

  • 解压源码包后进入该文件夹目录,在该目录下开启终端,运行以下代码
1
2
3
./configure
make
sudo make install

其他

  • 安装 python( sudo apt get install python3 python3-pip
  • 安装 GNU Make(先使用 make -v 查看本地有没有 make,若没有,运行 sudo apt-get install make 即可)
  • 安装 Git(运行 sudo apt install git 即可)

编译安装 Clang-LLVM

大体按照官网指引即可,但官网部分指令运行后会出错,需要修改。下面的是可以正确运行的版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir ~/clang-llvm
cd ~/clang-llvm
git clone https://github.com/llvm/llvm-project.git
cd ~/clang-llvm
git clone https://github.com/martine/ninja.git
cd ninja
git checkout release
python3 ./configure.py --bootstrap
sudo cp ninja /usr/bin/
cd ~/clang-llvm
mkdir build && cd build
cmake -G Ninja ../llvm-project/llvm -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" -DLLVM_BUILD_TEST=ON -DCMAKE_BUILD_TYPE="Release"
ninja
ninja check # Test LLVM only.
ninja clang-test # Test Clang only.
ninja install

ninja 构建过程中可能遇到编译中止问题,一般是虚拟机内存不足导致的,解决方案见 https://blog.csdn.net/weixin_44796670/article/details/121234446 。或者一开始构建虚拟机的时候就把内存给大点 / 手动扩展虚拟机内存也能解决问题(虽然也经历过手动扩容两三次都不够用的情况 …… )。

扩展虚拟机内存后如果无法启动虚拟机(表现为开机黑屏),解决方案见 Ubuntu20.04虚拟机扩展磁盘后系统无法启动 - 黑夫和惊 - 博客园 (cnblogs.com)

由于 LLVM 项目的编译流程非常非常吃内存,ninja 构建阶段结束之后最好及时删除 swap 分区,上面的博客里也介绍了方法。很多时候 LLVM 构建过程中出现的问题都是内存的问题 🤡

有两行用于测试的代码,其实我运行的时候并没有通过所有的测试(LLVM 测试失败了 4 个,Clang 测试成功通过),但似乎并不影响后面的使用,在论坛询问后也没有很好的预后方案。

1
2
3
4
5
6
7
8
9
10
11
12
13
# LLVM TEST
Failed Tests (4):
LLVM :: tools/llvm-ar/error-opening-permission.test
LLVM :: tools/llvm-dwarfdump/X86/output.s
LLVM :: tools/llvm-ifs/fail-file-write.test
LLVM :: tools/llvm-ranlib/error-opening-permission.test

Testing Time: 3873.59s
Skipped : 24
Unsupported : 2002
Passed : 90585
Expectedly Failed: 179
Failed : 4

完成以上工作后,在终端运行 cmake-gui ../llvm-project/llvm ,如果想要将 clang 作为默认编译器的话,将 CMAKE_CXX_COMPILER 的值设置为 clang++ 的安装路径(也可以不改,直接用 gcc 编译器),但最重要的是要将 CMAKE_BUILD_TYPE 的值设置为 Release。填写完后,依次点击 Configure 和 Generate。待 Generate 成功结束后,回到终端,在 build 目录下最后运行一次 ninja

pPYPuvj.jpg

编译 Clang 库编写的解析工具

这一步需要将写好的 Clang 工具文件夹(包括 cpp 文件和 CMakeLists,如官网上的例子 /loop-convert )复制一份到 ~/clang-llvm/llvm-project/clang-tools-extra 路径下,对工具进行安装。具体步骤:

  • 编辑 ~/clang-llvm/llvm-project/clang-tools-extra/CMakeLists.txt ,加入一行 add_subdirectory(loop-convert)
  • 回到 ~/clang-llvm/build 目录下,再次运行 ninja

工具安装结束后可以通过 ~/clang-llvm/build/bin/loop-convert 调用工具。

Buy me a cup of coffee ☕.