问题:CMake能否生成不以任何方式使用CMake的构建脚本?如果没有,那么将CMake生成的automake脚本排除在不对CMake进行任何检查的过程中有多难?
我是CMake的忠实粉丝,我支持我在当前的工作环境中过渡到它的想法。如果我能证明CMake可以生成不需要cmake的automake文件,那么可以简化从当前构建系统到CMake的过渡的一件事情。
显然,我绝不想在日常使用中这样做,但是能够轻松创建我们的代码分支,可以从源代码构建而不需要cmake,这将有助于我完成案例
答案 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来放置小部件; - )