没有扩展名的Makefile模式规则?

24

我有很多应用程序都是使用相同类型的 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个回答

29

这看起来像是一个需要使用静态模式规则的任务:

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

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

以上应该有效。

您可以将其转换为静态模式规则,以限制规则的范围,使其仅适用于您的目标列表:

$(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.

明天我会再试一次,看看能否以真正通用的方式使其工作。不过问题很好。


我不确定我理解了,你是在说Beta的答案是不正确的吗? - Andrew Tomazos
不,我没有说那个!两个回答在理论上都是正确的 - 实际上我也在尝试同样的事情。对于这些情况,制作静态模式规则是显而易见的选择......但是试图使它们过于通用并不起作用。我只是发表了我的观察结果,这对我来说似乎是合乎逻辑的,只是想让你知道。 - Nitin4873

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接