制作目标依赖源列表

时间:2013-07-05 13:29:04

标签: c makefile gnu-make

我想用一个Makefile编译两个略有不同版本的C代码。

基本上我只需要添加一些Flags和一些源文件。

现在我有源列表的定义:

SRC := <adding stuff>

并从中生成我的对象:

OBJ = $(SRC:%.c=$(OBJS_DIR)/%.o) $(ASRC:%.s=$(OBJS_DIR)/%.o)

“all”目标应该正常编译,“iomodule”目标更改变量并调用“all”:

.PHONY: iomodule
iomodule: CDEFS := $(subst -DFD_MODULE, -DIO_MODULE, $(CDEFS))
#iomodule: SRC += $(subst $(SRC_DIR)/,,$(wildcard $(SRC_DIR)/iomod*.c))
iomodule: SRC += iomod_ring_proto.c
iomodule: OBJ += $(OBJ_DIR)/iomod_ring_proto.o
#iomodule: $(info $(SRC))
iomodule: all

all: dirs STM32F100RB_FLASH.ld $(OBJ)
        $(CC) -o $(TARGET).elf $(LDFLAGS) $(OBJ)        $(LDLIBS)
        $(OBJCOPY) -O ihex   $(TARGET).elf $(TARGET).hex
        $(OBJCOPY) -O binary $(TARGET).elf $(TARGET).bin

我原本以为“info”会打印SRC,包括“iomod_ring_proto.c”,而OBJ,因为它是一个递归变量,会包含* .o文件。

奇怪的是,“info”打印没有文件的列表,并且永远不会编译“iomod_ring_proto.c”。 然而,我收到链接器错误,找不到“objs / iomod_ring_proto.o”。 因此,当我打印它时,它不在SRC列表中,而不是在编译时在OBJ列表中,但在链接时它在OBJ列表中?这是怎么回事?

1 个答案:

答案 0 :(得分:1)

加载makefile时会立即评估像Make这样的$(info)命令。这就是为什么它显示$(SRC)的“全局”值。

链接不包括您的目标文件的问题是,在加载文件时,依赖项“已评估”。这意味着对于all目标,依赖关系设置为文件加载时的OBJ