2016-11-14 128 views
0

我的Makefile的一部分:Makefile的静态模式规则

CFLAGS = -I ../headers -Wall 
EXECUTABLES = testPattern testPatterns 

$(EXECUTABLES): %Pattern: %.c pattern.o 
     g++ $(CFLAGS) [email protected] pattern.o -o [email protected] 

我不包括对象的编译,因为它是不相关的。

我用这段代码的问题是,该模式只匹配第一个可执行文件,因为它以'Pattern'结尾,第二个可执行文件在结尾处有一个额外的's',终止了该脚本。有什么办法可以让它工作而不需要改变第二个可执行文件的名字?

感谢

回答

1

有一个在这里使用的是静态模式规则,因为该模式没有在先决条件列表中出现没有意义的。但是,我想你也想在这里包含.c文件作为先决条件。

为什么在模式匹配中包含Pattern

你可以这样写:

CFLAGS = -I ../headers -Wall 
EXECUTABLES = testPattern testPatterns 

$(EXECUTABLES): % : %.c pattern.o 
     g++ $(CFLAGS) $^ -o [email protected] 

ETA 它会出现一个更好的例子,将显示你所面临的真正问题是这样的:

EXECUTABLES = someThing somePattern morePatterns 

你想要一个静态模式规则匹配包含Pattern而不是其他的二进制文件。

正如我在下面的评论中所说的,你不能用单个模式来做到这一点,这意味着你不能在静态模式规则的目标部分做到这一点。

但是,你可以做这样的:

$(foreach E,$(EXECUTABLES),$(if $(findstring Pattern,$E),$E)): % : %.c pattern.o 
     g++ $(CFLAGS) $^ -o [email protected] 

这基本上通过EXECUTABLES和测试每个条目循环,看它是否包含字符串Pattern,如果是扩展到该字符串别的什么也不扩展。

+0

你好,对不起,我搞砸了,但已经纠正了。文件名是在前提条件下。我需要一个模式是因为我有几个可执行文件,我有完全不同的名称和模式,并希望将它们全部存储在一个变量中。我不想要任何省略或错误的依赖关系。我会为他们制定新的规则,但我希望他们都在一个变量。 – Joe

+0

你的例子不是很好,因为前缀'test'是相同的。如果你使用了'EXECUTABLES = fooPattern barPatterns',这将是一个更好的例子。不可能写出一个匹配多个非连续非常数部分的模式。就你上面的例子来说,你不能编写一个与'Pattern'前面的前缀匹配的模式和'Pattern'后面的后缀。你每个单词只能有一个'%',所以你只能匹配一边或另一边。 – MadScientist

+0

好的!感谢您的快速和明确的解释。 – Joe