Makefile学习(1)
需要研究android的编译过程,则首先需要了解makefile文件。所以现在就开始从最基本的学习——了解makefile。
?
1.makefile的语法规则:
target...:prerequisites...
command
...
...
?
说明:
target:是一个目标文件,可以是Object File,也可以是执行文件。prerequisites:要生成那个target所需要的文件或者目标command:make需要执行的命令(任意的shell命令)
这表明的是一个文件的依赖关系,即target这一个或者多个目标文件依赖于prerequisites中的文件,其生成规则在command中定义。
注:在执行make时,如果prerequisites中有一个以上的文件更新时间比target文件晚,则command所定义的命令就会被执行。
?
2.一个简单makefile文件的示例(网上找的,为了说明语法规则,别介意哈)
edit:main.o? kbd.o
?????? cc -o edit main.o? kbd.o
?main.o:main.c? defs.h
??????? cc -c main.c
?kbd.o:kbd.c? defs.h? command.h
??????? cc -c kbd.c
?clean:
???????? rm edit main.o? kbd.o
?
说明:
在该文件所在的目录下,直接输入make命令就可以生成edit可执行文件。target包括:edit和中间的目标文件("*.o")prerequisites包括:冒号后面的 .c 文件和 .h 文件command一定要以一个Tab键作为开头clean:上面代码中的clean只不过是一个动作名字,和C中的lable一样。其冒号后面什么也没有,那么make就不会去找文件的依赖性,也就不会执行其后定义的命令。如果要执行后面的命令,则需在make命令后明显的指出这个lable的名字。eg:make clean
3.make的工作过程
?
在默认方式下,也就是我们只输入make命令,那么
make会在当前目录下找makefile文件如果找到该文件,它会找文件中第一个目标文件作为最终的目标文件,如果最终目标文件不存在或者后面的依赖文件的修改时间比较晚,则重新执行后面的命令生成最终的目标文件
注:make会一层一层的去找文件的依赖关系,如果出现错误则make直接退出并报错。
4.makefile中变量的使用:
?
在makefile一开始这样的定义:
objects=main.o? kbd.o
?
于是在makefile中以“$(objects)”的方式就可以使用这个变量,如下:
edit:$(objects)
?????? cc -o edit $(objects)
?main.o:main.c? defs.h
??????? cc -c main.c
?kbd.o:kbd.c? defs.h? command.h
??????? cc -c kbd.c
?clean:
???????? rm edit $(objects)
?
后续任务:makefile学习?? shell命令学习
目标:makefile基本知识掌握后,可以写一个简单的makefile文件测试