add_custom_command - actualiza la lista de dependencias sobre reconstrucciones
Ver última actualización de estado
Condiciones iniciales
generador de código que genera un conjunto de fuentes de c ++ que toman un archivo de entrada como parámetroel archivo de entrada puede incluir otros archivos de entradatarea ya resuelta de obtener una lista de archivos de salida, analizando archivos codegen de entrada para obtener una lista completa de entradas codegen. Es decir. add_custom_command se proporciona con el conjunto correcto de dependencias por primera vez:
add_custom_command(OUTPUT ${generatedSources}
COMMAND ${codegenCommand} ARGS ${codegenArgs}
DEPENDS ${codegenInputFiles})
Escenario de problema
El sistema actual funciona bien hasta que alguien modifica uno de los archivos de entrada de codegen para incluir un nuevo archivo de entrada o eliminar la inclusión de uno existente. En este caso, es necesario actualizar la lista del archivo de entrada de codegen proporcionado a add_custom_command como dependencias, pero no tengo idea de cómoLo que falta
capacidad de actualizar las dependencias add_custom_command sobre las reconstrucciones de proyectos¿Hay alguna manera de resolverlo sin hacer una reconstrucción completa del proyecto?
ACTUALIZACIÓN - Descripción del problema alternativo (¿mejor?)
He encontrado una pregunta similar no respondida en la lista de correo de cmake, publíquela aquí para mayor claridad:http://article.gmane.org/gmane.comp.programming.tools.cmake.user/52279
Estoy tratando de obtener una herramienta de generación de código que se comporte "igual que" un archivo fuente C con respecto a las dependencias. Con eso quiero decir, supongamos que tiene un archivo C "a.c". Porque puede #incluir archivos, cada vez que el contenido dea.c
cambios, sus dependencias pueden haber cambiado también. Las dependencias se vuelven a analizar con -MMD. Me gustaría alguna forma de emular esto para mi generador de código. Primero probé add_custom_command, que toma una lista DEPENDS fija, determinada en el momento en que se define el comando personalizado. Concretamente, quiero decir algo como esto:
function(add_generated_library)
figure_out_dependencies(deps ${ARGN})
add_custom_command(... DEPENDS ${deps})
endfunction()
Pero eso solo captura las dependencias en el momento de la generación del sistema de compilación. Cada vez que se ejecuta el comando personalizado, la lista DEPENDS puede necesitar cambiar, porque los cambios pueden implicar nuevas dependencias. ¿Cómo debo hacer esto?
ACTUALIZACIÓN 2 - Posible solución
A continuación, considero como hechos: hay voces en toda la web con respecto a la compatibilidad de las dependencias dinámicas, que es necesaria para la integración sin problemas de muchas herramientas de generación de código no triviales; no hay una solución óptima lista para usar disponible, como lo que realmente necesita un gancho para agregar soporte de DSL personalizado a IMPLICIT_DEPENDS
Del manual de cmake:
La opción IMPLICIT_DEPENDS solicita la exploración de dependencias implícitas de un archivo de entrada. El lenguaje dado especifica el lenguaje de programación cuyo escáner de dependencia correspondiente debe usarse. Actualmente solo se admiten escáneres de lenguaje C y CXX. El idioma debe especificarse para cada archivo en la lista IMPLICIT_DEPENDS.Las dependencias descubiertas del escaneo se agregan a las del comando personalizado en el momento de la compilación.
La solución a continuación se adhiere (con suerte) a los siguientes criterios:
evite el escaneo de dependencia no necesario en la reconstrucciónevitar el generador de código no necesario ejecutar en la reconstrucciónPermitir proporcionar funciones de cmake a los clientes para registrar sus modelos y generar código / crear bibliotecas a partir de ese código, sin imponer ningún requisito de estructura del proyecto (es decir, ningún subproyecto responsable de la generación del código, los modelos se distribuyen a través de la jerarquía del proyecto utilizando una política específica del proyecto)Idea de la solución
No es posible registrar un escáner de idioma personalizado, pero es posible reutilizar uno existente. La idea es que las dependencias / jerarquía de archivos de modelos personalizados se reflejen como jerarquía de archivos de encabezado "C". Cada nodo de jerarquía se agrega al registrar el archivo del modelo y el archivo C incluye el archivo del modelo de coincidencia. Si el archivo del modelo incluye el cambio, el archivo C incluye el cambio. Por lo tanto, cada invocación de codegen dependería de un solo encabezado C generado que refleje el modelo aprobado. Cada archivo reflejado dependerá del archivo del modelo y se tocará el cambio del archivo del modelo.
Para resumir: probablemente, mi redacción no es tan clara en este momento, pero con respecto a las necesidades de otras personas y la comunidad me ayudó a investigar este problema, publicaré una solución genérica (+ enlace a github o nueva página wiki de cmake) sin mi detalles del proyecto una vez que esté listo (en 1-3 días).