- 版本信息:
- u-boot-2010-06
[make smdk_2410]命令执行后,执行顶层Makefile的如下部分:
- smdk2410_config : unconfig
- @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
- $1 = smdk2410
- $2 = arm
- $3 = arm920t
- $4 = smdk2410
- $5 = samsung
- $6 = s3c24x0
- CURDIR = ./
- SRCTREE = ./
- TOPDIR = ./
- MKCONFIG= $(SRCTREE)/mkconfig
- = ./mkconfig
- BOARD_NAME = "$1"
- = smdk2410
- ARCH= arm
- OBJTREE= $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
- = ./
- LNPREFIX = 空
- BOARDDIR = $5/$4
- = samsung/smdk2410
其次,@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0实际效果是:
./mkconfig smdk2410 arm arm920t smdk2410 samsung s3c24x0
那么,就来研究下顶层目录下的mkconfig文件。
注: mkconfig文件注释符改为/* 注释内容 */
- /* Default: Create new config file */
- APPEND=no
- /* Name to print in make output */
- BOARD_NAME=""
- TARGETS=""
- /* $#: ./mkconfig smdk2410 arm arm920t smdk2410 samsung s3c24x0命令行参数的个数
- * $0 $1 $2 $3 $4 $5 $6
- * $符号总结:
- * $#: 代表后接的参数个数,以上为例这里为[6]
- * $@: 代表["$1" "$2" "$3" "$4"]之意,每个变量是独立的(用双引号括起来)
- * $*: 代表["$1c$2c$3c$4"],其中c为分割字符,默认为空格键,所以本例中代表["$1 $2 $3 $4"]
- *
- * -gt: great than; -lt: less than
- */
- while [ $# -gt 0 ] ; do
- case "$1" in
- /* shift命令:
- * 变量号码偏移功能,简单来说就是移动变量
- * 见[鸟哥的linux私房菜]
- */
- --) shift ; break ;;
- -a) shift ; APPEND=yes ;;
- -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
- -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;
- *) break ;;
- /* case条件不满足,故本循环中不做任何事 */
- esac
- done
- /* BOARD_NAME = smdk2410 */
- [ "${BOARD_NAME}" ] || BOARD_NAME="$1"
- /* 参数检查,不满足直接退出 */
- [ $# -lt 4 ] && exit 1
- [ $# -gt 6 ] && exit 1
- if [ "${ARCH}" -a "${ARCH}" != "$2" ]; then
- echo "Failed: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2
- exit 1
- fi
- echo "Configuring for ${BOARD_NAME} board..."
- /* Create link to architecture specific headers */
- if [ "$SRCTREE" != "$OBJTREE" ] ; then
- /* 在指定的${OBJTREE}目录下编译,可以保持源代码目录的干净,不执行该分支 */
- mkdir -p ${OBJTREE}/include
- mkdir -p ${OBJTREE}/include2
- cd ${OBJTREE}/include2
- rm -f asm
- ln -s ${SRCTREE}/arch/$2/include/asm asm
- LNPREFIX=${SRCTREE}/arch/$2/include/asm/
- cd ../include
- rm -f asm
- ln -s ${SRCTREE}/arch/$2/include/asm asm
- else
- cd ./include
- /* -f: 删除是不显示提示信息,对于不存在的文件,会忽略掉
- * asm: 上次配置过程中建立的连接文件
- */
- rm -f asm
- /* -s: make symbolic links instead of hard links
- * asm -> /arch/arm/include/asm
- */
- ln -s ../arch/$2/include/asm asm
- fi
- /* 即/arch/$2/include/asm/arch,为上次执行make smdk2410_config产生的连接文件,arch->arch/$2/include/asm/arch-s3c24x0 */
- rm -f asm/arch
- /* -z STRING: 判断字符串STRING是否为0,若STRING为空字符串,则为true
- * -o: or或的意思
- */
- if [ -z "$6" -o "$6" = "NULL" ] ; then
- ln -s ${LNPREFIX}arch-$3 asm/arch
- else
- /* arch->arch/arm/include/asm/arch-s3c24x0 */
- ln -s ${LNPREFIX}arch-$6 asm/arch
- fi
- if [ "$2" = "arm" ] ; then
- /* proc->arch/arm/include/asm/proc-armv */
- rm -f asm/proc
- ln -s ${LNPREFIX}proc-armv asm/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
- [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
- /* Assign board directory to BOARDIR variable */
- if [ -z "$5" -o "$5" = "NULL" ] ; then
- BOARDDIR=$4
- else
- /* BOARDDIR = samsung/smdk2410 */
- BOARDDIR=$5/$4
- fi
- /* 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
- for i in ${TARGETS} ; do
- echo "#define CONFIG_MK_${i} 1" >>config.h ;
- done
- cat << EOF >> config.h
- #define CONFIG_BOARDDIR board/$BOARDDIR
- #include <config_defaults.h>
- #include <configs/$1.h>
- #include <asm/config.h>
- EOF
- exit 0
./include/config.h文件内容:
- /* Automatically generated - do not edit */
- #define CONFIG_BOARDDIR board/samsung/smdk2410
- #include <config_defaults.h>
- #include <configs/smdk2410.h>
- #include <asm/config.h>
- ARCH = arm
- CPU = arm920t
- BOARD = smdk2410
- VENDOR = samsung
- SOC = s3c24x0
最后,总结下mkconfig文件的作用:
1、确定ARCH、CPU、BOARD等变量的值,并存到./include/config.mk文件中
2、建立板相关的 ./include/config.h文件
3、建立指向其他文件的软链接