Makefile静态模式规则

时间:2016-11-14 20:02:39

标签: makefile

我的Makefile的一部分:

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

$(EXECUTABLES): %Pattern: %.c pattern.o
      g++ $(CFLAGS) $@.c pattern.o -o $@

我没有包含对象编译,因为它不相关。

我对此代码的问题是该模式仅匹配第一个可执行文件,因为它以' Pattern'结尾,第二个可执行文件有另外的' s'在最后杀死脚本。有没有什么方法可以让它工作而不改变第二个可执行文件的名称?

谢谢

1 个答案:

答案 0 :(得分:2)

这里使用静态模式规则没有意义,因为模式没有出现在先决条件列表中。但是,我假设您还希望在此处包含.c文件作为先决条件。

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

你可以写:

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

$(EXECUTABLES): % : %.c pattern.o
        g++ $(CFLAGS) $^ -o $@

ETA 这似乎是一个更好的例子,可以显示你面临的真正问题是:

EXECUTABLES = someThing somePattern morePatterns

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

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

但是,你可以这样做:

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

这基本上循环遍历EXECUTABLES中的每个条目并测试它是否包含字符串Pattern,如果是,则扩展为该字符串,否则扩展为空。