Linux/Unix环境下的make命令详解( 三 )


-d Debug模式,输出有关文件和检测时间的详细信息 。
Linux下make标志位的常用选项与Unix系统中稍有不同,下面我们只列出了不同部分:
-c dir 在读取 makefile 之前改变到指定的目录dir 。
-I dir 当包含其他 makefile文件时,利用该选项指定搜索目录 。
-h help文挡,显示所有的make选项 。
-w 在处理 makefile 之前和之后,都显示工作目录 。
通过命令行参数中的target,可指定make要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件 。如果命令行中没有指定目标,则系统默认target指向描述文件中第一个目标文件 。
通常,makefile 中还定义有 clean 目标,可用来清除编译过程中的中间文件,例如:
clean:
rm -f *.o
运行 make clean 时,将执行 rm -f *.o 命令,最终删除所有编译过程中产生的所有中间文件 。
隐含规则
在make 工具中包含有一些内置的或隐含的规则,这些规则定义了如何从不同的依赖文件建立特定类型的目标 。Unix系统通常支持一种基于文件扩展名即文件名后缀的隐含规则 。这种后缀规则定义了如何将一个具有特定文件名后缀的文件(例如.c文件),转换成为具有另一种文件名后缀的文件(例如.o文件):

.c:.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
系统中默认的常用文件扩展名及其含义为:
.o目标文件
.cC源文件
.fFORTRAN源文件
.s汇编源文件
.yYacc-C源语法
.lLex源语法
在早期的Unix系统系统中还支持Yacc-C源语法和Lex源语法 。在编译过程中,系统会首先在makefile文件中寻找与目标文件相关的.C文件,如果还有与之相依赖的.y和.l文件,则首先将其转换为.c文件后再编译生成相应的.o文件;如果没有与目标相关的.c文件而只有相关的.y文件,则系统将直接编译.y文件 。
而GNU make 除了支持后缀规则外还支持另一种类型的隐含规则--模式规则 。这种规则更加通用,因为可以利用模式规则定义更加复杂的依赖性规则 。模式规则看起来非常类似于正则规则,但在目标名称的前面多了一个 % 号,同时可用来定义目标和依赖文件之间的关系,例如下面的模式规则定义了如何将任意一个 file.c 文件转换为 file.o 文件:
%.c:%.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
#EXAMPLE#
下面将给出一个较为全面的示例来对makefile文件和make命令的执行进行进一步的说明,其中make命令不仅涉及到了C源文件还包括了Yacc语法 。本例选自"Unix Programmer"s Manual 7th Edition, Volume 2A" Page 283-284
下面是描述文件的具体内容:
 #Description file for the Make command
 #Send to print
 P=und -3 | opr -r2
 #The source files that are needed by object files
 FILES= Makefile version.c defs main.c donamc.c misc.c file.c
 dosys.c gram.y lex.c gcos.c
 #The definitions of object files
 OBJECTS= vesion.o main.o donamc.o misc.o file.o dosys.o gram.o
 LIBES= -LS
 LINT= lnit -p
 CFLAGS= -O
 make: $(OBJECTS)
 cc $(CFLAGS) $(OBJECTS) $(LIBES) -o make
 size make
 $(OBJECTS): defs
 gram.o: lex.c
 cleanup:
 -rm *.o gram.c
 install:
 @size make /usr/bin/make
 cp make /usr/bin/make ; rm make
 #print recently changed files
 print: $(FILES)
 pr $? | $P
 touch print
 test:
 make -dp | grep -v TIME>1zap
 /usr/bin/make -dp | grep -v TIME>2zap
 diff 1zap 2zap
 rm 1zap 2zap
 lint: dosys.c donamc.c file.c main.c misc.c version.c gram.c
 $(LINT) dosys.c donamc.c file.c main.c misc.c version.c
 gram.c
 rm gram.c
 arch:
 ar uv /sys/source/s2/make.a $(FILES)
通常在描述文件中应象上面一样定义要求输出将要执行的命令 。在执行了make命令之后,输出结果为:

推荐阅读