U-Boot移植(二)——U-Boot编译过程分析(4)

来源:互联网 发布:fm2016汉化补丁 mac 编辑:程序博客网 时间:2024/05/16 11:30

该文件与Makefile在统一目录,是Make执行中包含的文件之一,包含了一些重要的编译规则。

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 specificrules

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 optimizeflags on a per dir/file basis

BCURDIR := $(notdir $(CURDIR))

$(obj)%.s:     %.S

       $(CPP)$(AFLAGS) $(AFLAGS_$(@F)) $(AFLAGS_$(BCURDIR)) -o $@ $<

$(obj)%.o:    %.S

       $(CC)  $(AFLAGS) $(AFLAGS_$(@F))$(AFLAGS_$(BCURDIR)) -o $@ $< -c

$(obj)%.o:    %.c

       $(CC)  $(CFLAGS) $(CFLAGS_$(@F))$(CFLAGS_$(BCURDIR)) -o $@ $< -c

$(obj)%.i:     %.c

       $(CPP)$(CFLAGS) $(CFLAGS_$(@F)) $(CFLAGS_$(BCURDIR)) -o $@ $< -c

$(obj)%.s:     %.c

       $(CC)  $(CFLAGS) $(CFLAGS_$(@F))$(CFLAGS_$(BCURDIR)) -o $@ $< -c -S

       例如:根据以上的定义,以“.s”结尾的目标文件将根据第一条规则由同名但后缀为“.S”的源文件来生成,若不存在“.S”结尾的同名文件则根据最后一条规则由同名的“.c”文件生成。


原创粉丝点击