【发布时间】:2014-04-20 04:41:58
【问题描述】:
大约 2 周前我开始学习 cmake 并喜欢它。到目前为止,我已经成功构建和打包(使用本机系统打包格式)libc++abi、libc++、llvm 3.4 全部使用cmake(libc++abi 使用我自己的cmake setup) 适用于 RHEL 6.x、Fedora 20+ 和 Ubuntu 12.04 LTS+。
我想创建一个 C++ 构建环境,
-
让我们完全摆脱对 GNU GCC 和
libstdc++的依赖(因此我们不希望来自上述发行版或 LLVM Debian/Ubuntu nightly packages 下载站点的任何 LLVM RPM/DEB) - 使我们能够全面探索 C++11 和 C++1y。换句话说,我们可以随时尝试甚至最前沿的 LLVM/clang,同时使用包管理系统保持所有构建系统的清洁。
尽管如此,我在运行 Ubuntu 12.04 LTS 64 位的构建主机上尝试使用 clang 3.4 构建 clang 3.4 时遇到了障碍,pure clang 3.3 由我构建没有对 GNU libstdc++ 以及 libc++ 3.3 和 libc++abi 的任何依赖。后两者也没有libstdc++ 依赖。我也是这样构建的。
我非常了解Clang - Getting Started 网页,并且成功地使用了那里的说明。但这些正是我不想使用的。它们也是不正确的:clang 3.4 的 CMakeLists.txt 明确指出以下内容:
1 # If we are not building as a part of LLVM, build Clang as an
2 # standalone project, using LLVM as an external library:
3 if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
4 project(Clang)
5 cmake_minimum_required(VERSION 2.8)
6
7 set(CLANG_PATH_TO_LLVM_SOURCE "" CACHE PATH
8 "Path to LLVM source code. Not necessary if using an installed LLVM.")
9 set(CLANG_PATH_TO_LLVM_BUILD "" CACHE PATH
10 "Path to the directory where LLVM was built or installed.")
参见第 1 行和第 2 行。但是,我还没有找到任何关于如何设置 CLANG_PATH_TO_LLVM_BUILD 的 LLVM 文档。我尝试了以下方法:
cmake -DCLANG_PATH_TO_LLVM_BUILD="../../llvm-3.4/build" ..
并得到以下错误:
$ clang3.4/_tars/clang-3.4/build$ cmake -DCLANG_PATH_TO_LLVM_BUILD="../../llvm-3.4/build" ..
-- The C compiler identification is Clang 3.3.0
-- The CXX compiler identification is Clang 3.3.0
-- Check for working C compiler: /usr/bin/clang
-- Check for working C compiler: /usr/bin/clang -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/clang++
-- Check for working CXX compiler: /usr/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
CMake Error at CMakeLists.txt:39 (include):
include could not find load file:
AddLLVM
CMake Error at CMakeLists.txt:40 (include):
include could not find load file:
TableGen
-- Performing Test C_SUPPORTS_FLAG
-- Performing Test C_SUPPORTS_FLAG - Success
-- Performing Test CXX_SUPPORTS_FLAG
-- Performing Test CXX_SUPPORTS_FLAG - Success
-- Building with -fPIC
-- Performing Test SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG
-- Performing Test SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG - Success
-- Found LibXml2: /usr/lib/x86_64-linux-gnu/libxml2.so (found version "2.7.8")
-- Clang version: 3.4
-- Performing Test CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG
-- Performing Test CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG - Success
CMake Error at utils/TableGen/CMakeLists.txt:3 (add_tablegen):
Unknown CMake command "add_tablegen".
-- Configuring incomplete, errors occurred!
但这是不对的! LLVM + compiler-rt 已使用我们自己的 DEB 安装在构建主机上。而且,
$ llvm/clang3.4/_tars/clang-3.4/build$ ls /usr/share/llvm/cmake
AddLLVM.cmake ChooseMSVCCRT.cmake linux_issue.cmake LLVMConfigVersion.cmake pkg.cmake
AddLLVMDefinitions.cmake GetSVN.cmake LLVM-Config.cmake LLVMParseArguments.cmake TableGen.cmake
arch.cmake HandleLLVMOptions.cmake LLVMConfig.cmake LLVMProcessSources.cmake
所以,所有必需的 cmake 模块都在那里 - 就在系统上!
我希望知道如何强制 clang 3.4 使用 cmake 构建,并使用已安装的 LLVM 3.4 + compiler-rt 3.4。
更新:
我决定做以下事情:
$ llvm/clang3.4/_tars/clang-3.4/build$ cmake -DCLANG_PATH_TO_LLVM_BUILD="/usr" ..
-- Building with -fPIC
-- Clang version: 3.4
-- Found Subversion: /usr/bin/svn (found version "1.6.17")
-- Configuring done
-- Generating done
-- Build files have been written to: ../llvm/clang3.4/_tars/clang-3.4/build
../llvm/clang3.4/_tars/clang-3.4/build$ make -j 2
Scanning dependencies of target ClangDriverOptions
Scanning dependencies of target clang-tblgen
[ 0%] Building Options.inc...
[ 0%] ../llvm/clang3.4/_tars/clang-3.4/include/clang/Driver/Options.td:15:9: error: Could not find include file 'llvm/Option/OptParser.td'
include "llvm/Option/OptParser.td"
^
.../llvm/clang3.4/_tars/clang-3.4/include/clang/Driver/Options.td:15:9: Building CXX object utils/TableGen/CMakeFiles/clang-tblgen.dir/ClangASTNodesEmitter.cpp.o
error: Unexpected input at top level
include "llvm/Option/OptParser.td"
^
make[2]: *** [include/clang/Driver/Options.inc.tmp] Error 1
make[1]: *** [include/clang/Driver/CMakeFiles/ClangDriverOptions.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 0%] Building CXX object utils/TableGen/CMakeFiles/clang-tblgen.dir/ClangAttrEmitter.cpp.o
[ 0%] Building CXX object utils/TableGen/CMakeFiles/clang-tblgen.dir/ClangCommentCommandInfoEmitter.cpp.o
[ 0%] Building CXX object utils/TableGen/CMakeFiles/clang-tblgen.dir/ClangCommentHTMLNamedCharacterReferenceEmitter.cpp.o
[ 1%] Building CXX object utils/TableGen/CMakeFiles/clang-tblgen.dir/ClangCommentHTMLTagsEmitter.cpp.o
[ 1%] Building CXX object utils/TableGen/CMakeFiles/clang-tblgen.dir/ClangDiagnosticsEmitter.cpp.o
[ 1%] Building CXX object utils/TableGen/CMakeFiles/clang-tblgen.dir/ClangSACheckersEmitter.cpp.o
[ 1%] Building CXX object utils/TableGen/CMakeFiles/clang-tblgen.dir/NeonEmitter.cpp.o
[ 1%] Building CXX object utils/TableGen/CMakeFiles/clang-tblgen.dir/TableGen.cpp.o
Linking CXX executable ../llvm/clang3.4/_tars/llvm-3.4/build/bin/clang-tblgen
[ 1%] Built target clang-tblgen
make: *** [all] Error 2
这样更好。看起来 clang 3.4 的默认 CMakeLists.txt 甚至都不是 QA-ed x-( Yikes x-(
【问题讨论】:
-
我还是
cmake的新手,但我怀疑clang3.4 附带的CMakeLists.txt不正确。我引用的首要陈述是误导。如果已安装 LLVM,并在/usr/share/llvm/cmake中使用自定义模块,那么CMAKE_MODULE_PATH不能单独依赖CLANG_PATH_TO_LLVM_SOURCE恕我直言。所以,我想知道 LLVM clang 人的这个说法真的可行吗?引用“如果我们不作为 LLVM 的一部分构建,请将 Clang 构建为独立项目,使用 LLVM 作为外部库” -
+1,感谢您自己构建一切的努力。但你知道llvm.org/apt 有一个半官方的 apt 回购吗?
-
@TemplateRex。我不喜欢使用这些。它们都具有 GNU libstdc++ 依赖项,这不符合我们的 GNU 免费 C++ 构建环境要求。
-
@user183394 你知道 Linux 内核是... GPL 吗? Glibc 是……GNU? GCC 也不是坏事。完全没有。特别是在 Linux 上。 Clang 并不完美,LLVM 在优化方面并不总是像 GCC 一样好。无论如何,我想我的意思是你无缘无故地让自己变得困难。
-
@rubenvb。我不反对 GNU,但我们有我们的需求,我不想详细说明 SO(太 OT)。让您了解一下:如何在 RHEL 5.8 上构建 C++11 应用程序? :> 关于clang的表现,我只能建议phoronix.com/…,只要你有时间。关于让我的生活变得困难:我们需要使用系统原生的包格式。
cmake和cpack真的很擅长满足这个要求。在 2 周内,我已经可以对高度精细的cmakelistfiles 进行切片和切块,恕我直言!bad :)