Chinaunix首页 | 论坛 | 博客
  • 博客访问: 344540
  • 博文数量: 108
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 65
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-16 11:38
文章分类
文章存档

2016年(2)

2015年(44)

2014年(62)

分类: 嵌入式

2015-06-26 17:44:54

采用资料比较多的,uboot 1.1.6 。
开始下载了个一个最新的版本,里面没有看到makefile 目标:  smdk2400_config。原因:

===================================================================================================
可以看到
smdk2400_config :       unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0
这行命令,首先需要执行目标 unconfig 删除以前的配置文件,然后执行 MKCONFIG这个变量表示的一个脚本。后面的 arm ar920t等等是这个脚本的启动参数。
@ 目的是不要echo 这行命令到标准输出
$(MKCONFIG) 表示一个脚本的名字,顶层目录下的 mkconfig,这个脚本的目的是创建一些配置文件,包括头文件,符号链接,make配置文件等
$(@:_config=) arm arm920t smdk2400 NULL s3c24x0

这几个都是参数,其中第一个,解释一下
-------------------------------------------------------------------------------------------------------------------------
$(@:_config=)的意思是,将目标文件名字中含有的_config用等号后面的的字符替换掉,这里=后面为空,所以其效果就是把_config去掉,这样,make smdk2410_config实际上就是先执行unconfig的命令,再执行mkconfig  smdk2410 arm arm920t smdk2400 NULL s3c24x0

这个地方看看原理:   这个地方由两个知识点凑起来的。
1)变量的高级用法,变量替换引用
$(VAR:PATTERN=REPLACEMENT)也就是说,把变量VAR中(以空格分开的各个字符串中)的 PATTERN 变为REPLACEMENT
举个普遍的应用:
我们有一个变量objects = foo.o bar.o baz.o,那么我们想获得所有.o文件对用的.c源文件,我们这么做
$(object:.o=.c)
这个地方其实是一个简化版的patsubst函数。 至于makefile中的函数,我们这里没法展开,遇到什么看什么把。
2)$@这里是一个自动化变量。
自动化变量是makefile中模式规则的一部分内容。这个地方记住下面几个就可以:
$@ 目标文件名,他表示当前规则的目标文件。
$<当前规则的所有依赖文件列表,使用空格分开。如果依赖列表中文件有重复,它只记录一次。
$^规则的依赖文件列表中的第一个文件名。

3)总结看来,就是 $@--> $(@)-->$(@:__config=)

=================================================================================================
下面看看mkconfig这个脚本干了什么事:
http://blog.csdn.net/heaiding/article/details/6103806
这个脚本文件只有八十几行。从注释来看只是


