生成文件静态模式规则



我的Makefile的一部分:

CFLAGS = -I ../headers -Wall
EXECUTABLES = testPattern testPatterns
$(EXECUTABLES): %Pattern: %.c pattern.o
      g++ $(CFLAGS) $@.c pattern.o -o $@

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

我对这段代码的问题是模式只匹配第一个可执行文件,因为它以' pattern '结尾,第二个可执行文件在结尾有一个额外的's',这会杀死脚本。是否有任何方法可以使它工作而不改变第二个可执行文件的名称?

谢谢

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

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

你可以直接写:

CFLAGS = -I ../headers -Wall
EXECUTABLES = testPattern testPatterns
$(EXECUTABLES): % : %.c pattern.o
        g++ $(CFLAGS) $^ -o $@
埃塔

下面是一个更好的例子,可以显示您所面临的实际问题:

EXECUTABLES = someThing somePattern morePatterns

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

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

但是,你可以这样做:

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

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

最新更新