linux下make命令 linux常用命令make( 五 )


通常,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 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)
通常在描述文件中应象上面一样定义要求输出将要执行的命令 。在执行了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"命令以"@"起始,这个符号禁止打印输出它所在的命令行 。

推荐阅读