Как скомпилировать различные файлы 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? спасибо!
Ответы
Ответ 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]