我大约两周前开始研究cmake
并喜欢它。到目前为止,我已成功构建和打包(使用本机系统打包格式)libc++abi
,libc++
,llvm
3.4所有{{1}对于RHEL 6.x,Fedora 20+和Ubuntu 12.04 LTS +,(cmake
使用我自己的libc++abi
设置)。
我想创建一个
的C ++构建环境cmake
完全(因此我们不希望任何LLVM RPM / DEB来自上述发行版或LLVM Debian/Ubuntu nightly packages下载位点)尽管如此,我试图在运行Ubuntu 12.04 LTS 64bit的构建主机上使用libstdc++
构建clang
3.4,并使用 pure clang 3.3构建我没有对GNU cmake
的任何依赖,以及libstdc++
3.3和libc++
。后两者也没有libc++abi
依赖。我也是这样构建的。
我非常了解Clang - Getting Started网页并成功使用了相关说明。但这些完全我不想使用的东西。它们也是不正确的:libstdc++
的{{1}} 3.4清楚地说明了以下内容:
CMakeLists.txt
请参阅第1行和第2行。但是,我没有找到有关如何设置clang
的任何LLVM文档。我尝试了以下方法:
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.")
并出现以下错误:
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!
安装在构建主机上。而且,
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
3.4使用cmake
进行构建,已经安装了LLVM 3.4 + clang
3.4。
更新:
我决定做以下事情:
cmake
那更好。看起来像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
甚至不是QA-ed x-(Yikes x - (
答案 0 :(得分:4)
我决定坚持,因为任何自尊的工程师都会这样做:)我只是查看以下两个文件并添加完整路径到违规包含,然后就是这样。
Options.td
CC1AsOptions.td
现在,我可以构建所有不需要libstdc++
依赖项的LLVM主项目,所有项目都与libc++
和libc++abi
相关联。万岁:)
所以,我已经确认了
compiler-rt
AFAIK除外)都可以使用cmake
构建。无需在LLVM源代码树下将它们整合在一起进行构建。你绝对可以在Linux上单独构建它们,不像这些“官方”文档可能让你相信:> LLVM团队应该真正考虑并最小化所有项目中明显的循环依赖性。在各种Linux发行版上引导LLVM / clang(尤其是较旧的发行版,如RHEL 5.x)没有 GNU libstdc++
依赖性太繁琐 - 从我的第一手经验来讲。他们可以完成(我已经完成了:)但它不适合胆小的人。
答案 1 :(得分:2)