标签:情况 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