在Ubuntu中用CLion来管理LLVM/Clang工程


前言

LLVM作为一个大型的编译套件,各种类继承关系,函数调用等十分繁杂,在Ubuntu下为了更好的,更方便的阅读LLVM套件的源码,希望通过CLion这个优秀的ide来管理这个工程。以下详细的记录了我在Ubuntu18.04.1中安装CLion和编译LLVM/Clang的步骤。对于初学者十分友好!!!


1、安装配置CLion

1.1、换源

目前我的系统仍然是刚刚安装的Ubuntu,先换上阿里源(以方便后续快速下载安装依赖包)

# 1.先用root权限打开sourses.list文件
$ sudo gedit /etc/apt/sources.list

# 2.将文件中原有的内容删除,复制粘贴下面阿里源,保存退出
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

# 3.在shell中输入以下指令更新
$ sudo apt update && sudo apt upgrade

1.2、下载安装CLion

CLion官网获取CLion的安装包,此处我安装的是2019.3.6版本
Version 2019.3
通过Ubuntu中火狐浏览器下载的安装包应该在用户的Download目录中,我这里将其移动到用户目录中,并通过以下命令解压:

$ tar -zxvf CLion-2019.3.6.tar.gz 

此时,用户目录会有以下两个文件:
clion解压后文件
在当前用户目录下输入以下命令即可展开CLion的安装:

$ cd clion-2019.3.6/bin/
$ ./clion.sh

首先会弹出以下要你选择配置文件的窗口,选择Do not import settings,然后点击OK即可。
然后只需要一直continue即可,直到出现以下界面,在以下界面For all users处打上勾勾,点击start,便完成了CLion的安装(CLion是一个收费的ide,但是可以先试用30天,自己可以想办法激活哦!)。

1.3 、配置C/C++编译环境

在安装好CLion后打开CLion,如下图:

这里新建一个工程,点击New Project,跳转如下:

这里就创建一个C++ Executable,这在CLion里面会生成一个CMake工程,点击creat,跳转如下:

可见在生成的工程里面build(那个锤子按钮)和run(播放按钮)都是灰色的,下面的CMake栏里面也有报CMake Error,这是因为CLion的C/C++编译toolchains还不完备(因为Ubuntu是默认不安装C/C++编译套件的)。先关闭CLion,打开命令行,输入如下命令安装C/C++编译套件:

# 我们在ubuntu上编译程序,默认是有gcc的,但是没有g++。如果自己来安装g++也可以,不过它涉及到一些依赖库,有点麻烦。有个叫build-essential的包,里面包含了很多开发必要的软件包,很全,很方便。
$ sudo apt-get install build-essential 

这时候重新打开CLion,会发现刚刚那个test工程可以build和run了(咦,我们好像没有安装CMake,应该是clion里面已经集成CMake)。我们可以通过点击File->Settings->Build,Execution,Deployment->toolchain看一下,可以看到CLion已经自动找到了刚刚安装的gcc,g++和make,如图:

到此,CLion的构建环境搭建好了,接下来通过CLion来编译LLVM/Clang。


2、编译LLVM/Clang

2.1、获取llvm-project

进入LLVM下载界面,我目前的稳定版本更新到11.0.0,如下图:

可以看到在Sources下有很多下载链接,如果你只需要LLVM和Clang的话,可以只下载第二个(LLVM)和第三个(Clang)的源码,因为我后续要用到clang-tools-extra中的clang-tidy作静态分析,而且还有可能会用到其他更多的外部项目,所以这里下载第一个llvm-project monorepo source code,里面包含其下所有的LLVM套件。
将下载好的文件放入用户目录,用以下命令对其解压:

$ tar xvJf llvm-project-11.0.0.tar.xz 

得到llvm-project-11.0.0文件夹,进入其中,其目录树如下:

.
├── clang
├── clang-tools-extra
├── compiler-rt
├── CONTRIBUTING.md
├── debuginfo-tests
├── flang
├── libc
├── libclc
├── libcxx
├── libcxxabi
├── libunwind
├── lld
├── lldb
├── llvm
├── mlir
├── openmp
├── parallel-libs
├── polly
├── pstl
├── README.md
└── utils

2.2、LLVM编译环境配置

编译LLVM需要很多的依赖包,官网的要求如下:

我们这里输入以下命令依次安装:

