列宁感人的故事:android makefile(android.mk)分析

来源:百度文库 编辑:偶看新闻 时间:2024/05/06 13:44:56
android makefile(android.mk)分析 android是什么就不用说了,android自从开源以来,就受到很多人的追捧。当然,一部人追捧它是因为它是Google开发的。对一个程序员来说,一个系统值不值得追捧得要拿代码来说话。我这里并不打算分析android的代码,而是android的makefile,我想通过分析andorid的makefile来告诉大家如何写makefile。对于一个程序新手而言,好的IDE是他们追捧的对象。但当他接触的代码多了之后,就会逐渐发现IDE不够用了,因为有好多东西用IDE是不好做的,例如自动编译,测试,版本控制,编译定制等。这跟政治课上的一句话有点像:资本主义开始的时候是促进生产力发展的,但到了后来又成了阻碍生产力发展的因素了。如果一个程序不能摆脱IDE的限制(不是不用,而是要有选择的用),那么他就很难提高。要知道,IDE和makefile代表了两种不同的思想:IDE根据强调的是简化计算机与用户的交互;而makefile体现的是自动化。对于一个一开始就接触linux的人来说,makefile可能是比较容易学的(熟能生巧),对于一个一开始就接触Windows的人来说,makefile就不太好学,这主要是应该很多时候会不自觉地去用Visual Studio(Visual Studio是个好东西,特别是它的调试)。不知道大叫有没有这个的感觉:一个人如果先接触c,再接触java会比较容易点;如果一个人先接触java,再接触c,就会比较反感c。这个先引用一下百度百科对makefile的一些描述:一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。 Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile 文件是许多编译器--包括 Windows NT 下的编译器--维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改 makefile 文件而已。
 对于android而言,android使用的是GNU的make,因此它的makefile格式也是GNU的makefile格式。现在网络上关于makefile最好的文档就是陈皓的《跟我一起写makefile》,这份文档对makefile进行了详细的介绍,因此推荐大家先看这份文档(电子版可以到http://pipi.googlecode.com/files/How%20to%20Write%20makefile.pdf下载,陈皓的blog在http://blog.csdn.net/haoel)。android最顶层的目录结构如下:.
|-- Makefile        (全局的Makefile)
|-- bionic          (Bionic含义为仿生,这里面是一些基础的库的源代码)
|-- bootloader      (引导加载器)
|-- build           (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)
|-- dalvik          (JAVA虚拟机)
|-- development     (程序开发所需要的模板和工具)
|-- external        (目标机器使用的一些库)
|-- frameworks      (应用程序的框架层)
|-- hardware        (与硬件相关的库)
|-- kernel          (Linux2.6的源代码)
|-- packages        (Android的各种应用程序)
|-- prebuilt        (Android在各种平台下编译的预置脚本)
|-- recovery        (与目标的恢复功能相关)
`-- system          (Android的底层的一些库)本文将要分析的是build目录下的makefile和shell文件,android的代码是1.5的版本。主要的目录结构如下:1.makefile入门    1.1 makefile helloworld    1.2 用makefile构建交叉编译环境    1.3 makefile里面的一些技巧2.android makefile分析    2.1 android shell分析    2.2 android build下的各个makefile分析3. android其他目录的android.mk分析由于最近研究生要毕业了,得找工作了,所以可能分析有时候会间断一两天,望大家能够谅解。作为序的最后,大家先通过网络的一些文章来了解一下andoroid的makefile。1.Android build system2.Android Building System 分析3.Android Build System(介绍使用)
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chief1985/archive/2009/10/19/4699831.aspx android makefile(android.mk)分析(1) 收藏 此文于2009-10-21被推荐到CSDN首页
如何被推荐?
1.1 makefile helloworldMakefile的规则如下:target ... : prerequisites ... command ... ...target可以是一个目标文件,也可以是Object File(例如helloworld.obj),也可以是执行文件和标签。prerequisites就是生成target所需要的文件或是目标。command也就是要达到target这个目标所需要执行的命令。这里没有说“使用生成target所需要执行的命令”,是因为target可能是标签。需要注意的是command前面必须是TAB键,而不是空格,因此喜欢在编辑器里面将TAB键用空格替换的人需要特别小心了。我们写程序一般喜欢写helloworld,当我们写了一个c的helloworld之后,我们该如何写helloworld来编译helloworld.c呢?下面就是编译helloworld的makefile。helloworld : helloworld.o    cc -o helloworld helloworld .ohelloworld.o : helloworld.c     cc -c main.cclean:    rm helloworld helloworl.o
 之后我们执行make就可以编译helloworld.c了,执行make clean就可以清除编译结果了(其实就是删除helloworld helloworl.o)。可能有人问为什么执行make就会生成helloworld呢?这得从make的默认处理说起:make将makefile的第一个target作为作为最终的target,凡是这个规则依赖的规则都将被执行,否则就不会执行。所以在执行make的时候,clean这个规则就没有被执行。上面的是最简单的makefile,复杂点makefile就开始使用高级点的技巧了,例如使用变量,使用隐式规则,执行负责点shell命令(常见的是字符串处理和文件处理等),这里不打算介绍这些规则,后面在分析android的makefile时会结合具体代码进行具体分析,大家可以先看看陈皓的《跟我一起写makefile》来了解了解。makefile的大体的结构是程序树形的,如下:                                                      这样写起makefile也简单,我们将要达到的目标作为第一个规则,然后将目标分解成子目标,然后一个个写规则,依次类推,直到最下面的规则很容易实现为止。这其实和算法里面的分治法很像,将一个复杂的问题分而治之。说到树,我想到了编译原理里面的语法分析,语法分析里面有自顶而下的分析方法和自底而下的分析方法。当然makefile并不是要做语法分析,而是要做与语法分析分析相反的事。(语法分析要做的是一个句子是不是根据语法可以推出来,而makefile要做的是根据规则生成一个command 执行队列。)不过makefile的规则和词法分析还是很像的。下面出一道编译原理上面的一个例子,大家可以理解一下makefile和词法分析的不同点和相同点:<标识符>  -> <字母><字母数字串>
    <字母数字串>  -> <字母><字母数字串>|<数字><字母数字串>|<下划线><字母数字串>|ε
   <无符号整数> -> <数字><数字串>
   <数字串> -> <数字><数字串>|ε
  <加法运算符>  -> +
   <减法运算符> -> -
  <大于关系运算符> -> >
   <大于等于关系运算符> -> >= 最后,介绍一下autoconfautomake,使用这两个工具可以自动生成makefile。 从上面的图可以看出,通过autoscan,我们可以根据代码生成一个叫做configure.scan的文件,然后我们编辑这个文件,参数一个configure.in的文件。接着我们写一个makefile.am的文件,然后就可以用automake生成makefile.in,最后,根据makefile.in和configure就可以生成makefile了。在很多开源的工程里面,我们都可以看到makefile.am,configure.in,makefine.in,configure文件,还有可能看到一个十分复杂的makefile文件,许多人学习makefile的时候想通过看这个文件来学习,最终却发现太复杂了。如果我们知道这个文件是自动生成的,就理解这个makefile文件为什么这个复杂了。欲更加详细的理解automake等工具,可以参考http://www.ibm.com/developerworks/cn/linux/l-makefile/。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chief1985/archive/2009/10/20/4705123.aspx