8

我有一个 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
4

1 回答 1

12

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

all: file1.x file2.x

%.x: doWork
    :

doWork:
    touch file1.x
    touch file2.x

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

于 2012-07-30T23:54:41.580 回答