<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          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://www.ex-cimer.com/article/201611/321714.htm

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

          這次準(zhǔn)備移植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為目標(biāo)時,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都是這個目標(biāo).目標(biāo)的依賴是unconfig,unconfig的命令是刪除一些文件,而這些文件正是從make xxx_config過程中產(chǎn)生的.unconfig就是清理配置的.

          我們來看@$(MKCONFIG) -A $(@:_config=)
          其實執(zhí)行的是mkconfig -A smdk2410
          我們可以在該行上面添加一行:echo $@
          則會輸出smdk2410_config,因為$@就是指目標(biāo)
          $(@:_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. #進(jìn)入./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)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();