【问题标题】:How to run `make` on a `makefile` target and ignore prerequisites?如何在“makefile”目标上运行“make”并忽略先决条件?
【发布时间】:2022-09-24 12:08:18
【问题描述】:

假设我有一个make 目标abc,其先决条件为x、y 和z。

abc: x y z
    echo \'Do something\'

有没有一些简单的方法来运行make 并忽略先决条件,这样它就可以在不先运行x、y 和z 的情况下运行abc?

  • 我在想一个命令行参数,比如make abc --ignore-prerequisites,但我在man make 中没有看到任何关于此的内容。我有点惊讶。似乎是一个非常常见的用例。就上下文而言,我们有一个大型管道,其中包含需要很长时间的作业,有时我们只想立即运行目标,即使有一些小的东西发生了变化并且需要更新。或者,在某些情况下,我们的一些先决条件还没有很好地编程,即使它们是最新的,它们也会运行。因此,这将是暂时解决此类情况的有用案例。
  • 哪有这回事。在make 的上下文中,它没有意义:当你说“目标 X 具有先决条件 Y”时,它意味着 Y 是 X 的一个要求。尝试构建 X 是没有意义的如果 Y 未构建或不是最新的:如果您这样做了,那么 X 的时间戳现在将高于 Y 的时间戳,并且当您重新运行时,它甚至会说“最新”尽管 Y 可能已更新,而 X 并未反映该更新。
  • 我有一种感觉,有人会这样回应:由于make 的设计方式,它没有意义。我理解生产。但发展过程不同。当你有一个长而复杂的管道,比如几个小时,涉及长时间运行的作业和下载 100 兆的文件,而你只是在做开发,(i) 对事物的小改动并不重要,并且 (ii ) 有时某些 prereqs 在它们实际上不需要时运行。可惜make 没有这个;相当短视的设计缺陷。
  • 如果您想要一个没有这些先决条件的不同目标,只需编写它。如果所有命令都相同,请使用定义。然后其他人看着你的设置就不必猜测什么是重要的,因为你会明确地把它写下来,这就是 make 的全部意义所在。
  • @JoeFlack相当短视的设计缺陷:恭喜,您发现了数百万开发人员使用的具有 46 年历史的工具中的一个重大设计缺陷。说真的,试试touch x; make abc。

标签: makefile target prerequisites


【解决方案1】:
$ make
echo x updated
x updated
echo y updated
y updated
echo z updated
z updated
echo all updated
all updated

$ make noreq=y
echo all updated
all updated

它是如何完成的:

ifdef noreq
req :=
else
req = $(1)
endif

.PHONY: all x y z

all: $(call req,x y z)
    echo $@ updated

x y z:
    echo $@ updated

请注意,GNU Makefile 可以检查变量 MKCMDGOALS 的值并从中计算其他变量。当某些目标在命令行上明确给出时(因此出现在MKCMDGOALS 中),您可以拥有它,然后noreq 标志生效,并且这些目标使用宏调整它们的行为。

警告:在noreq 模式下,目标实际上没有先决条件,因此您的规则不能通过$^ 或$< 引用先决条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多