3.1 例子
foo.o : foo.c defs.h# module for twiddling the frobs
cc -c -g foo.c
它的目标是"foo.o",依赖于"foo.c"和"defs.h",有一个命令"cc -c -g foo.c" 。命令行以TAB 字符开始标识它是一个命令 。
这条规则说明两件事:如何决定"foo.o"是旧的:如果它不存在,或者"foo.c"或者"defs.h"比它新 。如何更新"foo.o"文件:通过运行"cc"程序 。命令未提及"defs.h",但可以猜想"foo.c"包含了它,这是"defs.h"被置于依赖关系中的理由 。
3.2 规则的语法
语法如下:
TARGETS : DEPENDENCIES
COMMAND
...
或者
TARGETS : DEPENDENCIES ; COMMAND
COMMAND
...
TARGETS 是以空格隔开的文件名,统配符可以使用 。通常一个规则只有一个目标,偶尔也有多个 。命令行以TAB 键开始 。第一条命令可在依赖关系的下一行;或者在同一行,在分号后面;两种方式效果相同 。
因为"$"符号被用做变量引用,如果要在规则中使用"$"符号,必须写两个:"$$" 。可以用""符号来分割一个长行,这不是必须的,因为make 对行的长度没有限制 。
3.3 通配符
规则中的文件名可以包含统配符,如"*","?" 。文件名前的字符"~"有特殊的含义 。单独使用,或跟随一个"/",代表用户的home 目录,比如"~/bin"扩展为/home/you/bin";如果"~"跟随一个单词,表示单词指示的那个用户的home 目录,如"~john/bin"扩展为"/home/john/bin" 。通配符在目标,依赖关系,命令中自动扩展,其它情况下,统配符的扩展除非显式使用"wildcard"函数 。通配符的特殊意义可以使用""符号关闭 。
例子:
clean:
rm -f *.o
和
print: *.c
lpr -p $?
touch print
通配符在定义变量时并不扩展,例如:objects = *.o 则objects 的值是字符串"*.o";但是如果你将objects 用于目标,依赖或命令中,扩展会进行 。要将objects 设置成扩展过的内容,使用:objects := $(wildcard *.o)
3.3.1 通配符的缺陷
这是一个使用通配符的例子,但结果不是你所期望的 。假设可执行文件"foo" 是从当前目录中的所有".o"文件生成的:
objects = *.o
foo : $(objects)
cc -o foo $(CFLAGS) $(objects)
objects 变量的值是字符串"*.o" 。通配符扩展在规则"foo"中进行,于是所有存在的".o"文件成为"foo"的依赖而且在需要时重新编译 。
但如果删除了所有的".o"文件呢?当通配符不匹配任何文件时,一切都保持原样:则"foo"依赖于一个叫做"*.o"的文件;由于这个文件不大可能存在,"make"程序会报告一个无法生成"*.o"文件的错误,这不是期待的结果 。实际上可以用通配符获得期望结果,但是需要复杂的技术,包括"wildcard"函数和字符串替换函数 。
3.3.2wildcard 函数
通配符自动在规则中进行 。但是在变量赋值的和函数的参数中通配符不会扩展,如果在这些情况下需要通配符扩展,必须使用"wildcard"函数 。语法如下:
$(wildcard PATTERN...)
这个在makefile 任何地方出现的字符串,会被匹配任何一个文件名格式的以空格隔开的现有文件列表替换 。如果没有任何文件匹配一个模式,这个模式从"wildcard"的输出中忽略,注意,这和上述的通配符的处理是不一样的 。"wildcard"函数的一个功能是找出目录中所有的".c"文件:$(wildcard *.c),可以通过替换后缀".c"为".o"从C 文件列表得到目标文件的列表:
$(patsubst %.c,%.o,$(wildcard *.c))
这样,上节中的makefile 改写为:
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
cc -o foo $(objects)
这个makefile 利用了编译C 程序的隐含规则,所以不需要对编译写出显式的规则 。(":="是"="的一个变体)
推荐阅读
- q点是什么 简介q点是什么
- 布朗族主要分布在哪里 布朗族简介
- 白居易字什么晚年号是什么 白居易的简介晚年号
- gawk的使用方法
- vi 简介
- 关于gcc、gdb 和gmake 的资料
- Makefile工具的使用
- 佛教八大菩萨简介
- 白鹿原简介
- FreeBSD中/etc下的文件简介