linux系统makefile简析.ppt

上传人:b****1 文档编号:1397966 上传时间:2022-10-22 格式:PPT 页数:26 大小:1.15MB
下载 相关 举报
linux系统makefile简析.ppt_第1页
第1页 / 共26页
linux系统makefile简析.ppt_第2页
第2页 / 共26页
linux系统makefile简析.ppt_第3页
第3页 / 共26页
linux系统makefile简析.ppt_第4页
第4页 / 共26页
linux系统makefile简析.ppt_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

linux系统makefile简析.ppt

《linux系统makefile简析.ppt》由会员分享,可在线阅读,更多相关《linux系统makefile简析.ppt(26页珍藏版)》请在冰豆网上搜索。

linux系统makefile简析.ppt

嵌入式Linux内核Makefile浅析开发教程

(1),1配置系统的基本结构2Makefile2.1Makefile概述2.2Makefile中的变量1)版本信息2)CPU体系结构:

ARCH3)路径信息:

TOPDIR,SUBDIRS4)内核组成信息:

HEAD,CORE_FILES,NETWORKS,DRIVERS,LIBS5)编译信息:

CPP,CC,AS,LD,AR,CFLAGS,LINKFLAGS6)配置变量CONFIG_*2.3Rules.make变量2.4子目录Makefilea)注释b)编译目标定义c)适配段d)include$(TOPDIR)/Rules.make,Linux内核的配置系统由三个部分组成,分别是:

Makefile:

分布在Linux内核源代码中的Makefile,定义Linux内核的编译规则;配置文件(config.in):

给用户提供配置选择的功能;配置工具:

包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于Ncurses图形界面以及基于Xwindows图形界面的用户配置界面,各自对应于Makeconfig、Makemenuconfig和makexconfig)。

1配置系统的基本结构,这些配置工具都是使用脚本语言,如Tcl/TK、Perl编写的(也包含一些用C编写的代码)。

本文并不是对配置系统本身进行分析,而是介绍如何使用配置系统。

所以,除非是配置系统的维护者,一般的内核开发者无须了解它们的原理,只需要知道如何编写Makefile和配置文件就可以。

所以,在本文中,我们只对Makefile和配置文件进行讨论。

另外,凡是涉及到与具体CPU体系结构相关的内容,我们都以arm为例,这样不仅可以将讨论的问题明确化,而且对内容本身不产生影响。

2.1Makefile概述Makefile的作用是根据配置的情况,构造出需要编译的源文件列表,然后分别编译,并把目标代码链接到一起,最终形成Linux内核二进制文件。

由于Linux内核源代码是按照树形结构组织的,所以Makefile也被分布在目录树中。

Linux内核中的Makefile以及与Makefile直接相关的文件有:

Makefile:

顶层Makefile,是整个内核配置、编译的总体控制文件。

.config:

内核配置文件,包含由用户选择的配置选项,用来存放内核配置后的结果(如makeconfig)。

arch/*/Makefile:

位于各种CPU体系目录下的Makefile,如arch/arm/Makefile,是针对特定平台的Makefile。

2Makefile,各个子目录下的Makefile:

比如drivers/Makefile,负责所在子目录下源代码的管理。

Rules.make:

规则文件,被所有的Makefile使用。

用户通过makeconfig配置后,产生了.config。

顶层Makefile读入.config中的配置选择。

顶层Makefile有两个主要的任务:

产生vmlinux文件和内核模块(module)。

为了达到此目的,顶层Makefile递归的进入到内核的各个子目录中,分别调用位于这些子目录中的Makefile。

至于到底进入哪些子目录,取决于内核的配置。

在顶层Makefile中,有一句:

includearch/$(ARCH)/Makefile,包含了特定CPU体系结构下的Makefile,这个Makefile中包含了平台相关的信息。

位于各个子目录下的Makefile同样也根据.config给出的配置信息,构造出当前配置下需要的源文件列表,并在文件的最后有include$(TOPDIR)/Rules.make。

Rules.make文件起着非常重要的作用,它定义了所有Makefile共用的编译规则。

比如,如果需要将本目录下所有的c程序编译成汇编代码,需要在Makefile中有以下的编译规则:

%.s:

%.c$(CC)$(CFLAGS)-S$-o$有很多子目录下都有同样的要求,就需要在各自的Makefile中包含此编译规则,这会比较麻烦。

而Linux内核中则把此类的编译规则统一放置到Rules.make中,并在各自的Makefile中包含进了Rules.make(includeRules.make),这样就避免了在多个Makefile中重复同样的规则。

对于上面的例子,在Rules.make中对应的规则为:

%.s:

%.c$(CC)$(CFLAGS)$(EXTRA_CFLAGS)$(CFLAGS_$(*F)$(CFLAGS_$)-S$-o$,顶层Makefile定义并向环境中输出了许多变量,为各个子目录下的Makefile传递一些信息。

有些变量,比如SUBDIRS,不仅在顶层Makefile中定义并且赋初值,而且在arch/*/Makefile还作了扩充。

常用的变量有以下几类:

2.2Makefile中的变量,版本信息有:

VERSION,PATCHLEVEL,SUBLEVEL,EXTRAVERSION,KERNELRELEASE。

版本信息定义了当前内核的版本,比如VERSION=2,PATCHLEVEL=4,SUBLEVEL=18,EXATAVERSION=-rmk7,它们共同构成内核的发行版本KERNELRELEASE:

