Как скомпилировать разные c файлы с разными CFLAGS, используя Makefile? - PullRequest
36 голосов
/ 20 августа 2009

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

Как написать 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 $@

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

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

Ответы [ 3 ]

48 голосов
/ 20 августа 2009

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

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

Теперь, когда создается цель с именем TARGET, переменная с именем 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 $@ -c $<
13 голосов
/ 10 июля 2013

Подход, принятый системой сборки ядра Linux:

CFLAGS += $(CFLAGS-$@)

А потом,

CFLAGS-A.o += -DEXTRA
CFLAGS-B.o += -DEXTRA
2 голосов
/ 20 августа 2009

Я не могу ответить на вопрос для необработанных make-файлов, но если вы хотите использовать automake, это тривиально:

foo_CFLAGS = [options passed to CC only when building foo]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...