x210_sd_config : unconfig @$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110 @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
$@--目标文件(x210_sd_config)的_config用空格来代替(=(空)),所以第一个变量就变成x210_sd
Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
以下为mkconfig的源码解释
APPEND=no # Default: Create new config file进来先定义2个变量 BOARD_NAME="" # Name to print in make outputwhile [ $# -gt 0 ] ; do case "$1" in --) shift ; break ;; -a) shift ; APPEND=yes ;; -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;; *) break ;; esacdone
// $#这里等于6 因为调用config这个配置的时候传了6个参数分别为$1= x210_sd、$2=arm、$3=s5pc11x、$4=x210、$5=samsumg、$6=s5pc110、
$1(x210_sd)传进去用switch语句来判断是哪个case,在脚本里case 是会自动跳出的,如果加了break表示跳出while循环,且*表示任何情况。
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
可以理解为简列的if语句,如果${BOARD_NAME}成立BOARD_NAME=“$1"就不执行,则反。其实就是看BOARD_NAME变量是否有值,如果有值就维持不变;如果无值就给他赋值为$1,实际分析结果:BOARD_NAME=x210_sd,前面刚开始定义变量就已经赋空了(BOARD_NAME="")。
[ $# -lt 4 ] && exit 1 //if($#<4) return 1[ $# -gt 6 ] && exit 1 //if($#>6) return 1echo "Configuring for ${BOARD_NAME} board..."
传参的时候只能4、5、6个参数
# 创建符号链接# Create link to architecture specific headers#if [ "$SRCTREE" != "$OBJTREE" ] ; then mkdir -p ${OBJTREE}/include mkdir -p ${OBJTREE}/include2 cd ${OBJTREE}/include2 rm -f asm ln -s ${SRCTREE}/include/asm-$2 asm LNPREFIX="../../include2/asm/" cd ../include rm -rf asm-$2 rm -f asm mkdir asm-$2 ln -s asm-$2 asmelse cd ./include rm -f asm ln -s asm-$2 asmfirm -f asm-$2/archif [ -z "$6" -o "$6" = "NULL" ] ; then ln -s ${LNPREFIX}arch-$3 asm-$2/archelse ln -s ${LNPREFIX}arch-$6 asm-$2/archfi# create link for s3c24xx SoCif [ "$3" = "s3c24xx" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/archfi# create link for s3c64xx SoCif [ "$3" = "s3c64xx" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/archfi# create link for s5pc1xx SoCif [ "$3" = "s5pc1xx" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/archfi# create link for s5pc11x SoCif [ "$3" = "s5pc11x" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/archfi# create link for s5p64xx SoCif [ "$3" = "s5p64xx" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/archfi# create link for s5p644x SoCif [ "$3" = "s5p644x" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/archfiif [ "$2" = "arm" ] ; then rm -f asm-$2/proc ln -s ${LNPREFIX}proc-armv asm-$2/procfi# create link for s3c64xx-mp SoCif [ "$3" = "s3c64xx-mp" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/archfi
从第33行到第118行,都是在创建符号链接。为什么要创建符号链接?这些符号链接文件的存在就是整个配置过程的核心,这些符号链接文件(文件夹)的主要作用是给头文件包含等过程提供指向性连接。根本目的是让uboot具有可移植性。
uboot可移植性的实现原理:在uboot中有很多彼此平行的代码,各自属于各自不同的架构/CPU/开发板,我们在具体到一个开发板的编译时用符号连接的方式提供一个具体的名字的文件夹供编译时使用。这样就可以在配置的过程中通过不同的配置使用不同的文件,就可以正确的包含正确的文件。第一个:在include目录下创建asm文件,指向asm-arm。(46-48行)
第二个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc110第三个:在include目录下创建regs.h文件,指向include/s5pc110.h删除第二个。第四个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc11x第五个:在include/asm-arm下创建一个proc文件,指向include/asm-arm/proc-armv总结:一共创建了4个符号链接。这4个符号链接将来在写代码过程中,头文件包含时非常有用。譬如一个头文件包含可能是:#include <asm/xx.h>
注意:uboot的整个配置过程,很多文件之间是有关联的(有时候这个文件是在那个文件中创建出来的;有时候这个文件被那个文件包含进去;有时候这个文件是由那个文件的内容生成的决定的)
注意:uboot中配置和编译过程,所有的文件或者全局变量都是字符串形式的(不是指的C语言字符串的概念,指的是都是字符组成的序列)。这意味着我们整个uboot的配置过程都是字符串匹配的,所以一定要细节,注意大小写,要注意不要输错字符,因为一旦错一个最后会出现一些莫名其妙的错误,很难排查,这个是uboot移植过程中新手来说最难的地方。