2.4.18-rmk7,1)版本信息,在顶层Makefile的开头,用ARCH定义目标CPU的体系结构,比如ARCH:

=arm等。

许多子目录的Makefile中,要根据ARCH的定义选择编译源文件的列表。

2)CPU体系结构:

ARCH,TOPDIR定义了Linux内核源代码所在的根目录。

例如,各个子目录下的Makefile通过$(TOPDIR)/Rules.make就可以找到Rules.make的位置。

SUBDIRS定义了一个目录列表,在编译内核或模块时,顶层Makefile就是根据SUBDIRS来决定进入哪些子目录。

SUBDIRS的值取决于内核的配置,在顶层Makefile中SUBDIRS赋值为kerneldriversmmfsnetipclib;根据内核的配置情况,在arch/*/Makefile中扩充了SUBDIRS的值,参见4)中的例子。

3)路径信息:

TOPDIR,SUBDIRS,Linux内核文件vmlinux是由以下规则产生的:

vmlinux:

$(CONFIGURATION)init/main.oinit/version.olinuxsubdirs$(LD)$(LINKFLAGS)$(HEAD)init/main.oinit/version.o-start-group$(CORE_FILES)$(DRIVERS)$(NETWORKS)$(LIBS)-end-group-ovmlinux,4)内核组成信息:

HEAD,CORE_FILES,NETWORKS,DRIVERS,LIBS,可以看出,vmlinux是由HEAD、main.o、version.o、CORE_FILES、DRIVERS、NETWORKS和LIBS组成的。

这些变量(如HEAD)都是用来定义连接生成vmlinux的目标文件和库文件列表。

其中,HEAD在arch/*/Makefile中定义,用来确定被最先链接进vmlinux的文件列表。

比如,对于arm系列的CPU,HEAD定义为:

HEAD:

=arch/arm/kernel/head-$(PROCESSOR).oarch/arm/kernel/init_task.o表明head-$(PROCESSOR).o和init_task.o需要最先被链接到vmlinux中。

PROCESSOR为armv或armo,取决于目标CPU。

CORE_FILES,NETWORK,DRIVERS和LIBS在顶层Makefile中定义,并且由arch/*/Makefile根据需要进行扩充。

CORE_FILES对应着内核的核心文件,有kernel/kernel.o,mm/mm.o,fs/fs.o,ipc/ipc.o,可以看出,这些是组成内核最为重要的文件。

同时,arch/arm/Makefile对CORE_FILES进行了扩充:

#arch/arm/Makefile#Ifwehaveamachine-specificdirectory,thenincludeitinthebuild.MACHDIR:

=arch/arm/mach-$(MACHINE)ifeq($(MACHDIR),$(wildcard$(MACHDIR)SUBDIRS+=$(MACHDIR)CORE_FILES:

=$(MACHDIR)/$(MACHINE).o$(CORE_FILES),endifHEAD:

=arch/arm/kernel/head-$(PROCESSOR).oarch/arm/kernel/init_task.oSUBDIRS+=arch/arm/kernelarch/arm/mmarch/arm/libarch/arm/nwfpeCORE_FILES:

=arch/arm/kernel/kernel.oarch/arm/mm/mm.o$(CORE_FILES)LIBS:

=arch/arm/lib/lib.a$(LIBS),在Rules.make中定义的是编译的通用规则,具体到特定的场合,需要明确给出编译环境,编译环境就是在以上的变量中定义的。

针对交叉编译的要求,定义了CROSS_COMPILE。

比如:

CROSS_COMPILE=arm-linux-CC=$(CROSS_COMPILE)gccLD=$(CROSS_COMPILE)ld.,5)编译信息:

CPP,CC,AS,LD,AR,CFLAGS,LINKFLAGS,CROSS_COMPILE定义了交叉编译器前缀arm-linux-,表明所有的交叉编译工具都是以arm-linux-开头的,所以在各个交叉编译器工具之前,都加入了$(CROSS_COMPILE),以组成一个完整的交叉编译工具文件名,比如arm-linux-gcc。

CFLAGS定义了传递给C编译器的参数。

LINKFLAGS是链接生成vmlinux时,由链接器使用的参数。

LINKFLAGS在arm/*/Makefile中定义,比如:

#arch/arm/MakefileLINKFLAGS:

=-p-X-Tarch/arm/vmlinux.lds,.config文件中有许多的配置变量等式,用来说明用户配置的结果。

例如CONFIG_MODULES=y表明用户选择了Linux内核的模块功能。

.config被顶层Makefile包含后,就形成许多的配置变量,每个配置变量具有确定的值:

y表示本编译选项对应的内核代码被静态编译进Linux内核;m表示本编译选项对应的内核代码被编译成模块;n表示不选择此编译选项;如果根本就没有选择,那么配置变量的值为空。

6)配置变量CONFIG_*,前面讲过,Rules.make是编译规则文件,所有的Makefile中都会包括Rules.make。

Rules.make文件定义了许多变量,最为重要是那些编译、链接列表变量。

O_OBJS,L_OBJS,OX_OBJS,LX_OBJS:

本目录下需要编译进Linux内核vmlinux的目标文件列表,其中OX_OBJS和LX_OBJS中的X表明目标文件使用了EXPORT_SYMBOL输出符号。

M_OB

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1