uboot makefile分析之 make xx_config

2 篇文章 0 订阅

make mini2440_config 分析: 

Uboot第一步--make xxx_config。多么性感啊,我们就从这里开始吧···

  1. mini2440_config : unconfig  
  2.  @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 tekkamanninja s3c24x0  

朦胧才是美,此时我就要连你拨的一干二净,找到了unconfig的定义--

  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  


 

好了,清楚一点了。清楚了,但我又迷茫了,为什么我一运行 make mini2440_config就会跑到mini2440_config : unconfig 这个地方运行啊?这个问题就像 为什么一看到漂亮的女人我们就会想象她脱光衣服在床上的样子而从来不想她的脚到底有多臭 一样难解释。如果非要解释那么好吧:mini2440_config是一个伪目标,因为mini2440_config的:后面只跟着一个unconfig,而unconfig也是一个伪目标。为什么unconfig是一个伪目标呢?因为unconfig的:后面什么都没有。如果他是个变量的话 后面一定会加点什么东西,他就像make clean的clean一样,是个伪的。  如果还想问为什么?去看《跟我一起写makefile》吧?如果还有为什么,那我问你:为什么你爸是你爸?为什么你妈是你妈?为什么我不能cao你妈而你爸却可cao你妈?为什么你是你?你从何处来,又向何处去,你究竟是谁?  好了,这个问题就讨论到这里吧,世界还很美好,不能总在一个地方停留,还有很多美女需要我们去拯救,干点更有意义的事吧~~~

运行后必然会执行unconfig下的命令,就是删除那几个文件。为什么要删除那几个文件?因为后面的操作会再生成这几个文件。

接着分析

  1. @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 tekkamanninja s3c24x0  

 

需找$(MKCONFIG),功夫不负有心人,铁棒终于没有被磨成针。--

  1. MKCONFIG    := $(SRCTREE)/mkconfig  
  2. export MKCONFIG  


 

MKCONFIG就是uboot目录下的那个mkconfig这个文件。可是$(@:_config)是个问题。

没有可是,不要只有看H片时记得百度,百度一下--makefile中有个这样的表达方式:$(A:patternA=patternB)。意思就是将 A中 patternA格式的字符用patternB来代替。回归$(@:_config),@代表输入的参数,即:mini2440_config,patternA是_config,patternB是空的。说白了就是将mini2440_config的_config去掉。

这条语句就是:运行mkconfig文件,传递 6个参数。都分析到这里了,如果不继续的话那简直就是耍流氓。

 

mkconfig分析:

  1. APPEND=no    # Default: Create new config file  
  2. BOARD_NAME=""    # Name to print in make output  
  3. TARGETS=""  
  4. 定义变量,没啥鸟用。  
  5.   
  6. while [ $# -gt 0 ] ; do  
  7.     case "$1" in  
  8.     --) shift ; break ;;  
  9.     -a) shift ; APPEND=yes ;;  
  10.     -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;  
  11.     -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;  
  12.     *) break ;;  
  13.     esac  
  14. done  

