设为首页 加入收藏

TOP

U-Boot Makefile编译(三)
2015-07-20 17:20:47 来源: 作者: 【 】 浏览:20
Tags:U-Boot Makefile 编译
录下的一个目录为当前开发板专有代码的目录。若$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

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 3/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c++中 的向量vector 下一篇LeetCode[Sort]: Maximum Gap

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·我的Linux内核学习笔 (2025-12-26 22:21:10)
·如何评价腾讯开源的 (2025-12-26 22:21:07)
·为什么TCP网络编程中 (2025-12-26 22:21:04)
·Python 数据分析与可 (2025-12-26 21:51:20)
·从零开始学Python之 (2025-12-26 21:51:17)