如何生成CMakeLists.txt?

cel*_*vek 50 c c++ cmake

我需要一些关于如何为CMake自动生成CMakeLists.txt文件的指针/建议.有谁知道任何现有的发电机?我检查了CMake Wiki中列出的那些,但不幸的是它们不适合我.

我已经有一个基本的Python脚本遍历我的项目的目录结构并生成所需的文件,但它现在真的"愚蠢".我想补充它,以考虑我正在构建的不同平台,我正在使用的编译器\交叉编译器或我可能具有的库依赖项的不同版本.我没有太多关于CMake的专家经验和一个我可以根据我的工作或已经工作的发电机的例子可能会有很大的帮助.

小智 26

我认为您不需要使用自动脚本来生成CMakeLists.Txt,因为在您理解了基本过程之后编写一个非常简单的任务.是的,我同意理解编写CMake Wiki中给出的程序也很困难,因为它太详细了.

展示了如何编写一个非常简单的例子的CMakeLists.txt显示在这里,我想这将是利用每一个人,甚至有人谁去写的CMakeLists.txt首次的.

  • 无论您如何理解程序,自动生成程序将始终更快,更方便.这个问题值得一个有用的答案. (17认同)
  • 网站已关闭.有[缓存链接版本](http://web.archive.org/web/20141116113322/http://preetisblog.com/programming/how-to-write-cmakelists-txt) (4认同)

wOl*_*iNe 12

好吧,我也没有很多Cmake的经验,但是为了执行跨平台,需要编写和修改很多文件,包括CMakeLists.txt文件,我建议你使用这个名为ProjectGenerator Tool的新工具,非常酷,它可以完成所需的所有额外工作,并且可以轻松地为第三方源生成此类文件.在使用之前,请仔细阅读README.

链接:http://www.ogre3d.org/forums/viewtopic.php? f = 1& t = 54842

  • 这实际上是回答问题的唯一帖子.我不认为它应该被投票只是因为人们所有人的偏好是手动做事,因为linux. (5认同)

Lin*_*cer 10

我认为你这样做是颠倒的.

使用CMake时,您应该自己编写CMakeLists.txt.通常,您不需要处理不同的编译器,因为CMake了解它们.但是,如果必须,您可以在CMakeFiles中添加代码,以根据您使用的工具执行不同的操作.

  • 我同意。CMake 是我用过的最好的此类构建工具,但您必须遵守其规则,并遵守源的物理设计。您可能最好看看 CMake 在其他 Python 项目中的使用方式。 (2认同)

jpo*_*o38 7

我正在维护一个 C++ 软件环境,它有 1000 多个模块(共享、静态库、程序)并使用 20 多个第三方(boost、openCV、Qt、Qwt...)。这个软件环境承载了许多程序(约 50 个),每个程序都选择了一些库、程序和第三方。我使用 CMake 生成 makefile,这真的很棒。

但是,如果您CMakeLists.txt按照建议的方式编写(将模块声明为库/程序、导入源文件、添加依赖项...)。我同意 celavek:维护这些CMakeLists.txt文件真的很痛苦:

  • 向模块添加新文件时,需要更新其 CMakeLists.txt
  • 当您升级第三方时,您需要更新CMakeLists.txt所有使用它的模块
  • 当您添加新的依赖项(库A现在需要 library B)时,您可能需要使用更新CMakeLists.txt所有程序的A
  • 当您想要更改新的全局设置(编译器设置、预定义变量、使用的 C++ 标准)时,您需要更新所有 CMakeLists.txt

然后,我看到了两种解决这些问题的策略,可能是 OP 提到的一种。

1-CMakeLists.txt写得很好并且足够聪明,不会有僵硬的行为来即时更新自己。这就是我们在我们的软件环境中所拥有的。每个模块都有一个标准化的文件组织(源在src文件夹中,包含在inc文件夹中......)并且有简单的文本文件来指定它们的依赖关系(使用我们定义的关键字,比如QT模块需要链接Qt)。然后,我们CMakeLists.txt是一个两行文件,只需调用我们编写的 cmake 宏来自动设置模块。作为 MCVE,它将是:

CMakeLists.txt:

include( utl.cmake )
add_module( "mylib", lib )
Run Code Online (Sandbox Code Playgroud)

utl.cmake:

macro( add_module name what )
    file(GLOB_RECURSE source_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
    if ( what STREQUEL "lib" )
        add_library( ${name} SHARED ${source_files} )
    elseif ( what STREQUEL "prg" )
        add_executable( ${name} ${source_files} )
    endif()
    # TODO: Parse the simple texts files to add target_link_libraries accordingly
endmacro()
Run Code Online (Sandbox Code Playgroud)

然后,对于上面暴露的所有情况,您只需要更新 utl.cmake,而不是CMakeLists.txt您拥有的那一千个...

老实说,我们对这种方法很满意,系统变得非常易于维护,我们可以轻松添加新的依赖项、升级第三方、更改一些构建/依赖项策略……

但是,还有很多CMake脚本需要编写。而且CMake脚本语言很烂……这个工具非常强大,对,但是脚本的变量范围、缓存、痛苦的和没有很好记录的语法(只是为了检查列表是否为空,你必须询问它的大小并将其存储在一个变量!),事实上它不是面向对象的......维护起来真的很痛苦。

所以,我现在确信真正好的方法可能是:

2-CMakeLists.txt从更强大的语言(如 Python)完全生成。Python 脚本会做类似于我们的 utl.cmake 所做的事情,而是会生成一个CMakeLists.txt准备传递的 CMake 工具(具有 HelloWorld 中建议的格式,没有变量,没有函数......它只会调用标准的 CMake功能)。

我怀疑这样的通用工具是否存在,因为很难生成CMakeLists.txt让每个人都满意的文件,您必须自己编写。请注意,gen-cmake 会这样做(生成 CMakeLists.txt),但是以一种非常原始的方式并且它显然只支持 Linux,但它可能是一个很好的起点。

这很可能是我们软件环境的 v2...有一天。

注意:另外,如果你想同时支持 qmake 和 cmake,一个写得很好的 Python 脚本可以按需生成 CMakeLists 和 pro 文件!

  • 目标不是解决了必须保持依赖关系的大部分问题吗? (2认同)

小智 5

CLion是一个完全基于CMake项目文件的集成开发环境。

从源使用导入项目时,它能够自行生成CMakeLists.txt文件。

但是,很有可能您必须随着项目的增长以及添加外部依赖项来手动编辑此文件。