我有这个目标。它的目的是依赖输出目录和源。我使用this来截断文件名并将目录保留在其中。
build/%.o: src/%.cpp build/${%%/*}/
$(CC) $(CFLAGS) -o $@ $^
然后目录make target:
%/:
mkdir -p $@
问题是,${%%/*}
没有被替换,因此它最终只会使build//
代替build/folder/folder/
。
答案 0 :(得分:2)
.SECONDEXPANSION:
build/%.o: src/%.c | $$(dir $$@)/.dirstamp
echo $@
%/.dirstamp:
mkdir -p $(@D)
touch $@
应该这样做。
请注意:
|
;只有存在才有意义,而不是目录标记是否更新.dirstamp
更可靠您可能希望将.dirstamp
标记为.SECONDARY
。遗憾的是,gnumake
不支持通配符,因此您必须全部枚举它们,或将每个目标视为.SECONDARY