CMake可以生成*不*使用cmake的构建脚本吗?

时间:2010-07-09 22:25:42

标签: c++ build-process cmake

问题:CMake能否生成不以任何方式使用CMake的构建脚本?如果没有,那么将CMake生成的automake脚本排除在不对CMake进行任何检查的过程中有多难?

我是CMake的忠实粉丝,我支持我在当前的工作环境中过渡到它的想法。如果我能证明CMake可以生成不需要cmake的automake文件,那么可以简化从当前构建系统到CMake的过渡的一件事情。

显然,我绝不想在日常使用中这样做,但是能够轻松创建我们的代码分支,可以从源代码构建而不需要cmake,这将有助于我完成案例

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

执行此操作的能力取决于您的操作系统,我假设是Unix / Makefile或Winderz / MSVC。如果您正在使用MSVC,则应通过在cmake脚本开头声明CMAKE_SUPPRESS_REGENERATION选项来消除cmake依赖项。

SET(CMAKE_SUPPRESS_REGENERATION TRUE)

但是,在基于Unix的系统上,Makefile是tied显式的cmake构建文件(CMakeFiles等)。我怀疑Makefile指令中的战略性评论可以绕过这种依赖性,但我不能说它们可能是什么。

答案 2 :(得分:3)

CMake生成的文件依赖于cmake来执行各种命令,例如create / remove / etc ...而不仅仅是为了在更改时重新生成makefile,因此删除cmake是行不通的。

答案 3 :(得分:2)

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

CMake的一个好处是它可以更快地构建东西。使用fork shell实例来解释脚本真的会减慢构建过程。

答案 4 :(得分:-1)

'原子解决方案'怎么样?

EX-从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变量作为args,我不确定你是否可以要求更多......

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