2010-07-09 13 views
16

Pregunta: ¿Puede CMake generar scripts de compilación que de ninguna manera utilicen CMake? De lo contrario, ¿qué tan difícil es desanimar a un script de automake generado por CMake para que no realice ninguna comprobación en CMake?¿Puede CMake generar scripts de compilación que * no * usan cmake?

Soy un gran admirador de CMake hasta el punto en que defiendo la idea de que hagamos la transición en mi entorno de trabajo 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 requieran cmake.

Claramente, nunca me gustaría hacer esto para el uso diario, pero tener la capacidad de crear fácilmente una rama de nuestro código que se puede construir desde la fuente sin requerir cmake sería de gran ayuda para hacer que mi caso.

+0

Me parece extraño que las respuestas aquí sean "no". Estoy llegando al punto con cmake de que estoy empezando a entender cómo usarlo (en lugar de tratar de obligarlo a hacer algo para lo que no está diseñado), como usar compilaciones fuera de la fuente, etc. Pero yo sabe que cmake se incluye con cpack, que puede generar tarballs en Linux y similares. Si un tarball requiere cmake para construir, no estoy convencido de que sea un tarball en absoluto. – Steve314

+0

Echaré un vistazo más de cerca a CPack;) – Voltaire

+3

Los archivos comprimidos generados por CPack normalmente no son archivos tar de fuente para construir, sino más bien archivos binarios para ejecutar el sistema. – JesperE

Respuesta

5

No, CMake no puede hacer esto. En realidad, tampoco tiene sentido, ya que sin ningún soporte CMake en tiempo de compilación, no habría manera de verificar o actualizar los archivos makefiles/project ellos mismos cuando los archivos CMakeLists.txt hayan cambiado.

Si se está mudando de Visual Studio a CMake, es posible que desee echar un vistazo a vcproj2cmake.

+1

Eso es en realidad una consecuencia "deseada" - Estoy interesado en generar un tipo de construcción de herramientas automáticas "listas para distribuir", donde make podría usarse para construir el proyecto sin dependencias cmake de ningún tipo - en ese punto, está bien si los cambios no se reflejan en CMake. – Voltaire

+5

Ese es un caso de uso que CMake no aborda. – JesperE

2

Como alguien que ha tomado una gran pieza compleja de software y recientemente sacó su sistema de compilación existente, instalando un nuevo sistema de compilación en su lugar. Puedo decirte que no es fácil, pero definitivamente no quiero scripts de shell como parte de mi proceso de compilación, si pueden evitarse. Más y 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 acceden, los grandes proyectos.

Una de las cosas buenas de CMake es que construye cosas más rápido. Recurrir a tenedor instancias de shell para interpretar una secuencia de comandos realmente ralentiza el proceso de construcción.

3

Los archivos CMake generados dependen de cmake para varios comandos como crear/eliminar/etc ... no solo para regenerar los makefiles en un cambio, por lo que eliminar cmake no va a funcionar.

+2

+1 CMake también se puede utilizar como lenguaje de scripting (ver opción "-P" en la página de manual de CMake), y muchos proyectos usan CMake como reemplazo de scripts de shell, para cosas como copiar archivos o invocar programas de ayuda. Estos proyectos requerirán CMake en tiempo de compilación, no solo para generar el archivo MAKE. – sleske

-1

¿Qué pasa con la 'solución atómica'?

EX generar automáticamente un archivo "QT moc" de CMakeLists.txt, y luego construir proyecto que depende del archivo .cpp que se genera

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

Cuando 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 

ventanas equivalentes archivo por lotes "moc_creator_win.bat":

moc "GUICreator.h" -o "moc_GUICreator.cpp" 

no han probado este l ast bits en Windows, pero es algo muy cercano o deben trabajar, justo después del bloque si (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) 

Así que, básicamente, si eres inteligente que puede hacer lo que quiere de una script y usa las variables de CMake como args, no estoy seguro si puedes pedir más ...

el punto es evitar 'tipos de construcción no portátiles' a menos que realmente necesita para introducirse en un compilador especializado, o no se siente como el uso de QT Designer para colocar los widgets de ;-)

+0

No estoy seguro de que esto sea relevante para la pregunta original. –

+0

El punto en el que puede usar CMake como está previsto, o en el extremo opuesto del espectro, simplemente envuélvalo alrededor de scripts arbitrarios. No hay nada que le impida analizar las variables cmake y generar los archivos make que desee ... –

4

La capacidad para hacer esto depende de su sistema operativo, estoy suponiendo Unix/Makefile o Winderz/MSVC. Si está utilizando MSVC, la dependencia de cmake debe eliminarse declarando la opción CMAKE_SUPPRESS_REGENERATION al comienzo de su script cmake.

SET(CMAKE_SUPPRESS_REGENERATION TRUE) 

En los sistemas basados ​​en Unix, sin embargo, los Makefiles son tied explícitamente a la cmake construir archivos (CMakeFiles, etc.). Sospecho que esta dependencia podría ser evitada por el comentario estratégico de las directivas Makefile, aunque no puedo decir cuáles podrían ser.