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
我有这个目标。它的目的是依赖于输出目录和源代码。我使用 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