【问题标题】:Building and packaging LLVM clang 3.4 with cmake使用 cmake 构建和打包 LLVM clang 3.4
【发布时间】:2014-04-20 04:41:58
【问题描述】:

大约 2 周前我开始学习 cmake 并喜欢它。到目前为止,我已经成功构建和打包(使用本机系统打包格式libc++abilibc++llvm 3.4 全部使用cmakelibc++abi 使用我自己的cmake setup) 适用于 RHEL 6.x、Fedora 20+ 和 Ubuntu 12.04 LTS+。

我想创建一个 C++ 构建环境,

  1. 让我们完全摆脱对 GNU GCC 和 libstdc++ 的依赖(因此我们不希望来自上述发行版或 LLVM Debian/Ubuntu nightly packages 下载站点的任何 LLVM RPM/DEB)
  2. 使我们能够全面探索 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 的新手,但我怀疑clang 3.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/…,只要你有时间。关于让我的生活变得困难:我们需要使用系统原生的包格式。 cmakecpack 真的很擅长满足这个要求。在 2 周内,我已经可以对高度精细的 cmake listfiles 进行切片和切块,恕我直言!bad :)

标签: c++11 cmake clang llvm


【解决方案1】:

我决定像任何有自尊的工程师一样坚持 :) 我简单地修改了以下两个文件并添加了有问题的包含的完整路径,然后就是这样。

  1. Options.td
  2. CC1AsOptions.td

现在我可以构建所有需要的 LLVM 主项目,而无需依赖 libstdc++,所有项目都与 libc++libc++abi 链接。万岁:)

所以,我已经确认了

  • Getting Started: Building and Running Clang 中给出的一些说明具有误导性,例如7
  • 所有主要的 LLVM 项目(compiler-rtAFAIK 除外)都可以使用cmake 构建。无需将它们放在 LLVM 源代码树下进行构建。你绝对可以在 Linux 上单独构建几乎所有这些,不像这些“官方”文档可能会让你相信:>

LLVM 团队应该认真思考并尽量减少所有项目之间明显的循环依赖关系。在各种 Linux 发行版(尤其是较旧的发行版,例如 RHEL 5.x)上引导 LLVM/clang 没有 GNU libstdc++ 依赖项太乏味了——从我的第一手经验来看。他们可以做到(我已经做到了:)但这不适合胆小的人。

【讨论】:

  • 您有记录完整构建过程的网站/GitHub 页面吗?那将是非常有价值的!
  • 还没有。一旦我完成了整个系统。现在,恕我直言,仍然太 q&d :(
  • @user183394 现在呢?你能向我们这些受苦的人释放任何东西吗?
  • @user183394 我也想检查一下,这对我现在真的很有帮助。我有兴趣从 svn 结帐打包它:nosubstance.me/articles/2015-01-29-better-completion-for-cpp
【解决方案2】:

我认为这个项目做了你想做的事:

https://github.com/rsmmr/install-clang

我在 FC16+ 上使用过它,但在 RHEL5.x 上确实遇到了引导问题。

【讨论】:

  • 恐怕不会。作为我当前努力的前奏,我已经尝试构建一个类似的。正如您在上面指出的,该系统无法在旧 Linux 中运行。最具挑战性的部分:要在“(旧)Linux”上构建libstdc++ 免费的 C++1y 构建环境,您必须有一个支持 C++11 的构建环境!!我花了一段时间来打破这种循环依赖,首先是去年的 3.3,今年是 3.4。另外,我不仅需要一个构建系统,还需要一个使用系统原生打包格式的打包系统。 cmake + cpack 很好地支持这个需求。
猜你喜欢
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2011-10-25
  • 2018-03-15
相关资源
最近更新 更多