总是重建依赖关系
Make always rebuilding dependencies
当我使用没有变量目标的 Makefile 时,一切正常
preamble:
mkdir -p data
touch $@
data/a: preamble
touch $@
data/b: data/a
touch $@
data/c: data/a
touch $@
data/d: data/b data/c
touch $@
diamond: data/a data/b data/c data/d
touch $@
.PHONY: clean
clean:
rm -rf ${data} diamond preamble
但是,当我引入目标变量时,涉及的任务总是运行。
data="data"
preamble:
mkdir -p ${data}
touch $@
${data}/a: preamble
touch $@
${data}/b: data/a
touch $@
${data}/c: data/a
touch $@
${data}/d: data/b data/c
touch $@
diamond: ${data}/a ${data}/b ${data}/c ${data}/d
touch $@
.PHONY: clean
clean:
rm -rf ${data} diamond preamble
这些总是被执行
touch "data"/a
touch "data"/b
touch "data"/c
touch "data"/d
touch diamond
在目标中包含变量的正确方法是什么?
我建议不要使用引号。 Makefile 不需要它们,它们会混淆文件名。
用圆括号表示 $(DATA) 比用花括号表示 ${DATA} 更常见。
此外,作为实践,我建议使用全部大写的变量名。称其为 DATA 而不是数据。
当我使用没有变量目标的 Makefile 时,一切正常
preamble:
mkdir -p data
touch $@
data/a: preamble
touch $@
data/b: data/a
touch $@
data/c: data/a
touch $@
data/d: data/b data/c
touch $@
diamond: data/a data/b data/c data/d
touch $@
.PHONY: clean
clean:
rm -rf ${data} diamond preamble
但是,当我引入目标变量时,涉及的任务总是运行。
data="data"
preamble:
mkdir -p ${data}
touch $@
${data}/a: preamble
touch $@
${data}/b: data/a
touch $@
${data}/c: data/a
touch $@
${data}/d: data/b data/c
touch $@
diamond: ${data}/a ${data}/b ${data}/c ${data}/d
touch $@
.PHONY: clean
clean:
rm -rf ${data} diamond preamble
这些总是被执行
touch "data"/a
touch "data"/b
touch "data"/c
touch "data"/d
touch diamond
在目标中包含变量的正确方法是什么?
我建议不要使用引号。 Makefile 不需要它们,它们会混淆文件名。
用圆括号表示 $(DATA) 比用花括号表示 ${DATA} 更常见。
此外,作为实践,我建议使用全部大写的变量名。称其为 DATA 而不是数据。