entità Generazione IDL utilizzando automake / Makefile.am
-
26-09-2019 - |
Domanda
Per chi non conosce IDL (Interface Description Language), astrae descrizione dei dati per l'utilizzo su più piattaforme (Java, C, C ++, ecc). Il mio progetto ha dipendenze foo.c, foo.h, FooHelper.c, e FooHelper.h che sono generati da Foo.idl. Come faccio a eseguire un comando arbitrario quando Foo.idl cambia, ma ancora includono foo.c, FooHelper.c, nel processo di generazione?
I miei attuali tentativi di aggiungere una regola al Makefile.am - la speranza è che la regola viene copiato verso il Makefile generato
.ho provato:
Foo.idl : Foo.idl
${the_generate_command}
e poi aggiunse Foo.idl per my_program_SOURCES ma non viene eseguito the_generate_command quando si costruisce.
Ho avuto successo di generazione dal IDL con
Foo.c Foo.h FooHelper.h FooHelper.c : Foo.idl
${the_generate_command}
Ma non aggiungerà foo.c, FooHelper.c per il processo di compilazione, quindi sono mai costruiti, solo generato da the_generate_command!
Tutto il codice (compreso l'IDL) è in $ project_dir / src.
Soluzione
La risposta di RQ è quasi corretto, ma manca un paio di sottigliezze. Prova questo:
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
Le regole aggiuntive per "generare" Foo.h
, FooHelper.h
e FooHelper.c
da Foo.c
assicurare che parallelamente costruisce non cercare di $(THE_GENERATE_COMMAND)
correre due volte. Si tratta di un idioma dettagliato nella manuale Automake , che lavorerà per parallelo costruisce. C'è ancora un po 'di fragilità qui: se l'utente rimuove (diciamo) FooHelper.h
e FooHelper.c
e inizia un make parallelo, si può eseguire la parte di recupero $(MAKE) $(AM_MAKEFLAGS) $<
della regola più volte in parallelo. Come il manuale dice, questa gara non può che accadrà se i mutila utente manualmente il build tree, e anche allora di nulla un make clean; make
non può correzione.
I assicura linea BUILT_SOURCES
che Foo.c
, Foo.h
, FooHelper.h
e FooHelper.c
sono costruiti prima di tentare di costruire myprogram
(vedi questa sezione del Automake manuale per vedere il motivo per cui solo aggiungendoli myprog_SOURCES
è insufficiente). Si accerta variabili EXTRA_DIST
che il file .idl
sarà catturato dai make dist
( di riferimento ).
MAINTAINERCLEANFILES
specifica file aggiuntivi da eliminare durante l'esecuzione make maintainer-clean
; questo è quello di rispettare il GNU Makefile Standards . Vedere anche la descrizione della variabile in manuale Automake .