假设这是可能的,有人可以告诉我,我如何配置cmake构建以在ubuntu-16.04上创建一个“纯” llvm工具链,包括

  • clang
  • lld
  • libc++
  • libc++ abi
  • libunwind(llvm)
  • 编译器-rt
  • 其他可能相关且已准备就绪的其他作品

  • 生成的编译器应
  • 尽可能快(优化已打开,编译器二进制文件本身中没有不必要的断言或其他检查)
  • 可安装在单独的本地目录中(称为<llvm_install>)
  • 不依赖于数据包管理器
  • 提供的llvm tolchain
  • 默认使用libc++,libc++ abi等。
  • 支持 sanitizer (ubsan,地址,内存,线程)(这可能意味着我必须编译libc++ a second time)

  • 到目前为止,我已经克隆了
  • llvm从http://llvm.org/git/llvm.git转换为<llvm_root>
  • http://llvm.org/git/clang.git lang变成<llvm_root>/tools/clang
  • lld从http://llvm.org/git/lld.git转换为<llvm_root>/tools/lld
  • 编译器-rt,libcxx,libcxxabi,libunwind从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/

    10-11 22:47
    查看更多