【问题标题】:Building Swift on CentOS在 CentOS 上构建 Swift
【发布时间】:2015-12-11 23:30:05
【问题描述】:

我正在 CentOS 6 上从源代码构建 Swift 编译器,但遇到了库问题。在与构建脚本斗争了一段时间后,我得到了运行 ./utils/build-script 最终给出的位置:

+ /home/src/cmake-3.4.1-Linux-x86_64/bin/cmake --build /home/src/swift/build/Ninja-DebugAssert/cmark-linux-x86_64 -- all
ninja: no work to do.
llvm: using standard linker
+ cd /home/src/swift/build/Ninja-DebugAssert/llvm-linux-x86_64
+ /home/src/cmake-3.4.1-Linux-x86_64/bin/cmake -G Ninja -DCMAKE_C_COMPILER:PATH=clang -DCMAKE_CXX_COMPILER:PATH=clang++ '-DCMAKE_C_FLAGS= ' '-DCMAKE_CXX_FLAGS= ' -DCMAKE_BUILD_TYPE:STRING=Debug -DLLVM_ENABLE_ASSERTIONS:BOOL=TRUE -DLLVM_TOOL_SWIFT_BUILD:BOOL=NO '-DLLVM_TARGETS_TO_BUILD=X86;ARM;AArch64' -DLLVM_INCLUDE_TESTS:BOOL=TRUE -LLVM_INCLUDE_DOCS:BOOL=TRUE -DCMAKE_INSTALL_PREFIX:PATH=/usr -DINTERNAL_INSTALL_PREFIX=local /home/src/swift/llvm
CMake Error at cmake/modules/CheckAtomic.cmake:36 (message):
  Host compiler appears to require libatomic, but cannot find it.
Call Stack (most recent call first):
  cmake/config-ix.cmake:296 (include)
  CMakeLists.txt:403 (include)


-- Configuring incomplete, errors occurred!
See also "/home/src/swift/build/Ninja-DebugAssert/llvm-linux-x86_64/CMakeFiles/CMakeOutput.log".
See also "/home/src/swift/build/Ninja-DebugAssert/llvm-linux-x86_64/CMakeFiles/CMakeError.log".
./utils/build-script: command terminated with a non-zero exit status 1, aborting

gcc-4.8.2 是我编译 llvm 时使用的)

libatomic 在吗:

$ locate libatomic
/opt/gcc-4.8.2/lib64/libatomic.a
/opt/gcc-4.8.2/lib64/libatomic.la
/opt/gcc-4.8.2/lib64/libatomic.so
/opt/gcc-4.8.2/lib64/libatomic.so.1
/opt/gcc-4.8.2/lib64/libatomic.so.1.0.0

我只是不知道如何告诉构建系统在哪里寻找。我已经尝试过通常的CMAKE_LIBRARY_PATH(在命令行上导出 - 我不确定cmake 是否像LD_LIBRARY_PATHLIBRARY_PATH work 那样工作)但它似乎找不到它。

我的机器上也没有root。

【问题讨论】:

标签: swift cmake centos


【解决方案1】:

在看到这个问题之前,我没有尝试在 CentOS 6 上从源代码构建,但我已经能够在 CentOS 7.1 和 Ubuntu 14.04 上构建 Swift 2.2,并取得了部分成功。需要考虑的几点:

  • 您将需要构建 Swift 所需的大量依赖项,除非 它们恰好已经在系统上,您将需要 root 访问权限 安装它们。
  • 在构建脚本中使用 -R 标志来创建发布构建。 构建 DebugAssert(默认)将需要大量内存。就我而言,即使 14 GB 也不够。发布版本
    大约 6 GB 即可完成。

至于您的具体问题,它与 Clang 对标头和库的 GCC 相关包的依赖有关。例如,请参阅Fedora 21 with clang, without gcc

即使您安装了 GCC 4.8.2 并从 4.8.2 调整了使用 gcc 和 g++ 的路径,Clang 可能仍会在旧的 GCC 目录中查找头文件和库。 CMake 首先尝试编译包含标头atomic 的C++ 测试文件,该文件在旧的GCC 中不存在。因此,它会尝试链接使用库 libatomic 的 C 测试程序,而旧 GCC 中又不存在该库。您可以通过查看 usr1234567 提到的 llvm/cmake/modules/CheckAtomic.cmake 看到这一点。 CMakeError.log 和 CMakeOutput.log 也可以提供有价值的见解。顺便说一句,当我在 CentOS 7.1 上构建 Swift 时,我没有遇到这个问题,因为 Clang 将 GCC 4.8.2 用于头文件和库,并且找到了 atomic 头文件,因此编译了 C++ 文件。但是,如果检查了libatomic,它就会失败,因为存储库提供的 4.8.2 中的 libatomic.so 有 INPUT ( <name of some non-existent file> ),因此尝试与 libatomic 链接时出错。