$#是脚本传递的参数的个数。-gt是>的意思。 $1:第一个参数。shift:奸杀第一个参数,将第二参数变成第一个……这段代码意思 检查参数中,有无-a -n -t这样的参数,没有的话直接break。 很明显,makefile传递的6个参数,没有-a,-t,-n。直接break。

 

  1. "${BOARD_NAME}" ] || BOARD_NAME="$1"  
  2.   
  3. [ $# -lt 4 ] && exit 1  
  4. [ $# -gt 6 ] && exit 1  
  5.   
  6. if [ "${ARCH}" -a "${ARCH}" != "$2" ]; then  
  7.     echo "Failed: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2  
  8.     exit 1  
  9. fi  
  10.   
  11. echo "Configuring for ${BOARD_NAME} board..."  

这个一个简单的写法:["${BOARD_NAME}"]表示一个条件,BOARD_NAME != NULL, ||表示如果 条件为假 则运行后面的程序。 同时&&表示如果条件为真,则运行后面的程序。BOARD_NAME变量从声明开始一直是空,到这里给他赋值$1,即 BOARD_NAME = mini2440.

判断参数的个数 lt是<意思。  半段ARCH变量值是否为BULL ,-a是and的意思,并且!= $2。ARCH但是此刻ARCH应该是=NULL的, 但如果我们运行 make mini2440_defconfig ARCH=arm 这样的命令,ARCH可能就会有值了。个人感觉应该是这样的,没看过权威的资料。 阿门:求求你让我对了吧,少让咱丢点人~~

 

  1. #  
  2. # Create link to architecture specific headers  
  3. #  
  4. if [ "$SRCTREE" != "$OBJTREE" ] ; then  
  5.     mkdir -p ${OBJTREE}/include  
  6.     mkdir -p ${OBJTREE}/include2  
  7.     cd ${OBJTREE}/include2  
  8.     rm -f asm  
  9.     ln -s ${SRCTREE}/include/asm-$2 asm  
  10.     LNPREFIX="../../include2/asm/"  
  11.     cd ../include  
  12.     rm -rf asm-$2  
  13.     rm -f asm  
  14.     mkdir asm-$2  
  15.     ln -s asm-$2 asm  
  16. else  
  17.     cd ./include  
  18.     rm -f asm  
  19.     ln -s asm-$2 asm  
  20. fi  
  21.   
  22. rm -f asm-$2/arch  
  23.   
  24. if [ -z "$6" -o "$6" = "NULL" ] ; then  
  25.     ln -s ${LNPREFIX}arch-$3 asm-$2/arch  
  26. else  
  27.     ln -s ${LNPREFIX}arch-$6 asm-$2/arch  
  28. fi  
  29.   
  30. if [ "$2" = "arm" ] ; then  
  31.     rm -f asm-$2/proc  
  32.     ln -s ${LNPREFIX}proc-armv asm-$2/proc  
  33. fi  

从comment可以看出,是建立link文件。同理:是这里$SRCTREE $OBJTREE应该也是null的。所以相等,那么运行elase下语句,建立asm文件,link到asm-arm。 删除asm-arm下的arch文件,然后再建立他,--人类真是太贱了!     -z的意思是判断字符串是否为"" -o是或的意思  判断语句意思是     $6==="" 或者$6==NULL  不好意思,我们的$6==s3c24x0,那么就else吧。于是乎,在asm-arm下建立连接文件arch,link到arch-s3c24x0。arch-s3c24x0就在asm-arm下。 $LNPRERIX变量在哪?其实我也不知道, 那么只好把这个问题留给 苍空姐姐了,亚麻跌~~残缺才是美好的~!  如果是arm的话,再建立 一个link文件。

 

  1. #  
  2. # Create include file for Make  
  3. #  
  4. echo "ARCH = $2" > config.mk  
  5. echo "CPU = $3" >> config.mk  
  6. echo "BOARD = $4" >> config.mk  
  7.   
  8. "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk  
  9.   
  10. "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk  
  11.   
  12. # Assign board directory to BOARDIR variable  
  13. if [ -z "$5" -o "$5" = "NULL" ] ; then  
  14.     BOARDDIR=$4  
  15. else  
  16.     BOARDDIR=$5/$4  
  17. fi  

这上面的代码就太给力了,就像苍空姐姐一样,敢不打马赛克的女人才是真的女人。 直接看看uboot根目录下的config.mk文件就啥都明白了。另外:赋值了个BOARDDIR, 具体什么用,咱骑驴看唱本。

 

  1. #  
  2. # Create board specific header file  
  3. #  
  4. if [ "$APPEND" = "yes" ]     #Append to existing config file  
  5. then  
  6.     echo >> config.h  
  7. else  
  8.     > config.h        # Create new config file  
  9. fi  
  10. echo "/* Automatically generated - do not edit */" >>config.h  
  11.   
  12. for i in ${TARGETS} ; do  
  13.     echo "#define CONFIG_MK_${i} 1" >>config.h ;  
  14. done  
  15.   
  16. cat << EOF >> config.h  
  17. #define CONFIG_BOARDDIR board/$BOARDDIR  
  18. #include <config_defaults.h>  
  19. #include <configs/$1.h>  
  20. #include <asm/config.h>  
  21. EOF  
  22.   
  23. exit 0  

输出内容到config.h中。  > 的意思是创建一个文件,如果该文件存在则覆盖。cat << EOF 表示打印后满的内容,直到EOF结束。

 

结束:

至此,make mini2440_defconfig结束。 看一下干了点什么事: 建立了穿件了include目录下的link目录,创建confg.mk文件,创建config.h文件。

接下来就该make出场了,后面的内容更为精彩,赤裸裸的肉搏战,黄色,暴力兼而有之,搞怪,凶险一个都不少。且听下回分解~~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值