2009-08-20 3 views
30

tous. Disons que j'ai un programme qui contient une longue liste de fichiers source C, Ac, Bc, ...., Zc, maintenant je veux compiler Ac, Bc avec certains CFLAGS, et compiler la partie restante des fichiers source avec un autre Valeur CFLAGS. Comment écrire un Makefile pour faire le travail décrit ci-dessus?Comment compiler différents fichiers c avec différents CFLAGS en utilisant Makefile?

actuellement ce que je fais dans mon Makefile est:

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

Cela fonctionne, mais semble stupide/compliqué. Quelqu'un peut-il aider à indiquer quelle est la manière recommandée de le faire dans Makefile? Merci!

Répondre

45

Essayez d'utiliser des variables spécifiques à la cible. Une variable spécifique à la cible est déclarée comme ceci:

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

Maintenant, quand la cible nommée TARGET est faite, la variable VAR nommée aura la valeur « toto ».

Utilisation des variables spécifiques à la cible, vous pouvez le faire, par exemple:

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

Si vous ne voulez pas redéfinir la règle de compilation .c -> .o par défaut, un 'CFLAGS + = $ (EXTRA_CFLAGS) 'fonctionnerait aussi bien (au moins pour make GNU). – sstn

+0

L'ajout direct à CFLAGS semble également fonctionner: '$ (SPECIAL_OBJS): CFLAGS + = - std = c99' (make GNU again). – sstn

+0

@sstn Comme indiqué ci-dessus, toute forme d'affectation valide peut être utilisée. –

1

Je ne peux pas répondre à la question makefiles premières, mais si vous êtes prêt à utiliser automake il est trivial:

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

Lorsque vous utilisez automake comme ceci, peut "foo" être n'importe quel type de cible (par exemple un fichier objet), ou doit-il être une cible finale (exécutable ou bibliothèque) ? –

+1

L'utilisation de primaires comme celle-ci s'applique aux cibles finales et à toutes les cibles intermédiaires. Pour ne s'appliquer qu'aux cibles intermédiaires (par exemple les fichiers .o), vous pouvez écrire des règles explicites dans le Makefile.am –

10

L'approche adoptée par le système de compilation du noyau linux:

CFLAGS += $([email protected]) 

Et puis,

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