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

Variables in make target depending on its directory

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

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

然后目录make target:

%/:
        mkdir -p $@

问题是,${%%/*} 没有被替换,所以它最终只会生成目录 build// 而不是 build/folder/folder/

.SECONDEXPANSION:

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

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

应该这样做。

请注意:

  • 使用|;只有存在才是最重要的,与目录戳是否更新无关
  • 使用 .dirstamp 更可靠

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