自己写的bootloader可以引导kernel了,我以为曾经神秘的u-boot代码将变得毫无挑战,然事实表明u-boot作为优秀的开源代码,阅读起来还是很有挑战的,值得一读!

        阅读碰到的头等问题:Makefile和shell脚本看不懂...

        说起来做​​Linux​​也很久了,Makefile和shell脚本都接触过,但真的都是略懂而已.因为公司的Makefile和shell简单的一眼望的对穿,很初级的写法,简单的应用.再随便在网上下个老外的开源代码,那个Makefile和shell复杂啊.一不留神想起来了qt的qmake根据工程文件生成的Makefile也是很简单,但qmake是人家老外写的.不说其他语言了,只看Makefile和shell,中外的差距就在那了.

        这次准备移植u-boot到tq2440上,选用的u-boot版本是u-boot-2012.07.

        下面是我对u-boot配置和编译的makefile mkconfig config.mk等文件的解读,有些解读我是在源档上添加文字注释的,有些是另外写的,解读难免有误,若有读者发现了,希望能够指出,在下感激不尽!

        在编译u-boot的过程,就是make xxx_config和make两步

        以make smdk2410_config为例:

        当以smdk2410_config为目标时,makefile中前面一些变量的定义和其他文件的引用也是有的,这个在原档中添加了有关注释:

        在makefile中有:





