entidades de generación de IDL usando automake / Makefile.am
-
26-09-2019 - |
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.
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 .