u-boot的Makefile分析之mkconfig

版本信息:
u-boot-2010-06

[make smdk_2410]命令执行后,执行顶层Makefile的如下部分:

smdk2410_config	:	unconfig
	@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0

首先,确定下变量的值,这里以SMDK2410板为例:

$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]
 * [email protected]: 代表["$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

/* ./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>

exit 0

./include/config.mk文件内容:

注:此处hao2440为smdk2410

时间: 2024-11-08 03:48:53

u-boot的Makefile分析之mkconfig的相关文章

u-boot的Makefile分析

由顶层Makefile文件,梳理U-Boot的编译流程. 小技巧: 在大型Makefile中,很多时候需要确定某个变量的值,一个小方法就是: $(shell echo "VARIABLE0_VAL = $(VARIABLE0_VAL)" > v_file.txt ) $(shell echo "VARIABLE1_VAL = $(VARIABLE1_VAL)" >> v_file.txt ) 1.首先,确定make过程中需要的变量(Makefile

uboot移植之makefile分析

/* Name:uboot之makefile分析 Data:2015-3-3 Author:suj_un */ Uboot之makefile分析 编译uboot,内核或者其他软件只需要执行make命令就可以生成可执行文件.执行命令后是怎么工作的?要知道这个就要看makefile了.现在就来揭开这玩意神秘的面纱.其中会粘一些代码段来分析... VERSION = 2010 PATCHLEVEL = 03 SUBLEVEL = EXTRAVERSION = ifneq "$(SUBLEVEL)&qu

uboot主Makefile分析(t配置和编译过程详解)

1.编译uboot前需要三次make make distcleanmake x210_sd_configmake -j4 make distclean为清楚dist文件. make x210_sd_config  跳转执行mkconfig用来配置并生成config.mk(board/samsung/x210目录下为指定链接地址的与主uboot目录的config.mk不同) autuconfig.mk 2.框图 3.uboot主Makefile分析 3.1.uboot version确定(Make

Tiny4412 uboot Makefile 分析

* Build uboot a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好 环境变量PATH,保证可以正常使用.b) 解压 uboot_tiny4412-20130729.tgz 并进入相应的目录 tar xzf uboot_tiny4412-20130729.tgzc) 配置 uboot 并编译 cd uboot_tiny4412 make tiny4412_config maked) 编译 用于生成bl2 的工具 m

嵌入式 Linux开发Kernel移植(三)——Kernel工程Makefile分析

嵌入式 Linux开发Kernel移植(三)--Kernel工程Makefile分析 本文选择三星发布的基于SMDKV210开发板的linux 2.6.35.7版本kernel. 一.Kernel Makefle体系简介 1.Kernel Makefile体系组成 Kernel Makefile体系包含Kconfig和Kbuild两个系统. Kconfig系统 Kconfig 对应的是内核配置阶段,make xxconfig就是在使用Kconfig系统.Kconfig由三部分组成: script

nova boot代码流程分析(三):nova与neutron的交互(2)

继续<nova boot代码流程分析(三):nova与neutron的交互(1)>的分析. #/nova/virt/libvirt/driver.py:LibvirtDriver # NOTE(ilyaalekseyev): Implementation like in multinics # for xenapi(tr3buchet) def spawn(self, context, instance, image_meta, injected_files, admin_password,

nova boot代码流程分析(五):VM启动从neutron-dhcp-agent获取IP与MAC

1.   network和subnet创建代码流程 [[email protected] ~(keystone_user1)]# neutron net-create demo-net [[email protected] ~(keystone_user1)]# neutron subnet-create  demo-net 1.1.1.0/24 --name demo-subnet --gateway 1.1.1.1 --enable_dhcp true 这里,我们主要分析上面两个命令的代码流

MIT OS lab Makefile 分析

lab1 中的Makefile主要是根目录下的GNUMakefile, kern/Makefrag, boot/Makefrag, 后两者通过include直接包含到GNUMakefile中. 1 # 2 # This makefile system follows the structuring conventions 3 # recommended by Peter Miller in his excellent paper: 4 # 5 # Recursive Make Considere

Uboot 2014.07 makefile分析 - 其他Cortex系列

uboot的官网可以通过谷歌搜索得到,显示结果第一个链接就是. 官网:: http://www.denx.de/wiki/U-Boot ftp下载: ftp://ftp.denx.de/pub/u-boot/ 本文以uboot 2014.07为例,一般第一步总是类似这样: make smdkc100_config 然后执行make 先看Makefile第481 行 %_config:: outputmakefile @$(MKCONFIG) -A $(@:_config=) 当输入make sm