2009-08-20 5 views
30

alle. Nehmen wir an, ich habe ein Programm, das eine lange Liste von C-Quelldateien enthält, Ac, Bc, ...., Zc, jetzt möchte ich Ac, Bc mit bestimmten CFLAGS kompilieren und den Rest der Quelldateien mit einem anderen kompilieren CFLAGS-Wert.Wie kompiliere ich verschiedene c-Dateien mit verschiedenen CFLAGS mit Makefile?

Wie schreibe ich ein Makefile für den oben beschriebenen Job? Derzeit was ich in meinem Makefile mache ist:

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 $< 

Es funktioniert, aber sieht nur dumm/kompliziert. Kann jemand helfen, darauf hinzuweisen, was die empfohlene Vorgehensweise in Makefile ist? Vielen Dank!

Antwort

45

Versuchen zielspezifische Variablen. Eine zielspezifische Variable wird wie folgt erklärt:

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

Nun, wenn das Ziel mit dem Namen TARGET gemacht wird, wird die Variable mit dem Namen VAR den Wert „foo“ hat.

Mit zielspezifische Variablen, können Sie dies tun, zum Beispiel:

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

Wenn Sie die Standard-Compilierregel .c -> .o nicht neu definieren wollen, ein 'CFLAGS + = $ (EXTRA_CFLAGS) 'würde auch funktionieren (zumindest für GNU make). – sstn

+0

Das direkte Anhängen an CFLAGS scheint ebenfalls zu funktionieren: '$ (SPECIAL_OBJS): CFLAGS + = - std = c99' (GNU make again). – sstn

+0

@sstn Wie oben erwähnt, kann jede gültige Form der Zuweisung verwendet werden. –

1

Ich kann die Frage nicht für rohe Makefiles beantworten, aber wenn Sie bereit sind auto zu verwenden es ist trivial:

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

Wenn man einen Automake wie diesen verwendet, kann "foo" irgendeine Art von Ziel sein (zB Objektdatei), oder muss es ein endgültiges Ziel sein (ausführbare Datei oder Bibliothek). ? –

+1

Die Verwendung von Primärfarben wie diese gilt für Endziele und alle Zwischenziele. Um nur auf Zwischenziele (z. B. .o-Dateien) anzuwenden, können Sie explizite Regeln in Makefile.am schreiben. –

10

Der Ansatz von Linux-Kernel-Build-System genommen:

CFLAGS += $([email protected]) 

Und dann

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