2009-08-20 2 views
30

все. Предположим, у меня есть программа, которая содержит длинный список исходных файлов C, Ac, Bc, ...., Zc, теперь я хочу скомпилировать Ac, Bc с определенными CFLAGS и скомпилировать остальную часть исходных файлов с другим Значение CFLAGS.Как скомпилировать различные файлы c различными CFLAGS с помощью Makefile?

Как написать Makefile для выполнения описанной выше работы? в настоящее время я делаю в своем 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 $< 

Это работает, но выглядит просто глупо/сложно. Может ли кто-нибудь помочь указать, что рекомендуется делать в Makefile? благодаря!

ответ

45

Попробуйте использовать целевые конкретных переменных. Мишень конкретной переменная объявлена ​​как это:

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

Теперь, когда цель ТАРГЕТ делается, переменная с именем VAR будет иметь значение «Foo».

Использование целевых конкретных переменных, вы можете сделать это, например:

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

Если вы не хотите переопределять правило компиляции по умолчанию .c -> .o, 'CFLAGS + = $ (EXTRA_CFLAGS) 'будет работать (по крайней мере, для GNU make). – sstn

+0

Непосредственно добавление к CFLAGS также работает: '$ (SPECIAL_OBJS): CFLAGS + = - std = c99' (GNU make again). – sstn

+0

@sstn Как отмечено выше, может использоваться любая действительная форма назначения. –

1

Я не могу ответить на этот вопрос для сырых Makefiles, но если вы готовы использовать Automake тривиально:

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

При использовании automake, подобный этому, «foo» может быть любым объектом (например, объектным файлом), или он должен быть конечной целью (исполняемый файл или библиотека) ? –

+1

Использование праймериз применимо к конечным целям и всем промежуточным целям. Чтобы применять только к промежуточным целям (например, файлы .o), вы можете писать явные правила в Makefile.am –

Смежные вопросы