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.

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top