录下的一个目录为当前开发板专有代码的目录。若$5(VENDOR)为空则BOARDDIR设置为$4(BOARD),否则设置为$5/$4(VENDOR/BOARD)。在这里由于$5不为空,因此BOARDDIR被设置为samsung/mini2440 。
(6)构建include/config.h文件
#
# 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
#include
#include
EOF
exit 0
这里的“cat << EOF >> config.h”表示将输入的内容追加到config.h中,直到出现“EOF”这样的标识为止。
若APPEND为no,则创建新的include/config.h文件。若APPEND为yes,则将新的配置内容追加到include/config.h文件后面。由于APPEND的值保持“no”,因此config.h被创建了,并添加了如下的内容:
/* Automatically generated - do not edit */
#define CONFIG_BOARDDIR board/samsung/mini2440
#include
#include
#include
下面总结命令make mini2440_config执行的结果(仅针对编译目标输出到源代码目录的情况):
(1) 创建到目标板相关的文件的链接
ln -s asm-arm asm
ln -s arch-s3c24x0 asm-arm/arch
ln -s proc-armv asm-arm/proc
(2) 创建include/config.mk文件,内容如下所示:
ARCH = arm
CPU = arm920t
BOARD = mini2440
VENDOR = samsung
SOC = s3c24x0
(3) 创建与目标板相关的文件include/config.h,如下所示:
/* Automatically generated - do not edit */
#define CONFIG_BOARDDIR board/samsung/mini2440
#include
#include
#include
3. make all命令执行过程
若没有执行过“make
_config”命令就直接执行“make all”命令则会出现如下的才错误信息,然后停止编译:
System not configured - see README
U-Boot是如何知道用户没有执行过“make
_config”命令的呢?
阅读U-Boot源代码就可以发现了,Makefile中有如下代码:
ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk)) # config.mk存在
all:
sinclude $(obj)include/autoconf.mk.dep
sinclude $(obj)include/autoconf.mk
… …
else # config.mk不存在
… …
@echo "System not configured - see README" >&2
@ exit 1
… …
endif # config.mk
若include/config.mk 文件存在,则$(wildcard $(obj)include/config.mk) 命令执行的结果是“$(obj)include/config.mk”展开的字符串,否则结果为空。由于include/config.mk是“make
_config”命令执行过程生成的,若从没有执行过“make
_config”命令则include/config.mk必然不存在。因此Make就执行else分支的代码,在输出“System not configured - see README”的信息后就返回了。
下面再来分析“make all”命令正常执行的过程,在Makefile中有如下代码:
(1)include/autoconf.mk生成过程
all:
sinclude $(obj)include/autoconf.mk.dep
sinclude $(obj)include/autoconf.mk
include/autoconf.mk文件中是与开发板相关的一些宏定义,在Makefile执行过程中需要根据某些宏来确定执行哪些操作。下面简要分析include/autoconf.mk生成的过程,include/autoconf.mk生成的规则如下:
$(obj)include/autoconf.mk: $(obj)include/config.h
@$(XECHO) Generating $@ ; \
set -e ; \
: Extract the config macros ; \
$(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | \
sed -n -f tools/scripts/define2mk.sed > $@.tmp && \
mv $@.tmp $@
include/autoconf.mk依赖于make
_config 命令生成的include/config.h。因此执行make
_config命令后再执行make all将更新include/autoconf.mk。
编译选项“-dM”的作用是输出include/common.h中定义的所有宏。根据上面的规则,编译器提取include/common.h中定义的宏,然后输出给tools/scripts/define2mk.sed脚本处理,处理的结果就是include/autoconf.mk文件。其中tools/scripts/define2mk.sed脚本的主要完成了在include/common.h中查找和处理以“CONFIG_”开头的宏定义的功能。
include/common.h文件包含了include/config.h文件,而include/config.h文件又包含了config_defaults.h,configs/mini2440.h,asm/config.h文件。因此include/autoconf.mk实质上就是config_defaults.h,configs/mini2440.h,asm/config.h三个文件中“CONFIG_”开头的有效的宏定义的集合。
下面接着分析Makefile的执行。
# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export ARCH CP