在 CentOS 上构建 Swift
Building Swift on 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_PATH
、LIBRARY_PATH work
那样工作)但它似乎不能找到它。
我的机器上也没有 root。
CheckAtomic.cmake 似乎是 LLVM 的一部分。我在 Github 找到了一个文件,它试图从 libatomic
中找到“__atomic_fetch_add_4”
check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)
这对你来说失败了。检查 CMakeFiles/CMakeError.log 以获取此测试失败原因的更多详细信息。或者在新项目中尝试这一行。
在看到这个问题之前,我没有尝试在 CentOS 6 上从源代码构建,但我已经能够在 CentOS 7.1 和 Ubuntu 14.04 上构建 Swift 2.2,并取得了部分成功。需要考虑的几点:
- 您将需要构建 Swift 所需的大量依赖项,除非
它们恰好已经在系统上,您将需要 root 访问权限
安装它们。
- 使用 -R 标志和 build-script 来创建发布版本。
在 DebugAssert(默认)中构建将需要大量内存。就我而言,即使 14 GB 也不够。发布版本
大约 6 GB 就可以完成。
至于您的具体问题,它与 Clang 对 GCC-related 软件包和库的 GCC-related 依赖有关。参见,例如,Fedora 21 with clang, without gcc.
即使您安装了 GCC 4.8.2 并从 4.8.2 调整了使用 gcc 和 g++ 的路径,Clang 仍可能会在旧的 GCC 目录中查找 header 和库。 CMake 首先尝试编译一个包含 header atomic
的 C++ 测试文件,这在旧的 GCC 中不存在。因此,它然后尝试 link 一个使用库 libatomic
的 C 测试程序,它在旧的 GCC 中也不存在。您可以通过查看 usr1234567 提到的 llvm/cmake/modules/CheckAtomic.cmake
来了解这一点。 CMakeError.log 和 CMakeOutput.log 也可以提供有价值的见解。顺便说一句,当我在 CentOS 7.1 上构建 Swift 时,我没有 运行 解决这个问题,因为 Clang 将 GCC 4.8.2 用于 header 和库以及 atomic
header 被发现,所以 C++ 文件被编译。然而,如果 libatomic
检查已经完成,它就会失败,因为 repository-provided 4.8.2 中的 libatomic.so 有 INPUT ( <name of some non-existent file> )
,所以尝试 link 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 在 运行 时可供动态 linker 使用。因为你没有root,做
export LD_LIBRARY_PATH=/opt/gcc-4.8.2/lib64
如果你有 root,你可以使用 ldconfig
。
在开始构建 Swift 之前,您可能想尝试使用 Clang 构建一个简单的 C 程序 link 使用 libatomic
(代码实际上没有使用 lib 中的任何符号)和一个包含 <atomic>
header 的简单 C++ 程序。编译 C++ 程序时,使用 -std=c++11
编译器标志。如果 C++ 程序编译成功,则 libatomic
linking 测试不需要成功。
有趣的是,CMakeOutput.log 文件仍然没有报告发现 GCC 4.8.2 作为候选 GCC 安装,但是 configuration/build 在错误发生后运行良好。
希望这对您有所帮助。如果您 运行 喜欢其他东西,请告诉我们。
我正在 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_PATH
、LIBRARY_PATH work
那样工作)但它似乎不能找到它。
我的机器上也没有 root。
CheckAtomic.cmake 似乎是 LLVM 的一部分。我在 Github 找到了一个文件,它试图从 libatomic
中找到“__atomic_fetch_add_4”check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)
这对你来说失败了。检查 CMakeFiles/CMakeError.log 以获取此测试失败原因的更多详细信息。或者在新项目中尝试这一行。
在看到这个问题之前,我没有尝试在 CentOS 6 上从源代码构建,但我已经能够在 CentOS 7.1 和 Ubuntu 14.04 上构建 Swift 2.2,并取得了部分成功。需要考虑的几点:
- 您将需要构建 Swift 所需的大量依赖项,除非 它们恰好已经在系统上,您将需要 root 访问权限 安装它们。
- 使用 -R 标志和 build-script 来创建发布版本。
在 DebugAssert(默认)中构建将需要大量内存。就我而言,即使 14 GB 也不够。发布版本
大约 6 GB 就可以完成。
至于您的具体问题,它与 Clang 对 GCC-related 软件包和库的 GCC-related 依赖有关。参见,例如,Fedora 21 with clang, without gcc.
即使您安装了 GCC 4.8.2 并从 4.8.2 调整了使用 gcc 和 g++ 的路径,Clang 仍可能会在旧的 GCC 目录中查找 header 和库。 CMake 首先尝试编译一个包含 header atomic
的 C++ 测试文件,这在旧的 GCC 中不存在。因此,它然后尝试 link 一个使用库 libatomic
的 C 测试程序,它在旧的 GCC 中也不存在。您可以通过查看 usr1234567 提到的 llvm/cmake/modules/CheckAtomic.cmake
来了解这一点。 CMakeError.log 和 CMakeOutput.log 也可以提供有价值的见解。顺便说一句,当我在 CentOS 7.1 上构建 Swift 时,我没有 运行 解决这个问题,因为 Clang 将 GCC 4.8.2 用于 header 和库以及 atomic
header 被发现,所以 C++ 文件被编译。然而,如果 libatomic
检查已经完成,它就会失败,因为 repository-provided 4.8.2 中的 libatomic.so 有 INPUT ( <name of some non-existent file> )
,所以尝试 link 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 在 运行 时可供动态 linker 使用。因为你没有root,做
export LD_LIBRARY_PATH=/opt/gcc-4.8.2/lib64
如果你有 root,你可以使用 ldconfig
。
在开始构建 Swift 之前,您可能想尝试使用 Clang 构建一个简单的 C 程序 link 使用 libatomic
(代码实际上没有使用 lib 中的任何符号)和一个包含 <atomic>
header 的简单 C++ 程序。编译 C++ 程序时,使用 -std=c++11
编译器标志。如果 C++ 程序编译成功,则 libatomic
linking 测试不需要成功。
有趣的是,CMakeOutput.log 文件仍然没有报告发现 GCC 4.8.2 作为候选 GCC 安装,但是 configuration/build 在错误发生后运行良好。
希望这对您有所帮助。如果您 运行 喜欢其他东西,请告诉我们。