如何生成CMakeLists.txt?

时间:2011-08-02 15:28:46

标签: c++ c cmake

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

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

6 个答案:

答案 0 :(得分:23)

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

显示如何编写 CMakeLists.txt 的一个非常基本的示例显示为here,我认为这对每个人都有用,即使是那些打算写CMakeLists.txt的人第一次。

答案 1 :(得分:11)

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

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

答案 2 :(得分:11)

我认为你这样做是颠倒过来的。

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

答案 3 :(得分:4)

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

从源代码导入项目

时,可以自行生成CMakeLists.txt文件

但是,您很可能需要在项目增长时手动编辑此文件并添加外部依赖项。

答案 4 :(得分:1)

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

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

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

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

1- CMakeLists.txt写得很好并且足够聪明,不要有冻结的行为来即时更新自己。这就是我们在软件环境中拥有的。每个模块都有一个标准化的文件组织(源位于src文件夹中,包括位于inc文件夹中...),并具有简单的文本文件来指定其依赖性(使用我们定义的关键字,例如{{1 }}表示模块需要与QT链接)。然后,我们的Qt是两行文件,只需调用我们编写的cmake宏即可自动设置模块。作为MCVE,应该是:

CMakeLists.txt:

CMakeLists.txt

utl.cmake:

include( utl.cmake )
add_module( "mylib", lib )

然后,对于上面暴露的所有情况,您只需要更新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() 的数千个...

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

但是,仍有许多CMakeLists.txt脚本需要编写。 CMake脚本语言很烂……该工具非常强大,但是,脚本的变量范围,缓存,令人痛苦且记录不充分的语法(只是要检查列表是否为空,您必须要求它是大小并将其存储在变量中!),事实上它不是面向对象的,这使得维护起来非常麻烦。

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

2-从更强大的语言(如Python)完全生成CMake 。 Python脚本会执行类似于utl.cmake的操作,而是会生成一个CMakeLists.txt随时可以通过CMake工具传递(具有HelloWorld中提出的格式,没有变量,没有函数....它只会调用标准CMake函数)。

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

这很可能是我们软件环境的第二天……

注意:此外,例如,如果要同时支持qmake和cmake,编写良好的Python脚本可以按需生成CMakeLists和pro文件!

答案 5 :(得分:0)

不确定这是原始海报面临的问题,但是我看到上面有很多“只写CMakefile.txt”的答案,让我简单解释为什么生成CMakefiles可能有意义:

a)我有另一个构建系统我很满意

(其中涵盖了大型集合的大型多平台构建     互连的共享和静态库,程序,脚本     语言扩展和工具,具有各种内部和外部     依赖,怪癖和变体)

b)即使我要替换它,我也不会考虑使用cmake。

我看了一下CMakefiles,我对语法不满意    并且对语义不满意。

c)CLion仅使用CMakefiles和Cmakefiles(看起来有点有趣)

所以,给CLion一个机会(我喜欢PyCharm,所以它很诱人),但为了继续使用我的构建系统,我很乐意使用一些工具让我 实行     make generate_cmake 并根据当前动态生成所有必要的CMake文件 从我的构建系统中提取的信息。我很乐意为工具/脚本提供我的应用程序所包含的源和头文件的信息,它应该构建哪些库和程序,-I,-L,-D等应该为哪个组件设置等等。等

嗯,当然,如果JetBrains允许提供一些直接的协议来为IDE提供所需的信息,我会更高兴 (比如说,允许我提供自己的命令来编译,运行和执行 发出他们真正需要的任何元数据 - 我认为他们主要需要incdirs并定义实现快速代码分析,libpaths为调试器设置LD_LIBRARY_PATH),而不引用cmake。协议的CMakefiles有点复杂。