cdolinux命令 cd命令 linux(12)


clean:
rm -f *.o
运行 make clean 时,将执行 rm -f *.o 命令,最终删除所有编译过程中产生的所有中间文件 。
隐含规则
在make 工具中包含有一些内置的或隐含的规则,这些规则定义了如何从不同的依赖文件建立特定类型的目标 。Unix系统通常支持一种基于文件扩展名即文件名后缀的隐含规则 。这种后缀规则定义了如何将一个具有特定文件名后缀的文件(例如.c文件),转换成为具有另一种文件名后缀的文件(例如.o文件):
.c:.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $
系统中默认的常用文件扩展名及其含义为:
◆.o 目标文件
◆.c C源文件
◆.f FORTRAN源文件
◆.s 汇编源文件
◆.y Yacc-C源语法
◆.l Lex源语法
在早期的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 TIME1zap
/usr/bin/make -dp | grep -v TIME2zap
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)
通常在描述文件中应象上面一样定义要求输出将要执行的命令 。在执行了 linux make命令之后,输出结果为:
$ make
cc -c version.c
cc -c main.c
cc -c donamc.c
cc -c misc.c
cc -c file.c
cc -c dosys.c
yacc gram.y
mv y.tab.c gram.c
cc -c gram.c
cc version.o main.o donamc.o misc.o file.o dosys.o gram.o
-LS -o make
13188+3348+3044=19580b=046174b
最后的数字信息是执行"@size make"命令的输出结果 。之所以只有输出结果而没有相应的命令行,是因为"@size make"命令以"@"起始,这个符号禁止打印输出它所在的命令行 。
描述文件中的最后几条命令行在维护编译信息方面非常有用 。其中"print"命令行的作用是打印输出在执行过上次"make print"命令后所有改动过的文件名称 。系统使用一个名为print的0字节文件来确定执行print命令的具体时间,而宏$?则指向那些在print 文件改动过之后进行修改的文件的文件名 。如果想要指定执行print命令后,将输出结果送入某个指定的文件,那么就可修改P的宏定义:

推荐阅读