文档介绍:Makefile学
--- 杨洪涛
在Linux下编程,make 是个很重要的工具。它的作用就是通过解析Makefile 文件,构建和管理整个工程的编译和链接。所以每一个工程,我们都有投入一些时间去完成一个或者多个称之为 Makefile 文件的编写。Linux内核源代码就是个和好的例子。要想能更好的学习,编译内核,就要能看懂和更改他下面的Makefile文件。
一切从简单的开始,先来一个例子。分析一个简单的 Makefile,它对一个包含 8 个 C 的源代码和三个头文件的工程进行编译和链接。这个 Makefile 提供给了 make 必要的信息,make 程序根据 Makefile 中的规则描述执行相关的命令来完成指定的任务(如:编译、链接和清除编译过程文件等):
objects = /
edit : $(objects)
cc -o edit $(objects)
:
cc -c
:
cc -c
:
cc -
:
cc -c
:
cc -c
:
cc -c
:
cc -c
:
cc -c
clean :
rm edit $(objects)
上例的 Makefile,只要在命令行中输入make回车,这个工程就会被自动编译。edit就是这次make编译的最终目标,它由其中的8个c文件编译链接生成。文件一开头定义一个变量objects, ,下面的$(objects) -o edit $(objects) 就是编译链接这几个文件为最终可执行文件edit的命令(记住:命令行要用Tab键的空格开头), : 以及下面类似的语句,描述的是编译的规则和依赖关系,既:,一下类似语句意义皆是如此。最后的
clean :
rm edit $(objects) 。clean就相当与C语言中的lable,当在命令中输入make clean时。就会执行rm edit $(objects)语句。
总结一下make 是如何工作的:
1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
3、如果edit文件不存在, 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
4、,,。
5、当然,你的C文件和H文件是存在的啦, 文件, 文件生成make的终极任务,也就是执行文件edit了。
其实Makefile就是描述了这点东西,要编译生成的目标文件和生成目标的源文件的各自的生成的依赖关系,还要就是要执行的命令。
但是真正的项目工程往往是庞大的,各个模块已目录树的形式,组织在一起,它的编译链接非常复杂。每一个子目录有一个makefile文档,子目录makefile文档根据上级目录makefile文档命令启动编译,如linux的源代码。怎样把这些文件串在一起,就需要make中的变量定义如例子中的objects,文件包含如:include<filename>,还有类似预编译#if的语句,和许多的函数来完成。具体内容太多,不细说了,有兴趣可找资料自己学习,下面讲一下linux源码下得makefile。
Linux内核源码树的每个目录