首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无扩展名的Makefile模式规则?

无扩展名的Makefile模式规则?
EN

Stack Overflow用户
提问于 2013-03-30 20:43:52
回答 3查看 7.7K关注 0票数 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)构建规则的规则?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-30 20:49:56

这看起来像是static pattern rule的工作

$(apps) : % : %.o $(objects)
    $(link)
票数 29
EN

Stack Overflow用户

发布于 2013-03-30 20:51:22

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

上面的方法应该是可行的。

您可以通过将规则转换为static pattern rule来限制规则的范围,以便只在您的目标列表中考虑它:

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

Stack Overflow用户

发布于 2013-03-31 04:39:38

这不是你想要的答案,而是一个可以解释为什么这种级别的泛型代码可能不会产生良好结果的原因。……

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

我明白您想要实现的目标,即创建一个通用规则,以满足代码中对象和链接的所有目标检查。

如下所示::

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

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

由于您不想添加扩展(这会成为某些问题的根源),因此这样做的问题是目标也会反映在依赖项中,因为无法区分依赖项和目标项。

因此,如果你真的尝试过,我想你会成功的……

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

:),我明天会再试一次,看看我是否能让它以一种真正通用的方式工作。不过这个问题问得好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15718653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档