Skip to content

Latest commit

 

History

History
279 lines (183 loc) · 9.12 KB

File metadata and controls

279 lines (183 loc) · 9.12 KB

准备LLVM学习环境

[TOC]

LLVM 3.5

书籍《Getting Started with LLVM Core Library》1中是基于LLVM 3.4的,而附录是基于LLVM 3.5.0的。这里准备LLVM 3.5.0的环境。

有很多种方式:自己编译安装、采用已编译的发行版本、Docker一键式部署安装环境。这里提供Docker镜像的方式,快速部署。其他方式也有尝试,详见……。

通过Docker 安装

镜像
rafaelauler/llvmbook
同jahentao/llvmbook:origin
这是书《Getting Started with LLVM Core Library》1 Appendix中提供的LLVM 3.5学习镜像。比较大我下载了下来。
以防网络问题,提供了镜像tar包,下载导入即可:
链接:https://pan.baidu.com/s/1W5HOxkMC5S9b6kB7mrV1Lw
提取码:rt3u
jahentao/llvmbook:llvmbook-ssh 在以上jahentao/llvmbook:origin镜像的基础上,安装了ssh,配合VS Code ssh远程开发。
启动容器时可以映射到8008端口。用户名root,密码123456。学习使用,不考虑安全问题。
以防网络问题,提供了镜像tar包,下载导入即可:
链接:https://pan.baidu.com/s/1drNXMFa_7v4XD_JsiNoRVA
提取码:e7ol

从容器启动镜像:

docker run --name llvmbook -p 8008:22 -itd jahentao/llvmbook:llvmbook-ssh

解释一下,-p, --publish list将容器22端口在主机8008端口公开,-t, --tty分配一个pseudo-TTY伪终端,-d, --detach容器在后台运行并打印容器ID,容器名指定为llvmbook

不进入容器,启动ssh(llvmbook-ssh镜像已安装)

docker exec -d llvmbook service ssh start

或进入容器,启动ssh

docker exec -it llvmbook /bin/bash
root@5be544e81dcc:/# service ssh start

在Windows VS Code中连接虚拟机中的容器,密码123456

在Windows VS Code中连接虚拟机中的容器

在VS Code中Remote - SSH插件能够轻松编辑远程文件

在VS Code中ssh remote插件能够轻松编辑远程文件

禁用VS Code更新,VS Code自动更新导致远程的VS Code Server版本也要更新,时间不能浪费在无意义的地方。

禁用VS Code更新

VS Code可以在远程安装一些插件:C/C++等提高效率。

关闭容器

docker stop llvmbook

启动容器

docker start llvmbook

进入容器后,测试clang是否安装好的小技巧:

root@5be544e81dcc:/workspace# install/bin/clang++ -o test -x c++ - <<< '#include <iostream>
> int main() { std::cout << "Hello World!\n"; return 0; }'
root@5be544e81dcc:/workspace# ./test
Hello World!
root@5be544e81dcc:/workspace#

clang++不会依赖文件扩展名确定语言,需要-x指定语言。更为详细地编译选项详见compile-flag.md

从《Getting Started with LLVM Core Library》1书中,也可以积累到编译clang小程序的Makefile,可以用于以后使用。

LLVM_CONFIG?=llvm-config

ifndef VERBOSE
QUIET:=@
endif

SRC_DIR?=$(PWD)
LDFLAGS+=$(shell $(LLVM_CONFIG) --ldflags)
COMMON_FLAGS=-Wall -Wextra
CXXFLAGS+=$(COMMON_FLAGS) $(shell $(LLVM_CONFIG) --cxxflags) -fno-rtti
CPPFLAGS+=$(shell $(LLVM_CONFIG) --cppflags) -I$(SRC_DIR)
LLVMLIBS=$(shell $(LLVM_CONFIG) --libs bitreader support)
SYSTEMLIBS=$(shell $(LLVM_CONFIG) --system-libs)

HELLO=helloworld
HELLO_OBJECTS=hello.o
EXAM_OBJECTS=exam.o

default: $(HELLO)

%.o : $(SRC_DIR)/%.cpp
	@echo Compiling $*.cpp
	$(QUIET)$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<

$(HELLO) : $(HELLO_OBJECTS)
	@echo Linking $@
	$(QUIET)$(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) $^ $(LLVMLIBS) $(SYSTEMLIBS)

exam : $(EXAM_OBJECTS)
	@echo homework $@
	$(QUIET)$(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) $^ $(LLVMLIBS) $(SYSTEMLIBS)

