3. makeall命令執行過程
若沒有執行過“make《board_name》_config”命令就直接執行“make all”命令則會出現如下的才錯誤信息,然后停止編譯:
System not configured - see README
U-Boot是如何知道用戶沒有執行過“make《board_name》_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 《board_name》_config”命令執行過程生成的,若從沒有執行過“make 《board_name》_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 《board_name》_config 命令生成的include/config.h。因此執行make 《board_name》_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 ARCHCPU BOARD VENDOR SOC
將make mini2440_config命令生成的include/config.mk包含進來。
# 若主機架構與開發板結構相同,就使用主機的編譯器,而不是交叉編譯器
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
若主機與目標機器體系架構相同,則使用gcc編譯器而不是交叉編譯器。
# load other configuration
include $(TOPDIR)/config.mk
最后將U-Boot頂層目錄下的config.mk文件包含進來,該文件包含了對編譯的一些設置。下面對U-Boot頂層目錄下的config.mk文件進行分析:
(2)config.mk文件執行過程
1設置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
由于目標輸出到源代碼目錄下,因此執行完上面的代碼后,src和obj都是空。
評論
查看更多