3. makeall命令執(zhí)行過程
若沒有執(zhí)行過“make《board_name》_config”命令就直接執(zhí)行“make all”命令則會(huì)出現(xiàn)如下的才錯(cuò)誤信息,然后停止編譯:
System not configured - see README
U-Boot是如何知道用戶沒有執(zhí)行過“make《board_name》_config”命令的呢?閱讀U-Boot源代碼就可以發(fā)現(xiàn)了,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) 命令執(zhí)行的結(jié)果是“$(obj)include/config.mk”展開的字符串,否則結(jié)果為空。由于include/config.mk是“make 《board_name》_config”命令執(zhí)行過程生成的,若從沒有執(zhí)行過“make 《board_name》_config”命令則include/config.mk必然不存在。因此Make就執(zhí)行else分支的代碼,在輸出“System not configured -see README”的信息后就返回了。
下面再來分析“make all”命令正常執(zhí)行的過程,在Makefile中有如下代碼:
?。?)include/autoconf.mk生成過程
all:
sinclude $(obj)include/autoconf.mk.dep
sinclude $(obj)include/autoconf.mk
include/autoconf.mk文件中是與開發(fā)板相關(guān)的一些宏定義,在Makefile執(zhí)行過程中需要根據(jù)某些宏來確定執(zhí)行哪些操作。下面簡要分析include/autoconf.mk生成的過程,include/autoconf.mk生成的規(guī)則如下:
$(obj)include/autoconf.mk:$(obj)include/config.h
@$(XECHO)Generating $@ ; \
set-e ; \
?。篍xtract 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 《board_name》_config 命令生成的include/config.h。因此執(zhí)行make 《board_name》_config命令后再執(zhí)行make all將更新include/autoconf.mk。
編譯選項(xiàng)“-dM”的作用是輸出include/common.h中定義的所有宏。根據(jù)上面的規(guī)則,編譯器提取include/common.h中定義的宏,然后輸出給tools/scripts/define2mk.sed腳本處理,處理的結(jié)果就是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實(shí)質(zhì)上就是config_defaults.h,configs/mini2440.h,asm/config.h三個(gè)文件中“CONFIG_”開頭的有效的宏定義的集合。
下面接著分析Makefile的執(zhí)行。
# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export ARCHCPU BOARD VENDOR SOC
將make mini2440_config命令生成的include/config.mk包含進(jìn)來。
# 若主機(jī)架構(gòu)與開發(fā)板結(jié)構(gòu)相同,就使用主機(jī)的編譯器,而不是交叉編譯器
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
若主機(jī)與目標(biāo)機(jī)器體系架構(gòu)相同,則使用gcc編譯器而不是交叉編譯器。
# load other configuration
include $(TOPDIR)/config.mk
最后將U-Boot頂層目錄下的config.mk文件包含進(jìn)來,該文件包含了對(duì)編譯的一些設(shè)置。下面對(duì)U-Boot頂層目錄下的config.mk文件進(jìn)行分析:
?。?)config.mk文件執(zhí)行過程
1設(shè)置obj與src
在U-Boot頂層目錄下的config.mk文件中有如下代碼:
ifneq ($(OBJTREE),$(SRCTREE))
ifeq ($(CURDIR),$(SRCTREE))
dir :=
else
dir := $(subst $(SRCTREE)/,,$(CURDIR))
endif
obj := $(if$(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/)
src := $(if$(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/)
$(shell mkdir -p $(obj))
else
obj :=
src :=
endif
由于目標(biāo)輸出到源代碼目錄下,因此執(zhí)行完上面的代碼后,src和obj都是空。
評(píng)論
查看更多