Makefile 重复制作 .PHONY 目标

Cal*_*m M 1 dependencies makefile

我有一个 Makefile,如下所示:

.PHONY: aws-deps

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

aws-deps: requirements.txt
    pip3 install --upgrade --target aws_src/ -r $<
Run Code Online (Sandbox Code Playgroud)

如果我运行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>
Run Code Online (Sandbox Code Playgroud)

我是否误解了.PHONY部门的工作?我希望 aws-deps 仅在其先决条件发生变化时才执行某些操作,即我对 requests.txt 进行了更改 - 有人知道我在使其正常工作时缺少什么吗?

谢谢!

lub*_*bgr 5

.PHONY目标告诉 make 将目标视为不是文件,即使可能存在与该目标同名的文件。由于此处没有指定文件aws-deps,因此.PHONY对您的情况没有真正的影响。相反,make 没有任何东西可以比较 to 的时间戳,并假设必须运行requirements.txtfor 的规则。aws-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 $@
Run Code Online (Sandbox Code Playgroud)

  • 我很乐意提供帮助:) 在构建规则中的任何命令前面添加前缀“@”可确保该命令除了执行之外不会被打印出来。它只是减少了琐碎命令的视觉噪音。 (2认同)