gpt4 book ai didi

makefile - 依赖于 make 中的远程文件

转载 作者:行者123 更新时间:2023-12-03 10:00:16 27 4
gpt4 key购买 nike

我有一种情况,我需要根据远程文件在 make 中执行规则。这是我正在尝试做的一个例子(实际的 Makefile 在这里不相关的方式要复杂得多):

URL = http://cdn.sstatic.net/stackoverflow/img/favicon.ico

stackoverflow.png: favico.ico modified | check_modified
convert favicon.ico $@

check_modified: modified
@echo Icon was modified. Downloading.
rm -f favicon.ico
wget $(URL)

.PHONY: check_modified

favico.ico: check_modified

modified:
touch -d "`wget --spider -S $(URL) 2>&1 | sed -n 's/.*Modified: //p'`" $@

这个想法是:
  • 构建规则modified应该始终运行。该规则的作用是将文件的修改时间更改为与URL指向的修改时间相同。
  • 之后,我要modified在依赖项方面表现正常。如 modifiedfavicon.ico 更新,我想检索新文件,然后让对它的依赖导致重新制作目标文件。

  • 作为一个皱纹,在某些应用程序中,我必须手动检索文件。在这些情况下,我只想有一个规则来触发并告诉我手动下载文件,但这不会影响构建目标。例如,如果我正在转换的源图像在站点登录之后,我需要手动登录站点并将其下载到固定位置,然后重新运行 make。

    我尝试过的一切:
  • 如果目标是最新的,则无法检查 URL,或者
  • 始终检查 URL 并重建目标,即使 modified不比目标更近。

  • 有什么智慧的话吗?

    最佳答案

    您的问题可能是 make 在运行任何配方之前构建依赖关系图。所以,当您的 modified标记文件已创建/更新,make 考虑其最后修改日期并使用它来决定是否应构建其他目标为时已晚。

    您观察到的第一个行为(如果目标是最新的,则无法检查 URL)可能对应于您未使用 .PHONY 的尝试。特殊目标。尽快modified已创建,make 始终认为它是最新的,因为它没有先决条件,因此不会过时。

    第二种行为(始终检查 URL 并重建目标,即使修改的时间不比目标更新)对应于您发布的内容:check_modified.PHONY 的先决条件特殊目标,这迫使它总是认为它已经过时了。 stackoverflow.pngfavico.ico ,直接与否,取决于check_modified因此也总是被认为是过时的。

    解决您的问题的一种选择是使用递归的、两次传递的 make 调用。在第一次运行时,make 会构建 all虚假目标(始终),更新 modified标记文件,然后再次调用自身以构建其他以标记文件为先决条件且已过时的目标。因为,对于第二次调用,make 重建其依赖关系图,它将考虑标签文件的最后修改日期。就像是:

    URL = http://cdn.sstatic.net/stackoverflow/img/favicon.ico

    .PHONY: all

    all:
    touch -d "`wget --spider -S $(URL) 2>&1 | sed -n 's/.*Modified: //p'`" modified
    $(MAKE) stackoverflow.ico

    stackoverflow.ico: modified
    @echo Icon was modified. Downloading.; \
    rm -f favicon.ico; \
    wget $(URL); \
    convert favicon.ico $@

    说明:
  • 我将您的转换替换为 png通过无用的转换为 ico因为favicon.ico SO 的图标是复合的,并转换为 png创建两个文件而不是一个,命名为 stackoverflow-0.pngstackoverflow-1.png ,这无益地使事情复杂化。
  • all是一个真正的虚假目标和默认目标,因此,每次调用 make 时(或 make all ),它已构建。它首先更新 modified标记文件,然后再次调用 make 来构建 stackoverflow.ico .
  • 如果 stackoverflow.ico,第二个 make 调用什么也不做比 modified 更新,否则它会下载并转换。

  • 您的第二个问题(获取有关所需手动操作的消息)完全不同并且更容易解决。让我们首先定义一条消息并将其回显到文件的配方中:
    define DIY_message
    Dear user, you should first:
    - do this
    - and that.
    Unless you know it is useless, of course.
    endef
    export DIY_message

    the_remote_file:
    @echo "$$DIY_message"

    如果使用此目标( make the_remote_file )或以某种方式依赖于 the_remote_file 的目标调用 make ,则会打印该消息。或者:
  • the_remote_file不存在,
  • the_remote_file存在但就其先决条件而言已过时(如果您声明了先决条件),
  • the_remote_file.PHONY的先决条件.

  • 注意:使用由 define-endef 分配的中间 make 变量使格式化的多行消息更容易。

    关于makefile - 依赖于 make 中的远程文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34190643/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com