我有一堆应用程序都是使用相同类型的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)
构建规则的规则?
发布于 2013-03-30 20:49:56
这看起来像是static pattern rule的工作
$(apps) : % : %.o $(objects)
$(link)
发布于 2013-03-30 20:51:22
%: %.o $(objects)
$(link)
上面的方法应该是可行的。
您可以通过将规则转换为static pattern rule来限制规则的范围,以便只在您的目标列表中考虑它:
$(apps) : % : %.o $(objects) # only consider this for $(apps) targets
$(link)
发布于 2013-03-31 04:39:38
这不是你想要的答案,而是一个可以解释为什么这种级别的泛型代码可能不会产生良好结果的原因。……
静态模式依赖于词干的存在来匹配和构建依赖链。几乎与隐式规则(用于没有任何食谱的目标)的方式相同。
我明白您想要实现的目标,即创建一个通用规则,以满足代码中对象和链接的所有目标检查。
如下所示::
% : % : $(rule1)
echo / generic code ;
以便在不同的场景中为所有应用程序调用它
由于您不想添加扩展(这会成为某些问题的根源),因此这样做的问题是目标也会反映在依赖项中,因为无法区分依赖项和目标项。
因此,如果你真的尝试过,我想你会成功的……
$ make -nf mk.t
mk.t:18: *** mixed implicit and static pattern rules. Stop.
:),我明天会再试一次,看看我是否能让它以一种真正通用的方式工作。不过这个问题问得好。
https://stackoverflow.com/questions/15718653
复制相似问题