新聞中心

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

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

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

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

        本文引用地址:http://www.104case.com/article/201611/321714.htm

        說起來做linux也很久了,Makefile和shell腳本都接觸過,但真的都是略懂而已.因為公司的Makefile和shell簡單的一眼望的對穿,很初級的寫法,簡單的應用.再隨便在網上下個老外的開源代碼,那個Makefile和shell復雜啊.一不留神想起來了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為例:

        當以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=)
        其實執(zhí)行的是mkconfig -A smdk2410
        我們可以在該行上面添加一行:echo $@
        則會輸出smdk2410_config,因為$@就是指目標
        $(@:_config=)是變量的替換引用
        格式為“$(VAR:A=B)”(或者“${VAR:A=B}”),意思是:替換變量“VAR”中所有“A”字符結尾的字為“B”結尾的字。
        所以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也可用于在腳本內部給出其運行參數(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找不到對應的
        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在之前已經被設定了,就不做任何動作;如果為空,就設定為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. #因為我們的變量個數(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已經有值了,那么就檢測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都是當前目錄,所以這里執(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相關的頭文件
        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文件,文件內容是ARCH CPU BOARD VENDOR SOC的定義

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

        接著看make:

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


        上一頁 1 2 3 4 下一頁

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 嵊泗县| 壤塘县| 原阳县| 元谋县| 余姚市| 潞城市| 汤阴县| 仁化县| 白玉县| 万山特区| 奇台县| 宣化县| 叶城县| 博湖县| 蒲江县| 安陆市| 苏州市| 观塘区| 旬邑县| 嘉禾县| 淮安市| 财经| 大余县| 康保县| 钟祥市| 抚顺市| 榕江县| 乌兰浩特市| 敖汉旗| 凤凰县| 紫阳县| 吕梁市| 南昌市| 南召县| 西宁市| 留坝县| 沙雅县| 稻城县| 井研县| 阳山县| 武夷山市|