uboot系列之-----顶层Makefile分析(一)

这篇主要分析Makefile文件开头部分对与一些编译环境以及编译路径等变量的初始化

 

VERSION = 2010

PATCHLEVEL = 12

SUBLEVEL =

EXTRAVERSION =

ifneq "$(SUBLEVEL)"""

U_BOOT_VERSION =$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

else

U_BOOT_VERSION =$(VERSION).$(PATCHLEVEL)$(EXTRAVERSION)

Endif

 

U_BOOT_VERSION = 2010.12

TIMESTAMP_FILE =$(obj)include/timestamp_autogenerated.h

VERSION_FILE = $(obj)include/version_autogenerated.h

HOSTARCH := $(shell uname -m | \

         sed-e s/i.86/i386/ \

             -e s/sun4u/sparc64/ \

             -e s/arm.*/arm/ \

             -e s/sa110/arm/ \

             -e s/ppc64/powerpc/ \

             -e s/ppc/powerpc/ \

             -e s/macppc/powerpc/\

             -e s/sh.*/sh/)

$(shell uname -m)表示执行uname –mshell命令,他执行的结果是取出机器硬件名(这台机器是64位的,所以其得到的结果就是x86-84)。sed –e s/abc/def 的意思是寻找结果里面是否有’abc’字样,如果有,就用‘def’字样将其代替。

所以整条语句的意思就是,取出uname –m的结果,并在其中寻找是否有i.86字样,如果有就用i386代替,是否有arm.*(*是通配符),如果有,就用arm代替……,本台机的结果是x86-64所以还保持原样,没有用其他字符替换,所以HOSTARCH=x86-64

HOSTOS := $(shell uname -s | tr'[:upper:]' '[:lower:]' | \

            sed -e 's/\(cygwin\).*/(cygwin/')

  

uname –s 表示取出本机操作系统内核名称,(这台机器是Linux)tr ‘[:upper:]’’[:lower:]’表示将结果里面的大写字符全部换成小写字符,sed –e‘s/\(Cygwin\).*/Cygwin/’表示寻找结果里面是否有cygwin.*字符,如果有就用cygwin替换

所以整句话的结果就是HOSTOS = linux(注意第一个字母L被换成了小写l)

 

SHELL := $(shell if [ -x "$$BASH" ]; thenecho $$BASH; \

      else if [-x /bin/bash];then echo /bin/bash;\

     else echosh;fi;fi

       

SHELL if[-x filename]   表示如果这个filename文件是可执行的,则为真,显然BASH变量是空的,则SHELL= /bin/bash  就是说shell命令的路径位于/bin/bash目录下

 

export       HOSTARCH HOSTOS SHELL 

表示将这些变量导出,供别的文件使用

 

ifeq (,$(findstring s,$(MAKEFLAGS)))

XECHO = echo

else

XECHO = :

Endif

If$( findstring string,text )表示从text中寻找string字样,如果找到了则返回text,如果没找到就返回空,显然MAKEFLAGS为空,所以 $(findstring s,$(MAKEFLAGS)) 返回为空,if语句为真,XECHO =echo,执行非静默编译,否则,执行静默编译(静默编译的意思就是在编译时控制台不打印任何信息)

ifdef O

ifeq ("$(origin O)", "commandline")

BUILD_DIR := $(O)

endif

endif

 

这句话表示如果在编译的命令里面加入参数O( make O=/tmp).,就把O后面所指定的值赋给变量BUILD_DIR,BUILD_DIR表示uboot的编译路径)

ifneq ($(BUILD_DIR),)

saved-output := $(BUILD_DIR)

如果BUILD_DIR不为空,则将BUILD_DIR的值赋给saved-output

$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

如果BUILD_DIR是一个目录名称,就把该目录创建出来

BUILD_DIR := $(shell cd $(BUILD_DIR) &&/bin/pwd)

$(if $(BUILD_DIR),,$(error output directory"$(saved-output)" does not exist))

Endif

shell命令的意思是先进入到BUILD_DIR目录,然后调用PWD命令显示当前路径名,并把当前路径名赋给BUILD_DIR变量,If语句判断BUILD_DIR是否存在,如果还为空就显示错误(命令里面两个逗号之间表示空)

 

OBJTREE            :=$(if $(BUILD_DIR),$(BUILD_DIR),$(CURIDR)) //输出目录

SRCTREE             :=$(CURDIR) //源码目录

TOPDIR                :=$(SRCTREE)  //顶层目录

LNDIR                  :=$(OBJTREE) //连接目录

export        TOPDIR SRCTREE OBJTREE

先看CURIDR变量,这是一个MAKEFILE的内嵌变量,代表当前路径,为了验证,可以如下做个测试:

     /tmp/test目录下新建一个Makefile文件,在里面添加如下内容:

    all::

               @echo $(CURDIR)

     

         然后在/tmp/test路径下执行Make命令,显示的就是/tmp/test

如果定义了BUILD_DIR,就将BUILD_DIR赋给OBJTREE,如果没有定义,就将CURIDR赋给OBJTREE

……

所以如果编译时没有定义编译路径,及没有定义BUILD_DIR,则以上所有变量都是CURDIR,即当前目录,也就是uboot的顶层目录

 

 

MKCONFIG        :=$(SRCTREE)/mkconfig) 

export MKCONFIG

 

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

REMOTE_BUILD  := 1 

export REMOTE_BUILD

endif

如果源码目录与输出目录不想等,则置位REMOTE_BUILD变量

 

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

obj := $(OBJTREE)/

src := $(SRCTREE)/

else

obj :=

src :=

endif

export obj src

如果源码目录和输出目录不想等,则变量objsrc被赋予相应的值,否则,两变量都为空

 

SUBDIRS   =tools\

          examples/standalone\

         examples/api

          

 

.PHONY : $(SUBDIRS)

SUBIDRS被赋予了三个路径名称,并申明SUBIDRS是一个伪目标

 

你可能感兴趣的:(uboot系列之-----顶层Makefile分析(一))