Makefile模式规则没有扩展名?

时间:2013-03-30 12:43:52

标签: makefile gnu-make

我有一堆使用相同类型的make规则构建的应用程序:

apps = foo bar baz

all: $(apps)

foo: foo.o $(objects)
    $(link)

bar: bar.o $(objects)
    $(link)

baz: baz.o $(objects)
    $(link)

如果他们有扩展名(例如.x),我可以制定一个模式规则:

%.x: %.o $(objects)
    $(link)

我不必为每个应用程序写出新规则。

但他们没有扩展名,我很确定:

%: %.o $(objects)
    $(link)

将无效(因为它指定构建任何文件,您可以使用此规则)。

是否有指定一条涵盖所有$(apps)构建规则的规则?

3 个答案:

答案 0 :(得分:29)

这看起来像是static pattern rule

的工作
$(apps) : % : %.o $(objects)
    $(link)

答案 1 :(得分:8)

%: %.o $(objects)
    $(link)

上述情况应该有效。

您可以通过将规则转换为static pattern rule来限制规则的范围,以便仅针对您的目标列表进行考虑:

$(apps) : % : %.o $(objects) # only consider this for $(apps) targets
    $(link)

答案 2 :(得分:0)

不是您正在寻找的答案,而是一个可以解释为什么这种级别的通用代码可能无法产生良好结果的原因。 ....

静态模式依赖于词干的存在来匹配和构建依赖链。 几乎和隐式规则一样(用于没有任何收件人的目标。)

我看到你想要实现的目标,制定一个通用规则,以满足代码中对象和链接的所有目标检查。

像这样的事情::

 % : % : $(rule1)
         echo / generic code ;

以便在不同的场景中为所有应用调用它

因为您不想添加扩展名(这成为某些问题的根源) 这个问题是目标也会反映在依赖关系中,因为没有办法区分目标的依赖关系。

因此,如果你确实试过,我想你会来到这里......

 $ make -nf mk.t
   mk.t:18: *** mixed implicit and static pattern rules.  Stop.

:),我明天再试一次,看看能不能以真正的通用方式工作。不错的问题。