在Linux上为C ++构建和使用纯llvm工具链 [英] Building and using a pure llvm toolchain for c++ on linux

查看:194
本文介绍了在Linux上为C ++构建和使用纯llvm工具链的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设这是可能的,有人可以告诉我,我如何配置cmake构建以在由

组成的ubuntu-16.04上创建纯" llvm工具链.
  • c
  • lld
  • libc ++
  • libc ++ abi
  • libunwind(llvm)
  • compiler-rt
  • 任何其他可能相关且可以投入生产"的作品

生成的编译器应

  • 尽可能快(优化已打开,编译器二进制文件本身中没有不必要的断言或其他检查)
  • 安装在单独的本地目录中(将其称为<llvm_install>)
  • 不依赖于数据包管理器提供的llvm tolchain
  • 默认情况下使用libc ++,libc ++ abi等.
  • 支持消毒剂(ubsan,地址,内存,线程)(这可能意味着我必须编译libc ++一个 Pacific ++ 2017:钱德勒·卡鲁斯(Chandler Carruth),"LLVM:现代,开放的C ++工具链"

    解决方案

    我通常的过程是构建足够小的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, 您可以再次使用以下构建脚本,并根据需要进行调整(消毒剂等).除了关于主题的主要文档页面之外,还仔细阅读了各个工具的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. /p>

    最后,与上述过程有关的是我的旧问题,仍然困扰着我.如果您对此有任何见解,请不要犹豫.

    PS:脚本已通过LLVM 3.7至3.9和当前主干6.0.0进行了测试.

    更新:我还应用了

    The resulting compiler should

    So far I have cloned

    • llvm from http://llvm.org/git/llvm.git into <llvm_root>
    • clang from http://llvm.org/git/clang.git into <llvm_root>/tools/clang
    • lld from http://llvm.org/git/lld.git into <llvm_root>/tools/lld
    • compiler-rt, libcxx, libcxxabi, libunwind from http://llvm.org/git/<project_name> into <llvm_root>/projects/<project_name>

    Then run ccmake in a separate directory - I have tried various settings, but as soon as I try anything more fancy beyond turning optimizations on, I almost always get some sort of build error. Unfortunately, I have yet to find a way to export my changes from ccmake otherwise I'd give you an example with the settings and according error, but I'm more interested in a best practice than a fix to my test configs anyway.

    Bonus points: By default, this should build with the default g++ toolchain, but I'd also be interested in a two stage build if that improves the performance of the final toolchain (e.g. by using LTO).

    Btw.: The whole Idea came from watching chandler's talk
    Pacific++ 2017: Chandler Carruth "LLVM: A Modern, Open C++ Toolchain"

    解决方案

    My usual procedure is to build a small enough LLVM/Clang so that I have something working with libc++ and libc++abi. I guess you can the system-provided LLVM, but I haven't tried it. For this step, what you have checked-out is probably enough. A sample script for this:

    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]
    

    Having the aforementioned clang in your PATH environment variable, you can use the below build script again and adjust based on your needs (sanitizers, etc). Apart from the main documentation page on the subject, poking around the CMakeLists.txt of each respective tool is also illuminating and helps adjust the build process from version to version.

    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]
    

    A note on performance, I haven't watched that talk yet, but my motivation behind this 2 step build was to have a toolchain that I can easily relocate between systems since the minimal system dependence that matters is libc.

    Lastly, relevant to the above procedure is this older question of mine, which still bugs me. If you have any insight on this, please don't hesitate.

    PS: Scripts have been tested with LLVM 3.7 through 3.9 and current trunk 6.0.0.

    Update: I've also applied these suggestions, and there is marked improvement when using the gold linker instead of ld. LTO is also a boost.

    这篇关于在Linux上为C ++构建和使用纯llvm工具链的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