开始下载了个一个最新的版本,里面没有看到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
这个脚本文件只有八十几行。从注释来看只是
点击(此处)折叠或打开
-
#!/bin/sh -e
-
-
# Script to create header files and links to configure
-
# U-Boot for a specific board.
-
#
-
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
-
# 这个地方指出了脚本的参数,本次的参数依次为:smdk2410 arm arm920t smdk2400 NULL s3c24x0
-
#
-
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
-
#
-
-
APPEND=no # Default: Create new config file
-
BOARD_NAME="" # Name to print in make output
-
-
while [ $# -gt 0 ] ; do
-
case "$1" in
-
--) shift ; break ;;
-
-a) shift ; APPEND=yes ;;
-
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
-
*) break ;;
-
esac
-
done
- 这里第一个参数是 smdk_2410,所以不进入这个分支。不过需要说明一个东西,shift:
- 简要说来shift,用于把shell脚本的参数迁移。
- 比如说,我们执行了一次shift,那么 $1 没了,$2变为$1,$3变为$2。并且参数个的个数$#也跟着改变。
- 同理,如果是shift 3,那么$4变为s$1。$5变成$2。依次类推。
- shitf 不跟参数,等于shitf 1。
-
-
$0不便,$0是本脚本的文件名字
-
-
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
-
-
[ $# -lt 4 ] && exit 1
-
-
[ $# -gt 6 ] && exit 1
- 从开始的shell注释中可以看出,我们这个脚本的参数个数为 4-6个
-
****$#表示输入进来的参数个 数,-gt(great than)表示左边大于右边则返回真
SHELL常用内部参数:
$# ----传递给程序的总的参数数目
$? ----上一个代码或者shell程序在shell中退出的情况,如果正常退出则返回0,反之为非0值。
$* ----传递给程序的所有参数组成的字符串。
$n ----表示第几个参数,$1 表示第一个参数,$2 表示第二个参数 ...
$0 ----当前程序的名称
$@----以"参数1" "参数2" ... 形式保存所有参数
$$ ----本程序的(进程ID号)PID
$! ----上一个命令的PID
-
-
echo "Configuring for ${BOARD_NAME} board..."
- 这样语句是在执行make smdk_config这个命令的时候,输出的唯一output
-
-
#
-
# Create link to architecture specific headers
-
#
-
if [ "$SRCTREE" != "$OBJTREE" ] ; then
- 编译uboot的时候,我们可以把编译出的内容另外放到一个指定的目录下,也可以把对应的.o文件等放到源文件目录下,这个地方是说如果不放在源文件目录下,要创建对应的目录,至于这两个变量SRCTREE 和OBJTREE ,应该是从makefile传递过来的
-
mkdir -p ${OBJTREE}/include
-
mkdir -p ${OBJTREE}/include2
- 创建两个目录
-
cd ${OBJTREE}/include2
-
rm -f asm
-
ln -s ${SRCTREE}/include/asm-$2 asm
- 进入创建的第二个目录,首先删除原来已经有的文件asm,如果没有,拉倒(-f),然后在建立到源代码处的asm-arm的符号链接,这个地方的asm-$2即为 asm-arm,我们第二个参数是arm
-
LNPREFIX="../../include2/asm/"
-
cd ../include
-
rm -rf asm-$2
-
rm -f asm
-
mkdir asm-$2
-
ln -s asm-$2 asm
-
else
-
cd ./include
-
rm -f asm
-
ln -s asm-$2 asm
-
如果是把生成的文件放在源文件所在路径,简单许多,直接创建一个符号链接,这个地方,应该是为了make的时候简单,所以在配置的时候,使用符号链接文件asm 链接到实际起作用的目录。
-
fi
- 这个地方都是在include目录下操作
-
rm -f asm-$2/arch
- LNPREFIX这个变量,在上面的第一个分支里面复制了,第二个分支没有碰,这个变量应该也是从make中传过来的。
-
if [ -z "$6" -o "$6" = "NULL" ] ; then
- 第六个参数长度为0,或者为NULL
-
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
-
else
-
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
-
fi
-
-
if [ "$2" = "arm" ] ; then
-
rm -f asm-$2/proc
-
ln -s ${LNPREFIX}proc-armv asm-$2/proc
-
fi
-
-
#
-
# Create include file for Make
-
#
-
echo "ARCH = $2" > config.mk
- 创建一个文件
-
echo "CPU = $3" >> config.mk
-
echo "BOARD = $4" >> config.mk
- 追加文件内容
-
-
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
-
http://blog.sina.com.cn/s/blog_87edb13801012xte.html解释了 && 这个符号
-
-
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
-
-
-
#
-
# Create board specific header file
-
#
-
if [ "$APPEND" = "yes" ] # Append to existing config file
-
then
-
echo >> config.h
-
else
-
> config.h # Create new config file
-
fi
-
echo "/* Automatically generated - do not edit */" >>config.h
-
echo "#include
" >>config.h
-
- exit 0