Separare oggetti e sorgente con un makefile
Domanda
Ho avuto problemi a far funzionare i miei makefile come desidero.Prima di tutto, vorrei dire che questo è POSIX, come in http://www.opengroup.org/onlinepubs/009695399/utilities/make.html Ho bisogno che il mio sistema di compilazione funzioni sia con BSD che con GNU (Linux).
Quello che voglio è un makefile a manutenzione zero.Voglio che compili semplicemente tutti i file .c e .asm in src/ e inserisca i file oggetto in objs/ e quindi colleghi tutto in objs/ a un file binario.
Posso fare molto, ma non riesco a separare i file sorgente e obj.
Sono d'accordo se questo richiede un po' di scripting di shell integrato (usando POSIX definito /bin/sh), ma non riesco proprio a far funzionare correttamente le dipendenze.Voglio che crei il file oggetto solo se il file sorgente è più recente.
Il mio più vicino è questo:
${C_OBJS}: ${HDRS} ${*:objs/%=src/%}.c ${CC} ${CFLAGS} -c ${*:objs/%=src/%}.c -o $*.o
Questo ha il problema che devo ancora specificare C_OBJS=objs/foo.o e simili e inoltre non è a malapena POSIX e quindi si compila con BSD make ma non con GNU make.
Soluzione
La versione POSIX di make non supporta esplicitamente i nomi di file con barre al loro interno, né prevede la separazione dei file sorgente in una directory diversa dai file oggetto.E, come notato da @caskey, non supporta alcuna notazione utilizzando '%
', anche se rileva che tali regole esistono e raccomanda che siano riservate per l'uso come metacaratteri.
Di conseguenza, probabilmente non puoi fare quello che vuoi con POSIX standard make
.
In pratica, spesso puoi fare ciò che cerchi con implementazioni specifiche di make
, ma il risultato makefile
ha una portabilità limitata.
Prendi in considerazione l'utilizzo di un sistema di generazione di makefile di qualche tipo: cmake
o gli strumenti automatici (autoconf
, libtool
, automake
, eccetera).Oppure una delle tante rielaborazioni dei concetti base dell' make
:
- scons
- formica
- torta
- cucinare
- reggiseni
- ...e una dozzina che ho dimenticato o di cui non ho sentito parlare...
Altri suggerimenti
POSIX make non supporta costrutti come?
objs/%.o : src/%.c
${CC} ${CFLAGS} -c $< -o $@
Ho dimenticato il punto interrogativo alla fine, spero che renda il mio commento più chiaro.