假设这是可能的,有人可以告诉我,我如何配置cmake构建以在ubuntu-16.04上创建一个“纯” llvm工具链,包括
生成的编译器应
<llvm_install>
)到目前为止,我已经克隆了
http://llvm.org/git/llvm.git
转换为<llvm_root>
http://llvm.org/git/clang.git
lang变成<llvm_root>/tools/clang
http://llvm.org/git/lld.git
转换为<llvm_root>/tools/lld
http://llvm.org/git/<project_name>
转换为<llvm_root>/projects/<project_name>
然后在一个单独的目录中运行ccmake-我尝试了各种设置,但是一旦尝试了除打开优化功能之外的其他操作,我几乎总是会遇到某种构建错误。不幸的是,我还没有找到一种从ccmake导出更改的方法,否则我会给您一个有关设置和相应错误的示例,但是无论如何我对测试配置的修复,我对最佳实践更感兴趣。
优点:默认情况下,它应该使用默认的g++工具链构建,但是如果可以提高最终工具链的性能(例如,使用LTO),我也会对两阶段构建感兴趣。
顺便说一句:整个主意来自观看钱德勒的讲话
Pacific++ 2017: Chandler Carruth "LLVM: A Modern, Open C++ Toolchain"
最佳答案
我通常的过程是构建足够小的LLVM/Clang,以便可以使用libc++
和libc++abi
进行操作。我猜您可以使用系统提供的LLVM,但我还没有尝试过。对于此步骤,您已 checkout 的内容可能就足够了。为此的示例脚本:
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]
在您的clang
环境变量中包含上述的PATH
,您可以再次使用以下构建脚本,并根据需要进行调整( sanitizer 等)。除了关于该主题的main文档页面之外,拨弄每个相应工具的
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
。最后,与上述过程有关的是this我的一个较早的问题,它仍然使我感到烦恼。如果您对此有任何见解,请不要犹豫。
PS:脚本已通过LLVM 3.7至3.9和当前主干6.0.0进行了测试。
更新:我也应用了these建议,并且使用
gold
链接器代替ld
时有明显的改进。 LTO也是一个插入因素。关于c++ - 在Linux上为C++构建和使用纯llvm工具链,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47304919/