在顶层Makefile中可以看到如下代码:
SRCTREE := $(CURDIR)
......
MKCONFIG := $(SRCTREE)/mkconfig
......
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
假定在U-Boot-1.1.6的根目录下编译,则其中的MKCONFIG就是根目录下的mkconfig文件。$(@:_conifg=)的结果就是将“smdk2410_config”中的“_config”去掉,结果为“smdk2410”。所以就是执行如下命令:
./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
再来看看mkconfig的作用,在mkconfig文件开头第6行给出了它的用法:
06 # Parameters: Target Architecture CPU Board [VENDOR] [SOC]
下面分步骤分析mkconfig的作用。
(1)确定开发板名称BOARD_NAME,相关代码如下:
12 BOARD_NAME=“” #Name to print in make output
13
14 while [$# -gt 0] ; do
15 case "$1" in
16 --) shift ; break;;
17 -a) shift ; APPEND=yes;;
18 -n) shift ; BOARD_NAME="${1%%_config}"; shift;;
19 *) break;
20 esac
21 done
22
23 [ "${BOARD_NAME}" ] || BOARD_NAME="$1"
命令没有“--”、“-a”、“-n”等符号,所以第14~22行没做任何事情。第11/12行两个变量仍维持原值。
执行完第23行后,BOARD_NAME的值等于第一个参数,即“smdk2410”。
(2)创建到平台/开发板相关的头文件的链接
30 #
31 # Create link to architecture specifix headers
32 #
33 if [ "SRCTREE" != "$OBJTREE" ] ; then
.......
45 else
46 cd ./include
47 rm -f asm
48 lin -s asm-$2 asm
49 fi
50
继续往下看:
51 rm -f asm-$2/arch
52
53 if [ -z "$6" -o "$6" = "NULL" ] ; then
54 ln -s ${LNPREFIX}arch-$3 asm-$2/arch
55 else
56 ln -s ${LNPREFIX}arch-$6 asm-$2/arch
57 fi
58
59 if [ "$2" = "arm" ] ; then
60 rm -f asm-$2/proc
61 ln -s ${LNPREFIX}proc-armv asm-$2/proc
62 fi
63
第51行删除asm-$2/arch目录,$6为“s3c24x0”,不为空,所以第53行的条件不满足,将执行else分支。
第56行中,LNPREFIX为空,所以这个命令实际上就是“ln -s arch-$6 asm-$2/arch”, 即
“ln -s arch-s3c24x0 asm-arm/arch”。
第60/61行重新建立asm-arm/proc文件,并让它链接向proc-armv目录。
(3) 创建顶层Makefile包含的文件include/config.mk
64 #
65 # Create include file for Make
66 #
67 echo "ARCH = $2" > config.mk
68 echo "CPU = $3" >> config.mk
69 echo "BOARD = $4" >> config.mk
70
71 [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >>config.mk
72
73 [ "$6" ] $$ [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
上面几行代码创建的config.mk文件内容:
ARCH = arm
CPU = arm920t
BOARD = smdk2410
SOC = s3c24x0