将目标名称传递给makefile中的依赖项

时间:2013-01-29 00:47:27

标签: makefile gnu-make

如果我在makefile中有以下规则:

$(OBJ)/%.o: $(SRC)/%.c
    $(CC) -c -o $@ $< $(CFLAGS)

与前缀./obj/和su .o匹配的每个文件都会将其词干传递给%,因此我可以根据其名称提供一些依赖项。

但是,假设我有这样的规则,我逐一指定我想要的目标:

OBJECTS=abc.o bca.o cba.o
$(OBJECTS): $(SRC)/%.c
    $(CC) -c -o $@ $< $(CFLAGS)

如何使%词干真正适用于当前目标名称​​ make 正在执行?仅使用%不起作用,$@

请注意,我正在尝试将实际目标名称写入其自己的依赖项。例如,当 make 正在执行abc.o的规则时,它将包含$(SRC)/abc.c并且只包含它(类似于$(patsubst %.o, $(SRC)/%.c, MAGIC_TARGET_NAME_VARIABLE))。

2 个答案:

答案 0 :(得分:11)

您只需替换此规则:

$(OBJECTS): $(SRC)/%.c

使用:

$(OBJECTS) : %.o : $(SRC)/%.c

如果您仍希望在食谱中构建$(OBJ)部分,则需要将其添加到-o部分:

$(OBJECTS) : %.o : $(SRC)/%.c
     $(CC) -c -o $(OBJ)/$@ $< $(CFLAGS)

答案 1 :(得分:1)

我不清楚你在问什么,但我认为这可以完成你想要做的事情:

OBJECTS=abc.o bca.o cba.o

.PHONY: all
all: $(OBJECTS:%=obj/%)

$(OBJ)/%.o: $(SRC)/%.c
    echo $(CC) -c -o $@ $< $(CFLAGS)

构建了所有.o个文件;每个.o文件仅使用与其对应的.c文件构建;如果要在编译.o文件的命令中引用所有目标文件或源文件的列表,则可以直接引用${OBJECTS}


如果这不是你想要做的,你将能够通过列出你拥有的输入文件,你想要输出的文件,每个输出文件的输入依赖关系,得到更好的答案,以及要为每个输出文件执行的编译命令。