需要研究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文件测试