【发布时间】: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