Time 如何创建基于时间的Makefile规则?

Time 如何创建基于时间的Makefile规则?,time,makefile,dependencies,Time,Makefile,Dependencies,我希望有一个Makefile目标,只有当目标文件的时间间隔大于某个时间间隔时,它才会被重建 例如,假设我有某种方法生成一个有效期为一天的密钥,但生成它需要相当长的时间。我可以在每次需要时重新生成它: .PHONY: key key: sleep 5 && echo generated > key foo: key echo foo bar: key echo bar 但是,在一天中,我可能会多次键入makefoo或makebar。每次等待都很烦人,

我希望有一个Makefile目标,只有当目标文件的时间间隔大于某个时间间隔时,它才会被重建

例如,假设我有某种方法生成一个有效期为一天的密钥,但生成它需要相当长的时间。我可以在每次需要时重新生成它:

.PHONY: key
key:
    sleep 5 && echo generated > key
foo: key
    echo foo
bar: key
    echo bar

但是,在一天中,我可能会多次键入
makefoo
makebar
。每次等待都很烦人,我宁愿每天只吃一次这个费用。

让生成的文件依赖于某个虚拟文件,如
键时间戳
,然后让cron作业
每天触摸该文件。

要在某个时间后重建make目标,需要一个帮助文件,依靠这一点,用力触摸助手,如(示例为每日):

应按预期工作,如果您没有访问
find
的权限,则必须将其替换为类似的内容。基本上,将其替换为能够检测到密钥最近一次被修改1天或更长时间的内容

将强制运行规则

我还深入研究了,这需要在手头运行两次makefile,以便每24小时只更新一次密钥。不太实用


然而,这是一个技巧,我不建议将其作为makefile的正常使用。

虽然我相信这会起作用,但它需要每个想要编译此代码的开发人员进行额外的设置。如果未设置cron条目,则每当密钥过期时,构建就会开始失败。这似乎需要GNU
touch
,就像在macOS上一样:
touch:inally option--d
。这似乎无法解决问题。如果我将
sleep 5
添加到任一规则中并运行
make target
,则每次运行需要5秒,而不是一次5秒,然后立即运行。以这种方式添加sleep命令只会将事情延迟5秒。我知道这不会导致你所描述的结果。
touch
命令的一个可能的替代品可以是
perl
,比如:
@perl-e'$$t=time-3600*24;utime$$t,$$t,$@'
请注意,这一行已经被引用为makefile Btw.“.PHONY”也是
make
命令的gnu扩展。是的,每次执行
make
时,它都会将执行延迟5秒。问题的关键是:我宁愿每天只吃一次这个东西。这5秒应该每24个周期只出现一次。很抱歉,我丢失了。我确信我的Makefile修复了您的初始请求“仅当目标文件的时间间隔大于某个时间间隔时才重建”。不需要睡眠,不需要cronjob,只需要Makefile,这里我的示例时间间隔是“1天”。然而,在我看来,你提出了一个稍微不同的问题陈述。在这种情况下,如果你能重新表述你的问题陈述,那会有所帮助。
target:  target.helper
    script-or-rule

target.helper: FORCE
    @touch -d -1day $@

FORCE:
.PHONY: key.update key.check

foo: key.check
    echo foo

bar: key.check
    echo bar

key.check: key
    @find key -mmin +1440 -exec make key.update \;

key:
    make key.update

key.update:
    sleep 5 && echo generated > key