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

6
如果我在一个makefile中有以下规则:
$(OBJ)/%.o: $(SRC)/%.c
    $(CC) -c -o $@ $< $(CFLAGS)

每个文件名以前缀./obj/和后缀.o结尾的文件,它的stem将被传递给%,因此我可以根据其名称提供一些依赖关系。
但是,假设我有这种规则,我要逐个指定我想要的目标:
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个回答

12

您只需替换此规则:

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

随着:

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

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

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

这个方法解决了问题,非常好用!我不需要在 $@ 前面添加 $(OBJ)/。可能是因为我已经在 $(OBJECTS) 变量中包含了每个文件名的相对路径,所以 make 可以检查文件是否是最新的... - Toribio
这被记录为静态模式:https://www.gnu.org/software/make/manual/html_node/Static-Usage.html#Static-Usage - ssavec
虽然这对我也起作用,但make不能再检查$(OBJECTS)的存在,因此每次运行make都会重新生成它们。你如何处理这个问题?@FlávioToribio @carl-norum @ssavec - Michael

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}
如果这不是你想要做的事情,那么通过列出你拥有的输入文件、你想要生成的输出文件、每个输出文件的输入依赖以及你想要执行的编译命令来获得更好的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接