标签:情况 page start ibus func 重要 优先级 builds which
主Makefile位于uboot源码的根目录下,其内容主要结构为:
1. 确定版本号及主机信息(23至48行)
2. 实现静默编译功能(48至55行)
3. 设置各种路径(56至123行)
4. 设置编译工具链(124至186行,大部分在config.mk内)
5. 设置规则(187至470行)
6. 设置与cpu相关的伪目标(480至末尾)
需要注意的是,结构顺序不代表代码执行顺序
为了保证阅读的效果,请按推荐的顺序阅读源码。
| 
 1 
2 
3 
4 
5 
6 
7 
 | 
<code class="hljs makefile">VERSION = 1PATCHLEVEL = 3SUBLEVEL = 4EXTRAVERSION =U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)VERSION_FILE = $(obj)include/version_autogenerated.h</code> | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
 | 
<code class="hljs haml">HOSTARCH := $(shell uname -m | \    sed -e s/i.86/i386/ \        -e s/sun4u/sparc64/ \        -e s/arm.*/arm/ \        -e s/sa110/arm/ \        -e s/powerpc/ppc/ \        -e s/ppc64/ppc/ \        -e s/macppc/ppc/)</code> | 
| 
 1 
2 
3 
 | 
<code class="hljs bash">HOSTOS := $(shell uname -s | tr ‘[:upper:]‘ ‘[:lower:]‘ | \        sed -e ‘s/\(cygwin\).*/cygwin/‘)</code> | 
| 
 1 
 | 
<code class="hljs bash">export  HOSTARCH HOSTOS</code> | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
<code class="hljs coffeescript">########################################################################## Allow for silent buildsifeq (,$(findstring s,$(MAKEFLAGS)))XECHO = echoelseXECHO = :endif</code> | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
 | 
<code class="hljs vala">########################################################################### U-boot build supports producing a object files to the separate external# directory. Two use cases are supported:## 1) Add O= to the make command line# ‘make O=/tmp/build all‘## 2) Set environement variable BUILD_DIR to point to the desired location# ‘export BUILD_DIR=/tmp/build‘# ‘make‘## The second approach can also be used with a MAKEALL script# ‘export BUILD_DIR=/tmp/build‘# ‘./MAKEALL‘## Command line ‘O=‘ setting overrides BUILD_DIR environent variable.## When none of the above methods is used the local build is performed and# the object files are placed in the source directory.#</code> | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
<code class="hljs perl">ifdef Oifeq ("$(origin O)", "command line")BUILD_DIR := $(O)endifendififneq ($(BUILD_DIR),)saved-output := $(BUILD_DIR)</code> | 
| 
 1 
2 
 | 
<code class="hljs bash"># Attempt to create a output directory.$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})</code> | 
| 
 1 
2 
3 
4 
 | 
<code class="hljs autohotkey"># Verify if it was successful.BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))endif # ifneq ($(BUILD_DIR),)</code> | 
| 
 1 
2 
3 
4 
5 
 | 
<code class="hljs makefile">OBJTREE     := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))SRCTREE     := $(CURDIR)TOPDIR      := $(SRCTREE)LNDIR       := $(OBJTREE)export  TOPDIR SRCTREE OBJTREE</code> | 
| 
 1 
2 
3 
 | 
<code class="hljs makefile">MKCONFIG    := $(SRCTREE)/mkconfigexport MKCONFIG</code> | 
| 
 1 
2 
3 
4 
5 
 | 
<code class="hljs perl">ifneq ($(OBJTREE),$(SRCTREE))REMOTE_BUILD    := 1export REMOTE_BUILDendif</code> | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
 | 
<code class="hljs javascript"># $(obj) and (src) are defined in config.mk but here in main Makefile# we also need them before config.mk is included which is the case for# some targets like unconfig, clean, clobber, distclean, etc.ifneq ($(OBJTREE),$(SRCTREE))obj := $(OBJTREE)/src := $(SRCTREE)/elseobj :=src :=endifexport obj src</code> | 
| 
 1 
2 
3 
4 
5 
6 
 | 
<code class="hljs perl">ifeq ($(ARCH),powerpc)ARCH = ppcendififeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))</code> | 
| 
 1 
2 
3 
 | 
