2010-07-09 99 views
16

问题:CMake能否生成不以任何方式使用CMake的构建脚本?如果不是,那么如何去拼凑一个CMake生成的automake脚本来不对CMake进行任何检查?CMake可以生成*不*使用cmake的构建脚本吗?

我是CMake的忠实粉丝,我支持在当前工作环境中向我们过渡的想法。有一件事可以缓解从我们当前的构建系统到CMake的转换,如果我能证明CMake可以生成自己不需要cmake的automake文件。显然,我绝对不想这样做,每天使用,但有能力轻松创建我们可以从源代码构建的代码分支,而不需要cmake,这将帮助我做出很大的贡献案件。

+0

我觉得很奇怪,这里的答案是“不”。我刚开始接触cmake,我开始理解如何使用它(而不是试图迫使它做一些它不是专门设计的),比如使用out-of-source构建等。但是我知道cmake与cpack捆绑在一起,它可以在Linux和类似系统上生成tarball。如果tarball需要cmake来构建,我不相信它是一个tarball。 – Steve314 2010-07-15 04:04:12

+0

我会仔细看看CPack;) – Voltaire 2010-07-15 20:43:47

+3

CPack生成的压缩包通常不是用于构建的源代码压缩包,而是用于运行系统的二进制压缩包。 – JesperE 2010-07-15 21:33:37

回答

5

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

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

+1

这实际上是一个“期望的”后果 - 我有兴趣生成一个“准备分发”类型的构建的自动工具,其中make可用于构建没有任何类型的cmake依赖项目的项目 - 此时,它可以如果更改没有反映回CMake。 – Voltaire 2010-07-15 20:43:23

+5

这是一个CMake没有解决的用例。 – JesperE 2010-07-15 21:34:34

2

作为一个采取了大量复杂软件并且最近取消了其现有构建系统的人,在其位置安装了新的构建系统。我可以告诉你这并不容易,但是如果可以避免的话,我绝对不希望将shell脚本作为构建过程的一部分。无论如何,越来越多的系统会发现自己拥有CMake,因为像LLVM和KDE这样的大型软件包开始使用它 - 这是一个真正加入大型项目的领域。

关于CMake的好处之一是它可以更快地构建事物。假设必须通过fork外壳实例来解释脚本,才会减慢构建过程。

3

CMake生成的文件依赖于cmake的各种命令,如创建/删除/等等......不仅仅是为了重新生成makefiles,所以删除cmake不会起作用。

+2

+1 CMake也可用作脚本语言(请参阅CMake手册页中的选项“-P”),许多项目使用CMake作为shell脚本的替代品,用于诸如复制文件或调用帮助程序等。这些项目将在构建时需要CMake,而不仅仅是生成makefile。 – sleske 2012-05-16 08:05:58

-1

'原子解决方案'呢?

EX-自动生成的CMakeLists.txt了 “QT MOC” 文件,然后生成项目,取决于所产生的

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

.cpp文件凡.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" 

没有尝试过该L在Windows AST位,但它还是极为类似应工作,只是在对的CMakeLists.txt如果(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来放置小部件;-)

+0

我不确定这与原始问题有关。 – 2010-09-28 13:19:48

+0

您可以按照预期使用CMake,或者在光谱的另一端使用,只是将其包装在任意脚本周围。没有什么能阻止你分析cmake变量并生成你想要的任何makefile文件...... – 2010-10-03 20:24:32

4

的能力要做到这一点取决于你的操作系统,我假定Unix/Makefile或Winderz/MSVC。如果你使用的是MSVC,应该在你的cmake脚本开始时声明CMAKE_SUPPRESS_REGENERATION选项来消除cmake依赖。

SET(CMAKE_SUPPRESS_REGENERATION TRUE) 

在基于Unix的系统,但是,Makefile文件tied明确地CMake的构建文件(CMakeFiles等)。我怀疑这种依赖性可能会被Makefile指令中的策略性评论绕过,尽管我不能说它们可能是什么。