Подтвердить что ты не робот

Как скомпилировать различные файлы c различными CFLAGS с помощью Makefile?

все. Скажем, у меня есть программа, которая содержит длинный список исходных файлов 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 [email protected]

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

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

4b9b3361

Ответ 1

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

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 [email protected] -c $<

Ответ 2

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

CFLAGS += $([email protected])

И затем,

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

Ответ 3

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

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