clean::
	$(QUIET)rm -f $(HELLO) $(HELLO_OBJECTS) $(EXAM_OBJECTS)

TODO 如果改这个Makefile以复用

通过编译安装

单独编译安装LLVM很简单,一次成功。

通过CMake

编译参数更多地请参考llvm/docs/CMake.rst文档。

mkdir mybuilddir
cd mybuilddir
cmake path/to/llvm/source/root
make

通过如上步骤,即可编译安装LLVM。

编译安装LLVM+Clang

生成文档

LLVM的文档格式采用reStructuredText(ReST)格式写的,文件后缀名是.rst。HTML文档采用Sphinx 文件构建系统生成。生成文档也要做些工作,可以直接阅读版本已经发布的文档

可以参考SphinxQuickstartTemplate.rst学习如何写该类型文档。可以在VS Code中安装插件reStructuredText。详细可参考Sphinx Introduction for LLVM Developers

要生成文档,需要安装sphinx-build。

root@5be544e81dcc:/# apt install sphinx3

先安装pip(不要安装esay_install,以废弃),再通过其安装sphinx-build。

root@5be544e81dcc:/# wget https://bootstrap.pypa.io/get-pip.py
root@5be544e81dcc:/# export http_proxy=http://192.168.3.8:11080

其中我设置了宿主机代理http://192.168.3.8:11080。

在镜像中,进入/workspace/llvm/docs路径,执行

LLVM 3.8

尝试通过编译安装LLVM3.8的环境

从源安装,Ubuntu 16.04 目前是 3.8的版本

sudo apt install llvm clang

LLVM 8

成功编译安装LLVM 8的环境,在Unix-like Systems上。

以我的编译环境为例,虚拟机RAM 2G,还需要足够大的交换Swap空间。否则几次编译都有这样的错误:

clang: error: unable to execute command: Killed
clang: error: assembler command failed due to signal (use -v to see invocation)
  1. 添加Swap空间,参考博客
sudo fallocate -l 6G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

开机自动挂载swap: 使用 vi 或 nano 在 /etc/fstab 文件底部添加如下内容:

/swapfile none swap sw 0 0
  1. 其次以编译经验,编译llvm和clang相关工具,带Debug信息,至少磁盘空间还剩余四五十G。VMWare Ubuntu LVM扩容,可以参考这篇博客

  2. 下载源代码,这里通过Gitee 极速下载 / LLVM

    git clone https://gitee.com/mirrors/LLVM.git

    会比原始仓库https://github.com/llvm/llvm-project快很多。

  3. 切换分支

    git checkout llvmorg-8.0.1 -b llvmorg-8.0.1
  4. 设置一些软链接

    cd llvm/tools
    ln -s ../../clang clang
    cd clang/tools/
    ln -s ../../clang-tools-extra extra
    cd ../../../
  5. 开始构建,可参考Building LLVM with CMakeGetting StartedHacking on Clang

    mkdir build
    cd build/
    cmake -DCMAKE_BUILD_TYPE=Debug -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" ..
    make -j2

    -DCMAKE_EXPORT_COMPILE_COMMANDS=ON用于生成编译数据库。DCMAKE_BUILD_TYPE=RelWithDebInfo很占磁盘空间,没有一两百G不要全编。

  • -DLLVM_ENABLE_PROJECTS='...' — semicolon-separated list of the LLVM subprojects you’d like to additionally build. Can include any of: clang, clang-tools-extra, libcxx, libcxxabi, libunwind, lldb, compiler-rt, lld, polly, or debuginfo-tests. For example, to build LLVM, Clang, libcxx, and libcxxabi, use -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi".

  • -DCMAKE_INSTALL_PREFIX=directory — Specify for directory the full pathname of where you want the LLVM tools and libraries to be installed (default /usr/local).

  • -DCMAKE_BUILD_TYPE=type — Valid options for type are Debug, Release, RelWithDebInfo, and MinSizeRel. Default is Debug.

-- Refer

  1. 测试一下

    unset LLVM_HOME
    export PATH=~/project/LLVM/llvm/build/bin:$PATH

    输出:

    $ clang --version
    clang version 8.0.1
    Target: x86_64-unknown-linux-gnu
    Thread model: posix
    InstalledDir: /root/project/LLVM/llvm/build/bin

    编译常见错误

    1. error: linker command failed with exit code 1 (use -v to see invocation)

      编译make clang-check -j2时遇到的。

Footnotes

  1. books/Getting_Started_with_LLVM_Core_Libraries.pdf "Getting Started with LLVM Core Library" 2 3