c++ - ¿Puede CMake generar scripts de compilación que*no*usen cmake?
build-process (5)
¿Qué pasa con la ''solución atómica''?
Ej .: generar automáticamente un archivo "QT moc" desde CMakeLists.txt, luego construir un proyecto que dependa del archivo .cpp que se genere
# 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)
Donde el archivo .sh contiene:
# 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
Archivo de lotes de Windows equivalente, "moc_creator_win.bat":
moc "GUICreator.h" -o "moc_GUICreator.cpp"
No he probado este último bit en Windows, pero debería funcionar muy cerca, justo después del bloque if (UNIX) en CMakeLists.txt:
if(WIN32)
execute_process(COMMAND "cmd" ${CMAKE_CURRENT_SOURCE_DIR}/scripts/moc_creator_win.bat WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/scripts )
endif(WIN32)
Entonces, básicamente, si eres listo, puedes hacer lo que quieras de un script y usar las variables CMake como argumentos, no estoy seguro de que puedas pedir más ...
el punto es evitar ''tipos de compilación no portátiles'' a menos que realmente necesite piratearlo en un compilador especializado, o no tenga ganas de usar QT Designer para colocar los widgets ;-)
Pregunta: ¿Puede CMake generar scripts de compilación que, de alguna manera, no utilicen CMake? Si no, ¿qué tan difícil es eliminar un script de automake generado por CMake para no realizar ninguna comprobación en contra de CMake?
Soy un gran fan de CMake hasta el punto en el que estoy defendiendo la idea de que hacemos la transición a mi entorno laboral actual. Una cosa que podría facilitar esta transición de nuestro sistema de compilación actual a CMake sería si pudiera demostrar que CMake puede generar archivos automake que no requieren de ellos mismos.
Claramente, nunca querría hacer esto para el uso diario, pero tener la capacidad de crear fácilmente una rama de nuestro código que puede construirse desde una fuente sin necesidad de un cmake ayudaría mucho en mi defensa.
Como alguien que ha tomado una gran pieza de software complejo y recientemente sacó su sistema de compilación existente, instalando un nuevo sistema de compilación en su lugar. Puedo decirles que no es fácil, pero definitivamente no querría los scripts de shell como parte de mi proceso de creación, si se pueden evitar. Cada vez más sistemas se encontrarán con CMake en ellos de todos modos, a medida que más paquetes de software de renombre como LLVM y KDE comiencen a usarlo. Esta es un área en la que realmente acelera, grandes proyectos.
Una de las cosas buenas de CMake es que construye las cosas más rápido. Recurrir a tener que bifurcar instancias de shell para interpretar un script realmente ralentiza el proceso de construcción.
La capacidad para hacer esto depende de su sistema operativo, estoy asumiendo que Unix / Makefile o Winderz / MSVC. Si está utilizando MSVC, la dependencia de cmake debe eliminarse declarando la opción CMAKE_SUPPRESS_REGENERATION al inicio de su script de cmake.
SET(CMAKE_SUPPRESS_REGENERATION TRUE)
Sin embargo, en los sistemas basados en Unix, los Makefiles están tied explícitamente a los archivos de compilación de cmake (CMakeFiles, etc.). Sospecho que esta dependencia podría ser superada por los comentarios estratégicos de las directivas de Makefile, aunque no puedo decir cuáles podrían ser.
Los archivos generados en CMake dependen de cmake para varios comandos, como crear / eliminar / etc ... no solo para regenerar los archivos make en un cambio, por lo que eliminar cmake no va a funcionar.
No, CMake no puede hacer esto. Tampoco tiene sentido, ya que sin ningún soporte de CMake en el momento de la compilación, no habría ninguna manera de verificar o actualizar los archivos makefiles / project cuando los archivos CMakeLists.txt hayan cambiado.
Si se está moviendo de Visual Studio a CMake, es posible que desee echar un vistazo a vcproj2cmake .