在CentOS上构建Swift

时间:2015-12-11 23:30:06

标签: swift cmake centos

我在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。

2 个答案:

答案 0 :(得分:1)

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

check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)

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

答案 1 :(得分:1)

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

  • 构建Swift需要很多依赖项,除非 他们碰巧已经在系统上,你需要root访问权限 安装它们。
  • 将-R标志与build-script一起使用以创建发布版本。 在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中的任何符号)和一个简单的包含<atomic>标头的C ++程序。编译C ++程序时,请使用-std=c++11编译器标志。如果C ++程序成功编译,那么libatomic链接测试就不必成功。

有趣的是,CMakeOutput.log文件仍未报告将GCC 4.8.2视为候选GCC安装,但配置/构建在错误之后运行良好。

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