CMake能否生成不使用CMake的构建脚本?

18

问题:CMake是否可以生成完全不使用CMake的构建脚本?如果不行,将CMake生成的automake脚本修改为不检查CMake需要多难?

我非常喜欢CMake,甚至在我的工作环境中推动我们转向使用它。为了方便从我们当前的构建系统过渡到CMake,有一件事情可能会帮助:证明CMake可以生成不需要CMake自身的automake文件。

显然,我从不想在日常使用中这样做,但是能够轻松创建一个可以从源代码构建而不需要cmake的代码分支,将有助于我说服他人。


我觉得这里的答案“否定”有些奇怪。我现在刚开始理解如何使用cmake(而不是试图强制它做一些它没有设计的事情),例如使用外部构建等。但我知道cmake与cpack捆绑在一起,可以在Linux和类似系统上生成tarballs。如果一个tarball需要cmake来构建,我并不认为它是一个真正的tarball。 - user180247
我会仔细研究一下 CPack ;) - Voltaire
3
CPack 生成的 tarballs 通常不是用于构建的源代码 tarballs,而是用于运行系统的二进制 tarballs。 - JesperE
讽刺的是,你会提到“CMake生成的automake脚本”。Automake是CMake替代的工具之一,但“automake”这个词显然已经深入人心。 - William Pursell
5个回答

6

能否实现此功能取决于您的操作系统,我假设您使用的是Unix/Makefile或Windows/MSVC。如果您使用的是MSVC,则可以通过在cmake脚本开头声明CMAKE_SUPPRESS_REGENERATION选项来消除cmake依赖。

SET(CMAKE_SUPPRESS_REGENERATION TRUE)

然而,在基于Unix的系统上,Makefiles明确地与cmake构建文件(CMakeFiles等)绑定在一起。我怀疑通过策略性地注释Makefile指令可以绕过此依赖关系,尽管我无法确定它们可能是什么。


CMake 3.12 版本开始,“CMAKE_SUPPRESS_REGENERATION” 支持 Ninja 和 Makefile 生成器。 - Parker Coates

4

不,CMake不能做到这一点。这也没有什么意义,因为在构建时没有任何CMake支持,当CMakeLists.txt文件发生更改时,就无法检查或更新makefiles/project-files本身。

如果您从Visual Studio转移到CMake,您可能需要查看vcproj2cmake


1
这实际上是一个“期望的”结果 - 我有兴趣生成一个自动工具“准备分发”的构建,其中可以使用make构建项目而不需要任何CMake依赖项 - 在那一点上,如果更改不反映在CMake中,那就没关系了。 - Voltaire
5
这是一个 CMake 无法处理的使用情况。 - JesperE

3
CMake生成的文件依赖于CMake执行各种命令,例如创建/删除等操作,而不仅仅是在更改时重新生成makefile,因此删除CMake将无法起作用。

2
CMake也可以用作脚本语言(请参阅CMake手册中的“-P”选项),许多项目使用CMake替换shell脚本,例如复制文件或调用辅助程序。这些项目将需要在构建时使用CMake,而不仅仅是为了生成makefile。 - sleske

2
作为一个曾经接手过一款大型复杂软件的构建系统并安装了新的构建系统的人,我可以告诉你这并不容易。但是如果有可能,我肯定不想在我的构建流程中加入shell脚本。越来越多的系统将会使用CMake,就像LLVM和KDE这样的大型软件包开始使用它一样。在这方面,它真的很擅长处理大型项目。
CMake的一个优点是可以更快地构建。使用fork shell实例去解释一个脚本会使构建流程变得非常缓慢。

-1

关于“原子解决方案”怎么样?

例如,从CMakeLists.txt自动生成“QT moc”文件,然后构建依赖于生成的.cpp文件的项目。

# inside project level CMakeLists.txt 
# run shell script to create the "moc_GUICreator.cpp" auto-generated source file
if(UNIX)
execute_process(COMMAND "sh" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate_moc.sh  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts )
endif(UNIX)

其中 .sh 文件包含:

# generate_moc.sh
echo "generating moc file:  moc ../include/GUICreator.h  -o  ../src/moc_GUICreator.cpp "
moc ../include/GUICreator.h -o ../src/moc_GUICreator.cpp

等效的Windows批处理文件,“moc_creator_win.bat”:

moc "GUICreator.h" -o "moc_GUICreator.cpp"

在Windows上还没有尝试过这个最后一部分,但它或者非常接近的东西应该可以工作,在CMakeLists.txt的if(UNIX)块之后:

if(WIN32)
execute_process(COMMAND "cmd" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/moc_creator_win.bat  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts )
endif(WIN32)

所以,基本上如果你聪明的话,你可以从脚本中做任何你想做的事情,并将CMake变量用作参数,我不确定你是否还需要更多......

关键是要避免使用“非可移植构建类型”,除非你真的需要将其破解成专门的编译器,或者不想使用QT Designer来放置小部件;-)


你可以按照预期使用CMake,也可以将其包装到任意脚本中。没有任何阻止你解析CMake变量并生成所需的任何makefile... - peter karasev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接