如何解决忽略仅订购的先决条件
我有一组目标,应该根据一些订单要求执行。顺序正确:
-
wake
-
fuse
-
flash
-
eep
-
verify
-
lock
其中一些目标被分组为另一个(语音)空目标:
.PHONY: wake
full: fuse flash eep lock
不幸的是,当我打电话给make full --dry-run
时,我看到make
试图以错误的顺序执行规则:wake flash eep lock fuse
。因此,我得到了不正确的结果(擦除了MCU)。
我尝试添加一些仅订购先决条件。这是我的Makefile的骨架:
.PHONY: wake
wake:
<...>
.PHONY: flash
flash: build/main.hex | fuse
<...>
.PHONY: eep
eep: build/main.eep.hex | fuse flash
<...>
.PHONY: verify
verify: build/main.hex | fuse flash eep
<...>
.PHONY: fuse
fuse: | wake
<...>
.PHONY: lock
lock: | fuse flash eep
<...>
build/main.hex: <some files here>
<...>
现在make full
可以正常工作,但是即使我尝试执行某些特定规则,也只能执行PHONY仅订购目标的规则。例如:
make eep
导致执行wake fuse flash eep
。
我只想写新的eep图像,不想浪费时间进行全闪存。
似乎像所谓的“仅订单先决条件”一样对待常规先决条件。
如何强制“仅订购先决条件”像实际的仅订购要求一样工作?有更优雅的解决方案吗?
解决方法
我认为您误解了仅订购指的是什么。仅订购意味着必须在目标之前构建先决条件,但如果仅订购先决条件比目标新,则不需要重建目标。但是,如果仅订购的先决条件不存在,那么该目标仍被视为过时的(并且由于所有目标均为.PHONY,因此这些目标都不存在...)
您可以使用“哨兵”文件代替伪造目标,这些文件基本上是伪文件,用于标记是否/何时最后一次运行了每个目标:
<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Musician List</title>
<link rel="stylesheet" href="{%static 'css/style.css'%}">
</head>
<body>
{{text_1}}
<table border="1">
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Twitter Handle</th>
<th>Country Name</th>
<th>Followers</th>
<th>Following</th>
<th>Total Tweets</th>
<th>Month on Tweets</th>
</tr>
{% for i in musician %}
<tr>
<td>{{ i.first_name}}</td>
<td>{{ i.last_name}}</td>
<td>{{ i.twitter_handle}}</td>
<td>{{ i.country_name}}</td>
<td>{{ i.followers}}</td>
<td>{{ i.following}}</td>
<td>{{ i.total_tweets}}</td>
<td>{{ i.month_on_tweets}}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
请注意,在干净的构建中,.PHONY: flash fuse wake eep verify lock all
all: verify
flash: .flash.sentinel
fuse: .fuse.sentinel
wake: .wake.sentinel
eep: .eep.sentinel
.flash.sentinel: build/main.hex .fuse.sentinel
<...>
touch $@
.fuse.sentinel: .wake.sentinel
<...>
touch $@
.eep.sentinel: build/main.eep.hex fuse.sentinel flash.sentinel
<...>
touch $@
.wake.sentinel: build/main.eep.hex fuse.sentinel flash.sentinel
<...>
touch $@
verify: build/main.hex eep.sentinel fuse.sentinel flash.sentinel
<...>
将重建生成.sentinel文件的所有内容。随后对make all
的调用只会重建任何认为过时的内容。因此,例如,如果您修改了make all
,它将重建build/main.hex
,flash
,eep
和wake
,但是如果您不进行任何更改,它将不会做任何事情(因为一切都已经完成)。如果您构建fuse
,它将重建Flash及其认为过时的其他任何先决条件。
现在,另一方面,如果您想强制 在键入make flash
时运行Flash规则,而无论其他目标是否已过期,那么您可以添加一棵对称树,一棵具有prereq的树,而另一棵则没有:
make flash
这意味着如果您执行.PHONY: flash fuse wake eep verify lock
.PHONY: do_flash do_fuse do_wake do_eep do_verify do_lock
.PHONY: all
all: do_lock
flash do_flash:
<...>
fuse do_fuse:
<...>
wake do_wake:
<...>
eep do_eep:
<...>
verify do_verify:
<...>
lock do_lock:
<...>
do_fuse : do_wake
do_flash : do_fuse
do_eep : do_flash
do_verify : do_eep
do_lock : do_verify
,则没有先决条件,并且只会运行规则。如果您执行make flash
,则make all
具有先决条件all
,它具有另一个先决条件,依此类推,一直到最后,所有这些都将以正确的顺序运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。