为什么 GNU Make 的二次扩展不适用于依赖关系的模式规则?



请考虑以下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 $@

它会起作用。

最新更新