makefile静态模式

来源:互联网 发布:西门子plm软件下载 编辑:程序博客网 时间:2024/06/04 17:51
静态模式规则的基本语法:TARGETS ...: TARGET-PATTERN: PREREQ-PATTERNS ...COMMANDS...“ TAGETS”列出了此规则的一系列目标文件。像普通规则的目标一样可以包含通配符。“TAGET-PATTERN”和“ PREREQ-PATTERNS”说明了如何为每一个目标文件生成依赖文件。从目标模式( TAGET-PATTERN)的目标名字中抽取一部分字符串(称为“茎”)。使用“茎”替代依赖模式( PREREQ-PATTERNS)中的相应部分来产生对应目标的依赖文件。首先在目标模式和依赖模式中,一般需要包含模式字符“%”。在目标模式( TAGET-PATTERN)中“%”可以匹配目标文件的任何部分,模式字符“%”匹配的部分就是“茎”。目标文件和目标模式的其余部分必须精确的匹配。看一个例子:目标“foo.o”符合模式“%.o”,其“茎”为“foo”。而目标“foo.c”和“foo.out”就不符合此目标模式。每一个目标的依赖文件是使用此目标的“茎”代替依赖模式( PREREQ-PATTERNS)中的模式字符“%”而得到。例如:上边的例子中依赖模式( PREREQ-PATTERNS)为“%.c”,那么使用“茎”“foo”替代依赖模式中的“%”得到的依赖文件就是“foo.c”。需要明确的一点是:在模式规则的依赖列表中使用不包含模式字符“%”也是合法的。代表这个文件是所有目标的依赖文件。我们来看一个例子,它根据相应的.c 文件来编译生成“foo.o”和“bar.o”文件:objects = foo.o bar.oall: $(objects)$(objects): %.o: %.c$(CC) -c $(CFLAGS) $< -o $@例子中,规则描述了所有的.o文件的依赖文件为对应的.c文件,对于目标“foo.o”,取其茎“foo”替代对应的依赖模式“%.c”中的模式字符“%”之后可得到目标的依赖文件“foo.c”。这就是目标“foo.o”的依赖关系“foo.o: foo.c”在使用静态模式规则时,指定的目标必须和目标模式相匹配,否则在执行make时将会得到一个错误提示。如果存在一个文件列表,其中一部分符合某一种模式而另外一部分符合另外一种模式,这种情况下我们可以使用“filter”函数(可参考 第七章 make的内嵌函数)来对这个文件列表进行分类,在分类之后对确定的某一类使用模式规则。例如:files = foo.elc bar.o lose.o$(filter %.o,$(files)): %.o: %.c$(CC) -c $(CFLAGS) $< -o $@$(filter %.elc,$(files)): %.elc: %.elemacs -f batch-byte-compile $<其中; $(filter %.o,$(files))的结果为“bar.o lose.o”。“filter”函数过滤不符合“%.o”模式的文件名返回所有符合此模式的文件列表。第一条静态模式规则描述了这些目标文件是通过编译对应的.c 源文件来重建的。同样第二条规则也是使用这种方式。