问题:CMake是否可以生成完全不使用CMake的构建脚本?如果不行,将CMake生成的automake脚本修改为不检查CMake需要多难?
我非常喜欢CMake,甚至在我的工作环境中推动我们转向使用它。为了方便从我们当前的构建系统过渡到CMake,有一件事情可能会帮助:证明CMake可以生成不需要CMake自身的automake文件。
显然,我从不想在日常使用中这样做,但是能够轻松创建一个可以从源代码构建而不需要cmake的代码分支,将有助于我说服他人。
问题:CMake是否可以生成完全不使用CMake的构建脚本?如果不行,将CMake生成的automake脚本修改为不检查CMake需要多难?
我非常喜欢CMake,甚至在我的工作环境中推动我们转向使用它。为了方便从我们当前的构建系统过渡到CMake,有一件事情可能会帮助:证明CMake可以生成不需要CMake自身的automake文件。
显然,我从不想在日常使用中这样做,但是能够轻松创建一个可以从源代码构建而不需要cmake的代码分支,将有助于我说服他人。
能否实现此功能取决于您的操作系统,我假设您使用的是Unix/Makefile或Windows/MSVC。如果您使用的是MSVC,则可以通过在cmake脚本开头声明CMAKE_SUPPRESS_REGENERATION
选项来消除cmake依赖。
SET(CMAKE_SUPPRESS_REGENERATION TRUE)
然而,在基于Unix的系统上,Makefiles明确地与cmake构建文件(CMakeFiles等)绑定在一起。我怀疑通过策略性地注释Makefile指令可以绕过此依赖关系,尽管我无法确定它们可能是什么。
不,CMake不能做到这一点。这也没有什么意义,因为在构建时没有任何CMake支持,当CMakeLists.txt文件发生更改时,就无法检查或更新makefiles/project-files本身。
如果您从Visual Studio转移到CMake,您可能需要查看vcproj2cmake。
关于“原子解决方案”怎么样?
例如,从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来放置小部件;-)