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.

È stato utile?

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.

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