LLVM 6 Trunk 在 Ubuntu 16.04 上构建,未构建 lld

LLVM 6 Trunk Build on Ubuntu 16.04 not building lld

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

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

  1. 阅读文档。

  2. 阅读文档。

  3. 请记住,您曾两次收到有关阅读文档的警告。

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

  4. 签出 LLVM:

    cd where-you-want-llvm-to-live
    svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
    
  5. 结帐叮当声:

    cd where-you-want-llvm-to-live
    cd llvm/tools
    svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
    
  6. 检查额外的 Clang 工具 [可选]:

    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. 检查 LLD 链接器[可选]:

    cd where-you-want-llvm-to-live
    cd llvm/tools
    svn co http://llvm.org/svn/llvm-project/lld/trunk lld
    

没有下载其他可选包。由于 svn 下载工作不正常 (svn: E000104: Error running context: Connection reset by peer),我从他们的 github 镜像下载了 LLVM, Clang, clang-extra and lld 的相应 zip。因为,我没有使用 svn 必须对文件夹进行一些重命名(例如 clang-tools-extra-master 只是 extra)。

然后执行以下命令,cd进入llvm源文件夹的父文件夹后,

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

等待+8小时后,我得到了除lld以外的所有程序(clangllillc等)。我希望它出现在文件夹 build/bin.

我也试过选项cmake -DLLVM_ENABLE_PROJECTS=llvm/tools/lld ../llvm。 (表格 -DLLVM_ENABLE_PROJECTS=lld 不起作用,我发现 this 地方讨论了相同的 ENABLE 问题。)

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

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

如果需要更多信息,请告诉我。

首先,如果您使用 "flat" 源目录布局,我认为 LLVM_ENABLE_PROJECTS 选项很有用。在你的情况下,如果你按照你写的那样执行了结帐,那么它就没有多大用处。

此外,@PaulR 写的关于使用 ninja 的内容是一个很好的建议。它在重新启动构建时更快且非常有用,它会根据 nproc 同时生成尽可能多的独立编译作业,而无需明确指定它。

为了更快地构建和缩短 link 时间,我还建议使用 BUILD_SHARED_LIBS 选项启用启用共享库的构建。

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

  1. 使用 clang 构建 clang(自举或第二阶段构建)。
  2. 使用 gold linker 而不是 ld 以获得更快的 linking 时间。
  3. 更喜欢生成共享库的构建。

您现在可以跳过第 1 点(尽管您可以从系统包管理器安装初始 llvm/clang

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

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

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++ 的引导构建,您可以将上述命令扩充为(在您的 $PATH 环境变量中包含 clang):

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

如您所写,阅读文档、试验并再次阅读文档是必经之路。