采用资料比较多的,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)变量的高级用法,变量替换引用
$(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.
3. # Scriptto create header files and 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. ****$#表示输入进来的参数个数,-gt(great 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文件等放到源文件目录下,这个地方是说如果不放在源文件目录下,要创建对应的目录,至于这两个变量SRCTREE 和OBJTREE ,应该是从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. # Create includefile 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