[英]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中添加代码,以根据您使用的工具执行不同的操作。
不确定这是否是原始海报所面临的问题,但正如我在上面看到的“只写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有点复杂。
也许这可能会有所帮助:
作者已经发表了一些关于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
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.