在 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
)。
然后在cd
ing进入llvm
源文件夹的父文件夹后,执行以下操作,
$ mkdir build; cd build
$ cmake ../llvm
$ make
等待+8 小时后,我得到了除lld
之外的所有程序(clang
、lli
、llc
等)。我希望它出现在文件夹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/clang
和 libc++
的引导构建,您可以将上述命令扩充为(在您的 $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
。谢谢!
ninja
和make
之间的区别在您修改和重建时会最明显。最后构建的 LLVM
trunk (6.0.0) 对我有用的是“a694e228c261eec9940ea99cf60de8da4453bf8e”(如果仍然感兴趣),但这是一个移动目标,因为还有其他项目。无论如何,如果您绝对需要后备箱,请尝试使用不同的结帐方式。以上是关于在 Ubuntu 16.04 上构建 LLVM 6 主干不构建 lld的主要内容,如果未能解决你的问题,请参考以下文章
模块构建错误:pngquant ENOENT - webpack 构建在本地 OS X 上成功,在 AWS Ubuntu 16.04 服务器上失败
在安装 v0.6 的同时在 Ubuntu 16.04 上安装 Julia v0.5
如何在 Ubuntu 16.04 上安装 mysql2 [错误:安装 mysql2 时出错:错误:无法构建 gem 本机扩展。] [重复]