请考虑以下makefile:
%: %.c
@echo making $@
@touch $@
.SECONDEXPANSION:
%.pid: $$(basename $$@)
$(<D)/$(<F) --pidfile=$<.pid
在这里,第一条规则构建一个程序,第二条规则启动它,生成一个 pid 文件。注意:我知道在这个例子中不需要二次扩展;真正的makefile更复杂,我真的需要在那里进行二次扩展。
所以,键入 make foo.pid
,我希望 Make 通过第一条规则从foo.c
构建foo
,然后通过第二条规则运行./foo --pidfile=foo.pid
。
但是,它似乎不起作用:
$ make -f Makefile.test foo.pid
make: *** No rule to make target 'foo.pid'. Stop.
这在某种程度上与模式规则提供的辅助扩展依赖项有关。如果我写
-
%.pid: %
第二条规则(即摆脱二次扩展),或 -
foo: %: %.c
在第一条规则中(即编写显式静态模式规则),
这一切都突然奏效了。为什么?这是GNU Make的限制吗?就我而言,我想避免在第一条规则中预先列出所有可能的程序。
我认为您的情况在第 10.5.5 节匹配任何模式规则中都有描述。您在这里有一个非终端匹配任何规则,不允许匹配指示特定类型数据的文件名。
如果你有 让我们说
%:: %.c
@echo making $@
@touch $@
它会起作用。