新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > GNU ARM匯編--(十七)u-boot的makefile和mkconfig解讀

GNU ARM匯編--(十七)u-boot的makefile和mkconfig解讀

作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
自己寫的bootloader可以引導(dǎo)kernel了,我以為曾經(jīng)神秘的u-boot代碼將變得毫無挑戰(zhàn),然事實表明u-boot作為優(yōu)秀的開源代碼,閱讀起來還是很有挑戰(zhàn)的,值得一讀!

閱讀碰到的頭等問題:Makefile和shell腳本看不懂...

本文引用地址:http://m.butianyuan.cn/article/201611/321714.htm

說起來做linux也很久了,Makefile和shell腳本都接觸過,但真的都是略懂而已.因為公司的Makefile和shell簡單的一眼望的對穿,很初級的寫法,簡單的應(yīng)用.再隨便在網(wǎng)上下個老外的開源代碼,那個Makefile和shell復(fù)雜啊.一不留神想起來了qt的qmake根據(jù)工程文件生成的Makefile也是很簡單,但qmake是人家老外寫的.不說其他語言了,只看Makefile和shell,中外的差距就在那了.

這次準備移植u-boot到tq2440上,選用的u-boot版本是u-boot-2012.07.

下面是我對u-boot配置和編譯的makefile mkconfig config.mk等文件的解讀,有些解讀我是在源檔上添加文字注釋的,有些是另外寫的,解讀難免有誤,若有讀者發(fā)現(xiàn)了,希望能夠指出,在下感激不盡!

在編譯u-boot的過程,就是make xxx_config和make兩步

以make smdk2410_config為例:

當(dāng)以smdk2410_config為目標時,makefile中前面一些變量的定義和其他文件的引用也是有的,這個在原檔中添加了有關(guān)注釋:

在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過程中產(chǎn)生的.unconfig就是清理配置的.

我們來看@$(MKCONFIG) -A $(@:_config=)
其實執(zhí)行的是mkconfig -A smdk2410
我們可以在該行上面添加一行:echo $@
則會輸出smdk2410_config,因為$@就是指目標
$(@:_config=)是變量的替換引用
格式為“$(VAR:A=B)”(或者“${VAR:A=B}”),意思是:替換變量“VAR”中所有“A”字符結(jié)尾的字為“B”結(jié)尾的字。
所以smdk2410_config末尾的_config去除了.

下面就是執(zhí)行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. #我們執(zhí)行腳本的命令是mkconfig-Asmdk2410,$#表示的是參數(shù)的個數(shù),$1表示的是第一個參數(shù)
  32. #line就是在boards.cfg文件中smdk2410的那行,而-i表示忽略大小寫
  33. #在boards.cfg文件中,有
  34. #TargetARCHCPUBoardnameVendorSoCOptions
  35. #smdk2410armarm920t-samsungs3c24x0
  36. #set${line}
  37. #set也可用于在腳本內(nèi)部給出其運行參數(shù),所以這個時候參數(shù)就變?yōu)?smdk2410armarm920t-samsungs3c24x0"
  38. #這個時候參數(shù)個數(shù)就變成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找不到對應(yīng)的
  60. #################################################
  61. [$#-lt4]&&exit1
  62. [$#-gt7]&&exit1
  63. ##################################################
  64. #對參數(shù)個數(shù)做檢查,小于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在之前已經(jīng)被設(shè)定了,就不做任何動作;如果為空,就設(shè)定為smdk2410.這里設(shè)定為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. #設(shè)定arch變量的值為arm
  88. #cpu變量的值為arm920t
  89. #因為第四個變量為"-",所以board變量的值為smdk2410
  90. #######################################################
  91. [$#-gt4]&&["$5"!="-"]&&vendor="$5"
  92. [$#-gt5]&&["$6"!="-"]&&soc="$6"
  93. #############################################################
  94. #設(shè)定verdor變量的值為samsung
  95. #設(shè)定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. #因為我們的變量個數(shù)就是6個,這一段不執(zhí)行
  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已經(jīng)有值了,那么就檢測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中我們已經(jīng)知道SRCTREE和OBJTREE都是當(dāng)前目錄,所以這里執(zhí)行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不為空,執(zhí)行else
  178. #將asm/arch鏈向arch-s3c24x0,看一下arch-s3c24x0目錄,里面都是s3c24x0相關(guān)的頭文件
  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變量不為空,所以執(zhí)行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為空,上面不執(zhí)行了
  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文件,文件內(nèi)容是ARCH CPU BOARD VENDOR SOC的定義

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

接著看make:

給出部分makefile中的注釋,主要是一些變量的定義:


上一頁 1 2 3 4 下一頁

關(guān)鍵詞: ARM匯編u-bootmakefilemkconfi

評論


技術(shù)專區(qū)

關(guān)閉