2009-08-20 13 views
30

wszystko. Załóżmy, że mam program, który zawiera długą listę plików źródłowych C, Ac, Bc, ...., Zc, teraz chcę skompilować Ac, Bc z pewnymi CFLAGS i skompilować resztę plików źródłowych z inną Wartość CFLAGS.Jak skompilować różne pliki c z różnymi CFLAGS używając Makefile?

Jak napisać plik Makefile, aby wykonać wyżej opisaną pracę? obecnie to, co robię w moim Makefile to:

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

Działa, ale wygląda po prostu głupio/skomplikowanie. Czy ktoś może pomóc wskazać, jaki jest zalecany sposób robienia tego w Makefile? dzięki!

Odpowiedz

45

Spróbuj użyć zmiennych celowane. Zmienna celowane jest zadeklarowana następująco:

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

Teraz, gdy obiekt o nazwie TARGET jest dokonywana, zmienna nazwana VAR będzie miała wartość „foo”.

Używanie zmiennych docelowych specyficzny, można to zrobić, na przykład:

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

Jeśli nie chcesz ponownie definiować domyślnej reguły kompilacji .c -> .o, 'CFLAGS + = $ (EXTRA_CFLAGS) 'również by działało (przynajmniej dla GNU make). – sstn

+0

Bezpośrednie dołączanie do CFLAGS również działa: '$ (SPECIAL_OBJS): CFLAGS + = - std = c99' (GNU make again). – sstn

+0

@sstn Jak wspomniano powyżej, można użyć dowolnej ważnej formy przypisania. –

1

Nie mogę odpowiedzieć na pytanie do surowych makefile, ale jeśli są chętni do korzystania z automake jest trywialny:

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

Używając automake w ten sposób, możesz "foo" być dowolnym rodzajem celu (np. Plikiem obiektowym) lub musi to być ostateczny cel (plik wykonywalny lub biblioteka) ? –

+1

Używanie takich prawyborów jak ta dotyczy celów końcowych i wszystkich celów pośrednich. Aby zastosować tylko do pośrednich celów (np. Pliki .o), możesz napisać jawne reguły do ​​Makefile.am –

10

Podejście przyjęte przez system Linux kompilacji jądra:

CFLAGS += $([email protected]) 

a następnie

CFLAGS-A.o += -DEXTRA 
CFLAGS-B.o += -DEXTRA 
Powiązane problemy