所有。假设我有一个程序,其中包含很长的C源文件列表,Ac,Bc,....,Zc,现在我想用某些CFLAGS编译Ac,Bc,并用不同的文件编译其余部分的源文件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中这样做的推荐方法是什么?谢谢!
答案 0 :(得分:48)
尝试使用特定于目标的变量。特定于目标的变量声明如下:
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 $<
答案 1 :(得分:13)
linux内核构建系统采用的方法:
CFLAGS += $(CFLAGS-$@)
然后,
CFLAGS-A.o += -DEXTRA
CFLAGS-B.o += -DEXTRA
答案 2 :(得分:2)
我无法回答原始makefile的问题,但如果你愿意使用automake,那就很简单了:
foo_CFLAGS = [options passed to CC only when building foo]