欢迎来到天天文库
浏览记录
ID:57646112
大小:20.17 KB
页数:6页
时间:2020-08-30
《Makefile在linux内核中如何使用-华清远见.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Makefile在linux内核中如何使用 本篇文章,要讲解的是Makefile在linux内核中如何使用,在这之前,我们需要了解Makefile。 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 linux内核中Makefile的作用是根据配置的情况,构造出需要编译的源文件列表,然后分别编译,并把目标代码链接到一起,最终形成Linux内
2、核二进制文件。 由于Linux内核源代码是按照树形结构组织的,所以Makefile也被分布在目录树中。Linux内核中的Makefile以及与Makefile直接相关的文件有: 1.Makefile:顶层Makefile,是整个内核配置、编译的总体控制文件。 2.config:内核配置文件,包含由用户选择的配置选项,用来存放内核配置后的结果(如makeconfig)。 3.arch/*/Makefile:位于各种CPU体系目录下的Makefile,如arch/arm/Makefile,是针对特定平台的Makefile。 4.各个子目录下的Makefile:比如dr
3、ivers/Makefile,负责所在子目录下源代码的管理。 5.Rules.make:规则文件,被所有的Makefile使用。 用户通过makeconfig配置后,产生了.config。顶层Makefile读入.config中的配置选择。顶层Makefile有两个主要的任务:产生vmlinux文件和内核模块(module)。为了达到此目的,顶层Makefile递归的进入到内核的各个子目录中,分别调用位于这些子目录中的Makefile。至于到底进入哪些子目录,取决于内核的配置。在顶层Makefile中,有一句:includearch/$(ARCH)/Makefile,包
4、含了特定CPU体系结构下的Makefile,这个Makefile中包含了平台相关的信息。 位于各个子目录下的Makefile同样也根据.config给出的配置信息,构造出当前配置下需要的源文件列表,并在文件的最后有include$(TOPDIR)/Rules.make。 Rules.make文件起着非常重要的作用,它定义了所有Makefile共用的编译规则。比如,如果需要将本目录下所有的c程序编译成汇编代码,需要在Makefile中有以下的编译规则: %.s:%.c $(CC)$(CFLAGS)-S$<-o$@ 有很多子目录下都有同样的要求,就需要在各自的Make
5、file中包含此编译规则,这会比较麻烦。而Linux内核中则把此类的编译规则统一放置到Rules.make中,并在各自的Makefile中包含进了Rules.make(includeRules.make),这样就避免了在多个Makefile中重复同样的规则。对于上面的例子,在Rules.make中对应的规则为: %.s:%.c $(CC)$(CFLAGS)$(EXTRA_CFLAGS)$(CFLAGS_$(*F))$(CFLAGS_$@)-S$<-o$@ Makefile中的变量 顶层Makefile定义并向环境中输出了许多变量,为各个子目录下的Makefile传递
6、一些信息。有些变量,比如SUBDIRS,不仅在顶层Makefile中定义并且赋初值,而且在arch/*/Makefile还作了扩充。 常用的变量有以下几类: 1)版本信息 版本信息有:VERSION,PATCHLEVEL,SUBLEVEL,EXTRAVERSION,KERNELRELEASE。版本信息定义了当前内核的版本,比如VERSION=2,PATCHLEVEL=4,SUBLEVEL=18,EXATAVERSION=-rmk7,它们共同构成内核的发行版本KERNELRELEASE:2.4.18-rmk7 2)CPU体系结构:ARCH 在顶层Makefile的开
7、头,用ARCH定义目标CPU的体系结构,比如ARCH:=arm等。许多子目录的Makefile中,要根据ARCH的定义选择编译源文件的列表。 3)路径信息:TOPDIR,SUBDIRS TOPDIR定义了Linux内核源代码所在的根目录。例如,各个子目录下的Makefile通过$(TOPDIR)/Rules.make就可以找到Rules.make的位置。 SUBDIRS定义了一个目录列表,在编译内核或模块时,顶层Makefile就是根据SUBDIRS来决定进入哪些子目录。SUBDIRS的值取决于内核的配置,在
此文档下载收益归作者所有