在 Ubuntu 16.04 上构建 LLVM 6 主干不构建 lld

Posted

技术标签:

【中文标题】在 Ubuntu 16.04 上构建 LLVM 6 主干不构建 lld【英文标题】:LLVM 6 Trunk Build on Ubuntu 16.04 not building lld 【发布时间】:2017-12-07 14:01:43 【问题描述】:

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

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

    阅读文档。

    阅读文档。

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

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

    结帐 LLVM:

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

    结帐叮当声:

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

    检查额外的 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
    

    结帐 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 镜像下载了 zip 的 LLVM、Clang、clang-extra 和 lld。因为,我没有使用svn,所以必须对文件夹进行一些重命名(例如,将clang-tools-extra-master 改成extra)。

然后在cding进入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 问题。)

我已经尝试了 3 次调整。由于编译需要这么多时间,我决定请你帮忙。

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

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

【问题讨论】:

关于链接阶段的 RAM 使用:这是由于调试信息和静态链接造成的,请参阅此答案以了解缓解问题的不同方法***.com/a/44808601 @PaulR 感谢您的链接。每当我下次构建时都会尝试一下。我忘了提到我使用了make -j 2,因此链接表明并行链接可能是另一个罪魁祸首。 现在我想起来了,我的猜测是帖子中提到的 LLVM_PARALLEL_LINK_JOBS 仅适用于忍者。但是忍者在其他方面效果很好,所以你可以尝试一下。 【参考方案1】:

首先,如果您使用“平面”源目录布局,我认为LLVM_ENABLE_PROJECTS 选项很有用。在您的情况下,如果您按照您所写的方式执行结帐,那么它没有多大用处。

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

为了更快的构建和更短的链接时间,我还建议使用 BUILD_SHARED_LIBS 选项启用支持共享库的构建。

一些通用的好建议可以找到here,总结如下:

    使用clang 构建clang(自举或第二阶段构建)。 使用gold 链接器代替ld 以获得更快的链接时间。 更喜欢生成共享库的构建。

您现在可以跳过第 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]

此外,可以在here 找到另一个相关的 SO 问题。

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

【讨论】:

我在一个新的构建文件夹中尝试了您提供的第一个 cmake 配置(没有 libcxx 的标志),但我不断收到链接器错误。尽管我无数次尝试运行ninja(因为每次调用都链接了一些文件),但它并没有超过 [2/200] 标记。错误是:/home/codeman/mydata/local/packages-live/clang-llvm6/llvm/include/llvm/Analysis/DominanceFrontier.h:122: undefined reference to 'llvm::DominanceFrontierBase<llvm::BasicBlock, false>::DominanceFrontierBase()' collect2: error: ld returned 1 exit status 在主干上工作时有时会出现问题。你愿意尝试LLVM 5.0.0。我会尝试找到上次构建它时的 git refs。 该命令适用于 LLVM 5.0.0 版本,带有 clang、clang-extra 和 lld !!有了忍者,整个事情在 2 小时内就完成了! (很快将与make -j 4 进行比较)。 @compor 你说得对,此时 LLVM Trunk 肯定有问题。我遵循相同的步骤并在需要的地方得到了lld。谢谢! ninjamake 之间的区别在您修改和重建时会最明显。最后构建的 LLVMtrunk (6.0.0) 对我有用的是“a694e228c261eec9940ea99cf60de8da4453bf8e”(如果仍然感兴趣),但这是一个移动目标,因为还有其他项目。无论如何,如果您绝对需要后备箱,请尝试使用不同的结帐方式。

以上是关于在 Ubuntu 16.04 上构建 LLVM 6 主干不构建 lld的主要内容,如果未能解决你的问题,请参考以下文章

模块构建错误:pngquant ENOENT - webpack 构建在本地 OS X 上成功,在 AWS Ubuntu 16.04 服务器上失败

LLVM 安装方法(包安装)

在安装 v0.6 的同时在 Ubuntu 16.04 上安装 Julia v0.5

如何在 Ubuntu 16.04 上安装 mysql2 [错误:安装 mysql2 时出错:错误:无法构建 gem 本机扩展。] [重复]

为 Dragonboard(Ubuntu 16.04)构建 Android 开源项目(AOSP)时“构建某些目标失败”

在 Ubuntu 16.04 LTS 上安装 Python 3.6.0