如何处理Makefile中动态检测到的未知依赖项?

时间:2018-12-11 20:51:37

标签: makefile dependencies

比方说我的Makefile正在建立一个网站。我写了一个包含资产的index.html,如下所示:

<html>
  <body><img src="asset/foo.img"/></body>
</html>

现在,我想编写一条规则来创建一个包含HTML及其资产的ZIP存档。

我编写了一个脚本来解析src=属性,但是该如何处理?
如果我将其放在配方中,但那时不能更改Makefile规则。
如果我将其放在$(shell ...)命令中,那么即使用户正在执行clean或其他操作,它也必须在每次Makefile解析时运行。

处理这种情况的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

实际上,我想我自己才知道。解决方案是对$(MAKE)的子调用-实际上,与include相比,它的主要区别似乎是它在配方执行时而不是解析时发生。

答案 1 :(得分:0)

也许是这样的

assets := $(shell ./myscript index.html)

myzip.zip: index.html $(assets)
    zip $@ $^

答案 2 :(得分:0)

我似乎想念你的问题。是不是您所处的依赖关系树看起来像这样:

my_page.html   image1.bmp    image2.bmp
  |    |           |            |
  1    2           2            2
  |    |           |            |
  |     \          |           /
  |      \         |          /
  |       \        |         /
  |        \       |        /
  |         \      |       /
  |          \     |      /
depend.dep    archive.zip

其中“ 1”是扫描my_page.html的所有资产并将其写回到depend.dep(或makefile本身,不会改变解决方案)的规则,而“ 2”正在更新具有更改的成员文件的zip文件?由于make试图在执行其他任何规则之前重新制作depend.dep(或makefile本身),因此在启动make运行时,您始终具有最新的依赖项列表,该列表将完全您命令:将成员添加/更新到archive.zip(如果较新)。我再说一遍:如果解析my_page.html相对于依赖关系已更改,则在运行过程中重新解析步骤 zero ,如果存在对{{1 }} d或include本身。