我的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
,如果包含,则展开为该字符串,否则展开为无。