从零开始的LLVM+Clang(一)——下载、配置到第一个pass
前言
这段时间在给老板打工,学习计划内有个LLVM+clang的学习计划,于是年少无知的我开始倒腾起了这玩意儿,走了很多弯路,也看了不少大佬的资料,最后也有了些自己的心得,所以就把记录的笔记摘抄一下,留作备忘,也供大家参考。
一、配置信息
Win10+Ubuntu 20.04.1,最小安装,内存16GB,顺便一提安装时我是直接选择默认的双系统引导安装,坏处就是每次的开机引导是Ubuntu的,除此以外暂时没有发生问题。
二、LLVM+Clang安装
方法一:下载预编译包
地址:https://releases.llvm.org/
该方法适用于系统配置不足以完成编译的计算机体验LLVM,但如果你未来要进行LLVM的自定义和实验,不建议使用该方法。
选择版本,点击download后进入下载页面
在Pre-Built Binaries内,根据自己的版本,选择相应的预编译包,但不是所有版本的预编译包都有。比如之前我只能下载10.0.0内的Ubuntu 18.04的预编译包,然后因为缺少libtinfo.so.5文件就再安装了libncurses5。
环境配置可以参考这位大佬:https://blog.csdn.net/chikey/article/details/85004556
这法子还有一个问题,就是如果clang编译期间需要LLVM相应的头文件,会出现找不到地址的情况,请将相应头文件安装到usr/local的对应文件夹下。
安装成功(可以看到当时我是用虚拟机完成这步的)
方法二:下载官方源码自行编译
安装教程地址:Getting Started with the LLVM System
你可以按照Clang的安装教程下载每个组件
目前clang教程也推荐直接下载llvm-project,所以我就以完整项目开始说明。
1.配置需求
包 | 版本 | 说明 |
---|---|---|
CMake | >=3.13.4 | 用于生成Makefile和工作空间 |
GCC | >=5.1.0 | C/C++编译器 |
python | >=2.7 | 自动测试组件 |
zlib | >=1.2.3.4 | 压缩的组件包 |
GNU Make | 3.79, 3.79.1 | Makefile和build的处理器 |
对Ubuntu,你可以直接sudo apt install
以下组件:cmake、ninja-build(编译中需要,后面会解释)、gcc、g++、zlib1g(zlib对应的包是这个名字)、git。
如果还缺一些组件,请自行sudo apt-cache search
进行查找。
2.下载源码
你可以git clone https://github.com/llvm/llvm-project.git
使用git下载最新版本的源代码,如果下载比较慢记得使用镜像。
也可以在下载页面https://releases.llvm.org/手动下载。
无论使用什么方法,你现在有了一个llvm-project文件夹,里面包含了全部llvm+clang可能用到的组件。
3.编译开始
编译时,务必查看官方安装文档,虽然是英文,但一定要仔细看。
官方文档中的安装步骤是这样的:
-
cd llvm-project
-
mkdir build
-
cd build
-
cmake -G <generator> [options] …/llvm
-
下面是一些常用的启动器:
- Ninja — 用于产生Ninja构建文件。绝大多数llvm开发者使用Ninja(意思是建议你也使用)。
- Unix Makefiles — 用于生成兼容的parallel makefiles
- Visual Studio — 用于生成Visual Studio的工程和解决方案
- Xcode — 用于生成 Xcode 工程
-
一些常用选项,option可以不写,常用的有:
-
-DLLVM_ENABLE_PROJECTS=’…’ ——分号分割你llvm项目中想要额外构建的子项目,比如 clang, clang-tools-extra, libcxx, libcxxabi, libunwind, lldb, compiler-rt, lld, polly, or debuginfo-tests,我另外开了个文件夹构建clang,所以这里就没有使用这个option。例如,构建 LLVM, Clang, libcxx和libcxxabi, 写 -DLLVM_ENABLE_PROJECTS=“clang;libcxx;libcxxabi”.
-
-DCMAKE_INSTALL_PREFIX=directory —— 等号后面的“directory”表示需要写清楚你想要LLVM tools和libraries安装在哪个路径下,默认路径是/usr/local。一般不用改
-
-DCMAKE_BUILD_TYPE=type — 选择你构建的版本,可选版本有Debug, Release, RelWithDebInfo和MinSizeRel。默认是Debug。(警告:建议选择release版本,debug版本的编译开销很大,我双系统下的Ubuntu,16GB内存+8GB的swap空间仍然会在link阶段卡死,所以不建议使用默认版本)
-
-DLLVM_ENABLE_ASSERTIONS=On ——编译时开启断言检查,默认开启后只对Debug版本有用,对其他build版本无用。因为我们用了release所以也不用写。
-
-
-
cmake --build . [–target <target>] 或者其他build方法
- 默认的build写法 (例如cmake --build . 或 make)会构建整个LLVM.
- 写了check-all的话 (例如ninja check-all) 会运行回归测试,保证所有文件按顺序工作
- CMake会为每个工具和库生成build target,并且很多LLVM的子工程(sub-projects)会生成自己的check-的target
- 运行一条build的话会很慢(因为不能并行,比如我就会是最高速度的1/4),一定要使用并行的方式运行,对于make工具来说,用make -j.(make -4j)
综合文档和我遇到的错误,我的安装命令如下:
cd llvm-project
mkdir build
cd build
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ../llvm
sudo cmake --build . -j4 --target install
使用Ninja,只安装release版本,最后一条命令会把llvm安装到系统目录下。
注意安装时文件可能不全,/usr/local/include/llvm/Config/config.h不会被安装进去,需要手动从build文件夹内复制出来。在运行编译时可以根据缺少头文件自行sudo cp
安装完之后发现clang没被安装,那我们就仿照这个过程,再来一遍:
mkdir clang-build
cd clang-build
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ../clang
sudo cmake --build . -j4 --target install
大功告成,这个时候可以写个hello world尝试编译一下了~
方法三:apt-get(不推荐)
有一次搜索的时候偶然发现其实Ubuntu提供了llvm的安装。
如果只是想试一下的话可以sudo apt install llvm/clang
直接一步到位装好。
当然,这样的话自己就没法修改原代码了。
三、Hello World Pass!
既然已经安装了,那么按照惯例,我们应该整一个hello world来庆祝一下。
如果下载了源码,llvm很贴心的已经准备好了hello world的pass文件了,完全可以直接运行,当然,我们最好还是自己写一下。
官方教程地址:https://llvm.org/docs/WritingAnLLVMPass.html
待补充,等推免的日子,好艰难,写文动力不足