繁体   English   中英

"如何生成 CMakeLists.txt?"

[英]How to generate CMakeLists.txt?

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

我已经有一个基本的 Python 脚本,它遍历我的项目的目录结构并生成所需的文件,但它现在真的很“愚蠢”。 我想对其进行扩充以考虑到例如我正在构建的不同平台、我正在使用的编译器\\交叉编译器或我可能拥有的不同版本的库依赖项。 我在 CMake 方面没有太多\\专家经验,我可以根据我的工作或已经工作的生成器提供一个示例,这可能会有很大帮助。

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

这里显示了一个显示如何编写CMakeLists.txt的基本示例,我认为这对每个人都有用,即使是第一次编写CMakeLists.txt的人也是如此。

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

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

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

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

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

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

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

不确定这是否是原始海报所面临的问题,但正如我在上面看到的“只写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有点复杂。

也许这可能会有所帮助:

https://conan.io/

作者已经发表了一些关于cmake的演讲,以及如何使用cmake创建模块化项目到CPPCon。 据我所知,这个工具需要cmake,所以我想在集成新包或创建新包时生成它。 最近我读到了一些关于如何使用YAML文件编写C / C ++项目的更高级别描述的内容,但不确定它是否是conan的一部分(我读到的是来自conan的作者)。 我从来没有使用过,这对我来说是悬而未决的,所以,如果您使用它并满足您的需求,请评论您对它的看法以及它如何适合您的情况。

我正在维护一个拥有1000多个模块(共享,静态库,程序)的C ++软件环境,并使用超过20个第三方(boost,openCV,Qt,Qwt ......)。 这个软件环境包含许多程序(约50个),每个程序都会收集一些库,程序和第三方。 我使用CMake生成makefile,这真的很棒。

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

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

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

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

的CMakeLists.txt:

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()

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

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

但是,仍然有很多CMake脚本需要编写。 CMake脚本语言很糟糕......这个工具非常强大,对,但是脚本的变量范围,缓存,痛苦而且没有很好记录的语法(只是为了检查列表是否为空,你必须要求它的大小并存储这个在一个变量!),它不是面向对象的事实...使维护成为一个真正的痛苦。

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

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

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

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

我一直在寻找这样的生成器,但最后我决定自己编写(部分原因是我想了解 CMake 的工作原理):

https://github.com/Aenteas/cmake-generator

它有几个附加功能,例如创建 python 包装器 (SWIG)。

编写适合每个人的生成器是不可能的,但我希望它能给你一个想法,以防你想制作你的定制版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM