2010-07-16 12 views
12

Non sono esperto con i makefile, ma sono abituato a quelli semplici. In questo momento, ho un compito a portata di mano.Makefile - modifica il valore della variabile in base a un target

Ho bisogno di compilare e collegare un'applicazione di test con una libreria diversa e un percorso di inclusione diverso basato sul dato target. Se la destinazione è TARGET1, quindi il collegamento a LIB1 e include INCLUDEPATH1 durante la compilazione. Allo stesso modo, se l'obiettivo dato è TARGET2, compilare con INCLUDEPATH2 in CFLAGS e collegarlo a LIB2.

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

Ora ho una regola come sopra che compila la mia applicazione di test. Ora come possono essere modificati i CFLAG in base all'obiettivo.

risposta

27

Se si utilizza GNU Make, è possibile utilizzare target-specific variables:

target1: CFLAGS = -IINCLUDEPATH1 
target1: LDLIBS = -lLIB1 

target2: CFLAGS = -IINCLUDEPATH2 
target2: LDLIBS = -lLIB2 

all: target1 target2 

target1: target1.o misc.o 
target2: target2.o 

Tuttavia questo non funziona bene come vuoi: se condividere alcuni file di origine target1 e TARGET2 , dovrai organizzarli affinché vengano compilati due volte e in file .o con nomi diversi, il che renderà più complesso il tuo makefile.

Inoltre, se si digita make target1 poi -IINCLUDEPATH1 saranno propagate alla compilazione di misc.c, se lo desideri. Tuttavia, se si digita make misc.o non è possibile sapere che questo alla fine è destinato a target1 e la compilazione di misc.c non avrà alcun valore speciale $ CFLAGS (anche se otterrà quello globale, se ce n'è uno).

Quindi questo è davvero utile solo in casi semplici. Ma forse il tuo caso è sufficientemente semplice.

+1

Wow, non sapevo che le variabili specifiche della destinazione venissero propagate a regole implicite! –

+0

Ottimo consiglio. Anche se ho scritto Makefile per troppo tempo, in qualche modo non sono mai stato a conoscenza di questa funzione. –

1

Non penso che sia possibile modificare la variabile a seconda del target. Si supponga che si richiama

make TARGET1 TARGET2 

Che valore avrebbe la CFLAGS avere allora?

In questo caso, è possibile utilizzare le regole senza schema per distinguere i target.

TARGET1: a.c 
    @echo [CC] $< ... 
    $(CC) -I INCLUDEPATH1 ... 

TARGET2: a.c 
    @echo [CC] $< ... 
    $(CC) -I INCLUDEPATH2 ... 

Per diminuire la ripetizione, si può anche utilizzare le variabili e "functions". Quindi, è possibile riutilizzare quale sarebbe il corpo della regola del modello in regole diverse.

define compile_cmd 
    @echo [CC] $< ... 
    $(CC) -I $1 -l$2 $(CFLAGS) 
endef 

TARGET1: a.c 
    $(call compile_cmd,INCLUDEPATH1,LIB1) -o [email protected] $< 

TARGET2: a.c 
    $(call compile_cmd,INCLUDEPATH2,LIB2) -o [email protected] $< 

%.o: %.c 
    $(call compile_cmd,INCLUDEPATH_DEFAULT,LIB_DEFAULT) -o [email protected] $< 

Questo renderebbe un makefile carino e flessibile adatto alle proprie esigenze.

Problemi correlati