2011-03-21 9 views
11

Estoy usando CMake para construir mi proyecto C++ y tiene varios ejecutables y una biblioteca (todos ellos parte del mismo proyecto). Todo funciona bien, sin embargo, uno de mis ejecutables es un generador de código que crea algunas de las clases de la biblioteca. Tengo toda la generación funcionando pero no puedo encontrar la manera de llamar a este ejecutable (codegen) justo antes de que se construya la biblioteca. Estoy en entorno Linux. Espero que alguien pueda responder esto.Obtener CMake para ejecutar un objetivo en el proyecto antes de construir una biblioteca

Respuesta

17

En CMakeLists.txt:

En primer lugar, definir su ejecutable:

add_executable(marks-code-generator gen.cpp) 

A continuación, defina un comando personalizado para generar la fuente:

add_custom_command(OUTPUT generated.cpp generated.hpp 
        COMMAND marks-code-generator ARGS args here maybe 
        MAIN_DEPENDENCY input-file.in 
        DEPENDS marks-code-generator 
        COMMENT here we go! 
        VERBATIM) 

La opción VERBATIM se asegura de plataforma específica escaparse se hace correctamente. El COMMENT se imprimirá mientras make se ejecuta, dando algo como [ 66%] here we go!.

Por último, el nombre de su fuente generado en la lista de fuentes para su programa real:

add_executable(some-program generated.cpp generated.hpp non-generated.cpp foo.cpp) 
+0

Gracias Jack, En caso de marcas de código generador de escribir los archivos generated.cpp/h para directorio actual o las de salida sencilla para stdout y dejar que la parte de SALIDA los escriba? Si es así, ¿acabo de separarlos con un EOF al escribir? – Mark

+0

Cada vez tengo más la opinión de que los sistemas recursivos de compilación no funcionan. No funcionan con 'make', no funcionan con' automake' y no creo que funcionen con 'CMake'. ¿Hay alguna razón por la que no puedas hacer todo esto en un nivel superior 'CMakeLists.txt'? Use 'include' si se vuelve demasiado grande. Aún necesita hacer una salida a un archivo. La línea 'OUTPUT' en' add_custom_command' solo le dice a CMake qué archivos está generando (ya que no hay manera de que eso funcione por sí mismo), así que siga usando un 'ofstream' o lo que sea para generar su encabezado y fuente. –

+0

Gracias Jack, me fijaré en moverme a un CMakeLists, parece que sería más fácil de mantener, etc. – Mark

Cuestiones relacionadas