分类: 嵌入式
2012-05-08 14:39:14
文章引自:http://blog.chinaunix.net/uid-23929712-id-2650328.html
概述:
make从Makefile文件中获取模块间的依赖关系,判断哪些文件已经过时,根据这些信息make确定哪些文件需要重新编译,然后使用Makefile中的编译命令进行编译。
make命令参数详解:-C dir :在读取Makefile文件前,先切换到“dir”目录下,也就是把“dir”作为当前目录
-d :make执行时打印出所有的调试信息
-e :不允许在Makefile中对系统环境变量进行重新赋值
-f filename:使用指定文件作为Makefile文件
-i :忽略执行Makefile中命令时产生的错误,不退出make
-h :打印出帮助信息
-k :执行命令遇到错误时,不终止make的执行,make尽最大的可能执行所有的命令,知道出现致命错误才终止
-n :只打印出要执行的命令,但不执行命令
-o filename :指定文件filename不需要重建
-p :执行命令之前,打印出make读取的makefile的所有数据,同时打印出make 的版本信息
-t :将所有的目标文件的最后修改时间设置为当前系统时间
显式规则foo.o : foo.c defs.h
gcc -c -g foo.c
在第一行中,文件foo.o是规则的“目标文件”,foo.c和defs.h是生成foo.o所要使用的文件,成为依赖文件
规则中的第二行gcc -c -g foo.c是规则的命令,他描述了如何使用规则中的依赖文件来生成目标文件
书写规则:1,规则的命令部分由两种书写方式,当和“目标文件 : 依赖文件”为一行时,可以用“;”来分来,当另取一行时需要用TAB开始
2,Makefile中$有特殊的含义,当要使用$时,可以用$$
3,当Makefile中一行过长时可以用“\”将其书写到几个独立的物理行上
命令行属性一条规则可以有一个或者多个命令行,每个命令行以TAB开始。可以在TAB后加上“+”,“-”,“@”。
“-”执行本命令行的命令时如果遇到错误,继续执行而不退出make
“+”本行命令始终被执行,即使运行make命令时使用了-n,-q,-t选项(前提是本行命令所在规则的目标文件已经过时)
“@”执行本命令时不再屏幕上打印命令的内容
在这里“@”需要注意,在vivi的Makefile中,有使用。当然其他的特殊符号也可在特定的时候使用
伪目标.PHONY : clean
clean:
-rm -f *.o
.PHONY 目标“.PHONY”的所有依赖被作为伪目标,伪目标是这样一个目标:当使用make命令制定此目标时,这个目标躲在规则中的命令无论目标文件是否存在都会被无条件执行
特殊目标.PHONY 伪目标
.IGNORE 对于目标“.IGNORE”后面跟的依赖文件,生成这些依赖文件的命令在执行时如果遇到错误,make将忽略错误继续执行。当此目标没有依赖文件时,将忽略所有命令执行时的错误 ,相当于“-”
.SUFFIXES: 该目标的依赖被认为是一个后缀列表,在检查后缀规则时使用
.SILENT:对于该目标的依赖文件,执行生成依赖文件的命令时,make不会打印出所执行的命令,相当于“@”
.PRECIOUS :该目标的依赖文件会受到特别对待。这些依赖不会被删除
.INTERMEDIATE:它的依赖文件在执行make时被当做中间文件对待
使用变量变量名习惯上只使用字母,数字和下划线,并且不以数字开头。
赋值符主要有四个:=,:=,+=,?=
= 赋值变量是递归展开变量
:= 赋值变量是直接展开变量
?= 条件赋值,只有变量在之前没有赋值的情况下才会对这个变量进行赋值
+= 实现对一个变量值得追加操作,并用空格和原有值分开
常用的自动变量:$@,$%,$<,$>,$?,$^,$+,$*
$@:表示一个规则中的目标文件名
$%:当规则的目标文件时一个静态库文件时,$%代表静态库的一个成员名
$<:规则中的第一个依赖文件
$>:他和$%一样适合于库文件,它的值是库名
$?:所有比目标文件新的依赖文件列表,以空格分隔
$^:规则的所有依赖文件列表,使用空格分隔
$+:类似"$^",但是它保留了依赖文件中重复出现的文件
$*:它的值是目标文件去掉后缀后的名称
使用库建立和维护一个库时,将库名作为目标文件,把希望放到库中的文件作为依赖文件,格式为:
库名:库名(成员1 成员2 ....)
后面加上ar -ruv 库名 目标文件名
ps:mylib:mylib(file1.o file2.o file3.o)
ar -ruv $@ $?
rm -f $?