<code class="hljs ruby"># load ARCH, BOARD, and CPU configurationinclude $(obj)include/config.mkexport  ARCH CPU BOARD VENDOR SOC</code> | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
 | 
<code class="hljs perl">ifndef CROSS_COMPILEifeq ($(HOSTARCH),$(ARCH))CROSS_COMPILE =elseifeq ($(ARCH),ppc)CROSS_COMPILE = ppc_8xx-endififeq ($(ARCH),arm)#CROSS_COMPILE = arm-linux-#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-endififeq ($(ARCH),i386)CROSS_COMPILE = i386-linux-endififeq ($(ARCH),mips)CROSS_COMPILE = mips_4KC-endififeq ($(ARCH),nios)CROSS_COMPILE = nios-elf-endififeq ($(ARCH),nios2)CROSS_COMPILE = nios2-elf-endififeq ($(ARCH),m68k)CROSS_COMPILE = m68k-elf-endififeq ($(ARCH),microblaze)CROSS_COMPILE = mb-endififeq ($(ARCH),blackfin)CROSS_COMPILE = bfin-uclinux-endififeq ($(ARCH),avr32)CROSS_COMPILE = avr32-linux-endififeq ($(ARCH),sh)CROSS_COMPILE = sh4-linux-endififeq ($(ARCH),sparc)CROSS_COMPILE = sparc-elf-endif   # sparcendif   # HOSTARCH,ARCHendif   # CROSS_COMPILEexport  CROSS_COMPILE</code> | 
| 
 1 
2 
 | 
<code class="hljs ruby"># load other configurationinclude $(TOPDIR)/config.mk</code> | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
 | 
<code class="hljs perl">########################################################################## U-Boot objects....order is important (i.e. start must be first)OBJS  = cpu/$(CPU)/start.oifeq ($(CPU),i386)OBJS += cpu/$(CPU)/start16.oOBJS += cpu/$(CPU)/reset.oendififeq ($(CPU),ppc4xx)OBJS += cpu/$(CPU)/resetvec.oendififeq ($(CPU),mpc85xx)OBJS += cpu/$(CPU)/resetvec.oendifOBJS := $(addprefix $(obj),$(OBJS))</code> | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
 | 
<code class="hljs makefile">LIBS  = lib_generic/libgeneric.aLIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ]; then echo \    "board/$(VENDOR)/common/lib$(VENDOR).a"; fi)LIBS += cpu/$(CPU)/lib$(CPU).aifdef SOCLIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).aendififeq ($(CPU),ixp)LIBS += cpu/ixp/npe/libnpe.aendifLIBS += lib_$(ARCH)/lib$(ARCH).aLIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \    fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.aLIBS += net/libnet.aLIBS += disk/libdisk.aLIBS += drivers/bios_emulator/libatibiosemu.aLIBS += drivers/block/libblock.aLIBS += drivers/dma/libdma.aLIBS += drivers/hwmon/libhwmon.aLIBS += drivers/i2c/libi2c.aLIBS += drivers/input/libinput.aLIBS += drivers/misc/libmisc.aLIBS += drivers/mmc/libmmc.aLIBS += drivers/mtd/libmtd.aLIBS += drivers/mtd/nand/libnand.aLIBS += drivers/mtd/nand_legacy/libnand_legacy.aLIBS += drivers/mtd/onenand/libonenand.aLIBS += drivers/mtd/ubi/libubi.aLIBS += drivers/mtd/spi/libspi_flash.aLIBS += drivers/net/libnet.aLIBS += drivers/net/sk98lin/libsk98lin.aLIBS += drivers/pci/libpci.aLIBS += drivers/pcmcia/libpcmcia.aLIBS += drivers/spi/libspi.aifeq ($(CPU),mpc83xx)LIBS += drivers/qe/qe.aendififeq ($(CPU),mpc85xx)LIBS += drivers/qe/qe.aendifLIBS += drivers/rtc/librtc.aLIBS += drivers/serial/libserial.aLIBS += drivers/usb/libusb.aLIBS += drivers/video/libvideo.aLIBS += common/libcommon.aLIBS += libfdt/libfdt.aLIBS += api/libapi.aLIBS += post/libpost.aLIBS := $(addprefix $(obj),$(LIBS)).PHONY : $(LIBS) $(VERSION_FILE)LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).aLIBBOARD := $(addprefix $(obj),$(LIBBOARD))# Add GCC libPLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc</code> | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
 | 
