uboot 编译分析(一)mkconfig分析

来源:互联网 发布:outlook导入mac mail 编辑:程序博客网 时间:2024/05/29 19:33

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

===================================================================================================
可以看到
smdk2400_config :       unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t smdk2400NULL 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 NULLs3c24x0

这个地方看看原理:  这个地方由两个知识点凑起来的。

1
)变量的高级用法,变量替换引用
$
VARPATTERN=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.       

3.      # Scriptto create header filesand links to configure

4.      # U-Bootfor a specific board.

5.      #

6.      #Parameters: Target Architecture CPU Board [VENDOR][SOC]

7.      这个地方指出了脚本的参数,本次的参数依次为:smdk2410 arm arm920t smdk2400 NULLs3c24x0

8.      #

9.      #(C)2002-2006 DENX Software Engineering, WolfgangDenk <wd@denx.de>

10.  #

11.   

12.  APPEND=no    #Default: Create new config file

13.  BOARD_NAME=""    #Nameto print in make output

14.   

15.  while[ $# -gt0]; do

16.      case"$1"in

17.      --)shift; break ;;

18.      -a)shift; APPEND=yes;;

19.      -n)shift; BOARD_NAME="${1%%_config}"; shift;;

20.      *)break;;

21.      esac

22.  done

23.  这里第一个参数是 smdk_2410,所以不进入这个分支。不过需要说明一个东西,shift

24.  简要说来shift,用于把shell脚本的参数迁移。

25.  比如说,我们执行了一次shift,那么 $1 没了,$2变为$1$3变为$2。并且参数个的个数$#也跟着改变。

26.  同理,如果是shift 3,那么$4变为s$1$5变成$2。依次类推。

27.  shitf不跟参数,等于shitf 1

28.   

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

30.   

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

32.   

33.  [ $#-lt4] && exit 1

34.   

35.  [ $#-gt6] && exit 1

36.  从开始的shell注释中可以看出,我们这个脚本的参数个数为 4-6

37.  ****$#表示输入进来的参数个数,-gtgreat than)表示左边大于右边则返回真
SHELL常用内部参数:  
 $# ----传递给程序的总的参数数目
 $? ----上一个代码或者shell程序在shell中退出的情况,如果正常退出则返回0,反之为非0值。
 $* ----传递给程序的所有参数组成的字符串。
      $n ----表示第几个参数,$1表示第一个参数,$2表示第二个参数 ... 
      $0 ----当前程序的名称
      $@----"参数1" "参数2" ...形式保存所有参数
      $$ ----本程序的(进程ID)PID
      $!  ----上一个命令的PID 

38.   

39.  echo"Configuringfor ${BOARD_NAME} board..."

40.  这样语句是在执行makesmdk_config这个命令的时候,输出的唯一output

41.   

42.  #

43.  # Createlink to architecture specific headers

44.  #

45.  if["$SRCTREE"!="$OBJTREE"]; then

46.  编译uboot的时候,我们可以把编译出的内容另外放到一个指定的目录下,也可以把对应的.o文件等放到源文件目录下,这个地方是说如果不放在源文件目录下,要创建对应的目录,至于这两个变量SRCTREEOBJTREE,应该是从makefile传递过来的

47.      mkdir-p ${OBJTREE}/include

48.      mkdir-p ${OBJTREE}/include2

49.  创建两个目录

50.      cd${OBJTREE}/include2

51.      rm-f asm

52.      ln-s ${SRCTREE}/include/asm-$2 asm

53.  进入创建的第二个目录,首先删除原来已经有的文件asm,如果没有,拉倒(-f),然后在建立到源代码处的asm-arm的符号链接,这个地方的asm-$2即为 asm-arm,我们第二个参数是arm

54.      LNPREFIX="../../include2/asm/"

55.      cd../include

56.      rm-rf asm-$2

57.      rm-f asm

58.      mkdirasm-$2

59.      ln-s asm-$2 asm

60.  else

61.      cd./include

62.      rm-f asm

63.      ln-s asm-$2 asm

64.    如果是把生成的文件放在源文件所在路径,简单许多,直接创建一个符号链接,这个地方,应该是为了make的时候简单,所以在配置的时候,使用符号链接文件asm链接到实际起作用的目录。

65.  fi

66.  这个地方都是在include目录下操作

67.  rm-fasm-$2/arch

68.  LNPREFIX这个变量,在上面的第一个分支里面复制了,第二个分支没有碰,这个变量应该也是从make中传过来的。

69.  if[-z"$6"-o"$6"="NULL"]; then

70.  第六个参数长度为0,或者为NULL

71.      ln-s ${LNPREFIX}arch-$3 asm-$2/arch

72.  else

73.      ln-s ${LNPREFIX}arch-$6 asm-$2/arch

74.  fi

75.   

76.  if["$2"="arm"]; then

77.      rm-f asm-$2/proc

78.      ln-s ${LNPREFIX}proc-armvasm-$2/proc

79.  fi

80.   

81.  #

82.  # Createincludefile for Make

83.  #

84.  echo"ARCH= $2">config.mk

85.  创建一个文件

86.  echo"CPU= $3">> config.mk

87.  echo"BOARD= $4">> config.mk

88.  追加文件内容

89.   

90.  ["$5"] && ["$5"!="NULL"] &&echo"VENDOR = $5">> config.mk

91.  http://blog.sina.com.cn/s/blog_87edb13801012xte.html解释了 && 这个符号

92.   

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

94.   

95.   

96.  #

97.  # Createboard specific header file

98.  #

99.  if["$APPEND"="yes"]    # Append to existingconfig file

100.                       then

101.                           echo>> config.h

102.                       else

103.                           >config.h        # Createnew config file

104.                       fi

105.                       echo"/*Automatically generated - do not edit */">>config.h

106.                       echo"#include<configs/$1.h>">>config.h

107.                        

108.                       exit 0

 

原创粉丝点击