ARM Linux 移植(一)makefile 分析

一、linux 内核makefile 组成

Linux内核Makefile文件组成
名称 描述
顶层 Makefile 它是所有Makefile文件的核心,从总体上控制着内核的编译、连接
arch/$(ARCH)/Makefile 对应体系结构的Makefile,它用来决定哪些体系结构相关的文件参与内核的生成,并提供一些规则来生成特定格式的内核映像
scripts/Makefile.* Makefile公用的通用规则、脚本等
子目录kbuild Makefiles 各级子目录的Makefile相对简单,被上一层Makefile.build调用来编译当前目录的文件。
顶层.config

配置文件,配置内核时生成。所有的Makefile文件(包括顶层目录和各级子目录)都是根据.config来决定使用哪些文件的

 

 

总结:

  Linux内核Makefile体系核心的Makefile文件就两个:顶层Makefile、scripts/Makefile.build。

  子目录中的Makefile、kbuild不是Makefile文件(完整的Makefile文件),只能算作是Makefile的包含文件。

  顶层Makefile文件负责将各个目录生成的*.built-in.o、lib.a等文件连接到一起。而scripts/Makefile.build 包含子目录中的Makefile文件来生成这些*.built-in.o、lib.a、*.o等文件。

二、分析顶层makefile 以周立功的imx287移植好的 linux-2.65 为例

1. 内核版本号
打开顶层 Makefile,开头的几行记录了内核源码的版本号,通常如下所示:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 35
EXTRAVERSION =3
说明代码版本为 2.6.35.3,编译得到的内核在目标板运行后,输入 uname -a 命令可以得
到印证:
# uname -a
Linux boy 2.6.35.3-571-gcca29a0-gd431b3d-dirty #22 PREEMPT Tue Oct 27 20:12:33 CST 2015 armv5tejl
GNU/Linux
2. 编译控制
(1)体系结构
Linux 是一个支持众多体系结构的操作系统,在编译过程中需指定体系结构,以与实际
平台对应。在顶层 Makefile 中,通过变量 ARCH 来指定:
ARCH ?= $(SUBARCH)
如果没有在编译命令行中指定 ARCH 参数,系统将会进行本地编译,通过获取本机信
息来自动指定:
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-e s/sh[234].*/sh/ )
如果进行 ARM 嵌入式 Linux 开发,则必须指定 ARCH 为 arm(注意大小写,须与 arch/
目录下的 arm 一致),如:
$make ARCH=arm
当然,也可以修改 Makefile,将修改为 ARCH ?= $(SUBARCH)修改为 ARCH = arm,在
命令行直接 make 即可。
(2)编译器
如果不是进行本地编译,则须指定交叉编译器,通过 CROSS_COMPILE 来指定。Makefile
中与交叉编译器的指定如下:
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
……
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) –E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
CONFIG_CROSS_COMPILE 是一个配置选项,可在内核配置时候指定。如果在配置内
核时候没有指定 CONFIG_CROSS_COMPILE,也没有在编译参数指定 CROSS_COMPILE,
则会采用本地编译器进行编译。
进行 ARM 嵌入式 Linux 开发,必须指定交叉编译器,可以在内核配置通过 CONFIG
_CROSS_COMPILE 指定交叉编译器,也可以通过 CROSS_COMPILE 指定。假定使用的交
叉编译器是 arm-linux-gnueabihf-gcc,则指定 CROSS_COMPILE 为 arm-linux-gnueabihf-:
$ make ARCH=arm CROSS_COMPILE= arm-linux-gnueabihf-
或者在 Makefile 中,直接指定 CROSS_COMPILE 的值:
CROSS_COMPILE = arm-linux-gnueabihf-
注意: CROSS_COMPILE 指定的交叉编译器必须事先安装并正确设置系统环境变量; 如果
没有设置环境变量, 则需使用绝对地址, 例如:
CROSS_COMPILE =/home/ctools/linux-devkit/bin/arm-linux-gnueabihf-
如果同时指定了 ARCH 和 CROSS_COMPILE, 则在编译的时候, 只需简单的 make 就
可以了。
(3)编译总目标uImage

 内核配置完成后,在顶层目录中执行“#make uImage”便开始编译内核。但是,uImage却不是在顶层Makefile中定义,而是在arch/$(ARCH)/Makefile中定义。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值