Pregunta

Para aquellos familiarizados con IDL (lenguaje de descripción de interfaz), se abstrae descripción de datos para su uso a través de plataformas (Java, C, C ++, etc). Mi proyecto tiene dependencias Foo.c, foo.h, FooHelper.c y FooHelper.h que se genera a partir de Foo.idl. ¿Cómo se ejecuta un comando arbitrario cuando Foo.idl cambia, pero todavía incluyen Foo.c, FooHelper.c, en el proceso de construcción?

Mis intentos actuales añadir una regla a la Makefile.am - la esperanza es que la regla se copia en el Makefile generado

.

He intentado:

Foo.idl : Foo.idl
 ${the_generate_command}

y luego añadió Foo.idl a my_program_SOURCES pero no se ejecuta the_generate_command en la construcción.

He tenido éxito desde el generador de IDL con

Foo.c Foo.h FooHelper.h FooHelper.c : Foo.idl
 ${the_generate_command}

Pero no va a añadir Foo.c, FooHelper.c al proceso de compilación, por lo que nunca están construidos, simplemente genera por the_generate_command!

Todo el código (incluyendo el IDL) es de $ project_dir / src.

¿Fue útil?

Solución

La respuesta de RQ es casi correcta, pero no alcanza un par de sutilezas. Prueba esto:

bin_PROGRAMS = myprogram
myprogram_SOURCES = Foo.c Foo.h FooHelper.h FooHelper.c $(OTHER_SOURCES)
BUILT_SOURCES = Foo.c Foo.h FooHelper.h FooHelper.c
EXTRA_DIST = Foo.idl
MAINTAINERCLEANFILES = Foo.c Foo.h FooHelper.h FooHelper.c

Foo.c: Foo.idl
    $(THE_GENERATE_COMMAND)

Foo.h FooHelper.h FooHelper.c: Foo.c
    @if test -f $@; then \
        touch $@; \
    else \
## Recover from the removal of $@
        rm -rf $<; \
        $(MAKE) $(AM_MAKEFLAGS) $<; \
    fi

Las reglas adicionales a "generar" Foo.h, FooHelper.h y FooHelper.c de Foo.c asegurar que construye paralelo no tratas de ejecutar $(THE_GENERATE_COMMAND) dos veces. Es un idioma se detalla en el manual Automake que trabajará para construye paralelo. Todavía hay un poco de fragilidad aquí: si los elimina de usuario (por ejemplo) y FooHelper.h FooHelper.c e inicia una marca paralela, puede ejecutar la recuperación de parte de los múltiples $(MAKE) $(AM_MAKEFLAGS) $< regla veces en paralelo. Como dice el manual, esta carrera sólo se va a pasar si los mutila manual de usuario del árbol de construcción, e incluso entonces no es nada un make clean; make no puede arreglar.

Las asegura que la línea BUILT_SOURCES Foo.c, Foo.h, FooHelper.h y FooHelper.c se construyeron antes de tratar de construir myprogram (ver esta sección del Automake manual para ver qué simplemente agregarlas a myprog_SOURCES es insuficiente). Los asegura variables EXTRA_DIST que el archivo .idl será capturado por make dist ( referencia ).

MAINTAINERCLEANFILES especifica archivos adicionales para eliminar al ejecutar make maintainer-clean; esto es para cumplir con la href="http://www.gnu.org/software/automake/manual/standards/Standard-Targets.html#Standard-Targets" rel="nofollow noreferrer"> Normas Makefile de GNU . Véase también la descripción de la variable en el manual Automake .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top