设为首页 加入收藏

TOP

U-Boot Makefile编译(四)
2015-07-20 17:20:47 来源: 作者: 【 】 浏览:29
Tags:U-Boot Makefile 编译
U BOARD VENDOR SOC

将make mini2440_config命令生成的include/config.mk包含进来。

# 若主机架构与开发板结构相同,就使用主机的编译器,而不是交叉编译器

ifeq ($(HOSTARCH),$(ARCH))

CROSS_COMPILE ?=

endif

若主机与目标机器体系架构相同,则使用gcc编译器而不是交叉编译器。

# load other configuration

include $(TOPDIR)/config.mk

最后将U-Boot顶层目录下的config.mk文件包含进来,该文件包含了对编译的一些设置。下面对U-Boot顶层目录下的config.mk文件进行分析:

(2)config.mk文件执行过程

1设置obj与src

在U-Boot顶层目录下的config.mk文件中有如下代码:

ifneq ($(OBJTREE),$(SRCTREE))

ifeq ($(CURDIR),$(SRCTREE))

dir :=

else

dir := $(subst $(SRCTREE)/,,$(CURDIR))

endif

?

obj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/)

src := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/)

?

$(shell mkdir -p $(obj))

else

obj :=

src :=

endif

由于目标输出到源代码目录下,因此执行完上面的代码后,src和obj都是空。

2设置编译选项

PLATFORM_RELFLAGS =

PLATFORM_CPPFLAGS = #编译选项

PLATFORM_LDFLAGS = #连接选项

用这3个变量表示交叉编译器的编译选项,在后面Make会检查交叉编译器支持的编译选项,然后将适当的选项添加到这3个变量中。

#

# Option checker (courtesy linux kernel) to ensure

# only supported compiler options are used

#

cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \

> /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)

变量CC和CFLAGS在后面的代码定义为延时变量,其中的CC即arm-linux-gcc。函数cc-option用于检查编译器CC是否支持某选项。将2个选项作为参数传递给cc-option函数,该函数调用CC编译器检查参数1是否支持,若支持则函数返回参数1,否则返回参数2 (因此CC编译器必须支持参数1或参数2,若两个都不支持则会编译出错)。可以像下面这样调用cc-option函数,并将支持的选项添加到FLAGS中:

FLAGS +=$(call cc-option,option1,option2)

3指定交叉编译工具

#

# Include the make variables (CC, etc...)

#

AS = $(CROSS_COMPILE)as

LD = $(CROSS_COMPILE)ld

CC = $(CROSS_COMPILE)gcc

CPP = $(CC) -E

AR = $(CROSS_COMPILE)ar

NM = $(CROSS_COMPILE)nm

LDR = $(CROSS_COMPILE)ldr

STRIP = $(CROSS_COMPILE)strip

OBJCOPY = $(CROSS_COMPILE)objcopy

OBJDUMP = $(CROSS_COMPILE)objdump

RANLIB = $(CROSS_COMPILE)RANLIB

对于arm开发板,其中的CROSS_COMPILE在lib_arm/config.mk文件中定义:

CROSS_COMPILE ?= arm-linux-

因此以上代码指定了使用前缀为“arm-linux-”的编译工具,即arm-linux-gcc,arm-linux-ld等等。

4包含与开发板相关的配置文件

# Load generated board configuration

sinclude $(OBJTREE)/include/autoconf.mk

?

ifdef ARCH

sinclude $(TOPDIR)/lib_$(ARCH)/config.mk # include architecture dependend rules

endif

$(ARCH)的值是“arm”,因此将“lib_arm/config.mk”包含进来。lib_arm/config.mk脚本指定了交叉编译器,添加了一些跟CPU架构相关的编译选项,最后还指定了cpu/arm920t/u-boot.lds为U-Boot的连接脚本。

ifdef CPU

sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # include CPU specific rules

endif

$(CPU)的值是“arm920t”,因此将“cpu/arm920t/config.mk”包含进来。这个脚本主要设定了跟arm920t处理器相关的编译选项。

ifdef SOC

sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk # include SoC specific rules

endif

$(SOC)的值是s3c24x0,因此Make程序尝试将cpu/arm920t/s3c24x0/config.mk包含进来,而这个文件并不存在,但是由于用的是“sinclude”命令,所以并不会报错。

ifdef VENDOR

BOARDDIR = $(VENDOR)/$(BOARD)

else

BOARDDIR = $(BOARD)

endif

$(BOARD)的值是mini2440,VENDOR的值是samsung,因此BOARDDIR的值是samsung/mini2440。BOARDDIR变量表示开发板特有的代码所在的目录。

ifdef BOARD

sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules

endif

Make将“board/samsung/mini2440/config.mk”包含进来。该脚本只有如下的一行代码:

TEXT_BASE = 0x33F80000

U-Boot编译时将使用TEXT_BASE作为代码段连接的起始地址。

LDFLAGS += -Bstatic -T $(obj)u-boot.lds $(PLATFORM_LDFLAGS)

ifneq ($(TEXT_BASE),)

LDFLAGS += -Ttext $(TEXT_BASE)

endif

执行完以上代码后,LDFLAGS中包含了“-Bstatic -T u-boot.lds ”和“-Ttext 0x33F80000”的字样。

5指定隐含的编译规则

# Allow boards to use custom optimize flags on a per dir/file basis

BCURDIR := $(notdir $(CURDIR))

$(ob

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c++中 的向量vector 下一篇LeetCode[Sort]: Maximum Gap

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·【C语言】动态内存管 (2025-12-27 06:23:20)
·C语言中的内存管理 - (2025-12-27 06:23:16)
·C语言指南:C语言内 (2025-12-27 06:23:14)
·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)