首页 > 解决方案 > Makefile 反复制作 .PHONY 目标

问题描述

我有一个看起来像这样的 Makefile:

.PHONY: aws-deps

requirements.txt: Pipfile Pipfile.lock
    pipenv lock -r > $@

aws-deps: requirements.txt
    pip3 install --upgrade --target aws_src/ -r $<

如果我运行make requirements.txt不止一次,它会正确地说它是最新的。但是,如果我运行make aws-deps它的行为与我期望的.PHONY目标不同,它每次都会运行,无论是否requirements.txt发生了变化。比如先删除 requirements.txt:

$ make aws-deps
pipenv lock -r > requirements.txt
pip3 install --upgrade --target aws_src/ -r requirements.txt
<snip>

$ make aws-deps
pip3 install --upgrade --target aws_src/ -r requirements.txt
<snip>

我是否误解了.PHONYdeps 的作用?我希望 aws-deps 仅在其先决条件发生变化时才做某事,即我的 requirements.txt 发生了变化——有人知道我在让它工作时缺少什么吗?

谢谢!

标签: makefiledependencies

解决方案


.PHONY目标告诉 make 将目标视为不是文件,即使可能存在与该目标具有相同名称的文件。由于此处没有命名文件aws-deps.PHONY因此对您的情况没有实际影响。相反,make 没有任何东西可以比较 to 的时间戳,requirements.txt并假设规则 foraws-deps必须运行。您可以通过以下方式更改此行为

AWS_DEP = .aws-deps-done # hidden file to compare a timestamp against

.PHONY: aws-deps

aws-deps: $(AWS_DEP)

$(AWS_DEP): requirements.txt
    pip3 install --upgrade --target aws_src/ -r $<
    @touch $@

推荐阅读