Makefile重复制作。虚假目标

Makefile重复制作。虚假目标,makefile,dependencies,Makefile,Dependencies,我有一个Makefile,如下所示: .PHONY: aws-deps requirements.txt: Pipfile Pipfile.lock pipenv lock -r > $@ aws-deps: requirements.txt pip3 install --upgrade --target aws_src/ -r $< 我是否误会了。虚假的部门的工作?我希望aws deps只在其先决条件发生变化的情况下才做一些事情,即我在requirements

我有一个Makefile,如下所示:

.PHONY: aws-deps

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

aws-deps: requirements.txt
    pip3 install --upgrade --target aws_src/ -r $<
我是否误会了
。虚假的
部门的工作?我希望aws deps只在其先决条件发生变化的情况下才做一些事情,即我在requirements.txt中做了一个更改-有人知道我在使其工作时缺少了什么吗


谢谢

.PHONY
目标告诉make将目标视为非文件,即使可能存在与此目标同名的文件。由于此处没有名为
aws deps
的文件,
.PHONY
对您的情况没有实际影响。相反,make没有任何东西可以将
requirements.txt
的时间戳与进行比较,并假设必须运行
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 $@
AWS_DEP=.AWS deps done#将时间戳与
.冒牌货:美国焊接学会副会长
aws部门:$(aws_部门)
$(AWS_DEP):requirements.txt
pip3安装--升级--目标aws_src/-r$<
@触碰$@

.PHONY
目标要求make将目标视为非文件,即使可能存在与此目标名称相同的文件。由于此处没有名为
aws deps
的文件,
.PHONY
对您的情况没有实际影响。相反,make没有任何东西可以将
requirements.txt
的时间戳与进行比较,并假设必须运行
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 $@
AWS_DEP=.AWS deps done#将时间戳与
.冒牌货:美国焊接学会副会长
aws部门:$(aws_部门)
$(AWS_DEP):requirements.txt
pip3安装--升级--目标aws_src/-r$<
@触碰$@

我也经历过类似的情况。我不太喜欢创建另一个文件。隐藏或可见。但这就是我经常看到的。我去了GNU make手册[谁还在做这个?],希望作者考虑过一些显而易见的东西。我找到了目标
.INTERMEDIATE
,它不需要文件更新。那么,你的例子是:

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

.INTERMEDIATE: aws-deps
aws-deps: requirements.txt
    pip3 install --upgrade --target aws_src/ -r $<
requirements.txt:Pipfile Pipfile.lock
pipenv锁-r>$@
.中级:aws deps
aws deps:requirements.txt
pip3安装--升级--目标aws_src/-r$<

它运行良好,不需要编写额外的文件作为标志。我使用这个
.INTERMEDIATE
目标类型在大规模编译PDF文件之前打印一条消息,并使用另一条消息进行类似的大规模编译PNG文件。如果您尝试使用
.PHONY
,编译将重复。如果在规则块内打印消息,则将为正在处理的每个文件打印消息。打印一次性消息是
的另一种用法。中间

我也经历过类似的情况。我不太喜欢创建另一个文件。隐藏或可见。但这就是我经常看到的。我去了GNU make手册[谁还在做这个?],希望作者考虑过一些显而易见的东西。我找到了目标
.INTERMEDIATE
,它不需要文件更新。那么,你的例子是:

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

.INTERMEDIATE: aws-deps
aws-deps: requirements.txt
    pip3 install --upgrade --target aws_src/ -r $<
requirements.txt:Pipfile Pipfile.lock
pipenv锁-r>$@
.中级:aws deps
aws deps:requirements.txt
pip3安装--升级--目标aws_src/-r$<

它运行良好,不需要编写额外的文件作为标志。我使用这个
.INTERMEDIATE
目标类型在大规模编译PDF文件之前打印一条消息,并使用另一条消息进行类似的大规模编译PNG文件。如果您尝试使用
.PHONY
,编译将重复。如果在规则块内打印消息,则将为正在处理的每个文件打印消息。打印一次性消息是
.INTERMEDIATE

的另一种用法完美的答案,谢谢!)这有点烦人,但它确实有道理。只有一个问题,为什么要用
@touch
而不是
touch
?我发现用谷歌搜索这个是不可能的!我很乐意为您提供帮助:)在生成规则中的任何命令前面加上前缀
@
,可以确保除了执行命令之外,命令不会被打印出来。它只是减少了琐碎命令的视觉噪音。完美答案,谢谢!:)这有点烦人,但它确实有道理。只有一个问题,为什么要用
@touch
而不是
touch
?我发现用谷歌搜索这个是不可能的!我很乐意为您提供帮助:)在生成规则中的任何命令前面加上前缀
@
,可以确保除了执行命令之外,命令不会被打印出来。它只是减少了琐碎命令的视觉噪音。这是一个非常好的解决方案,谢谢分享!)这是一个非常好的解决方案,谢谢分享!:)