GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读
阅读碰到的头等问题: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
- unconfig:
- @rm-f$(obj)include/config.h$(obj)include/config.mk
- $(obj)board/*/config.tmp$(obj)board/*/*/config.tmp
- $(obj)include/autoconf.mk$(obj)include/autoconf.mk.dep
- %_config::unconfig
- echo$@
- $(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
- #!/bin/sh-e
- #Scripttocreateheaderfilesandlinkstoconfigure
- #U-Bootforaspecificboard.
- #
- #Parameters:TargetArchitectureCPUBoard[VENDOR][SOC]
- #
- #(C)2002-2010DENXSoftwareEngineering,WolfgangDenk
- #
- APPEND=no#Default:Createnewconfigfile
- BOARD_NAME=""#Nametoprintinmakeoutput
- TARGETS=""
- arch=""
- cpu=""
- board=""
- vendor=""
- soc=""
- options=""
- echo$#
- if[$#-eq2-a("$1"="-A")];then
- #Automaticmode
- line=`egrep-i"^[[:space:]]*${2}[[:space:]]"boards.cfg`||{
- echo"make:***Noruletomaketarget`$2_config.Stop.">&2
- exit1
- }
- set${line}
- echo${line}
- echo$#
- #adddefaultboardnameifneeded
- [$#=3]&&set${line}${1}
- #####################################
- #我们执行脚本的命令是mkconfig-Asmdk2410,$#表示的是参数的个数,$1表示的是第一个参数
- #line就是在boards.cfg文件中smdk2410的那行,而-i表示忽略大小写
- #在boards.cfg文件中,有
- #TargetARCHCPUBoardnameVendorSoCOptions
- #smdk2410armarm920t-samsungs3c24x0
- #set${line}
- #set也可用于在脚本内部给出其运行参数,所以这个时候参数就变为"smdk2410armarm920t-samsungs3c24x0"
- #这个时候参数个数就变成6个了
- ######################################
- elif["${MAKEFLAGS+set}${MAKELEVEL+set}"="setset"];then
- #onlywarnwhenusingaconfigtargetintheMakefile
- cat<-EOF
- warning:Pleasemigratetoboards.cfg.Failuretodosowill
- meanremovalofyourboardinthenextrelease.
- EOF
- sleep5
- fi
- echo$1
- while[$#-gt0];do
- case"$1"in
- --)shift;break;;
- -a)shift;APPEND=yes;;
- -n)shift;BOARD_NAME="${1%_config}";shift;;
- -t)shift;TARGETS="`echo$1|seds:_::g`${TARGETS}";shift;;
- *)break;;
- esac
- done
- ################################################
- #因为$1的值为smdk2410,所以case找不到对应的
- #################################################
- [$#-lt4]&&exit1
- [$#-gt7]&&exit1
- ##################################################
- #对参数个数做检查,小于4个或大于7个就退出
- ##################################################
- #Stripalloptionsand/or_configsuffixes
- CONF
ARM汇编u-bootmakefilemkconfi 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)