使用如何閱讀U-Boot的Makefile中的方法我們同樣可以獲取make_boot_compile.log.1
,下面是其中內(nèi)容的詳細(xì)解釋凉馆。
目標(biāo)autoconf.mk和autoconf.mk.dep
make[1]: Entering directory `/disk2/boot'
Generating include/autoconf.mk
Generating include/autoconf.mk.dep
make[1]: Leaving directory `/disk2/boot'
在boot/Makefile
中有
all:
sinclude $(obj)include/autoconf.mk.dep
sinclude $(obj)include/autoconf.mk
雖然boot/Makefile
中有兩個(gè)all
目標(biāo),但是在執(zhí)行make時(shí)首先會(huì)執(zhí)行第一個(gè)all
挂疆,第一個(gè)all
目標(biāo)只是說明了sinclude
兩個(gè)文件硼端,這兩個(gè)文件在下面有創(chuàng)建的規(guī)則,所以會(huì)直接執(zhí)行這兩個(gè)目標(biāo)醋安。
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/config.h
,XECHO
根據(jù)環(huán)境變量中是否有s
靜默模式賦值為echo
或者:
墓毒,:
表示注釋吓揪,CPP
為gcc -E
,表示展開宏所计,定義在config.mk
柠辞。-dM include/common.h
表示展開文件中的宏,利用腳本define2mk.sed
將宏定義轉(zhuǎn)換成CONFIG_SYS_SPI_U_BOOT_OFFS=0x20000
主胧。
include/config.h在U-boot配置時(shí)創(chuàng)建叭首。
autoconf.mk.dep
$(obj)include/autoconf.mk.dep: $(obj)include/config.h include/common.h
@$(XECHO) Generating $@ ; \
set -e ; \
: Generate the dependancies ; \
$(CC) -x c -DDO_DEPS_ONLY -M $(CFLAGS) $(CPPFLAGS) \
-MQ $(obj)include/autoconf.mk include/common.h > $@
依賴include/config.h
和include/common.h
,提取所有依賴的頭文件踪栋。
目標(biāo)all
這里的目標(biāo)all
指的是第二個(gè)
all: $(ALL-y) $(SUBDIR_EXAMPLES)
只有依賴文件焙格,沒有命令,所以只需要關(guān)注變量$(ALL-y)
和$(SUBDIR_EXAMPLES)
ALL-y
ALL-y += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)u-boot.dis $(obj)System.map
ALL-$(CONFIG_SPL) += $(obj)spl/u-boot-spl.bin
有兩種賦值形式己英,需要了解的是第二種间螟,根據(jù)宏是否定義為y
來決定ALL-y
是否包含吴旋。
u-boot.srec
繼續(xù)看make_boot_compile.log.1
文件“all”不存在损肛。
文件“u-boot.srec”不存在。
文件“u-boot”不存在荣瑟。
...
必須重新創(chuàng)建目標(biāo)“u-boot.srec”治拿。
/disk2/cross_compiler/bin/arm-buildroot-linux-uclibcgnueabi-objcopy -O srec u-boot u-boot.srec
重新創(chuàng)建目標(biāo)文件“u-boot.srec”成功。
對(duì)應(yīng)的makefile內(nèi)容是
$(obj)u-boot.srec: $(obj)u-boot
$(OBJCOPY) -O srec $< $@
u-boot[重要]
文件“u-boot”不存在笆焰。
文件“depend”不存在劫谅。
...
重新創(chuàng)建目標(biāo)文件“depend”成功。
...
cd /disk2/boot && /disk2/cross_compiler/bin/arm-buildroot-linux-uclibcgnueabi-ld -pie -T u-boot.lds -Bstatic -Ttext 0x4ff00000 arch/arm/cpu/arm920t/start.o --start-group arch/arm/cpu/arm920t/libarm920t.o arch/arm/lib/libarm.o common/libcommon.o drivers/crypto/libcrypto.o drivers/i2c/libi2c.o drivers/mtd/libmtd.o drivers/mtd/nand/libnand.o drivers/mtd/spi/libspi_flash.o drivers/net/libnet.o drivers/net/phy/libphy.o drivers/rtc/librtc.o drivers/serial/libserial.o drivers/spi/libspi.o drivers/usb/ulpi/libusb_ulpi.o lib/libfdt/libfdt.o lib/libgeneric.o lib/lzma/liblzma.o lib/lzo/liblzo.o lib/zlib/libz.o net/libnet.o board/samsung/smdk2440/libsmdk2440.o --end-group /disk2/boot/arch/arm/lib/eabi_compat.o -L /disk2/cross_compiler/cross_compiler/bin/../lib/gcc/arm-linux-gcc/4.7.2 -lgcc -Map u-boot.map -o u-boot
重新創(chuàng)建目標(biāo)文件“u-boot”成功。
對(duì)應(yīng)Makefile的代碼
GEN_UBOOT = \
cd $(LNDIR) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \
$(__OBJS) \
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot
$(obj)u-boot: depend \
$(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
$(GEN_UBOOT)
依賴文件是depend
捏检、$(SUBDIR_TOOLS)
荞驴、$(OBJS)
、$(LIBBOARD)
贯城、$(LIBS)
熊楼、$(LDSCRIPT)
和$(obj)u-boot.lds
,待這些依賴文件全部更新后執(zhí)行$(GEN_UBOOT)
能犯。
下面我們對(duì)每一個(gè)進(jìn)行分析
depend
Makefile內(nèi)容
depend dep: $(TIMESTAMP_FILE) $(VERSION_FILE) \
$(obj)include/autoconf.mk \
$(obj)include/generated/generic-asm-offsets.h \
$(obj)include/generated/asm-offsets.h
for dir in $(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR) ; do \
$(MAKE) -C $$dir _depend ; done
-
TIMESTAMP_FILE
是時(shí)間戳文件include/generated/timestamp_autogenerated.h
鲫骗; -
VERSION_FILE
是版本信息,包括boot
的版本信息踩晶、arm-linux-gcc
和arm-linux-ld
的版本信息执泰; -
include/autoconf.mk
之前已經(jīng)分析過了; -
lib/asm-offsets.c
中定義了global_data
結(jié)構(gòu)體的一些信息渡蜻,利用該文件生成lib/asm-offsets.s
术吝,再利用tools/scripts/make-asm-offsets
和lib/asm-offsets.s
生成include/generated/generic-asm-offsets.h
; - 利用
$(src)$(CPUDIR)/$(SOC)/asm-offsets.c
生成$(CPUDIR)/$(SOC)/asm-offsets.s
晴楔,不存在則該文件為空顿苇,再利用tools/scripts/make-asm-offsets
和$(CPUDIR)/$(SOC)/asm-offsets.s
生成include/generated/asm-offsets.h
; - 對(duì)
tools
税弃、arch/arm/cpu/arm920t
和/disk2/boot/board/samsung/smdk2440/
分別執(zhí)行make -C $dir _depend
纪岁,將在這些目錄下生成.depend
文件,內(nèi)容是.c
文件編譯時(shí)所依賴的頭文件则果。
$(SUBDIR_TOOLS)
在boot下面的Makefile中SUBDIR_TOOLS = tools
幔翰。
TOOLSUBDIRS =
BIN_FILES-$(CONFIG_BUILD_ENVCRC) += envcrc$(SFX)
BINS := $(addprefix $(obj),$(sort $(BIN_FILES-y)))
all: $(obj).depend $(BINS) $(LOGO-y) subdirs
$(obj)envcrc$(SFX): $(obj)crc32.o $(obj)env_embedded.o $(obj)envcrc.o $(obj)sha1.o
$(HOSTCC) $(HOSTCFLAGS) $(HOSTLDFLAGS) -o $@ $^
subdirs:
ifeq ($(TOOLSUBDIRS),)
@:
else
@for dir in $(TOOLSUBDIRS) ; do \
$(MAKE) \
HOSTOS=$(HOSTOS) \
HOSTARCH=$(HOSTARCH) \
-C $$dir || exit 1 ; \
done
endif
.depend
之前已經(jīng)更新了;BIN表示諸如envcrc
的可執(zhí)行文件西壮,在boot/rules.mk
中關(guān)于.c編譯成.o遗增;LOGO-y
表示頭文件;subdirs
表示其他需要編譯的目錄款青,這里定義是空做修。
$(HOSTOBJS): $(obj)%.o: %.c
$(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c
tool
中的可執(zhí)行文件使gcc
編譯的,也就是說這些工具是在
$(OBJS)
在boot/Makefile
中OBJS
的定義是arch/arm/cpu/arm920t/start.o
OBJS = $(CPUDIR)/start.o
OBJS := $(addprefix $(obj),$(OBJS))
$(OBJS): depend
$(MAKE) -C $(CPUDIR) $(if $(REMOTE_BUILD),$@,$(notdir $@))
執(zhí)行的命令等同于
make -C arch/arm/cpu/arm920t start.o
對(duì)應(yīng)make_boot_compile.log.1
中的內(nèi)容
文件“arch/arm/cpu/arm920t/start.o”不存在抡草。
必須重新創(chuàng)建目標(biāo)“arch/arm/cpu/arm920t/start.o”饰及。
make -C arch/arm/cpu/arm920t start.o
文件“start.o”不存在。
必須重新創(chuàng)建目標(biāo)“start.o”康震。
make[2]: Entering directory `/disk2/boot/arch/arm/cpu/arm920t'
/disk2/cross_compiler/bin/arm-linux-gcc -D__ASSEMBLY__ -g -Os -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DCONFIG_SYS_TEXT_BASE=0x4ff00000 -DCONFIG_SPL_TEXT_BASE=0x200000 -DCONFIG_SPL_PAD_TO=0 -I/disk2/boot/include -fno-builtin -ffreestanding -nostdinc -isystem /disk2/cross_compiler/cross_compiler/bin/../lib/gcc/arm-linux-gcc/4.7.2/include -pipe -DCONFIG_ARM -D__ARM__ -marm -mno-thumb-interwork -mabi=aapcs-linux -march=armv5 -o start.o start.S -c
重新創(chuàng)建目標(biāo)文件“start.o”成功燎含。
$(LIBBOARD)
LIBS-y += lib/libgeneric.o
LIBS-y += lib/lzma/liblzma.o
...
LIBS-y += $(CPUDIR)/$(SOC)/lib$(SOC).o
LIBS := $(addprefix $(obj),$(sort $(LIBS-y)))
SUBDIR_TOOLS = tools
LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).o
LIBBOARD := $(addprefix $(obj),$(LIBBOARD))
$(LIBS): depend $(SUBDIR_TOOLS)
$(MAKE) -C $(dir $(subst $(obj),,$@))
$(LIBBOARD): depend $(LIBS)
$(MAKE) -C $(dir $(subst $(obj),,$@))
依賴文件是depend
和$(LIBS)
,depend
之前已經(jīng)更新過了腿短,所以這里只需要考慮$(LIBS)
的更新屏箍。根據(jù)(LIBS)
的定義可以看出是.o文件绘梦,編譯的方法類似于
make -C arch/arm/cpu/arm920t/
LIBBOARD
的定義是board/samsung/smdk2440/libsmdk2440.o
,因此編譯的命令相當(dāng)于
make -C board/samsung/smdk2440/
$(LIBS)
之前更新$(LIBBOARD)
時(shí)已經(jīng)更新過了赴魁。
$(LDSCRIPT)
ifeq ($(wildcard $(LDSCRIPT)),)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
endif
對(duì)應(yīng)make_boot_compile.log.1
中
目標(biāo)“/disk2/boot/board/samsung/smdk2440/u-boot.lds”的前提“depend”不存在卸奉。
必須重新創(chuàng)建目標(biāo)“/disk2/boot/board/samsung/smdk2440/u-boot.lds”。
make -C /disk2/boot/board/samsung/smdk2440/ u-boot.lds
u-boot.lds
文件存在颖御,不需要更新择卦。
$(obj)u-boot.lds
在boot/Makefile
中
$(obj)u-boot.lds: $(LDSCRIPT)
$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$< >$@
對(duì)應(yīng)make_boot_compile.log.1
中
文件“u-boot.lds”不存在。
必須重新創(chuàng)建目標(biāo)“u-boot.lds”郎嫁。
/disk2/cross_compiler/bin/arm-linux-gcc -E -g -Os -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DCONFIG_SYS_TEXT_BASE=0x4ff00000 -DCONFIG_SPL_TEXT_BASE=0x200000 -DCONFIG_SPL_PAD_TO=0 -I/disk2/boot/include -fno-builtin -ffreestanding -nostdinc -isystem /disk2/cross_compiler/cross_compiler/bin/../lib/gcc/arm-linux-gcc/4.7.2/include -pipe -DCONFIG_ARM -D__ARM__ -marm -mno-thumb-interwork -mabi=aapcs-linux -march=armv5 -include /disk2/boot/include/u-boot/u-boot.lds.h -DCPUDIR=arch/arm/cpu/arm920t -ansi -D__ASSEMBLY__ -P - </disk2/boot/board/samsung/smdk2440/u-boot.lds >u-boot.lds
重新創(chuàng)建目標(biāo)文件“u-boot.lds”成功秉继。
u-boot.bin
文件“u-boot.bin”不存在。
必須重新創(chuàng)建目標(biāo)“u-boot.bin”泽铛。
/disk2/cross_compiler/bin/arm-buildroot-linux-uclibcgnueabi-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
重新創(chuàng)建目標(biāo)文件“u-boot.bin”成功尚辑。
對(duì)應(yīng)的makefile內(nèi)容是
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
$(BOARD_SIZE_CHECK)
u-boot.bin
用于燒寫。
u-boot.dis
文件“u-boot.dis”不存在盔腔。
必須重新創(chuàng)建目標(biāo)“u-boot.dis”杠茬。
/disk2/cross_compiler/bin/arm-buildroot-linux-uclibcgnueabi-objdump -d u-boot > u-boot.dis
重新創(chuàng)建目標(biāo)文件“u-boot.dis”成功。
對(duì)應(yīng)的makefile內(nèi)容是
$(obj)u-boot.dis: $(obj)u-boot
$(OBJDUMP) -d $< > $@
反匯編u-boot弛随,u-boot.dis
一般用于定位問題瓢喉。
System.map
文件“System.map”不存在。
必須重新創(chuàng)建目標(biāo)“System.map”舀透。
重新創(chuàng)建目標(biāo)文件“System.map”成功栓票。
對(duì)應(yīng)的makefile內(nèi)容是
SYSTEM_MAP = \
$(NM) $1 | \
grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
LC_ALL=C sort
$(obj)System.map: $(obj)u-boot
@$(call SYSTEM_MAP,$<) > $(obj)System.map
依賴文件u-boot
,命令是$(call SYSTEM_MAP,$<) > $(obj)System.map
愕够,等同于
$(CROSS_COMPILE)nm u-boot | \
grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
LC_ALL=C sort > System.map
生成符號(hào)表System.map
走贪。
spl/u-boot-spl.bin
$(obj)spl/u-boot-spl.bin: $(SUBDIR_TOOLS) depend
$(MAKE) -C spl all
SUBDIR_EXAMPLES
例子所在的文件夾,可以直接注釋掉
SUBDIR_EXAMPLES = examples/standalone examples/api