您的位置 首页 IOT

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

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

自己写的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<<-EOF
  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中的注释,首要是一些变量的界说:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/258032.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部