Makefile重复制作。虚假目标
我有一个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
.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
?我发现用谷歌搜索这个是不可能的!我很乐意为您提供帮助:)在生成规则中的任何命令前面加上前缀@
,可以确保除了执行命令之外,命令不会被打印出来。它只是减少了琐碎命令的视觉噪音。这是一个非常好的解决方案,谢谢分享!)这是一个非常好的解决方案,谢谢分享!:)