我的Makefile的一部分:
CFLAGS = -I ../headers -Wall
EXECUTABLES = testPattern testPatterns
$(EXECUTABLES): %Pattern: %.c pattern.o
g++ $(CFLAGS) $@.c pattern.o -o $@
我没有包含对象编译,因为它不相关。
我对此代码的问题是该模式仅匹配第一个可执行文件,因为它以' Pattern'结尾,第二个可执行文件有另外的' s'在最后杀死脚本。有没有什么方法可以让它工作而不改变第二个可执行文件的名称?
谢谢
答案 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
,如果是,则扩展为该字符串,否则扩展为空。