如何使用Makefile编译不同CFLAGS的不同c文件?

时间:2009-08-20 11:56:11

标签: makefile

所有。假设我有一个程序,其中包含很长的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中这样做的推荐方法是什么?谢谢!

3 个答案:

答案 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]