<code class="hljs autohotkey">SUBDIRS = tools \      examples \      api_examples.PHONY : $(SUBDIRS)ifeq ($(CONFIG_NAND_U_BOOT),y)NAND_SPL = nand_splU_BOOT_NAND = $(obj)u-boot-nand.binendififeq ($(CONFIG_ONENAND_U_BOOT),y)ONENAND_IPL = onenand_bl1U_BOOT_ONENAND = $(obj)u-boot-onenand.binendif__OBJS := $(subst $(obj),,$(OBJS))__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))</code> | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
 | 
<code class="hljs coffeescript">##################################################################################################################################################ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) $(obj)u-boot.disifeq ($(ARCH),blackfin)ALL += $(obj)u-boot.ldrendifall:        $(ALL)</code> | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
 | 
<code class="hljs ruby">$(obj)u-boot.hex:   $(obj)u-boot        $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@$(obj)u-boot.srec:  $(obj)u-boot        $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@$(obj)u-boot.bin:   $(obj)u-boot        $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@$(obj)u-boot.ldr:   $(obj)u-boot        $(LDR) -T $(CONFIG_BFIN_CPU) -f -c $@ $< $(LDR_FLAGS)$(obj)u-boot.ldr.hex:   $(obj)u-boot.ldr        $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary$(obj)u-boot.ldr.srec:  $(obj)u-boot.ldr        $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary$(obj)u-boot.img:   $(obj)u-boot.bin        ./tools/mkimage -A $(ARCH) -T firmware -C none \        -a $(TEXT_BASE) -e 0 \        -n $(shell sed -n -e ‘s/.*U_BOOT_VERSION//p‘ $(VERSION_FILE) | \            sed -e ‘s/"[     ]*$$/ for $(BOARD) board"/‘) \        -d $< $@$(obj)u-boot.sha1:  $(obj)u-boot.bin        $(obj)tools/ubsha1 $(obj)u-boot.bin$(obj)u-boot.dis:   $(obj)u-boot        $(OBJDUMP) -d $< > $@$(obj)u-boot:       depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT)        UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \        sed  -n -e ‘s/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p‘|sort|uniq`;\        cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \            --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \            -Map u-boot.map -o u-boot$(OBJS):    depend $(obj)include/autoconf.mk        $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))$(LIBS):    depend $(obj)include/autoconf.mk        $(MAKE) -C $(dir $(subst $(obj),,$@))$(LIBBOARD):    depend $(LIBS) $(obj)include/autoconf.mk        $(MAKE) -C $(dir $(subst $(obj),,$@))$(SUBDIRS): depend $(obj)include/autoconf.mk        $(MAKE) -C $@ all$(LDSCRIPT):    depend $(obj)include/autoconf.mk        $(MAKE) -C $(dir $@) $(notdir $@)$(NAND_SPL):    $(VERSION_FILE)    $(obj)include/autoconf.mk        $(MAKE) -C nand_spl/board/$(BOARDDIR) all$(U_BOOT_NAND): $(NAND_SPL) $(obj)u-boot.bin $(obj)include/autoconf.mk        cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin            后面还有一大堆繁琐但不是很重要的代码,就不贴了</code> | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
 | 
<code class="hljs ruby">## Auto-generate the autoconf.mk file (which is included by all makefiles)## This target actually generates 2 files; autoconf.mk and autoconf.mk.dep.# the dep file is only include in this top level makefile to determine when# to regenerate the autoconf.mk file.$(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 $(HOST_CFLAGS) $(CPPFLAGS) \        -MQ $(obj)include/autoconf.mk include/common.h > $@$(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 > $@sinclude $(obj)include/autoconf.mk.dep</code> | 
| 
 1 
2 
3 
4 
5 
6 
 | 
<code class="hljs ruby">  #由于这些代码都与cpu本身有关,有2000多行,且功能重复,故这里挑选我们板子上的s5pv210为例子来分析,这行代码大概位于2600多行。x210_sd_config :    unconfig    @$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110    @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk</code> | 
标签:情况 page start ibus func 重要 优先级 builds which
原文地址:http://www.cnblogs.com/icefree/p/7669057.html