嵌入式 > 嵌入式开发 > 详情

GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读

发布时间:2020-09-01 发布时间:
|
自己写的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 plaincopy
  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 plaincopy
  1. #!/bin/sh-e
  2. #Scripttocreateheaderfilesandlinkstoconfigure
  3. #U-Bootforaspecificboard.
  4. #
  5. #Parameters:TargetArchitectureCPUBoard[VENDOR][SOC]
  6. #
  7. #(C)2002-2010DENXSoftwareEngineering,WolfgangDenk
  8. #
  9. APPEND=no#Default:Createnewconfigfile
  10. BOARD_NAME=""#Nametoprintinmakeoutput
  11. TARGETS=""
  12. arch=""
  13. cpu=""
  14. board=""
  15. vendor=""
  16. soc=""
  17. options=""
  18. echo$#
  19. if[$#-eq2-a("$1"="-A")];then
  20. #Automaticmode
  21. line=`egrep-i"^[[:space:]]*${2}[[:space:]]"boards.cfg`||{
  22. echo"make:***Noruletomaketarget`$2_config.Stop.">&2
  23. exit1
  24. }
  25. set${line}
  26. echo${line}
  27. echo$#
  28. #adddefaultboardnameifneeded
  29. [$#=3]&&set${line}${1}
  30. #####################################
  31. #我们执行脚本的命令是mkconfig-Asmdk2410,$#表示的是参数的个数,$1表示的是第一个参数
  32. #line就是在boards.cfg文件中smdk2410的那行,而-i表示忽略大小写
  33. #在boards.cfg文件中,有
  34. #TargetARCHCPUBoardnameVendorSoCOptions
  35. #smdk2410armarm920t-samsungs3c24x0
  36. #set${line}
  37. #set也可用于在脚本内部给出其运行参数,所以这个时候参数就变为"smdk2410armarm920t-samsungs3c24x0"
  38. #这个时候参数个数就变成6个了
  39. ######################################
  40. elif["${MAKEFLAGS+set}${MAKELEVEL+set}"="setset"];then
  41. #onlywarnwhenusingaconfigtargetintheMakefile
  42. cat<
  43. warning:Pleasemigratetoboards.cfg.Failuretodosowill
  44. meanremovalofyourboardinthenextrelease.
  45. EOF
  46. sleep5
  47. fi
  48. echo$1
  49. while[$#-gt0];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|seds:_::g`${TARGETS}";shift;;
  55. *)break;;
  56. esac
  57. done
  58. ################################################
  59. #因为$1的值为smdk2410,所以case找不到对应的
  60. #################################################
  61. [$#-lt4]&&exit1
  62. [$#-gt7]&&exit1
  63. ##################################################
  64. #对参数个数做检查,小于4个或大于7个就退出
  65. ##################################################
  66. #Stripalloptionsand/or_configsuffixes
  67. CONFIG_NAME="${1%_config}"
  68. ####################
  69. #CONFIG_NAME的值为smdk2410
  70. #########################
  71. echoconfig_
  72. echo${CONFIG_NAME}
  73. ["${BOARD_NAME}"]||BOARD_NAME="${1%_config}"
  74. echoboard
  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. [$#-gt4]&&["$5"!="-"]&&vendor="$5"
  92. [$#-gt5]&&["$6"!="-"]&&soc="$6"
  93. #############################################################
  94. #设定verdor变量的值为samsung
  95. #设定soc变量的值为s3c24x0
  96. #############################################################
  97. [$#-gt6]&&["$7"!="-"]&&{
  98. #checkifwehaveaboardconfignameintheoptionsfield
  99. #theoptionsfieldmavehaveaboardconfignameandalist
  100. #ofoptions,bothseparatedbyacolon(:);theoptionsare
  101. #separatedbycommas(,).
  102. #
  103. #Checkforboardname
  104. tmp="${7%:*}"
  105. if["$tmp"];then
  106. CONFIG_NAME="$tmp"
  107. fi
  108. #Checkifweonlyhaveacolon...
  109. if["${tmp}"!="$7"];then
  110. options=${7#*:}
  111. TARGETS="`echo${options}|seds:,::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},shouldbe${arch}for${BOARD_NAME}"1>&2
  121. exit1
  122. fi
  123. ####################################################
  124. #ARCH是在顶层makefile中定义的,在此刻还是为空的。
  125. #如果ARCH已经有值了,那么就检测ARCH和arch是否匹配了.
  126. ####################################################
  127. if["$options"];then
  128. echo"Configuringfor${BOARD_NAME}-Board:${CONFIG_NAME},Options:${options}"
  129. else
  130. echo"Configuringfor${BOARD_NAME}board..."
  131. fi
  132. ###########################################################################
  133. #我们没有定义options变量,所以输出Configuringforsmdk2410board...
  134. ###########################################################################
  135. #
  136. #Createlinktoarchitecturespecificheaders
  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-fasm
  145. ln-s${SRCTREE}/arch/${arch}/include/asmasm
  146. LNPREFIX=${SRCTREE}/arch/${arch}/include/asm/
  147. cd../include
  148. mkdir-pasm
  149. else
  150. cd./include
  151. rm-fasm
  152. ln-s../arch/${arch}/include/asmasm
  153. fi
  154. #############################################################################
  155. #在makefile中我们已经知道SRCTREE和OBJTREE都是当前目录,所以这里执行else
  156. #进入./include目录,删除asm链接,并重新建立链接asm,指向arch/arm/include/asm
  157. #############################################################################
  158. rm-fasm/arch
  159. #########################################################################
  160. #删除include目录下的asm下的arch链接文件
  161. ########################################################################
  162. ss=
  163. echo${ss}
  164. if[-z"${ss}"];then
  165. echo"null"
  166. else
  167. echo"notnull"
  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-fasm/proc
  182. ln-s${LNPREFIX}proc-armvasm/proc
  183. fi
  184. ###########################################################
  185. #删除asm/proc链接文件
  186. #将asm/proc链向proc-armv目录,该目录下是四个头文件:domain.hprocessor.hptrace.hsystem.h
  187. #############################################################
  188. #
  189. #CreateincludefileforMake
  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. #AssignboarddirectorytoBOARDIRvariable
  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. #Createboardspecificheaderfile
  218. #
  219. if["$APPEND"="yes"]#Appendtoexistingconfigfile
  220. then
  221. echo>>config.h
  222. else
  223. >config.h#Createnewconfigfile
  224. fi
  225. ########################################################################
  226. #在文件的最开头可以看到APPEND为no,所以这里我们在include文件夹下建立config.h文件
  227. #######################################################################
  228. echo"/*Automaticallygenerated-donotedit*/">>config.h
  229. echo${TARGETS}
  230. foriin${TARGETS};do
  231. i="`echo${i}|sed/=/{s/=//;q;};{s/$/1/;}`"
  232. echo"#defineCONFIG_${i}">>config.h;
  233. done
  234. ###################################################
  235. #这里我们TARGETS为空,上面不执行了
  236. ##################################################
  237. echo"#defineCONFIG_SYS_ARCH"${arch}"">>config.h
  238. echo"#defineCONFIG_SYS_CPU"${cpu}"">>config.h
  239. echo"#defineCONFIG_SYS_BOARD"${board}"">>config.h
  240. ["${vendor}"]&&echo"#defineCONFIG_SYS_VENDOR"${vendor}"">>config.h
  241. ["${soc}"]&&echo"#defineCONFIG_SYS_SOC"${soc}"">>config.h
  242. cat<>config.h
  243. #defineCONFIG_BOARDDIRboard/$BOARDDIR
  244. #include
  245. #include
  246. #include
  247. #include
  248. #include
  249. EOF
  250. ######################################################
  251. #生成config.h文件如下:
  252. #/*Automaticallygenerated-donotedit*/
  253. ##defineCONFIG_SYS_ARCH"arm"
  254. ##defineCONFIG_SYS_CPU"arm920t"
  255. ##defineCONFIG_SYS_BOARD"smdk2410"
  256. ##defineCONFIG_SYS_VENDOR"samsung"
  257. ##defineCONFIG_SYS_SOC"s3c24x0"
  258. ##defineCONFIG_BOARDDIRboard/samsung/smdk2410
  259. ##include
  260. ##include
  261. ##include
  262. ##include
  263. ##include
  264. #####################################################
  265. exit0

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中的注释,主要是一些变量的定义:



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
定时器CTC模式的测试