2013-03-30 29 views
20

我有一大堆的是与同类型的化妆规则构建的应用程序:没有扩展名的Makefile模式规则?

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)构建规则?

回答

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

以上应该工作。

您可以通过将其转换成static pattern rule限制规则的范围,因此,它是只考虑您的目标清单:

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

不是一个答案,你在找什么,但这可能解释为什么这样的通用代码级别可能不会产生好的结果。 ...

静态模式依赖干的存在来匹配和构建依赖链。 与隐式规则(用于没有任何收件人的目标)相同的方式。

我看到你试图存档,制定一个通用的规则,将满足对象的所有目标检查并链接到你的代码中。

像这样::

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

,以便它被调用在不同的充场景

,因为你不想添加一个扩展(这成为一些问题的根源) 的所有应用程序与此相关的问题是,目标也会反映在依赖关系中,因为无法区分目标的依赖关系。

因此,如果你没有尝试,我想你会到这里来?

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

:),我会给这个明天再试,看看我是否能在真正通用的方式得到这个工作。不错的问题,但。

+0

我不确定我是否理解,你是说[Beta](http://stackoverflow.com/a/15718701/1131467)的答案不正确? –

+0

不,不是我说的! ,所发布的答案在理论上都是正确的 - 事实上我正在尝试同样的事情。制定静态模式规则是这些场景的明显选择.....但试图使它们过于通用不起作用。我只是发布了我的观察结果,这对我来说似乎很合理,只是为了让你知道。 – nsd