微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读

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

时间:11-26 来源:互联网 点击:
自己写的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. CONF

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top