make目标中的变量取决于其目录

时间:2016-07-31 18:49:24

标签: makefile gnu-make

我有这个目标。它的目的是依赖输出目录和源。我使用this来截断文件名并将目录保留在其中。

build/%.o: src/%.cpp build/${%%/*}/
        $(CC) $(CFLAGS) -o $@ $^

然后目录make target:

%/:
        mkdir -p $@

问题是,${%%/*}没有被替换,因此它最终只会使build//代替build/folder/folder/

1 个答案:

答案 0 :(得分:2)

.SECONDEXPANSION:

build/%.o:  src/%.c | $$(dir $$@)/.dirstamp
    echo $@

%/.dirstamp:
    mkdir -p $(@D)
    touch $@

应该这样做。

请注意:

  • 使用|;只有存在才有意义,而不是目录标记是否更新
  • 使用.dirstamp更可靠

您可能希望将.dirstamp标记为.SECONDARY。遗憾的是,gnumake不支持通配符,因此您必须全部枚举它们,或将每个目标视为.SECONDARY