在Ubuntu 16.04上的LLVM 6 Trunk Build不构建lld

时间:2017-12-07 14:01:43

标签: llvm llvm-clang

我正在Ubuntu 16.04上构建LLVM 6。我也想要lld。但无论我做什么,lld都不会构建/安装。

遵循here的以下说明。 仍在筛选第一和第二:)

  1. 阅读文档。

  2. 阅读文档。

  3. 请记住,您在阅读文档时被警告了两次。

    特别是,指定的相对路径很重要。

  4. Checkout LLVM:

    cd where-you-want-llvm-to-live
    svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
    
  5. Checkout Clang:

    cd where-you-want-llvm-to-live
    cd llvm/tools
    svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
    
  6. Checkout Extra Clang Tools [可选]:

    cd where-you-want-llvm-to-live
    cd llvm/tools/clang/tools
    svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
    
  7. Checkout LLD链接器[可选]:

    cd where-you-want-llvm-to-live
    cd llvm/tools
    svn co http://llvm.org/svn/llvm-project/lld/trunk lld
    
  8. 没有下载其他可选包。由于svn下载无法正常运行(svn: E000104: Error running context: Connection reset by peer),因此我为LLVMClangclang-extra和{{3}分别下载了zip来自他们的github镜子。由于我没有使用svn,因此必须对文件夹进行一些重命名(例如,clang-tools-extra-master仅限extra)。

    然后在cd进入llvm源文件夹的父文件夹后执行以下操作

    $ mkdir build; cd build
    $ cmake ../llvm
    $ make
    

    等待+8小时后,除了clang外,我获得了所有程序(llillclld等)。我希望它出现在build/bin文件夹中。

    我也尝试了cmake -DLLVM_ENABLE_PROJECTS=llvm/tools/lld ../llvm选项。 (-DLLVM_ENABLE_PROJECTS=lld形式不起作用,我发现lld讨论了同一个ENABLE问题。)

    我已经尝试了一些调整三次。由于编译需要很长时间,所以我决定接受你的帮助。

    一个单独的问题:在构建时,链接阶段需要12 GB RAM + 8.8 GB交换空间在我的笔记本电脑上! LLVM构建真的需要> 20 GB的ram吗? (我关闭了所有其他前台应用,尤其是firefox

    如果需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

首先,我认为如果使用“平面”源目录布局,LLVM_ENABLE_PROJECTS选项很有用。在您的情况下,如果您在编写时执行了检查,那么它没有多大用处。

此外,@ PaulR写的关于使用ninja的内容是一个非常好的建议。它在重新启动构建时更快,更有用,它可以同时生成尽可能多的单独编译作业,具体取决于nproc,而不必明确指定它。

为了加快构建速度并缩短链接时间,我还建议使用BUILD_SHARED_LIBS选项启用共享库启用构建。

可以找到一些一般的好建议here,可以概括为:

  1. 使用clang构建clang(自举或第二阶段构建)。
  2. 使用gold链接器代替ld以加快链接时间。
  3. 更喜欢构建生成共享库。
  4. 您现在可以跳过第1点(尽管您可以从系统包管理器安装初始llvm/clang

    最后,您可以使用LLVM_TARGETS_TO_BUILD选项限制当前所需的特定目标后端的编译。

    我最近使用trunk配置构建了lld(包括cmake):

    CC=gcc CXX=g++ \
    cmake -G Ninja \
      -DCMAKE_EXPORT_COMPILE_COMMANDS=On \
      -DBUILD_SHARED_LIBS=On \
    
      -DLLVM_ENABLE_ASSERTIONS=On \
      -DLLVM_TARGETS_TO_BUILD="X86" \
      -DLLVM_ENABLE_SPHINX=Off \
      -DLLVM_ENABLE_THREADS=On \
      -DLLVM_INSTALL_UTILS=On \
    
      -DCMAKE_BUILD_TYPE=Debug \
      [path-to-source-root-dir]
    

    如果您需要构建libcxx

    ,可以添加以下标志
    [...]
    -DLLVM_ENABLE_LIBCXX=On \
    -DLIBCXX_ENABLE_EXCEPTIONS=On \
    -DLIBCXX_ENABLE_RTTI=On \
    [...]
    

    对于使用其他llvm/clanglibc++的自举构建,您可以将上述命令扩充为(在clang环境变量中具有$PATH):

    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_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 \
      [path-to-source-root-dir]
    

    此外,可以找到另一个相关的SO感兴趣的问题here

    正如您所写,阅读文档,再次尝试和阅读文档是可行的方法。