【问题标题】:Execute Makefile rule only once只执行一次 Makefile 规则
【发布时间】:2012-07-30 23:49:30
【问题描述】:

我有一个 Makefile 规则,如下所示:

%.b : %.a
    [run some commands...]

我想重写我的 Makefile,以便从 %.a 到 %.b 的所有转换都通过命令的一次执行来处理,而不是每个文件一次。

我尝试了以下方法:

%.b : someDummyFile

someDummyFile : 
    [run some commands]

问题是即使第一个规则没有请求创建 someDummyFile 的规则也会执行,从而导致不良行为。我猜没有依赖关系的规则会一直执行,即使它们的目标没有被其他规则使用?

我在这里错过了什么?


在尝试调试此问题时,我删除了对第二条规则的所有引用。例如,我将以下规则插入到现有的 Makefile 中,为什么即使没有其他规则引用它也会执行?

HELLOWORLD :
    echo "# HELLO WORLD! THE NEXT LINE WILL TRIGGER AN ERROR"
    DFASDA

【问题讨论】:

  • 您所描述的似乎在这里工作正常;你能更详细地解释你的问题吗?
  • @CarlNorum:感谢您查看此内容。我的问题是,当我不希望它执行时,规则正在执行。请参阅我在上面附加的小示例。
  • 如果一个规则没有被引用,它的配方永远不会被执行。您可以使用make -d 获取大量调试信息,以帮助您找出发生这种情况的原因。

标签: linux makefile


【解决方案1】:

这是一个简单的例子,我认为它可以满足您的需求:

all: file1.x file2.x

%.x: doWork
    :

doWork:
    touch file1.x
    touch file2.x

doWork 规则会运行一次,然后%.x 规则中的:(无操作)会运行两次。您确实需要 :,或至少 something 作为该规则的配方,否则您将收到关于没有创建 .x 文件的规则的错误。这是用于取消模式规则的语法的副作用,即无配方规则。

【讨论】:

  • @Basile - 是的,all 和 doWork 都应该是 .PHONY,但除非存在具有这些名称的文件,否则它并不那么重要。我离开了.PHONY 线以获得最短长度的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2016-06-30
  • 2020-09-11
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多