我确信有多种方法可以解决此问题,但对我来说解决问题的是设置以下环境变量,请根据您的具体设置进行调整:

export CPLUS_INCLUDE_PATH=/opt/gcc-4.8.2/include/c++/4.8.2:/opt/gcc-4.8.2/include/c++/4.8.2/x86_64-unknown-linux-gnu

export LIBRARY_PATH=/opt/gcc-4.8.2/lib64:/opt/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2

还要确保您的 4.8.2 版本的 libstdc++.so 在运行时可用于动态链接器。因为你没有root,所以做

export LD_LIBRARY_PATH=/opt/gcc-4.8.2/lib64

如果你有 root,你可以使用ldconfig

在开始构建 Swift 之前,您可能想尝试使用 Clang 构建一个简单的 C 程序,将其与 libatomic 链接(代码实际上不必使用 lib 中的任何符号)和一个简单的 C++ 程序其中包括 <atomic> 标头。编译 C++ 程序时,使用 -std=c++11 编译器标志。如果 C++ 程序编译成功,那么libatomic 链接测试不一定要成功。

有趣的是,CMakeOutput.log 文件仍然没有报告找到 GCC 4.8.2 作为候选 GCC 安装,但配置/构建运行良好,克服了错误。

希望这会有所帮助。如果您遇到其他问题,请告诉我们。

【讨论】:

  • clang 是 3.8。我用llvm构建了它。如果我没记错的话,它希望 gcc 4.7 至少能够快速编译。我正在一个胖服务器上构建它,所以内存并不是什么大问题。到目前为止,我已经能够摆脱安装依赖项并将它们粘贴在路径上......(顺便说一下,使用 -m 启动构建脚本可以让你回避忍者,我仍然有一些问题)跨度>
  • 好的,感谢您提供更多信息。从源代码构建的 Clang 可能有自己的特质。自从我昨晚开始玩这个,今晚会继续让你知道。看起来是一个不错的探索项目。
  • 顺便说一句,您原来的问题中提到的 CMakeError.log 中的最后一个错误是什么?使用 make 文件(构建脚本的 -m 选项)时是否会出现问题?使用忍者时发生过这种情况吗?你能用 clang++ 编译另一个响应者提到的包含 的 C++ 文件吗?如果使用 -std=c++11 标志,它会编译吗?
  • CMakeError.log 有 CMakeError.log 有 FAILED: : && clang -DCHECK_FUNCTION_EXISTS=__atomic_fetch_add_4 CMakeFiles/cmTC_679a4.dir/CheckFunctionExists.c.o -o cmTC_679a4 -rdynamic -latomic -lm && : /usr/bin/ ld:找不到-latomic clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)忍者:构建停止。使用 -m 我得到.. + cmake --build /Unix_Makefiles-DebugAssert/llvm-linux-x86_64 -- -j64 all gmake: *** No rule to make target `all'.
  • 在 CMakeOutput.log 中,在与 CMakeError.log 相同的目录中,应该有关于找到候选 GCC 安装以及选择了哪些安装的日志消息。它是否找到选择您的 4.8.2 安装?我终于从源代码构建了我的 4.8.2,所以我会试一试。 Devtools-2 不起作用。
【解决方案2】:

CheckAtomic.cmake 似乎是 LLVM 的一部分。我在Github 找到了一个文件,它试图从 libatomic 中找到“__atomic_fetch_add_4”

check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)

这对你来说失败了。检查 CMakeFiles/CMakeError.log 以获取有关此测试失败原因的更多详细信息。或者在新项目中尝试这一行。

【讨论】:

  • 我认为它失败了,因为它找不到要链接的 libatomic。不知何故,它需要被告知 libatomic 在哪里
  • 你是对的,我错过了一级缩进。更新了我的答案。
  • 首先编译包含的C++文件失败,然后尝试这个check_library_exists()失败。如果 C++ 编译成功,甚至不会尝试 check_library_exists()。顺便说一句,我检查了 CentOS 7.1 上的日志,它在那里构建正常,并且在那里编译了 C++ 文件。如果它通过库测试,它将失败,因为即使可以从存储库中找到 libatomic.so 作为 4.8.2 安装的一部分,但内容是伪造的。
  • 使用从源代码构建的 4.8.2,libatomic.so 不是伪造的并且具有正在检查的功能,但找不到该库。那是 4.4.7 仍在系统上。唯一找到并选择的 GCC 是 4.4.7。卸载 4.4.7 后,没有找到候选 GCC,并且 CMake 在原子测试之前就失败了。
  • @OmniProg 您知道您可以通过CMAKE_CXX_COMPILER 将路径传递给您的编译器?
猜你喜欢
  • 2014-04-28
  • 1970-01-01
  • 2013-08-31
  • 2011-10-15
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 2013-09-22
相关资源
最近更新 更多