点击(此处)折叠或打开

  1. #!/bin/sh -e

  2. # Script to create header files and links to configure
  3. # U-Boot for a specific board.
  4. #
  5. # Parameters: Target Architecture CPU Board [VENDOR] [SOC]
  6. # 这个地方指出了脚本的参数,本次的参数依次为:smdk2410 arm arm920t smdk2400 NULL s3c24x0
  7. #
  8. # (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
  9. #

  10. APPEND=no    # Default: Create new config file
  11. BOARD_NAME=""    # Name to print in make output

  12. while [ $# -gt 0 ] ; do
  13.     case "$1" in
  14.     --) shift ; break ;;
  15.     -a) shift ; APPEND=yes ;;
  16.     -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
  17.     *) break ;;
  18.     esac
  19. done
  20. 这里第一个参数是 smdk_2410,所以不进入这个分支。不过需要说明一个东西,shift:
  21. 简要说来shift,用于把shell脚本的参数迁移。
  22. 比如说,我们执行了一次shift,那么 $1 没了,$2变为$1,$3变为$2。并且参数个的个数$#也跟着改变。
  23. 同理,如果是shift 3,那么$4变为s$1。$5变成$2。依次类推。
  24. shitf 不跟参数,等于shitf 1。

  25. $0不便,$0是本脚本的文件名字

  26. [ "${BOARD_NAME}" ] || BOARD_NAME="$1"

  27. [ $# -lt 4 ] && exit 1

  28. [ $# -gt 6 ] && exit 1
  29. 从开始的shell注释中可以看出,我们这个脚本的参数个数为 4-6个
  30. ****$#表示输入进来的参数个 数,-gt(great than)表示左边大于右边则返回真
    SHELL常用内部参数:  
     $# ----传递给程序的总的参数数目
       $? ----上一个代码或者shell程序在shell中退出的情况,如果正常退出则返回0,反之为非0值。
       $* ----传递给程序的所有参数组成的字符串。
          $n ----表示第几个参数,$1 表示第一个参数,$2 表示第二个参数 ... 
          $0 ----当前程序的名称
          $@----以"参数1" "参数2" ... 形式保存所有参数
          $$ ----本程序的(进程ID号)PID
          $!  ----上一个命令的PID
     


  31. echo "Configuring for ${BOARD_NAME} board..."
  32. 这样语句是在执行make smdk_config这个命令的时候,输出的唯一output

  33. #
  34. # Create link to architecture specific headers
  35. #
  36. if [ "$SRCTREE" != "$OBJTREE" ] ; then
  37. 编译uboot的时候,我们可以把编译出的内容另外放到一个指定的目录下,也可以把对应的.o文件等放到源文件目录下,这个地方是说如果不放在源文件目录下,要创建对应的目录,至于这两个变量SRCTREE 和OBJTREE ,应该是从makefile传递过来的
  38.     mkdir -p ${OBJTREE}/include
  39.     mkdir -p ${OBJTREE}/include2
  40. 创建两个目录
  41.     cd ${OBJTREE}/include2
  42.     rm -f asm
  43.     ln -s ${SRCTREE}/include/asm-$2 asm
  44. 进入创建的第二个目录,首先删除原来已经有的文件asm,如果没有,拉倒(-f),然后在建立到源代码处的asm-arm的符号链接,这个地方的asm-$2即为 asm-arm,我们第二个参数是arm
  45.     LNPREFIX="../../include2/asm/"
  46.     cd ../include
  47.     rm -rf asm-$2
  48.     rm -f asm
  49.     mkdir asm-$2
  50.     ln -s asm-$2 asm
  51. else
  52.     cd ./include
  53.     rm -f asm
  54.     ln -s asm-$2 asm
  55.     如果是把生成的文件放在源文件所在路径,简单许多,直接创建一个符号链接,这个地方,应该是为了make的时候简单,所以在配置的时候,使用符号链接文件asm 链接到实际起作用的目录。
  56. fi
  57. 这个地方都是在include目录下操作
  58. rm -f asm-$2/arch
  59. LNPREFIX这个变量,在上面的第一个分支里面复制了,第二个分支没有碰,这个变量应该也是从make中传过来的。
  60. if [ -z "$6" -o "$6" = "NULL" ] ; then
  61. 第六个参数长度为0,或者为NULL
  62.     ln -s ${LNPREFIX}arch-$3 asm-$2/arch
  63. else
  64.     ln -s ${LNPREFIX}arch-$6 asm-$2/arch
  65. fi

  66. if [ "$2" = "arm" ] ; then
  67.     rm -f asm-$2/proc
  68.     ln -s ${LNPREFIX}proc-armv asm-$2/proc
  69. fi

  70. #
  71. # Create include file for Make
  72. #
  73. echo "ARCH = $2" > config.mk
  74. 创建一个文件
  75. echo "CPU = $3" >> config.mk
  76. echo "BOARD = $4" >> config.mk
  77. 追加文件内容

  78. [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
  79. http://blog.sina.com.cn/s/blog_87edb13801012xte.html释了 && 这个符号

  80. [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk


  81. #
  82. # Create board specific header file
  83. #
  84. if [ "$APPEND" = "yes" ]    # Append to existing config file
  85. then
  86.     echo >> config.h
  87. else
  88.     > config.h        # Create new config file
  89. fi
  90. echo "/* Automatically generated - do not edit */" >>config.h
  91. echo "#include " >>config.h

  92. exit 0












阅读(1018) | 评论(0) | 转发(0) |
0

上一篇:uboot编译全程

下一篇:Linux进程调度策略

给主人留下些什么吧!~~