# GCC套件和Make前面装clion的时候已经装好了
# 装zlib
$ sudo apt-get install zlib1g zlib1g-dev
# 装python
$ sudo apt-get install python3 python
# 再装个git,可以配合clion来管理源代码
$ sudo apt-get install git

这样,依赖包就装好了!下面进入更重要的环节!也是我踩过最多坑的地方!!
编译Debug版的LLVM套件不仅需要很大的内存,而且编译得到的文件会消耗很多磁盘空间!!
所以首先保证你的虚拟机的磁盘空间最好在100G以上!
接下来就是内存了,我自己一开始仅仅开了8G内存,在链接clang的时候直接内存爆掉了。那么怎么处理内存的问题呢,首先,我将虚拟机的内存开到了12G(物理机是16G),然后挂载了一个8G的swap分区!根据经验,你的内存+swap分区大小最好>16G!!
根据以下命令,扩大swap分区大小:

# 1. 创建8G的空文件,以备挂载为swap分区(该过程可能需要半分钟)
$ sudo dd if=/dev/zero of=/tmp/swap1 bs=1M count=8192
# 2. 将/tmp/swap1格式化为swap分区,重启后自动没了
$ sudo mkswap /tmp/swap1
# 3. 挂载
$ sudo swapon /tmp/swap1
# 4. 用free指令看一下交换分区大小
$ free -h
# 5. 显示如下,可见在我系统中内存+swap分区大小已经有了20G左右
               total        used        free      shared  buff/cache   available
Mem:            11G        1.4G        136M         18M         10G          9G
Swap:            9G          0B          9G

至此,编译环境都准备好了,接下来在CLion中编译LLVM/Clang!!!

2.3、编译LLVM/Clang

首先,在前文所说的llvm-project-11.0.0目录下创建build目录,作为构建的目录:

$ cd ~/llvm-project-11.0.0/
$ mkdir build

然后打开CLion,点击Open File or Project,然后选择llvm源码文件夹,点击OK打开,如下图:

这时候会进入CLion,并且CLion会根据llvm文件夹下的CMakeLists.txt自动执行CMake构建出一个目录cmake-build-debug,如下图:

但这不是我们想要的,我们需要自己配置CMake的参数来进行生成。为此,进行接下来的操作:首先点击Tools->CMake->Chang Project Root,将其改为与llvm同级目录的build文件夹;然后点击File->Settings->Build, Execution, Deployment->CMake进入CMake的配置窗口;在CMake配置窗口内,将Generate Path改为刚刚那个build的文件夹,同时将CMake options里面的内容添加以下选项:


点击OK,配置完成!
这时,CLion又会自动执行CMake生成项目,生成目录如下(没有把llvm同级文件夹下其他不需要的文件夹包括进来):

现在,你可以删除刚刚自动生成的cmake-build-debug的目录,并且进行LLVM/Clang的构建了!
开始编译:点击Build->Build All in ‘Debug’,则开始正式编译项目了,编译生成的可执行文件均存放在build/bin/目录下
历经4.5h,终于编译成功了,这时候可以去进入build/bin/目录下运行各种LLVM套件中的各种工具啦!!!

3、总结

编译LLVM的Debug版本需要特别大的内存,我在实践中还是编译的RelWithDebInfo版本,对于阅读源码调试源码暂时够用了。以下是我的CMake参数配置:

在用CMake生成构建文件时,有一些常用的CMake选项如下:

  • CMAKE_BUILD_TYPE:指定构建的类型,包括Debug, Release, RelWithDebInfo和MinSizeRel四种版本,默认是Debug。
  • CMAKE_INSTALL_PREFIX:指定构建时的安装目录。
  • LLVM_TARGETS_TO_BUILD:指定构建的目标架构。包括:AArch64, AMDGPU, ARM, BPF, Hexagon, Mips, MSP430, NVPTX, PowerPC, Sparc, SystemZ, X86, XCore。默认全开,也可以用分号隔开来自己指定需要生成的架构。
  • LLVM_ENABLE_PROJECTS:一个分号分隔的列表,可以选择要额外构建的其他LLVM子项目。(只有在使用并排的项目布局时才有效,就是上文提到的那种目录树布局)。默认列表为空。可以包括:clang, clang-tools-extra, libcxx, libcxxabi, libunwind, lldb, compiler-rt, lld, polly, debuginfo-tests。

猜你喜欢

转载自blog.csdn.net/qq_21746331/article/details/110198265