cmake: ¿Cómo agregar un add_custom_command que solo ejecuta un shellscript?

Cuando utilizo el gnu Make clásico, coloco acciones posteriores a la compilación, como flashear el dispositivo (si es un dispositivo integrado) y otras acciones similares. El destello real generalmente está oculto detrás de un pequeño sctipt o algunos comandos.

Entonces puedo escribir algo como

make flash

así que primero construyo el código y luego termina en el objetivo. El Makefile clásico podría tener algo como:

.PHONY: flash
flash: main.bin
    scripts/do_flash.pl main.bin

Pero, ¿cómo agrego este tipo de acciones posteriores a la compilación a una compilación de cmake?

¿Cómo agrego un "comando personalizado" que simplemente ejecuta un shellscript?

Esta pregunta habla de add_custom_command: la pregunta cmake agregar comando personalizado parece que está cerca, pero el add_custom_command parece necesitar un "archivo de salida" para funcionar. Pero en este caso está sucediendo algo, no generado.

¿Qué pondría en CMakeLists.txt para agregar tal acción personalizada?

/Gracias


Como referencia, un enlace a la documentación de cmake sobre este tema.

preguntado el 08 de noviembre de 11 a las 16:11

1 Respuestas

Prueba esto:

add_custom_target(flash
    COMMAND ${PERL_EXECUTABLE} ${CMAKE_SOURCE_DIR}/scripts/do_flash.pl ${MAIN_BIN_FILE}
    DEPENDS ${MAIN_BIN_FILE}
)

respondido 08 nov., 11:21

Por cierto, ¿cómo sabes que $ {MAIN_BIN_FILE} debería transformarse en main.bin? ¿Existe algún tipo de magia de cmake, o debo definir un varialbe llamado MAIN_BIN_FILE y darle el valor main.bin? - Johan

Sí, deberías definirlo tú mismo. Supuse que producirá main.bin mediante add_custom_command (SALIDA $ {MAIN_BIN_FILE} ...). Si no es el caso, puede reemplazarlo con una cadena constante. En ese caso, también puede eliminar la cláusula DEPENDS de add_custom_target. - arrowd

Todavía no he convertido mi proyecto en cmake, estoy tratando de averiguar si puedo convertir y qué ganaré / perderé si cambio. - Johan

Creo que esto puede funcionar, complicado con las cadenas internas que a veces necesita tener "" y otras no ... pero con algo de impresión con el comando "mensaje", creo que puedo manejar eso. - Johan

Hay una diferencia con la escritura set (var string1 string2) y set (var "string1 string2"). En el primer caso, está creando una lista (';' - cadena delimitada) con dos elementos y en el segundo caso es solo una cadena simple. Funciones de CMake como add_custom _ * () aceptan listas, no cadenas, así que tenga cuidado con las comillas. - arrowd

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.