[cpp]  ​​view plain​​​  ​​​copy​






  1. unconfig:
  2. @rm -f $(obj)include/config.h $(obj)include/config.mk \
  3. $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \
  4. $(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep
  5. %_config::  unconfig
  6. echo $@
  7. $(MKCONFIG) -A $(@:_config=)




        %是个通配符,make xxx_config都是这个目标.目标的依赖是unconfig,unconfig的命令是删除一些文件,而这些文件正是从make xxx_config过程中产生的.unconfig就是清理配置的.

        我们来看@$(MKCONFIG) -A $(@:_config=)

        其实执行的是mkconfig -A smdk2410

        我们可以在该行上面添加一行:echo $@

        则会输出smdk2410_config,因为$@就是指目标

        $(@:_config=)是变量的替换引用

        格式为“$(VAR:A=B)”(或者“${VAR:A=B}”),意思是:替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。

所以smdk2410_config末尾的_config去除了.

        下面就是执行mkconfig脚本了,mkconfig -A smdk2410

        给出添加注释的mkconfig文件:





[cpp]  ​​view plain​​​  ​​​copy​






  1. #!/bin/sh -e
  2. # Script to create header files and links to configure
  3. # U-Boot for a specific board.
  4. #
  5. # Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]
  6. #
  7. # (C) 2002-2010 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
  8. #
  9. APPEND=no   # Default: Create new config file
  10. BOARD_NAME=""   # Name to print in make output
  11. TARGETS=""
  12. arch=""
  13. cpu=""
  14. board=""
  15. vendor=""
  16. soc=""
  17. options=""
  18. echo $#
  19. if [ $# -eq 2 -a \( "$1" = "-A" \) ] ; then
  20. # Automatic mode
  21. line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg` || {
  22. echo "make: *** No rule to make target \`$2_config'.  Stop." >&2
  23. exit 1
  24. }
  25. set ${line}
  26. echo ${line}
  27. echo $#
  28. # add default board name if needed
  29. [ $# = 3 ] && set ${line} ${1}
  30. #####################################
  31. #我们执行脚本的命令是mkconfig -A smdk2410,$#表示的是参数的个数,$1表示的是第一个参数
  32. #line 就是在boards.cfg文件中smdk2410的那行,而-i表示忽略大小写
  33. #在boards.cfg文件中,有
  34. #Target                     ARCH        CPU         Board name          Vendor          SoC         Options
  35. #smdk2410                     arm         arm920t     -                   samsung        s3c24x0
  36. #  set ${line}
  37. #  set也可用于在脚本内部给出其运行参数,所以这个时候参数就变为"smdk2410 arm arm920t - samsung s3c24x0"
  38. #这个时候参数个数就变成6个了
  39. ######################################
  40. elif [ "${MAKEFLAGS+set}${MAKELEVEL+set}" = "setset" ] ; then
  41. # only warn when using a config target in the Makefile
  42. cat <<-EOF
  43. warning: Please migrate to boards.cfg.  Failure to do so will
  44. mean removal of your board in the next release.
  45. EOF
  46. sleep 5
  47. fi
  48. echo $1
  49. while [ $# -gt 0 ] ; do
  50. case "$1" in
  51. --) shift ; break ;;
  52. -a) shift ; APPEND=yes ;;
  53. -n) shift ; BOARD_NAME="${1%_config}" ; shift ;;
  54. -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;
  55. *)  break ;;
  56. esac
  57. done
  58. ################################################
  59. #因为$1的值为smdk2410,所以case找不到对应的
  60. #################################################
  61. [ $# -lt 4 ] && exit 1
  62. [ $# -gt 7 ] && exit 1
  63. ##################################################
  64. #对参数个数做检查,小于4个或大于7个就退出
  65. ##################################################
  66. # Strip all options and/or _config suffixes
  67. CONFIG_NAME="${1%_config}"
  68. ####################
  69. #CONFIG_NAME的值为smdk2410
  70. #########################
  71. echo config_
  72. echo ${CONFIG_NAME}
  73. [ "${BOARD_NAME}" ] || BOARD_NAME="${1%_config}"
  74. echo board
  75. echo ${BOARD_NAME}
  76. ###########################################
  77. #如果BOARD_NAME在之前已经被设定了,就不做任何动作;如果为空,就设定为smdk2410.这里设定为smdk2410
  78. ############################################
  79. arch="$2"
  80. cpu="$3"
  81. if [ "$4" = "-" ] ; then
  82. board=${BOARD_NAME}
  83. else
  84. board="$4"
  85. fi
  86. ######################################################
  87. #设定arch变量的值为arm
  88. #cpu变量的值为arm920t
  89. #因为第四个变量为"-",所以board变量的值为smdk2410
  90. #######################################################
  91. [ $# -gt 4 ] && [ "$5" != "-" ] && vendor="$5"
  92. [ $# -gt 5 ] && [ "$6" != "-" ] && soc="$6"
  93. #############################################################
  94. #设定verdor变量的值为samsung
  95. #设定soc变量的值为s3c24x0
  96. #############################################################
  97. [ $# -gt 6 ] && [ "$7" != "-" ] && {
  98. # check if we have a board config name in the options field
  99. # the options field mave have a board config name and a list
  100. # of options, both separated by a colon (':'); the options are
  101. # separated by commas (',').
  102. #
  103. # Check for board name
  104. tmp="${7%:*}"
  105. if [ "$tmp" ] ; then
  106. CONFIG_NAME="$tmp"
  107. fi
  108. # Check if we only have a colon...
  109. if [ "${tmp}" != "$7" ] ; then
  110. options=${7#*:}
  111. TARGETS="`echo ${options} | sed 's:,: :g'` ${TARGETS}"
  112. fi
  113. }
  114. #################################################
  115. #因为我们的变量个数就是6个,这一段不执行
  116. #################################################
  117. echo ${ARCH}
  118. echo ${arch}
  119. if [ "${ARCH}" -a "${ARCH}" != "${arch}" ]; then
  120. echo "Failed: \$ARCH=${ARCH}, should be '${arch}' for ${BOARD_NAME}" 1>&2
  121. exit 1
  122. fi
  123. ####################################################
  124. #ARCH是在顶层makefile中定义的,在此刻还是为空的。
  125. #如果ARCH已经有值了,那么就检测ARCH和arch是否匹配了.
  126. ####################################################
  127. if [ "$options" ] ; then
  128. echo "Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options: ${options}"
  129. else
  130. echo "Configuring for ${BOARD_NAME} board..."
  131. fi
  132. ###########################################################################
  133. #我们没有定义options变量,所以输出Configuring for smdk2410 board...
  134. ###########################################################################
  135. #
  136. # Create link to architecture specific headers
  137. #
  138. echo ${SRCTREE}
  139. echo ${OBJTREE}
  140. if [ "$SRCTREE" != "$OBJTREE" ] ; then
  141. mkdir -p ${OBJTREE}/include
  142. mkdir -p ${OBJTREE}/include2
  143. cd ${OBJTREE}/include2
  144. rm -f asm
  145. ln -s ${SRCTREE}/arch/${arch}/include/asm asm
  146. LNPREFIX=${SRCTREE}/arch/${arch}/include/asm/
  147. cd ../include
  148. mkdir -p asm
  149. else
  150. cd ./include
  151. rm -f asm
  152. ln -s ../arch/${arch}/include/asm asm
  153. fi
  154. #############################################################################
  155. #在makefile中我们已经知道SRCTREE和OBJTREE都是当前目录,所以这里执行else
  156. #进入./include目录,删除asm链接,并重新建立链接asm,指向arch/arm/include/asm
  157. #############################################################################
  158. rm -f asm/arch
  159. #########################################################################
  160. #删除include目录下的asm下的arch链接文件
  161. ########################################################################
  162. ss=
  163. echo ${ss}
  164. if [ -z "${ss}" ] ; then
  165. echo "null"
  166. else
  167. echo "not null"
  168. fi
  169. echo ${LNPREFIX}
  170. if [ -z "${soc}" ] ; then
  171. ln -s ${LNPREFIX}arch-${cpu} asm/arch
  172. else
  173. ln -s ${LNPREFIX}arch-${soc} asm/arch
  174. fi
  175. ##########################################################
  176. #-z用来检测字符串是否为空,为空返回真
  177. #这里我们的soc不为空,执行else
  178. #将asm/arch链向arch-s3c24x0,看一下arch-s3c24x0目录,里面都是s3c24x0相关的头文件
  179. ##########################################################
  180. if [ "${arch}" = "arm" ] ; then
  181. rm -f asm/proc
  182. ln -s ${LNPREFIX}proc-armv asm/proc
  183. fi
  184. ###########################################################
  185. #删除asm/proc链接文件
  186. #将asm/proc链向proc-armv目录,该目录下是四个头文件:domain.h\processor.h\ptrace.h\system.h
  187. #############################################################
  188. #
  189. # Create include file for Make
  190. #
  191. echo "ARCH   = ${arch}"  >  config.mk
  192. echo "CPU    = ${cpu}"   >> config.mk
  193. echo "BOARD  = ${board}" >> config.mk
  194. [ "${vendor}" ] && echo "VENDOR = ${vendor}" >> config.mk
  195. [ "${soc}"    ] && echo "SOC    = ${soc}"    >> config.mk
  196. ######################################################################
  197. #上面几句的作用在注释中描述的很清楚
  198. #include/config.mk的文件如下:
  199. #ARCH   = arm
  200. #CPU    = arm920t
  201. #BOARD  = smdk2410
  202. #VENDOR = samsung
  203. #SOC    = s3c24x0
  204. ######################################################################
  205. # Assign board directory to BOARDIR variable
  206. if [ -z "${vendor}" ] ; then
  207. BOARDDIR=${board}
  208. else
  209. BOARDDIR=${vendor}/${board}
  210. fi
  211. echo ${BOARDDIR}
  212. #######################################################################
  213. #因为vendor变量不为空,所以执行else
  214. #BOARDDIR的值为samsung/s3c24x0
  215. ########################################################################
  216. #
  217. # Create board specific header file
  218. #
  219. if [ "$APPEND" = "yes" ]    # Append to existing config file
  220. then
  221. echo >> config.h
  222. else
  223. > config.h       # Create new config file
  224. fi
  225. ########################################################################
  226. #在文件的最开头可以看到APPEND为no,所以这里我们在include文件夹下建立config.h文件
  227. #######################################################################
  228. echo "/* Automatically generated - do not edit */" >>config.h
  229. echo ${TARGETS}
  230. for i in ${TARGETS} ; do
  231. i="`echo ${i} | sed '/=/ {s/=/  /;q; } ; { s/$/ 1/; }'`"
  232. echo "#define CONFIG_${i}" >>config.h ;
  233. done
  234. ###################################################
  235. #这里我们TARGETS为空,上面不执行了
  236. ##################################################
  237. echo "#define CONFIG_SYS_ARCH  \"${arch}\""  >> config.h
  238. echo "#define CONFIG_SYS_CPU   \"${cpu}\""   >> config.h
  239. echo "#define CONFIG_SYS_BOARD \"${board}\"" >> config.h
  240. [ "${vendor}" ] && echo "#define CONFIG_SYS_VENDOR \"${vendor}\"" >> config.h
  241. [ "${soc}"    ] && echo "#define CONFIG_SYS_SOC    \"${soc}\""    >> config.h
  242. cat << EOF >> config.h
  243. #define CONFIG_BOARDDIR board/$BOARDDIR
  244. #include <config_cmd_defaults.h>
  245. #include <config_defaults.h>
  246. #include <configs/${CONFIG_NAME}.h>
  247. #include <asm/config.h>
  248. #include <config_fallbacks.h>
  249. EOF
  250. ######################################################
  251. #生成config.h文件如下:
  252. #   /* Automatically generated - do not edit */
  253. #   #define CONFIG_SYS_ARCH  "arm"
  254. #   #define CONFIG_SYS_CPU   "arm920t"
  255. #   #define CONFIG_SYS_BOARD "smdk2410"
  256. #   #define CONFIG_SYS_VENDOR "samsung"
  257. #   #define CONFIG_SYS_SOC    "s3c24x0"
  258. #   #define CONFIG_BOARDDIR board/samsung/smdk2410
  259. #   #include <config_cmd_defaults.h>
  260. #   #include <config_defaults.h>
  261. #   #include <configs/smdk2410.h>
  262. #   #include <asm/config.h>
  263. #   #include <config_fallbacks.h>
  264. #####################################################
  265. exit 0




        make xxx_config后,主要的变化是多了几个文件:

        1.include/asm    -->     arch/arm/include/arm

        2.include/asm/arch  -->  arch-s3c24x0

        3.include/asm/proc  -->  proc-armv

        4.在include目录下新建了config.mk文件,文件内容是ARCH CPU BOARD VENDOR SOC的定义

        5.在include目录下新建了config.h文件


        接着看make:

        给出部分makefile中的注释,主要是一些变量的定义:





[cpp]  ​​view plain​​​  ​​​copy​






  1. VERSION = 2012
  2. PATCHLEVEL = 07
  3. SUBLEVEL =
  4. EXTRAVERSION =
  5. ifneq "$(SUBLEVEL)" ""
  6. U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
  7. else
  8. U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL)$(EXTRAVERSION)
  9. endif
  10. ################################
  11. #定义U_BOOT_VERSION为2012.07
  12. #####################################
  13. TIMESTAMP_FILE = $(obj)include/generated/timestamp_autogenerated.h
  14. VERSION_FILE = $(obj)include/generated/version_autogenerated.h
  15. ###############################
  16. #因为obj为空,所以定义TIMESTAMP_FILE为include/generated/timestamp_autogenerated.h
  17. #定义VERSION_FILE为include/generated/version_autogenerated.h
  18. #****************
  19. HOSTARCH := $(shell uname -m | \
  20. sed -e s/i.86/x86/ \
  21. -e s/sun4u/sparc64/ \
  22. -e s/arm.*/arm/ \
  23. -e s/sa110/arm/ \
  24. -e s/ppc64/powerpc/ \
  25. -e s/ppc/powerpc/ \
  26. -e s/macppc/powerpc/\
  27. -e s/sh.*/sh/)
  28. HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
  29. sed -e 's/ cygwin .*/cygwin/')
  30. # Set shell to bash if possible, otherwise fall back to sh
  31. SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
  32. else if [ -x /bin/bash ]; then echo /bin/bash; \
  33. else echo sh; fi; fi)
  34. export  HOSTARCH HOSTOS SHELL
  35. #########################
  36. #HOSTARCH为i686,HOSTOS为linux,SHELL为/bin/sh
  37. #############################
  38. # Deal with colliding definitions from tcsh etc.
  39. VENDOR=
  40. #########################################################################
  41. # Allow for silent builds
  42. ifeq (,$(findstring s,$(MAKEFLAGS)))
  43. XECHO = echo
  44. else
  45. XECHO = :
  46. endif
  47. ###########################
  48. #因为MAKEFLAGS变量的字符串为空,找不到s,所以ifeq为真,XECHO = echo
  49. ###########################
  50. #########################################################################
  51. #
  52. # U-boot build supports producing a object files to the separate external
  53. # directory. Two use cases are supported:
  54. #
  55. # 1) Add O= to the make command line
  56. # 'make O=/tmp/build all'
  57. #
  58. # 2) Set environement variable BUILD_DIR to point to the desired location
  59. # 'export BUILD_DIR=/tmp/build'
  60. # 'make'
  61. #
  62. # The second approach can also be used with a MAKEALL script
  63. # 'export BUILD_DIR=/tmp/build'
  64. # './MAKEALL'
  65. #
  66. # Command line 'O=' setting overrides BUILD_DIR environent variable.
  67. #
  68. # When none of the above methods is used the local build is performed and
  69. # the object files are placed in the source directory.
  70. #
  71. ifdef O
  72. ifeq ("$(origin O)", "command line")
  73. BUILD_DIR := $(O)
  74. endif
  75. endif
  76. #################################
  77. #如果没有在make命令行中定义O=/tmp之类的,那么BUILD_DIR就为/tmp,否则为空。
  78. #当使用make O=/tmp时,表明#ifdef O有定义,而$(origin O)返回的就是"command line"
  79. #################################
  80. ifneq ($(BUILD_DIR),)
  81. saved-output := $(BUILD_DIR)
  82. # Attempt to create a output directory.
  83. $(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})
  84. # Verify if it was successful.
  85. BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
  86. $(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
  87. endif # ifneq ($(BUILD_DIR),)
  88. #################################
  89. #如果BUILD_DIR不为空,那么这几句就执行:
  90. #首先,saved-output变量也是BUILD_DIR的值
  91. #如果BUILD_DIR不存在,那么就创建BUILD_DIR目录
  92. #检测BUILD_DIR目录是否成功建好了,如果有问题就输出错误信息
  93. #################################
  94. OBJTREE     := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
  95. SPLTREE     := $(OBJTREE)/spl
  96. SRCTREE     := $(CURDIR)
  97. TOPDIR      := $(SRCTREE)
  98. LNDIR       := $(OBJTREE)
  99. export  TOPDIR SRCTREE OBJTREE SPLTREE
  100. ###########################################
  101. #如果BUILD_DIR有值,那么OBJTREE就是BUILD_DIR的值,如果BUILD_DIR为空,那么OBJTREE就是CURDIR的值,$(CURDIR)时GNU Make内嵌的变量,是当前目录。
  102. #我们在make时候不加O=/tmp之类的参数,所以OBJTREE就是当前工作目录,SPLTREE是当前工作目录下的spl目录,SRCTREE时当前工作目录,TOPDIR也是当前目录,LNDIR也是当前目录。
  103. ##########################################
  104. MKCONFIG    := $(SRCTREE)/mkconfig
  105. export MKCONFIG
  106. #############################################
  107. #MKCONFIG定义为当前工作目录下的mkconfig脚本,并export
  108. #############################################
  109. ifneq ($(OBJTREE),$(SRCTREE))
  110. REMOTE_BUILD    := 1
  111. export REMOTE_BUILD
  112. endif
  113. ####################################################################
  114. #在我们的执行中,OBJTREE和SRCTREE是相等的,所以不管了
  115. ###################################################################
  116. # $(obj) and (src) are defined in config.mk but here in main Makefile
  117. # we also need them before config.mk is included which is the case for
  118. # some targets like unconfig, clean, clobber, distclean, etc.
  119. ifneq ($(OBJTREE),$(SRCTREE))
  120. obj := $(OBJTREE)/
  121. src := $(SRCTREE)/
  122. else
  123. obj :=
  124. src :=
  125. endif
  126. export obj src
  127. #######################################
  128. #可以先看下上面的注释   因为两个路径相同,所以执行else
  129. #########################################
  130. # Make sure CDPATH settings don't interfere
  131. unexport CDPATH
  132. #########################################################################
  133. # The "tools" are needed early, so put this first
  134. # Don't include stuff already done in $(LIBS)
  135. # The "examples" conditionally depend on U-Boot (say, when USE_PRIVATE_LIBGCC
  136. # is "yes"), so compile examples after U-Boot is compiled.
  137. SUBDIR_TOOLS = tools
  138. SUBDIR_EXAMPLES = examples/standalone examples/api
  139. SUBDIRS = $(SUBDIR_TOOLS)
  140. ###############################################
  141. #定义SUBDIR_TOOLS SUBDIR_EXAMPLES 和 SUBDIRS
  142. ###############################################
  143. .PHONY : $(SUBDIRS) $(VERSION_FILE) $(TIMESTAMP_FILE)
  144. ########################
  145. #定义几个伪目标
  146. ########################
  147. ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))
  148. # Include autoconf.mk before config.mk so that the config options are available
  149. # to all top level build files.  We need the dummy all: target to prevent the
  150. # dependency target in autoconf.mk.dep from being the default.
  151. all:
  152. sinclude $(obj)include/autoconf.mk.dep
  153. sinclude $(obj)include/autoconf.mk
  154. ###################################################################################
  155. #包含auoconf.mk和autoconf.mk.dep文件
  156. ###################################################################################
  157. ifndef CONFIG_SANDBOX
  158. SUBDIRS += $(SUBDIR_EXAMPLES)
  159. endif
  160. ###################################
  161. #追加SUBDIRS 为"tools  examples/standalone examples/api"
  162. ###################################
  163. # load ARCH, BOARD, and CPU configuration
  164. include $(obj)include/config.mk
  165. export  ARCH CPU BOARD VENDOR SOC
  166. #######################################
  167. #包含include/config.mk文件,这个文件是在make xxx_config过程中产生的
  168. #######################################
  169. # set default to nothing for native builds
  170. ifeq ($(HOSTARCH),$(ARCH))
  171. CROSS_COMPILE ?=
  172. endif
  173. #######################################
  174. #看看注释就知道了,但是很显示我们的HOSTARCH是x86的,目标时arm的
  175. ########################################
  176. # load other configuration
  177. include $(TOPDIR)/config.mk
  178. #######################################
  179. #包含uboot顶层目录的config.mk文件
  180. #######################################
  181. # If board code explicitly specified LDSCRIPT or CONFIG_SYS_LDSCRIPT, use
  182. # that (or fail if absent).  Otherwise, search for a linker script in a
  183. # standard location.
  184. LDSCRIPT_MAKEFILE_DIR = $(dir $(LDSCRIPT))
  185. ##############################################################################
  186. #用等号赋值的变量是递归方式扩展的变量。变量定义时,变量值中对其他变量的引用不会被替换展开;
  187. #而是变量在引用它的地方替换展开的同时,它所引用的其它变量才会被一同替换展开。
  188. #其优点是:
  189. #这种类型变量在定义时,可以引用其它的之前没有定义的变量(可能在后续部分定义,或者是通过make的命令行选项传递的变量)。
  190. #LDSCRIPT变量就是后面才定义的
  191. ##############################################################################
  192. ifndef LDSCRIPT
  193. #LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
  194. ifdef CONFIG_SYS_LDSCRIPT
  195. # need to strip off double quotes
  196. LDSCRIPT := $(subst ",,$(CONFIG_SYS_LDSCRIPT))
  197. endif
  198. endif
  199. #######################################################################################
  200. #如果定义了CONFIG_SYS_LDSCRIPT,将CONFIG_SYS_LDSCRIPT代表的字符串去掉双引号后赋值给LDSCRIPT变量
  201. #这里我们并没有定义CONFIG_SYS_LDSCRIPT
  202. #######################################################################################
  203. # If there is no specified link script, we look in a number of places for it
  204. ifndef LDSCRIPT
  205. ifeq ($(CONFIG_NAND_U_BOOT),y)
  206. LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
  207. ifeq ($(wildcard $(LDSCRIPT)),)
  208. LDSCRIPT := $(TOPDIR)/$(CPUDIR)/u-boot-nand.lds
  209. endif
  210. endif
  211. ifeq ($(wildcard $(LDSCRIPT)),)
  212. LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
  213. endif
  214. ifeq ($(wildcard $(LDSCRIPT)),)
  215. LDSCRIPT := $(TOPDIR)/$(CPUDIR)/u-boot.lds
  216. endif
  217. ifeq ($(wildcard $(LDSCRIPT)),)
  218. LDSCRIPT := $(TOPDIR)/arch/$(ARCH)/cpu/u-boot.lds
  219. # We don't expect a Makefile here
  220. LDSCRIPT_MAKEFILE_DIR =
  221. endif
  222. ifeq ($(wildcard $(LDSCRIPT)),)
  223. $(error could not find linker script)
  224. endif
  225. endif
  226. ##########################################################################################
  227. #注释写的很明确,如果没有用CONFIG_SYS_LDSCRIPT指定LDSCRIPT,那么就在几个地方搜
  228. #第一个地方:如果CONFIG_NAND_U_BOOT是y,就用u-boot-nand.lds         但是这里没有这个定义
  229. #第一个地方没找到,就找第二个地方:u-boot-2012.07/board/samsung/smdk2410     这个目录没有u-boot.lds文件
  230. #第二个地方没找到,就找第三个地方:其中CPUDIR是在顶层的config.mk中定义的,在arch/arm/cpu/arm920t中找    这个目录也没有
  231. #第三个地方没找到,就找第四个地方:arch/arm/cpu/u-boot.lds,这里就找到了!!!!
  232. ##########################################################################################
  233. #########################################################################
  234. # U-Boot objects....order is important (i.e. start must be first)
  235. OBJS  = $(CPUDIR)/start.o
  236. ifeq ($(CPU),x86)
  237. OBJS += $(CPUDIR)/start16.o
  238. OBJS += $(CPUDIR)/resetvec.o
  239. endif
  240. ifeq ($(CPU),ppc4xx)
  241. OBJS += $(CPUDIR)/resetvec.o
  242. endif
  243. ifeq ($(CPU),mpc85xx)
  244. OBJS += $(CPUDIR)/resetvec.o
  245. endif
  246. OBJS := $(addprefix $(obj),$(OBJS))
  247. #####################################
  248. #为OBJS增加前缀,其中obj在顶层目录的config.mk中定义,这里根据实际情况 OBJS就是 arch/arm/cpu/arm920t/start.o
  249. #####################################
  250. LIBS  = lib/libgeneric.o
  251. LIBS += lib/lzma/liblzma.o
  252. LIBS += lib/lzo/liblzo.o
  253. LIBS += lib/zlib/libz.o
  254. ifeq ($(CONFIG_TIZEN),y)
  255. LIBS += lib/tizen/libtizen.o
  256. endif
  257. LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ]; then echo \
  258. "board/$(VENDOR)/common/lib$(VENDOR).o"; fi)
  259. LIBS += $(CPUDIR)/lib$(CPU).o
  260. ifdef SOC
  261. LIBS += $(CPUDIR)/$(SOC)/lib$(SOC).o
  262. endif
  263. ifeq ($(CPU),ixp)
  264. LIBS += arch/arm/cpu/ixp/npe/libnpe.o
  265. endif
  266. ifeq ($(CONFIG_OF_EMBED),y)
  267. LIBS += dts/libdts.o
  268. endif
  269. LIBS += arch/$(ARCH)/lib/lib$(ARCH).o
  270. LIBS += fs/cramfs/libcramfs.o fs/fat/libfat.o fs/fdos/libfdos.o fs/jffs2/libjffs2.o \
  271. fs/reiserfs/libreiserfs.o fs/ext2/libext2fs.o fs/yaffs2/libyaffs2.o \
  272. fs/ubifs/libubifs.o
  273. LIBS += net/libnet.o
  274. LIBS += disk/libdisk.o
  275. LIBS += drivers/bios_emulator/libatibiosemu.o
  276. LIBS += drivers/block/libblock.o
  277. LIBS += drivers/dma/libdma.o
  278. LIBS += drivers/fpga/libfpga.o
  279. LIBS += drivers/gpio/libgpio.o
  280. LIBS += drivers/hwmon/libhwmon.o
  281. LIBS += drivers/i2c/libi2c.o
  282. LIBS += drivers/input/libinput.o
  283. LIBS += drivers/misc/libmisc.o
  284. LIBS += drivers/mmc/libmmc.o
  285. LIBS += drivers/mtd/libmtd.o
  286. LIBS += drivers/mtd/nand/libnand.o
  287. LIBS += drivers/mtd/onenand/libonenand.o
  288. LIBS += drivers/mtd/ubi/libubi.o
  289. LIBS += drivers/mtd/spi/libspi_flash.o
  290. LIBS += drivers/net/libnet.o
  291. LIBS += drivers/net/phy/libphy.o
  292. LIBS += drivers/pci/libpci.o
  293. LIBS += drivers/pcmcia/libpcmcia.o
  294. LIBS += drivers/power/libpower.o
  295. LIBS += drivers/spi/libspi.o
  296. ifeq ($(CPU),mpc83xx)
  297. LIBS += drivers/qe/libqe.o
  298. LIBS += arch/powerpc/cpu/mpc8xxx/ddr/libddr.o
  299. LIBS += arch/powerpc/cpu/mpc8xxx/lib8xxx.o
  300. endif
  301. ifeq ($(CPU),mpc85xx)
  302. LIBS += drivers/qe/libqe.o
  303. LIBS += drivers/net/fm/libfm.o
  304. LIBS += arch/powerpc/cpu/mpc8xxx/ddr/libddr.o
  305. LIBS += arch/powerpc/cpu/mpc8xxx/lib8xxx.o
  306. endif
  307. ifeq ($(CPU),mpc86xx)
  308. LIBS += arch/powerpc/cpu/mpc8xxx/ddr/libddr.o
  309. LIBS += arch/powerpc/cpu/mpc8xxx/lib8xxx.o
  310. endif
  311. LIBS += drivers/rtc/librtc.o
  312. LIBS += drivers/serial/libserial.o
  313. ifeq ($(CONFIG_GENERIC_LPC_TPM),y)
  314. LIBS += drivers/tpm/libtpm.o
  315. endif
  316. LIBS += drivers/twserial/libtws.o
  317. LIBS += drivers/usb/eth/libusb_eth.o
  318. LIBS += drivers/usb/gadget/libusb_gadget.o
  319. LIBS += drivers/usb/host/libusb_host.o
  320. LIBS += drivers/usb/musb/libusb_musb.o
  321. LIBS += drivers/usb/phy/libusb_phy.o
  322. LIBS += drivers/usb/ulpi/libusb_ulpi.o
  323. LIBS += drivers/video/libvideo.o
  324. LIBS += drivers/watchdog/libwatchdog.o
  325. LIBS += common/libcommon.o
  326. LIBS += lib/libfdt/libfdt.o
  327. LIBS += api/libapi.o
  328. LIBS += post/libpost.o
  329. ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP34XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX),)
  330. LIBS += $(CPUDIR)/omap-common/libomap-common.o
  331. endif
  332. ifeq ($(SOC),mx5)
  333. LIBS += $(CPUDIR)/imx-common/libimx-common.o
  334. endif
  335. ifeq ($(SOC),mx6)
  336. LIBS += $(CPUDIR)/imx-common/libimx-common.o
  337. endif
  338. ifeq ($(SOC),s5pc1xx)
  339. LIBS += $(CPUDIR)/s5p-common/libs5p-common.o
  340. endif
  341. ifeq ($(SOC),exynos)
  342. LIBS += $(CPUDIR)/s5p-common/libs5p-common.o
  343. endif
  344. LIBS := $(addprefix $(obj),$(sort $(LIBS)))
  345. ########################################
  346. #将LIBS排序后为LIBS增加前缀
  347. #########################################
  348. .PHONY : $(LIBS)
  349. LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).o
  350. LIBBOARD := $(addprefix $(obj),$(LIBBOARD))
  351. ###########################################
  352. #为LIBBOARD增加前缀,LIBBOARD就是board/samsung/smdk2410/libsmdk2410.o
  353. ###########################################
  354. # Add GCC lib
  355. ifdef USE_PRIVATE_LIBGCC
  356. ifeq ("$(USE_PRIVATE_LIBGCC)", "yes")
  357. PLATFORM_LIBGCC = $(OBJTREE)/arch/$(ARCH)/lib/libgcc.o
  358. else
  359. PLATFORM_LIBGCC = -L $(USE_PRIVATE_LIBGCC) -lgcc
  360. endif
  361. else
  362. PLATFORM_LIBGCC := -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
  363. endif
  364. PLATFORM_LIBS += $(PLATFORM_LIBGCC)
  365. export PLATFORM_LIBS
  366. # Special flags for CPP when processing the linker script.
  367. # Pass the version down so we can handle backwards compatibility
  368. # on the fly.
  369. LDPPFLAGS += \
  370. -include $(TOPDIR)/include/u-boot/u-boot.lds.h \
  371. -DCPUDIR=$(CPUDIR) \
  372. $(shell $(LD) --version | \
  373. sed -ne 's/GNU ld version  [0−9][0−9]∗ \. [0−9][0−9]∗ .*/-DLD_MAJOR=\1 -DLD_MINOR=\2/p')
  374. __OBJS := $(subst $(obj),,$(OBJS))
  375. __LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
  376. #########################################################################
  377. #########################################################################
  378. ifneq ($(CONFIG_BOARD_SIZE_LIMIT),)
  379. BOARD_SIZE_CHECK = \
  380. @actual=`wc -c $@ | awk '{print $$1}'`; \
  381. limit=$(CONFIG_BOARD_SIZE_LIMIT); \
  382. if test actual−gt
    limit; then \
  383. echo "$@ exceeds file size limit:"; \
  384. echo "  limit:  $$limit bytes"; \
  385. echo "  actual: $$actual bytes"; \
  386. echo "  excess: $$((actual - limit)) bytes"; \
  387. exit 1; \
  388. fi
  389. else
  390. BOARD_SIZE_CHECK =
  391. endif




        这里也给出顶层目录下的config.mk文件的注释:





[cpp]  ​​view plain​​​  ​​​copy​






  1. #
  2. # (C) Copyright 2000-2006
  3. # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  4. #
  5. # See file CREDITS for list of people who contributed to this
  6. # project.
  7. #
  8. # This program is free software; you can redistribute it and/or
  9. # modify it under the terms of the GNU General Public License as
  10. # published by the Free Software Foundation; either version 2 of
  11. # the License, or (at your option) any later version.
  12. #
  13. # This program is distributed in the hope that it will be useful,
  14. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. # GNU General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU General Public License
  19. # along with this program; if not, write to the Free Software
  20. # Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  21. # MA 02111-1307 USA
  22. #
  23. #########################################################################
  24. ifeq ($(CURDIR),$(SRCTREE))
  25. dir :=
  26. else
  27. dir := $(subst $(SRCTREE)/,,$(CURDIR))
  28. endif
  29. ###########################################################################
  30. #在顶层makefile中已经分析了CURDIR和SRCTREE都是当前目录,所以这里dir暂时为空
  31. ###########################################################################
  32. ifneq ($(OBJTREE),$(SRCTREE))
  33. # Create object files for SPL in a separate directory
  34. ifeq ($(CONFIG_SPL_BUILD),y)
  35. obj := $(if $(dir),$(SPLTREE)/$(dir)/,$(SPLTREE)/)
  36. else
  37. obj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/)
  38. endif
  39. src := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/)
  40. $(shell mkdir -p $(obj))
  41. else
  42. # Create object files for SPL in a separate directory
  43. ifeq ($(CONFIG_SPL_BUILD),y)
  44. obj := $(if $(dir),$(SPLTREE)/$(dir)/,$(SPLTREE)/)
  45. $(shell mkdir -p $(obj))
  46. else
  47. obj :=
  48. endif
  49. src :=
  50. endif
  51. ########################################################################################
  52. #首先OBJTREE和SRCTREE都是当前目录,所以执行else
  53. #查找CONFIG_SPL_BUILD是否定义为y,在autoconf.mk中,并没有这个定义,所以obj和src暂时也为空
  54. ########################################################################################
  55. # clean the slate ...
  56. PLATFORM_RELFLAGS =
  57. PLATFORM_CPPFLAGS =
  58. PLATFORM_LDFLAGS =
  59. #########################################################################
  60. HOSTCFLAGS  = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer \
  61. $(HOSTCPPFLAGS)
  62. HOSTSTRIP   = strip
  63. #
  64. # Mac OS X / Darwin's C preprocessor is Apple specific.  It
  65. # generates numerous errors and warnings.  We want to bypass it
  66. # and use GNU C's cpp.  To do this we pass the -traditional-cpp
  67. # option to the compiler.  Note that the -traditional-cpp flag
  68. # DOES NOT have the same semantics as GNU C's flag, all it does
  69. # is invoke the GNU preprocessor in stock ANSI/ISO C fashion.
  70. #
  71. # Apple's linker is similar, thanks to the new 2 stage linking
  72. # multiple symbol definitions are treated as errors, hence the
  73. # -multiply_defined suppress option to turn off this error.
  74. #
  75. ifeq ($(HOSTOS),darwin)
  76. # get major and minor product version (e.g. '10' and '6' for Snow Leopard)
  77. DARWIN_MAJOR_VERSION    = $(shell sw_vers -productVersion | cut -f 1 -d '.')
  78. DARWIN_MINOR_VERSION    = $(shell sw_vers -productVersion | cut -f 2 -d '.')
  79. os_x_before = $(shell if [ $(DARWIN_MAJOR_VERSION) -le $(1) -a \
  80. $(DARWIN_MINOR_VERSION) -le $(2) ] ; then echo "$(3)"; else echo "$(4)"; fi ;)
  81. # Snow Leopards build environment has no longer restrictions as described above
  82. HOSTCC       = $(call os_x_before, 10, 5, "cc", "gcc")
  83. HOSTCFLAGS  += $(call os_x_before, 10, 4, "-traditional-cpp")
  84. HOSTLDFLAGS += $(call os_x_before, 10, 5, "-multiply_defined suppress")
  85. else
  86. HOSTCC      = gcc
  87. endif
  88. ifeq ($(HOSTOS),cygwin)
  89. HOSTCFLAGS  += -ansi
  90. endif
  91. # We build some files with extra pedantic flags to try to minimize things
  92. # that won't build on some weird host compiler -- though there are lots of
  93. # exceptions for files that aren't complaint.
  94. HOSTCFLAGS_NOPED = $(filter-out -pedantic,$(HOSTCFLAGS))
  95. HOSTCFLAGS  += -pedantic
  96. ############################################################
  97. #HOSTCFLAGS_NOPED是利用filter-out函数从HOSTCFLAGS中过滤掉-pedantic选项
  98. #而HOSTCFLAGS追加上-pedantic选项
  99. ############################################################
  100. #########################################################################
  101. #
  102. # Option checker, gcc version (courtesy linux kernel) to ensure
  103. # only supported compiler options are used
  104. #
  105. CC_OPTIONS_CACHE_FILE := $(OBJTREE)/include/generated/cc_options.mk
  106. CC_TEST_OFILE := $(OBJTREE)/include/generated/cc_test_file.o
  107. -include $(CC_OPTIONS_CACHE_FILE)
  108. #############################################################################
  109. #定义编译选项
  110. #在cc_options.mk中有如下选项:
  111. #   CC_OPTIONS += -marm
  112. #   CC_OPTIONS += -mno-thumb-interwork
  113. #   CC_OPTIONS += -mapcs-32
  114. #   CC_OPTIONS += -malignment-traps
  115. #   CC_OPTIONS += -Wno-format-nonliteral
  116. #   CC_OPTIONS += -Wno-format-security
  117. #   CC_OPTIONS += -mabi=apcs-gnu
  118. #   CC_OPTIONS += -mabi=aapcs-linux
  119. #############################################################################
  120. cc-option-sys = $(shell mkdir -p $(dir $(CC_TEST_OFILE)); \
  121. if $(CC) $(CFLAGS) $(1) -S -xc /dev/null -o $(CC_TEST_OFILE) \
  122. > /dev/null 2>&1; then \
  123. echo 'CC_OPTIONS += $(strip $1)' >> $(CC_OPTIONS_CACHE_FILE); \
  124. echo "$(1)"; fi)
  125. ifeq ($(CONFIG_CC_OPT_CACHE_DISABLE),y)
  126. cc-option = $(strip $(if $(call cc-option-sys,$1),$1,$2))
  127. else
  128. cc-option = $(strip $(if $(findstring $1,$(CC_OPTIONS)),$1,\
  129. $(if $(call cc-option-sys,$1),$1,$2)))
  130. endif
  131. ###########################################################################################
  132. #定义两个函数,cc-option-sys被cc-option调用
  133. #cc-option被后面的函数调用
  134. ############################################################################################
  135. # cc-version
  136. # Usage gcc-ver := $(call cc-version)
  137. cc-version = $(shell $(SHELL) $(SRCTREE)/tools/gcc-version.sh $(CC))
  138. ##########################################################################################
  139. #使用tools/gcc-version.sh脚本来获取编译器的版本
  140. #在顶层makefile中,有调用cc-version函数
  141. ##########################################################################################
  142. #
  143. # Include the make variables (CC, etc...)
  144. #
  145. AS  = $(CROSS_COMPILE)as
  146. LD  = $(CROSS_COMPILE)ld
  147. CC  = $(CROSS_COMPILE)gcc
  148. CPP = $(CC) -E
  149. AR  = $(CROSS_COMPILE)ar
  150. NM  = $(CROSS_COMPILE)nm
  151. LDR = $(CROSS_COMPILE)ldr
  152. STRIP   = $(CROSS_COMPILE)strip
  153. OBJCOPY = $(CROSS_COMPILE)objcopy
  154. OBJDUMP = $(CROSS_COMPILE)objdump
  155. RANLIB  = $(CROSS_COMPILE)RANLIB
  156. DTC = dtc
  157. #########################################################################
  158. #定义汇编器,连接器,编译器,打包工具,反汇编工具,值的注意的RANLIB的作用是在静态库有添加新的.o后,负责更新索引.
  159. #########################################################################
  160. # Load generated board configuration
  161. sinclude $(OBJTREE)/include/autoconf.mk
  162. sinclude $(OBJTREE)/include/config.mk
  163. ################################################################################################
  164. #包上配置编译时产生的autoconf.mk和config.mk文件
  165. ################################################################################################
  166. # Some architecture config.mk files need to know what CPUDIR is set to,
  167. # so calculate CPUDIR before including ARCH/SOC/CPU config.mk files.
  168. # Check if arch/$ARCH/cpu/$CPU exists, otherwise assume arch/$ARCH/cpu contains
  169. # CPU-specific code.
  170. CPUDIR=arch/$(ARCH)/cpu/$(CPU)
  171. ifneq ($(SRCTREE)/$(CPUDIR),$(wildcard $(SRCTREE)/$(CPUDIR)))
  172. CPUDIR=arch/$(ARCH)/cpu
  173. endif
  174. #################################################################################################
  175. #定义CPUDIR为arch/arm/cpu/arm920t
  176. #################################################################################################
  177. sinclude $(TOPDIR)/arch/$(ARCH)/config.mk   # include architecture dependend rules
  178. sinclude $(TOPDIR)/$(CPUDIR)/config.mk      # include  CPU  specific rules
  179. ##################################################################################################
  180. #包上arch/arm/config.mk和/arch/arm/cpu/arm920t/config.mk文件
  181. ##################################################################################################
  182. ifdef   SOC
  183. sinclude $(TOPDIR)/$(CPUDIR)/$(SOC)/config.mk   # include  SoC  specific rules
  184. endif
  185. ######################################################################
  186. #包上arch/arm/cpu/arm920t/s3c24x0/config.mk文件
  187. #####################################################################
  188. ifdef   VENDOR
  189. BOARDDIR = $(VENDOR)/$(BOARD)
  190. else
  191. BOARDDIR = $(BOARD)
  192. endif
  193. ifdef   BOARD
  194. sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk  # include board specific rules
  195. endif
  196. ######################################################################################
  197. #包上board/samsung/smdk2410/config.mk文件
  198. ######################################################################################
  199. #########################################################################
  200. # We don't actually use $(ARFLAGS) anywhere anymore, so catch people
  201. # who are porting old code to latest mainline but not updating $(AR).
  202. ARFLAGS = $(error update your Makefile to use cmd_link_o_target and not AR)
  203. RELFLAGS= $(PLATFORM_RELFLAGS)
  204. DBGFLAGS= -g # -DDEBUG
  205. OPTFLAGS= -Os #-fomit-frame-pointer
  206. OBJCFLAGS += --gap-fill=0xff
  207. gccincdir := $(shell $(CC) -print-file-name=include)
  208. CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS)     \
  209. -D__KERNEL__
  210. # Enable garbage collection of un-used sections for SPL
  211. ifeq ($(CONFIG_SPL_BUILD),y)
  212. CPPFLAGS += -ffunction-sections -fdata-sections
  213. LDFLAGS_FINAL += --gc-sections
  214. endif
  215. ifneq ($(CONFIG_SYS_TEXT_BASE),)
  216. CPPFLAGS += -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE)
  217. endif
  218. ifneq ($(CONFIG_SPL_TEXT_BASE),)
  219. CPPFLAGS += -DCONFIG_SPL_TEXT_BASE=$(CONFIG_SPL_TEXT_BASE)
  220. endif
  221. ifneq ($(CONFIG_SPL_PAD_TO),)
  222. CPPFLAGS += -DCONFIG_SPL_PAD_TO=$(CONFIG_SPL_PAD_TO)
  223. endif
  224. ifeq ($(CONFIG_SPL_BUILD),y)
  225. CPPFLAGS += -DCONFIG_SPL_BUILD
  226. endif
  227. ifneq ($(RESET_VECTOR_ADDRESS),)
  228. CPPFLAGS += -DRESET_VECTOR_ADDRESS=$(RESET_VECTOR_ADDRESS)
  229. endif
  230. ifneq ($(OBJTREE),$(SRCTREE))
  231. CPPFLAGS += -I$(OBJTREE)/include2 -I$(OBJTREE)/include
  232. endif
  233. CPPFLAGS += -I$(TOPDIR)/include
  234. CPPFLAGS += -fno-builtin -ffreestanding -nostdinc   \
  235. -isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS)
  236. ifdef BUILD_TAG
  237. CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes \
  238. -DBUILD_TAG='"$(BUILD_TAG)"'
  239. else
  240. CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes
  241. endif
  242. CFLAGS_SSP := $(call cc-option,-fno-stack-protector)
  243. CFLAGS += $(CFLAGS_SSP)
  244. # Some toolchains enable security related warning flags by default,
  245. # but they don't make much sense in the u-boot world, so disable them.
  246. CFLAGS_WARN := $(call cc-option,-Wno-format-nonliteral) \
  247. $(call cc-option,-Wno-format-security)
  248. CFLAGS += $(CFLAGS_WARN)
  249. # Report stack usage if supported
  250. CFLAGS_STACK := $(call cc-option,-fstack-usage)
  251. CFLAGS += $(CFLAGS_STACK)
  252. # $(CPPFLAGS) sets -g, which causes gcc to pass a suitable -g<format>
  253. # option to the assembler.
  254. AFLAGS_DEBUG :=
  255. # turn jbsr into jsr for m68k
  256. ifeq ($(ARCH),m68k)
  257. ifeq ($(findstring 3.4,$(shell $(CC) --version)),3.4)
  258. AFLAGS_DEBUG := -Wa,-gstabs,-S
  259. endif
  260. endif
  261. AFLAGS := $(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CPPFLAGS)
  262. LDFLAGS += $(PLATFORM_LDFLAGS)
  263. LDFLAGS_FINAL += -Bstatic
  264. LDFLAGS_u-boot += -T $(obj)u-boot.lds $(LDFLAGS_FINAL)
  265. ifneq ($(CONFIG_SYS_TEXT_BASE),)
  266. LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE)
  267. endif
  268. LDFLAGS_u-boot-spl += -T $(obj)u-boot-spl.lds $(LDFLAGS_FINAL)
  269. ifneq ($(CONFIG_SPL_TEXT_BASE),)
  270. LDFLAGS_u-boot-spl += -Ttext $(CONFIG_SPL_TEXT_BASE)
  271. endif
  272. # Location of a usable BFD library, where we define "usable" as
  273. # "built for ${HOST}, supports ${TARGET}".  Sensible values are
  274. # - When cross-compiling: the root of the cross-environment
  275. # - Linux/ppc (native): /usr
  276. # - NetBSD/ppc (native): you lose ... (must extract these from the
  277. #   binutils build directory, plus the native and U-Boot include
  278. #   files don't like each other)
  279. #
  280. # So far, this is used only by tools/gdb/Makefile.
  281. ifeq ($(HOSTOS),darwin)
  282. BFD_ROOT_DIR =      /usr/local/tools
  283. else
  284. ifeq ($(HOSTARCH),$(ARCH))
  285. # native
  286. BFD_ROOT_DIR =      /usr
  287. else
  288. #BFD_ROOT_DIR =     /LinuxPPC/CDK       # Linux/i386
  289. #BFD_ROOT_DIR =     /usr/pkg/cross      # NetBSD/i386
  290. BFD_ROOT_DIR =      /opt/powerpc
  291. endif
  292. endif
  293. #########################################################################
  294. export  HOSTCC HOSTCFLAGS HOSTLDFLAGS PEDCFLAGS HOSTSTRIP CROSS_COMPILE \
  295. AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP MAKE
  296. export  CONFIG_SYS_TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS
  297. #########################################################################
  298. # Allow boards to use custom optimize flags on a per dir/file basis
  299. BCURDIR = $(subst $(SRCTREE)/,,$(CURDIR:$(obj)%=%))
  300. ALL_AFLAGS = $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR))
  301. ALL_CFLAGS = $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR))
  302. EXTRA_CPPFLAGS = $(CPPFLAGS_$(BCURDIR)/$(@F)) $(CPPFLAGS_$(BCURDIR))
  303. ALL_CFLAGS += $(EXTRA_CPPFLAGS)
  304. # The _DEP version uses the $< file target (for dependency generation)
  305. # See rules.mk
  306. EXTRA_CPPFLAGS_DEP = $(CPPFLAGS_$(BCURDIR)/$(addsuffix .o,$(basename $<))) \
  307. $(CPPFLAGS_$(BCURDIR))
  308. $(obj)%.s:  %.S
  309. $(CPP) $(ALL_AFLAGS) -o $@ $<
  310. $(obj)%.o:  %.S
  311. $(CC)  $(ALL_AFLAGS) -o $@ $< -c
  312. $(obj)%.o:  %.c
  313. $(CC)  $(ALL_CFLAGS) -o $@ $< -c
  314. $(obj)%.i:  %.c
  315. $(CPP) $(ALL_CFLAGS) -o $@ $< -c
  316. $(obj)%.s:  %.c
  317. $(CC)  $(ALL_CFLAGS) -o $@ $< -c -S
  318. #########################################################################
  319. # If the list of objects to link is empty, just create an empty built-in.o
  320. cmd_link_o_target = $(if $(strip $1),\
  321. $(LD) $(LDFLAGS) -r -o $@ $1,\
  322. rm -f $@; $(AR) rcs $@ )
  323. #########################################################################



        主要是一些变量和函数的定义,编译链接的参数设置以及依赖规则.


        最后分析下make:





[cpp]  ​​view plain​​​  ​​​copy​






  1. $(obj)include/autoconf.mk.dep: $(obj)include/config.h include/common.h
  2. @$(XECHO) Generating $@ ; \
  3. set -e ; \
  4. : Generate the dependancies ; \
  5. $(CC) -x c -DDO_DEPS_ONLY -M $(CFLAGS) $(CPPFLAGS) \
  6. -MQ $(obj)include/autoconf.mk include/common.h > $@
  7. $(obj)include/autoconf.mk: $(obj)include/config.h
  8. @$(XECHO) Generating $@ ; \
  9. set -e ; \
  10. : Extract the config macros ; \
  11. $(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | \
  12. sed -n -f tools/scripts/define2mk.sed > $@.tmp && \
  13. mv $@.tmp $@


        第一个是生成include/autoconf.mk的依赖文件


        第二个是根据include/config.h的文件内容,利用tools/scripts/define2mk.sed脚本将所有的CONFIG提取到autoconf.mk文件中


        终极目标是:ALL-y += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map

        u-boot.srec也是根据u-boot用objcopy工具搞出来的,不知的什么作用

        u-boot.bin也是根据u-boot用objcopy工具搞出来的,最终烧写的二进制bin档

        System.map是符号列表





[cpp]  ​​view plain​​​  ​​​copy​






  1. $(obj)u-boot.bin:   $(obj)u-boot
  2. $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
  3. $(BOARD_SIZE_CHECK)
  4. ###################################################################################
  5. #要得到最后的u-boot.bin,必须得到u-boot.u-boot.bin是最后要烧写到板子上的二进制bin档
  6. #利用objcopy来得到这个二进制文件($@是规则的目标文件名,$<是规则的第一个依赖文件名)
  7. #调用BOARD_SIZE_CHECK
  8. ###################################################################################



u-boot的依赖分析:


$(obj)u-boot:

depend \


$(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds


$(GEN_UBOOT)




u-boot 依赖depend $(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds


然后用$(GEN_UBOOT)生成最后的u-boot,GEN_UBOOT就是用ld链接的过程




a.看一下depend:


depend dep:

$(TIMESTAMP_FILE) $(VERSION_FILE) \


$(obj)include/autoconf.mk \


$(obj)include/generated/generic-asm-offsets.h \


$(obj)include/generated/asm-offsets.h


for dir in $(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR) ; do \


$(MAKE) -C $$dir _depend ; done


对$(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR)目录生成depend依赖文件;


而_depend是在rules.mk中定义的,利用CC的-M选项生成依赖文件.



b.看一下$(SUBDIR_TOOLS):


         tools目录



c.看一下$(OBJS):


$(OBJS):

depend


$(MAKE) -C $(CPUDIR) $(if $(REMOTE_BUILD),$@,$(notdir $@))


看下$(if $(REMOTE_BUILD),$@,$(notdir $@))


因为$(REMOTE_BUILD)为空,所以返回的是$(notdir $@)的值;


因为$@指的是规则的目标,所以就是$(OBJS),而$(OBJS)就是arch/arm/cpu/arm920t/start.o


notdir内嵌函数返回的文件名;所以返回start.o


执行makc -C arch/arm/cpu/arm920t start.o



d.$(LIBBOARD)


$(LIBBOARD):

depend $(LIBS)


$(MAKE) -C $(dir $(subst $(obj),,$@))


执行make -C board/samsung/smdk2410



e.$(LIBS)


$(LIBS):

depend $(SUBDIR_TOOLS)


$(MAKE) -C $(dir $(subst $(obj),,$@))


进入到LIBS包含的很多目录,执行make,生成很多.a文件.



f.$(LDSCRIPT)


$(LDSCRIPT):

depend


$(MAKE) -C $(dir $@) $(notdir $@)


在前面找链接脚本时已然知晓LDSCRIPT就是arch/arm/cpu/u-boot.lds


执行make -C arch/arm/cpu u-boot.lds  这个目录没有makefile,这什么意思?!!!



g.$(obj)u-boot.lds


$(obj)u-boot.lds: $(LDSCRIPT)


$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@



       这些就是编译uboot的规则,分析的比较粗糙,在移植的过程中肯定还会遇到各式各样的问题,在移植过程中再进一步深入并修正.