假设这是可能的,有人可以告诉我,我如何配置cmake构建以在ubuntu-16.04上创建一个“纯粹的”llvm工具链
>铿锵
> lld
> libc
> libc abi
> libunwind(llvm)
> compiler-rt
>任何其他可能相关且“生产就绪”的作品
生成的编译器应该
>尽可能快(打开优化,在编译器二进制文件中没有不必要的断言或其他检查)
>安装在一个单独的本地目录中(让我们称之为< llvm_install>)
>没有依赖于数据包管理器提供的llvm tolchain
>默认使用libc,libc abi等.
>支持清洁剂(ubsan,地址,内存,线程)(这可能意味着我必须编译libc a second time)
到目前为止,我已经克隆了
> 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
> http://llvm.org/git/\u0026lt;project_name\u0026gt;编译器-rt,libcxx,libcxxabi,libunwind;进入< 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,但我还没试过.对于此步骤,您已签出的内容可能就足够了.一个示例脚本:
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]
在PATH环境变量中有上述clang,
您可以再次使用以下构建脚本并根据您的需要进行调整(消毒剂等).除了关于该主题的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]
关于性能的说明,我还没有看过那个话题,但是我在这个2步构建背后的动机是有一个工具链,我可以轻松地在系统之间重新定位,因为最重要的系统依赖是libc.
最后,与上述程序相关的是this我的老问题,这仍然让我感到困扰.如果您对此有任何见解,请不要犹豫.
PS:脚本已经过LLVM 3.7到3.9和当前主干6.0.0的测试.
更新:我还应用了these个建议,使用黄金链接器代替ld时有明显的改进. LTO也是一个推动力.