36 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 $@
%.o: %.c
@echo [Compiling]: $<
$(CC) $(CFLAGS) -o $@ -c $<
Run Code Online (Sandbox Code Playgroud)
它有效,但看起来很愚蠢/复杂.任何人都可以帮助指出在Makefile中这样做的推荐方法是什么?谢谢!
Dan*_*ing 48
尝试使用特定于目标的变量.特定于目标的变量声明如下:
TARGET: VAR := foo # Any valid form of assignment may be used ( =, :=, +=, ?=)
Run Code Online (Sandbox Code Playgroud)
现在,当创建名为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 $<
Run Code Online (Sandbox Code Playgroud)
小智 13
linux内核构建系统采用的方法:
CFLAGS += $(CFLAGS-$@)
Run Code Online (Sandbox Code Playgroud)
然后,
CFLAGS-A.o += -DEXTRA
CFLAGS-B.o += -DEXTRA
Run Code Online (Sandbox Code Playgroud)