微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

忽略仅订购的先决条件

如何解决忽略仅订购的先决条件

我有一组目标,应该根据一些订单要求执行。顺序正确:

  1. wake
  2. fuse
  3. flash
  4. eep
  5. verify
  6. 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.hexflasheepwake,但是如果您不进行任何更改,它将不会做任何事情(因为一切都已经完成)。如果您构建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 举报,一经查实,本站将立刻删除。