从零开始的LLVM+Clang(一)——下载、配置到第一个pass

从零开始的LLVM+Clang(一)——下载、配置到第一个pass

  • 前言
  • 一、配置信息
  • 二、LLVM+Clang安装
        • 方法一:下载预编译包
        • 方法二:下载官方源码自行编译
          • 1.配置需求
          • 2.下载源码
          • 3.编译开始
        • 方法三:apt-get(不推荐)
  • 三、Hello World Pass!

前言

这段时间在给老板打工,学习计划内有个LLVM+clang的学习计划,于是年少无知的我开始倒腾起了这玩意儿,走了很多弯路,也看了不少大佬的资料,最后也有了些自己的心得,所以就把记录的笔记摘抄一下,留作备忘,也供大家参考。

一、配置信息

Win10+Ubuntu 20.04.1,最小安装,内存16GB,顺便一提安装时我是直接选择默认的双系统引导安装,坏处就是每次的开机引导是Ubuntu的,除此以外暂时没有发生问题。

二、LLVM+Clang安装

方法一:下载预编译包

地址:https://releases.llvm.org/
该方法适用于系统配置不足以完成编译的计算机体验LLVM,但如果你未来要进行LLVM的自定义和实验,不建议使用该方法。
从零开始的LLVM+Clang(一)——下载、配置到第一个pass_第1张图片
选择版本,点击download后进入下载页面
从零开始的LLVM+Clang(一)——下载、配置到第一个pass_第2张图片
在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的对应文件夹下。
从零开始的LLVM+Clang(一)——下载、配置到第一个pass_第3张图片
安装成功(可以看到当时我是用虚拟机完成这步的)

方法二:下载官方源码自行编译

安装教程地址: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 [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 ] 或者其他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

待补充,等推免的日子,好艰难,写文动力不足

你可能感兴趣的:(linux,cmake,llvm)