2009-08-20 4 views
30

tutti. Diciamo che ho un programma che contiene una lunga lista di file sorgente C, Ac, Bc, ...., Zc, ora voglio compilare Ac, Bc con alcuni CFLAGS e compilare la parte restante dei file sorgente con un diverso Valore CFLAGS.Come compilare diversi file c con CFLAG differenti usando Makefile?

Come scrivere un Makefile per eseguire il lavoro sopra descritto? attualmente quello che sto facendo nel mio Makefile è:

OBJ=[all other .o files here, e.g. D.o, D.o, E.o .... Z.o] 
SPECIAL_OBJS=A.o B.o 

all: $(OBJ) $(SPECIAL_OBJS) 

$(SPECIAL_OBJS): 
    @echo [Compiling]: $(@:.o=.c) 
    $(CC) [SOME OTHER GCC OPTIONS HERE] $(CFLAGS) -c $(@:.o=.c) -o [email protected] 

%.o: %.c 
    @echo [Compiling]: $< 
    $(CC) $(CFLAGS) -o [email protected] -c $< 

Funziona, ma sembra solo stupido/complicato. Qualcuno può aiutare a sottolineare qual è il modo consigliato di farlo in Makefile? Grazie!

risposta

45

Provate ad usare variabili specifiche bersaglio. Una variabile specifici target è dichiarata in questo modo:

TARGET: VAR := foo # Any valid form of assignment may be used (=, :=, +=, ?=) 

Ora, quando è stato fatto il bersaglio di nome TARGET, il VAR variabile denominata avrà il valore "pippo".

Utilizzo delle variabili specifiche bersaglio, si potrebbe fare questo, per esempio:

OBJ=[all other .o files here, e.g. D.o, D.o, E.o .... Z.o] 
SPECIAL_OBJS=A.o B.o 

all: $(OBJ) $(SPECIAL_OBJS) 

$(SPECIAL_OBJS): EXTRA_FLAGS := -std=c99 # Whatever extra flags you need 

%.o: %.c 
    @echo [Compiling]: $< 
    $(CC) $(CFLAGS) $(EXTRA_FLAGS) -o [email protected] -c $< 
+1

Se non si desidera ridefinire la regola di compilazione .c -> .o predefinita, un 'CFLAGS + = $ (EXTRA_CFLAGS) 'funzionerebbe pure (almeno per GNU make). – sstn

+0

Anche l'aggiunta diretta a CFLAGS sembra funzionare: '$ (SPECIAL_OBJS): CFLAGS + = - std = c99' (GNU make again). – sstn

+0

@sstn Come indicato sopra, è possibile utilizzare qualsiasi forma valida di assegnazione. –

1

Non posso rispondere alla domanda per makefile prime, ma se siete disposti a utilizzare automake è banale:

 
foo_CFLAGS = [options passed to CC only when building foo] 
+0

Quando si utilizza automake come questo, può "foo" essere un qualsiasi tipo di target (es. File oggetto), oppure deve essere un target finale (eseguibile o libreria) ? –

+1

L'uso di primari come questo si applica ai target finali e a tutti i target intermedi. Per applicare solo a target intermedi (ad esempio .o file), è possibile scrivere regole esplicite nel Makefile.am –

10

L'approccio adottato da Linux sistema di compilazione del kernel:

CFLAGS += $([email protected]) 

E poi,

CFLAGS-A.o += -DEXTRA 
CFLAGS-B.o += -DEXTRA