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

时间:2016-01-28 09:52:58

标签: makefile gnu-make

考虑这个makefile:

%: %.c
    @echo making $@
    @touch $@

.SECONDEXPANSION:
%.pid: $$(basename $$@)
    $(<D)/$(<F) --pidfile=$<.pid

这里,第一个规则构建一个程序,第二个规则启动它,生成一个pid文件。 注意:我知道在这个例子中不需要二次扩展;真正的makefile更复杂,我真的需要在那里进行二次扩展。

因此,输入make foo.pid,我希望Make能够通过第一个规则从foo构建foo.c,然后再通过第二个规则运行./foo --pidfile=foo.pid

然而,它似乎不起作用:

$ make -f Makefile.test foo.pid
make: *** No rule to make target 'foo.pid'.  Stop.

这在某种程度上与模式规则提供的二次扩展依赖关系有关。如果我写

    第二条规则中的
  • %.pid: %(即摆脱二次扩张)或
  • 第一条规则中的
  • foo: %: %.c(即编写显式静态模式规则),
一切都突然起作用了。为什么?这是GNU Make的限制吗?就我而言,我想避免在第一条规则中预先列出所有可能的程序。

1 个答案:

答案 0 :(得分:0)

我认为你的情况在10.5.5匹配任何模式规则中描述。你在这里有一个非终端匹配任何规则,不允许匹配指示特定类型数据的文件名。

如果你让我们说


Django as the freamwork,
PostgreSQL as the DB backend
PostgreSQL PGIS as the geolocation handler
Openstreetmap as the map viewer

它会起作用。