在linux上为c++构建和使用纯llvm工具链
Building and using a pure llvm toolchain for c++ on linux
假设这是可能的,有人能告诉我,我必须如何配置cmake构建,以在ubuntu-16.04上创建一个由组成的"纯"llvm工具链吗
- 叮当
- lld
- libc++
- libc++abi
- libunfold(llvm)
- 编译器rt
- 任何其他可能相关且"已准备好生产"的作品
生成的编译器应该
- 尽可能快(优化已打开,编译器二进制文件本身中没有不必要的断言或其他检查)
- 安装在单独的本地目录中(我们称之为
<llvm_install>
) - 不依赖于数据包管理器提供的llvm tolchain
- 默认情况下使用libc++、libc++abi等
- 支持清理程序(subsan、地址、内存、线程)(这可能意味着我必须再次编译libc++)
到目前为止,我已经克隆了
- llvm从
http://llvm.org/git/llvm.git
进入<llvm_root>
- 从
http://llvm.org/git/clang.git
到<llvm_root>/tools/clang
的叮当声 - lld从
http://llvm.org/git/lld.git
进入<llvm_root>/tools/lld
- 编译器rt、libcxx、libcxxabi、libunfold从
http://llvm.org/git/<project_name>
到<llvm_root>/projects/<project_name>
然后在一个单独的目录中运行ccmake-我尝试过各种设置,但一旦我尝试了除了打开优化之外的任何更花哨的设置,我几乎总是会遇到某种构建错误。不幸的是,我还没有找到从ccmake导出更改的方法,否则我会给你一个设置和相应错误的例子,但我更感兴趣的是最佳实践,而不是修复我的测试配置。
加分:默认情况下,这应该使用默认的g++工具链构建,但如果能提高最终工具链的性能(例如使用LTO),我也会对两阶段构建感兴趣。
Btw整个想法来自于观看chandler的演讲
太平洋++2017:chandler Carruth"LLVM:一个现代的、开放的C++工具链">
我通常的过程是构建一个足够小的LLVM/Cang,这样我就可以使用libc++
和libc++abi
了。我想你可以使用系统提供的LLVM,但我还没有尝试过。对于这一步,你所检查的可能已经足够了。一个示例脚本:
cmake
-G Ninja
-DCMAKE_EXPORT_COMPILE_COMMANDS=On
-DCMAKE_BUILD_TYPE=RelWithDebInfo
-DBUILD_SHARED_LIBS=On
-DLLVM_ENABLE_ASSERTIONS=Off
-DLLVM_TARGETS_TO_BUILD="X86"
-DLLVM_ENABLE_SPHINX=Off
-DLLVM_ENABLE_THREADS=On
-DLIBCXX_ENABLE_EXCEPTIONS=On
-DLIBCXX_ENABLE_RTTI=On
-DCMAKE_INSTALL_PREFIX=[path-to-install-dir]
[path-to-source-dir]
在CCD_ 13环境变量中具有上述CCD_,您可以再次使用下面的构建脚本,并根据需要进行调整(消毒液等)。除了关于这个主题的主要文档页面外,浏览每个相应工具的CMakeLists.txt
也很有启发性,有助于从一个版本到另一个版本调整构建过程。
LLVM_TOOLCHAIN_LIB_DIR=$(llvm-config --libdir)
LD_FLAGS=""
LD_FLAGS="${LD_FLAGS} -Wl,-L ${LLVM_TOOLCHAIN_LIB_DIR}"
LD_FLAGS="${LD_FLAGS} -Wl,-rpath-link ${LLVM_TOOLCHAIN_LIB_DIR}"
LD_FLAGS="${LD_FLAGS} -lc++ -lc++abi"
CXX_FLAGS=""
CXX_FLAGS="${CXX_FLAGS} -stdlib=libc++ -pthread"
CC=clang CXX=clang++
cmake -G Ninja
-DCMAKE_EXPORT_COMPILE_COMMANDS=On
-DBUILD_SHARED_LIBS=On
-DLLVM_ENABLE_LIBCXX=On
-DLLVM_ENABLE_LIBCXXABI=On
-DLLVM_ENABLE_ASSERTIONS=On
-DLLVM_TARGETS_TO_BUILD="X86"
-DLLVM_ENABLE_SPHINX=Off
-DLLVM_ENABLE_THREADS=On
-DLLVM_INSTALL_UTILS=On
-DLIBCXX_ENABLE_EXCEPTIONS=On
-DLIBCXX_ENABLE_RTTI=On
-DCMAKE_BUILD_TYPE=Debug
-DCMAKE_CXX_FLAGS="${CXX_FLAGS}"
-DCMAKE_SHARED_LINKER_FLAGS="${LD_FLAGS}"
-DCMAKE_MODULE_LINKER_FLAGS="${LD_FLAGS}"
-DCMAKE_EXE_LINKER_FLAGS="${LD_FLAGS}"
-DCMAKE_POLICY_DEFAULT_CMP0056=NEW
-DCMAKE_POLICY_DEFAULT_CMP0058=NEW
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
[path-to-source-dir]
关于性能的说明:我还没有看过那次演讲,但我在这两步构建背后的动机是拥有一个工具链,我可以在系统之间轻松地重新定位,因为最重要的系统依赖性是libc
。
最后,与上述程序相关的是我的这个老问题,它仍然困扰着我。如果你对此有任何见解,请不要犹豫。
PS:脚本已经用LLVM 3.7到3.9以及当前的trunk 6.0.0进行了测试。
更新:我也应用了这些建议,当使用gold
链接器而不是ld
时,有了显著的改进。LTO也是一个推动因素。
- 如何将 I->getType() 作为参数传递给 llvm 中的 CreateCall?
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 在clang++预处理器中确定gcc工具链版本
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- llvm构建器向基本块添加终止符
- 参数化自定义CMake工具链
- 如何在QT中的自定义视频小工具t上绘制矩形
- 正在LLVM中检测整数比较条件
- 如何在LLVM中dyn_cast以识别StoreInst?
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- 构建LLVM 10 C++工具链的问题
- 在linux上为c++构建和使用纯llvm工具链
- 如何使用Cmake Build Config运行LLVM Libclang工具,该工具不是我整个代码库上的插件
- 使用 CMAKE、Clang 和 LLVM 为 Visual Studio 构建工具链
- 无法为Eclipse CDT安装LLVM工具链
- LLVM 3.4无法在VS 2012中选择平台工具集
- LLVM的GCC工具链