我是靠谱客的博主 不安芒果,最近开发中收集的这篇文章主要介绍深入浅析Linux下uboot之(三)-----------------------:Makefile分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Makefile 是配置整个 uboot 的关键。

VERSION = 2
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h

真正开始的是从这段代码开始,这段代码是生成uboot的版本号:

  • VERSION:主板本号
    PATCHLEVEL:次版本号
    SUBLEVEL:再次版本号
    EXTRAVERSION:另外附加的版本信息
  • include/version_autogenerated.h文件是编译过程中自动生成的一个文件,所以源目录中没有,但是编译过后的uboot中就有了。它里面的内容是一个宏定义,宏定义的值内容就是我们在Makefile中配置的uboot的版本号。

最终uboot会生成 “2.3.4Croxd”。

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/)

HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | 
	    sed -e 's/(cygwin).*/cygwin/')
  • HOSTARCH:HOST是主机,就是当前在做开发用的这台电脑就叫主机;ARCH是architecture(架构)的缩写,表示CPU的架构。所以HOSTARCH就表示主机的CPU的架构。
  • HOSTOS:主机的操作系统。
# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif
  • 静默编译:平时默认编译时命令行会打印出来很多编译信息。但是有时候我们不希望看到这些编译信息,就后台编译即可。这就叫静默编译。使用方法就是编译时make -s,-s会作为MAKEFLAGS传给Makefile,这段代码作用下XECHO变量就会被变成空(默认等于echo),于是实现了静默编译。
ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endif

ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)

# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

# 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),)

OBJTREE		:= $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE		:= $(CURDIR)
TOPDIR		:= $(SRCTREE)
LNDIR		:= $(OBJTREE)
export	TOPDIR SRCTREE OBJTREE

MKCONFIG	:= $(SRCTREE)/mkconfig
export MKCONFIG

ifneq ($(OBJTREE),$(SRCTREE))
REMOTE_BUILD	:= 1
export REMOTE_BUILD
endif

# $(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)/
else
obj :=
src :=
endif
export obj src

# Make sure CDPATH settings don't interfere
unexport CDPATH
  • 这段代码主要实现的是单独输出文件夹编译:在编译复杂项目,Makefile提供2种编译管理方法。默认情况下是当前文件夹中的.c文件,编译出来的.o文件会放在同一文件夹下。这种方式叫原地编译。另一种方法是单独输出文件夹方式的编译(linux kernel也支持,而且uboot的这种技术就是从linux kernel学习来的)。基本思路就是在编译时另外指定一个输出目录,将来所有的编译生成的.o文件或生成的其他文件全部丢到那个输出目录下去。
  • 单独输出文件夹编译方法:默认的就是原地编译。如果需要指定具体的输出目录编译则有2种方式来指定输出目录:第一种:make O=输出目录  ,第二种:export BUILD_DIR=输出目录 然后再make。如果两个都指定了(既有BUILD_DIR环境变量存在,又有O=xx),则O=xx具有更高优先级,听他的。
  • OBJTREE:编译出的.o文件存放的目录的根目录。在默认编译下,OBJTREE等于当前目录;在O=xx编译下,OBJTREE就等于我们设置的那个输出目录。
  • SRCTREE: 源码目录,其实就是源代码的根目录,也就是当前目录。
  • MKCONFIG:Makefile中定义的一个变量(在这里定义,在后面使用),它的值就是我们源码根目录下面的mkconfig。这个mkconfig是一个脚本,这个脚本就是uboot配置阶段的配置脚本。
# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export	ARCH CPU BOARD VENDOR SOC

ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = ppc_8xx-
endif
ifeq ($(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-
endif
ifeq ($(ARCH),i386)
CROSS_COMPILE = i386-linux-
endif
ifeq ($(ARCH),mips)
CROSS_COMPILE = mips_4KC-
endif
ifeq ($(ARCH),nios)
CROSS_COMPILE = nios-elf-
endif
ifeq ($(ARCH),nios2)
CROSS_COMPILE = nios2-elf-
endif
ifeq ($(ARCH),m68k)
CROSS_COMPILE = m68k-elf-
endif
ifeq ($(ARCH),microblaze)
CROSS_COMPILE = mb-
endif
ifeq ($(ARCH),blackfin)
CROSS_COMPILE = bfin-uclinux-
endif
ifeq ($(ARCH),avr32)
CROSS_COMPILE = avr32-linux-
endif
ifeq ($(ARCH),sh)
CROSS_COMPILE = sh4-linux-
endif
ifeq ($(ARCH),sparc)
CROSS_COMPILE = sparc-elf-
endif	# sparc
endif	# HOSTARCH,ARCH
endif	# CROSS_COMPILE

export	CROSS_COMPILE
  • include $(obj)include/config.mk:include/config.mk不是源码自带的(你在没有编译过的源码目录下是找不到这个文件的),要在配置过程(make x210_sd_config)中才会生成这个文件。因此这个文件的值和我们配置过程有关,是由配置过程根据我们的配置自动生成的。如:ARCH   = arm、CPU    = s5pc11x、BOARD  = x210、VENDOR = samsung
    、OC    = s5pc110 ,配置值来自于Makefile :@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
  • ARCH:定义当前编译的目标CPU的架构,它的值会影响后面的CROSS_COMPILE环境变量的值。
  • CROSS_COMPILE:定义交叉编译工具链的前缀的。CROSS_COMPILE是被ARCH所确定的,只要配置了ARCH=arm,那么我们就只能在ARM的那个分支去设置CROSS_COMPILE的值。实际运用时,我们可以在Makefile中去更改设置CROSS_COMPILE的值,也可以在编译时用make CROSS_COMPILE=xxxx来设置,而且编译时传参的方法可以覆盖Makefile里面的设置。
# load other configuration
include $(TOPDIR)/config.mk
  • 接下来是会用到当前目录下的 config.mk ,config.mk的内容如下:
  • #
    # (C) Copyright 2000-2006
    # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
    #
    # See file CREDITS for list of people who contributed to this
    # project.
    #
    # This program is free software; you can redistribute it and/or
    # modify it under the terms of the GNU General Public License as
    # published by the Free Software Foundation; either version 2 of
    # the License, or (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software
    # Foundation, Inc., 59 Temple Place, Suite 330, Boston,
    # MA 02111-1307 USA
    #
    
    #########################################################################
    
    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
    
    # clean the slate ...
    PLATFORM_RELFLAGS =
    PLATFORM_CPPFLAGS =
    PLATFORM_LDFLAGS =
    
    #
    # When cross-compiling on NetBSD, we have to define __PPC__ or else we
    # will pick up a va_list declaration that is incompatible with the
    # actual argument lists emitted by the compiler.
    #
    # [Tested on NetBSD/i386 1.5 + cross-powerpc-netbsd-1.3]
    
    ifeq ($(ARCH),ppc)
    ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
    PLATFORM_CPPFLAGS+= -D__PPC__
    endif
    ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
    PLATFORM_CPPFLAGS+= -D__PPC__
    endif
    endif
    
    ifeq ($(ARCH),arm)
    ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
    PLATFORM_CPPFLAGS+= -D__ARM__
    endif
    ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
    PLATFORM_CPPFLAGS+= -D__ARM__
    endif
    endif
    
    #########################################################################
    
    CONFIG_SHELL	:= $(shell if [ -x "$$BASH" ]; then echo $$BASH; 
    		    else if [ -x /bin/bash ]; then echo /bin/bash; 
    		    else echo sh; fi ; fi)
    
    ifeq ($(HOSTOS)-$(HOSTARCH),darwin-ppc)
    HOSTCC		= cc
    else
    HOSTCC		= gcc
    endif
    HOSTCFLAGS	= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
    HOSTSTRIP	= strip
    
    #########################################################################
    #
    # Option checker (courtesy linux kernel) to ensure
    # only supported compiler options are used
    #
    cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null 
    		> /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
    
    #
    # Include the make variables (CC, etc...)
    #
    AS	= $(CROSS_COMPILE)as
    LD	= $(CROSS_COMPILE)ld
    CC	= $(CROSS_COMPILE)gcc
    CPP	= $(CC) -E
    AR	= $(CROSS_COMPILE)ar
    NM	= $(CROSS_COMPILE)nm
    LDR	= $(CROSS_COMPILE)ldr
    STRIP	= $(CROSS_COMPILE)strip
    OBJCOPY = $(CROSS_COMPILE)objcopy
    OBJDUMP = $(CROSS_COMPILE)objdump
    RANLIB	= $(CROSS_COMPILE)RANLIB
    
    #########################################################################
    
    # Load generated board configuration
    sinclude $(OBJTREE)/include/autoconf.mk
    
    ifdef	ARCH
    sinclude $(TOPDIR)/$(ARCH)_config.mk	# include architecture dependend rules
    endif
    ifdef	CPU
    sinclude $(TOPDIR)/cpu/$(CPU)/config.mk	# include  CPU	specific rules
    endif
    ifdef	SOC
    sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk	# include  SoC	specific rules
    endif
    ifdef	VENDOR
    BOARDDIR = $(VENDOR)/$(BOARD)
    else
    BOARDDIR = $(BOARD)
    endif
    ifdef	BOARD
    sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk	# include board specific rules
    endif
    
    #########################################################################
    
    ifneq (,$(findstring s,$(MAKEFLAGS)))
    ARFLAGS = cr
    else
    ARFLAGS = crv
    endif
    RELFLAGS= $(PLATFORM_RELFLAGS)
    DBGFLAGS= -g # -DDEBUG
    OPTFLAGS= -Os #-fomit-frame-pointer
    ifndef LDSCRIPT
    #LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
    #------------------------ 1 ----------------------------
    ifeq ($(CONFIG_NAND_U_BOOT),y)
    LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
    else
    LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
    endif
    #------------------------ 1 ----------------------------
    endif
    OBJCFLAGS += --gap-fill=0xff
    
    gccincdir := $(shell $(CC) -print-file-name=include)
    
    CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS)		
    	-D__KERNEL__
    #------------------------ 2 ----------------------------
    ifneq ($(TEXT_BASE),)
    CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
    endif
    #------------------------ 2 ----------------------------
    
    ifneq ($(OBJTREE),$(SRCTREE))
    CPPFLAGS += -I$(OBJTREE)/include2 -I$(OBJTREE)/include
    endif
    
    CPPFLAGS += -I$(TOPDIR)/include
    CPPFLAGS += -fno-builtin -ffreestanding -nostdinc	
    	-isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS)
    
    ifdef BUILD_TAG
    CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes 
    	-DBUILD_TAG='"$(BUILD_TAG)"'
    else
    CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes
    endif
    
    CFLAGS += $(call cc-option,-fno-stack-protector)
    
    # avoid trigraph warnings while parsing pci.h (produced by NIOS gcc-2.9)
    # this option have to be placed behind -Wall -- that's why it is here
    ifeq ($(ARCH),nios)
    ifeq ($(findstring 2.9,$(shell $(CC) --version)),2.9)
    CFLAGS := $(CPPFLAGS) -Wall -Wno-trigraphs
    endif
    endif
    
    # $(CPPFLAGS) sets -g, which causes gcc to pass a suitable -g<format>
    # option to the assembler.
    AFLAGS_DEBUG :=
    
    # turn jbsr into jsr for m68k
    ifeq ($(ARCH),m68k)
    ifeq ($(findstring 3.4,$(shell $(CC) --version)),3.4)
    AFLAGS_DEBUG := -Wa,-gstabs,-S
    endif
    endif
    
    AFLAGS := $(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CPPFLAGS)
    
    LDFLAGS += -Bstatic -T $(LDSCRIPT) $(PLATFORM_LDFLAGS)
    ifneq ($(TEXT_BASE),)
    LDFLAGS += -Ttext $(TEXT_BASE)
    endif
    
    # Location of a usable BFD library, where we define "usable" as
    # "built for ${HOST}, supports ${TARGET}".  Sensible values are
    # - When cross-compiling: the root of the cross-environment
    # - Linux/ppc (native): /usr
    # - NetBSD/ppc (native): you lose ... (must extract these from the
    #   binutils build directory, plus the native and U-Boot include
    #   files don't like each other)
    #
    # So far, this is used only by tools/gdb/Makefile.
    
    ifeq ($(HOSTOS)-$(HOSTARCH),darwin-ppc)
    BFD_ROOT_DIR =		/usr/local/tools
    else
    ifeq ($(HOSTARCH),$(ARCH))
    # native
    BFD_ROOT_DIR =		/usr
    else
    #BFD_ROOT_DIR =		/LinuxPPC/CDK		# Linux/i386
    #BFD_ROOT_DIR =		/usr/pkg/cross		# NetBSD/i386
    BFD_ROOT_DIR =		/opt/powerpc
    endif
    endif
    
    ifeq ($(PCI_CLOCK),PCI_66M)
    CFLAGS := $(CFLAGS) -DPCI_66M
    endif
    
    #########################################################################
    
    export	CONFIG_SHELL HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE 
    	AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP 
    	MAKE
    export	TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS
    
    #########################################################################
    
    ifndef REMOTE_BUILD
    
    %.s:	%.S
    	$(CPP) $(AFLAGS) -o $@ $<
    %.o:	%.S
    	$(CC) $(AFLAGS) -c -o $@ $<
    %.o:	%.c
    	$(CC) $(CFLAGS) -c -o $@ $<
    
    else
    
    $(obj)%.s:	%.S
    	$(CPP) $(AFLAGS) -o $@ $<
    $(obj)%.o:	%.S
    	$(CC) $(AFLAGS) -c -o $@ $<
    $(obj)%.o:	%.c
    	$(CC) $(CFLAGS) -c -o $@ $<
    endif
    
    #########################################################################

     

  • 前面到107行是具体编译工具的选择。
  • sinclude $(OBJTREE)/include/autoconf.mk:autoconfig.mk文件不是源码提供的,是配置过程自动生成的。这个文件的作用就是用来指导整个uboot的编译过程。这个文件的内容其实就是很多CONFIG_开头的宏(可以理解为变量),这些宏/变量会影响我们uboot编译过程的走向(原理就是条件编译)。在uboot代码中有很多地方使用条件编译进行编写,这个条件编译是用来实现可移植性的。这个文件不是凭空产生的,配置过程也是需要原材料来产生这个文件的。原材料在源码目录的inlcude/configs/xxx.h头文件。(X210开发板中为include/configs/x210_sd.h)。这个h头文件里面全都是宏定义,这些宏定义就是我们对当前开发板的移植。每一个开发板的移植都对应这个目录下的一个头文件,这个头文件里每一个宏定义都很重要,这些配置的宏定义就是我们移植uboot的关键所在。
  • 文本中 #------------------------ 1 ----------------------------包含的是:uboot的编译链接过程的链接脚本。如果定义了CONFIG_NAND_U_BOOT宏,则链接脚本叫u-boot-nand.lds,如果未定义这个宏则链接脚本叫u-boot.lds。实际在boardsamsungx210目录下有u-boot.lds,这个就是链接脚本。我们在分析uboot的编译链接过程时就要考虑这个链接脚本。
  • 文本中 #------------------------ 2 ----------------------------包含的是:TEXT_BASE:Makefile中在配置X210开发板时,在board/samsung/x210目录下生成了一个文件config.mk,其中的内容就是:TEXT_BASE = 0xc3e00000相当于定义了一个变量。TEXT_BASE是将来我们整个uboot链接时指定的链接地址。

接下来回到我们的 Makefile,后面执行的都是目标文件的生成如。还有 unconfig 未配置的内容,用 unconfig 这个符号用来做为我们各个开发板配置目标的依赖。如:

置开发板时使用:make x210_sd_config,因此分析x210_sd_config肯定是主Makefile中的一个目标。

这里传6个参数:$(@:_config=) arm s5pc11x x210 samsung s5pc110。x210_sd_config里的_config部分用空替换,得到:x210_sd,这就是第一个参数,所以:

  • $1:    x210_sd
  • $2:    arm
  • $3:    s5pc11x
  • $4:    x210
  • $5:    samsumg
  • $6:    s5pc110

所以,$# = 6

这几个参数的值是传到和 Makefile 同目录下的 mkconfig 文件里,以下是 mkconfig 的内容:

#!/bin/sh -e

# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]
#
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
#

APPEND=no	# Default: Create new config file
BOARD_NAME=""	# Name to print in make output

while [ $# -gt 0 ] ; do
	case "$1" in
	--) shift ; break ;;
	-a) shift ; APPEND=yes ;;
	-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
	*)  break ;;
	esac
done

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"

[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1

echo "Configuring for ${BOARD_NAME} board..."

#
# Create link to architecture specific headers
#
if [ "$SRCTREE" != "$OBJTREE" ] ; then
	mkdir -p ${OBJTREE}/include
	mkdir -p ${OBJTREE}/include2
	cd ${OBJTREE}/include2
	rm -f asm
	ln -s ${SRCTREE}/include/asm-$2 asm
	LNPREFIX="../../include2/asm/"
	cd ../include
	rm -rf asm-$2
	rm -f asm
	mkdir asm-$2
	ln -s asm-$2 asm
else
	cd ./include
	rm -f asm
	ln -s asm-$2 asm
fi

rm -f asm-$2/arch

if [ -z "$6" -o "$6" = "NULL" ] ; then
	ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
	ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi

# create link for s3c24xx SoC
if [ "$3" = "s3c24xx" ] ; then
	rm -f regs.h
	ln -s $6.h regs.h
	rm -f asm-$2/arch
	ln -s arch-$3 asm-$2/arch
fi

# create link for s3c64xx SoC
if [ "$3" = "s3c64xx" ] ; then
	rm -f regs.h
	ln -s $6.h regs.h
	rm -f asm-$2/arch
	ln -s arch-$3 asm-$2/arch
fi

# create link for s5pc1xx SoC
if [ "$3" = "s5pc1xx" ] ; then
        rm -f regs.h
        ln -s $6.h regs.h
        rm -f asm-$2/arch
        ln -s arch-$3 asm-$2/arch
fi

# create link for s5pc11x SoC
if [ "$3" = "s5pc11x" ] ; then
        rm -f regs.h
        ln -s $6.h regs.h
        rm -f asm-$2/arch
        ln -s arch-$3 asm-$2/arch
fi

# create link for s5p64xx SoC
if [ "$3" = "s5p64xx" ] ; then
	rm -f regs.h
	ln -s $6.h regs.h
	rm -f asm-$2/arch
	ln -s arch-$3 asm-$2/arch
fi

# create link for s5p644x SoC
if [ "$3" = "s5p644x" ] ; then
	rm -f regs.h
	ln -s $6.h regs.h
	rm -f asm-$2/arch
	ln -s arch-$3 asm-$2/arch
fi

if [ "$2" = "arm" ] ; then
	rm -f asm-$2/proc
	ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi

# create link for s3c64xx-mp SoC
if [ "$3" = "s3c64xx-mp" ] ; then
	rm -f regs.h
	ln -s $6.h regs.h
	rm -f asm-$2/arch
	ln -s arch-$3 asm-$2/arch
fi

#
# Create include file for Make
#
echo "ARCH   = $2" >  config.mk
echo "CPU    = $3" >> config.mk
echo "BOARD  = $4" >> config.mk

[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk

[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk

#
# Create board specific header file
#
if [ "$APPEND" = "yes" ]	# Append to existing config file
then
	echo >> config.h
else
	> config.h		# Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h

exit 0
  • [ "${BOARD_NAME}" ] || BOARD_NAME="$1":看BOARD_NAME变量是否有值,如果有值就维持不变;如果无值就给他赋值为$1
  • 25、26行判断传的参数个数小于4或者大于6,就返回1,所以:mkconfig脚本传参只能是4、5、6。
  • 从第33行到第118行,都是在创建符号链接。为什么要创建符号链接?这些符号链接文件的存在就是整个配置过程的核心,这些符号链接文件(文件夹)的主要作用是给头文件包含等过程提供指向性连接。根本目的是让uboot具有可移植性
  • 第一个链接:在include目录下创建asm文件,指向asm-arm。(46-48行),第二个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc110,第三个:在include目录下创建regs.h文件,指向include/s5pc110.h,然后删除第二个,第四个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc11x,第五个:在include/asm-arm下创建一个proc文件,指向include/asm-arm/proc-armv。一共创建了4个符号链接。这4个符号链接将来在写代码过程中,头文件包含时非常有用。譬如一个头文件包含可能是:#include <asm/xx.h>
  • 123-129行:创建include/config.mk文件,是为了让主Makefile在第133行去包含的。
  • 134-141行:创建(默认情况)/追加(make -a时追加)include/config.h文件,x210_sd.h文件会被用来生成一个autoconfig.mk文件,这个文件会被主Makefile引入,指导整个编译过程。这里面的这些宏定义会影响我们对uboot中大部分.c文件中一些条件编译的选择。从而实现最终的可移植性。

以下是 Makefile 代码:

​
# (C) Copyright 2000-2008
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
#
# See file CREDITS for list of people who contributed to this
# project.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundatio; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA
#

VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h

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/)

HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | 
	    sed -e 's/(cygwin).*/cygwin/')

export	HOSTARCH HOSTOS

# Deal with colliding definitions from tcsh etc.
VENDOR=

#########################################################################
# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif

#########################################################################
#
# 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.
#

ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endif

ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)

# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

# 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),)

OBJTREE		:= $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE		:= $(CURDIR)
TOPDIR		:= $(SRCTREE)
LNDIR		:= $(OBJTREE)
export	TOPDIR SRCTREE OBJTREE

MKCONFIG	:= $(SRCTREE)/mkconfig
export MKCONFIG

ifneq ($(OBJTREE),$(SRCTREE))
REMOTE_BUILD	:= 1
export REMOTE_BUILD
endif

# $(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)/
else
obj :=
src :=
endif
export obj src

# Make sure CDPATH settings don't interfere
unexport CDPATH

#########################################################################

ifeq ($(ARCH),powerpc)
ARCH = ppc
endif

ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))

# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export	ARCH CPU BOARD VENDOR SOC

ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = ppc_8xx-
endif
ifeq ($(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-
endif
ifeq ($(ARCH),i386)
CROSS_COMPILE = i386-linux-
endif
ifeq ($(ARCH),mips)
CROSS_COMPILE = mips_4KC-
endif
ifeq ($(ARCH),nios)
CROSS_COMPILE = nios-elf-
endif
ifeq ($(ARCH),nios2)
CROSS_COMPILE = nios2-elf-
endif
ifeq ($(ARCH),m68k)
CROSS_COMPILE = m68k-elf-
endif
ifeq ($(ARCH),microblaze)
CROSS_COMPILE = mb-
endif
ifeq ($(ARCH),blackfin)
CROSS_COMPILE = bfin-uclinux-
endif
ifeq ($(ARCH),avr32)
CROSS_COMPILE = avr32-linux-
endif
ifeq ($(ARCH),sh)
CROSS_COMPILE = sh4-linux-
endif
ifeq ($(ARCH),sparc)
CROSS_COMPILE = sparc-elf-
endif	# sparc
endif	# HOSTARCH,ARCH
endif	# CROSS_COMPILE

export	CROSS_COMPILE

# load other configuration
include $(TOPDIR)/config.mk

#########################################################################
# U-Boot objects....order is important (i.e. start must be first)

OBJS  = cpu/$(CPU)/start.o
ifeq ($(CPU),i386)
OBJS += cpu/$(CPU)/start16.o
OBJS += cpu/$(CPU)/reset.o
endif
ifeq ($(CPU),ppc4xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
ifeq ($(CPU),mpc85xx)
OBJS += cpu/$(CPU)/resetvec.o
endif

OBJS := $(addprefix $(obj),$(OBJS))

LIBS  = lib_generic/libgeneric.a
LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ]; then echo 
	"board/$(VENDOR)/common/lib$(VENDOR).a"; fi)
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
ifeq ($(CPU),ixp)
LIBS += cpu/ixp/npe/libnpe.a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a 
	fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
LIBS += net/libnet.a
LIBS += disk/libdisk.a
LIBS += drivers/bios_emulator/libatibiosemu.a
LIBS += drivers/block/libblock.a
LIBS += drivers/dma/libdma.a
LIBS += drivers/hwmon/libhwmon.a
LIBS += drivers/i2c/libi2c.a
LIBS += drivers/input/libinput.a
LIBS += drivers/misc/libmisc.a
LIBS += drivers/mmc/libmmc.a
LIBS += drivers/mtd/libmtd.a
LIBS += drivers/mtd/nand/libnand.a
LIBS += drivers/mtd/nand_legacy/libnand_legacy.a
LIBS += drivers/mtd/onenand/libonenand.a
LIBS += drivers/mtd/ubi/libubi.a
LIBS += drivers/mtd/spi/libspi_flash.a
LIBS += drivers/net/libnet.a
LIBS += drivers/net/sk98lin/libsk98lin.a
LIBS += drivers/pci/libpci.a
LIBS += drivers/pcmcia/libpcmcia.a
LIBS += drivers/spi/libspi.a
ifeq ($(CPU),mpc83xx)
LIBS += drivers/qe/qe.a
endif
ifeq ($(CPU),mpc85xx)
LIBS += drivers/qe/qe.a
endif
LIBS += drivers/rtc/librtc.a
LIBS += drivers/serial/libserial.a
LIBS += drivers/usb/libusb.a
LIBS += drivers/video/libvideo.a
LIBS += common/libcommon.a
LIBS += libfdt/libfdt.a
LIBS += api/libapi.a
LIBS += post/libpost.a

LIBS := $(addprefix $(obj),$(LIBS))
.PHONY : $(LIBS) $(VERSION_FILE)

LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).a
LIBBOARD := $(addprefix $(obj),$(LIBBOARD))

# Add GCC lib
PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc

# The "tools" are needed early, so put this first
# Don't include stuff already done in $(LIBS)
SUBDIRS	= tools 
	  examples 
	  api_examples

.PHONY : $(SUBDIRS)

ifeq ($(CONFIG_NAND_U_BOOT),y)
NAND_SPL = nand_spl
U_BOOT_NAND = $(obj)u-boot-nand.bin
endif

ifeq ($(CONFIG_ONENAND_U_BOOT),y)
ONENAND_IPL = onenand_bl1
U_BOOT_ONENAND = $(obj)u-boot-onenand.bin
endif

__OBJS := $(subst $(obj),,$(OBJS))
__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))

#########################################################################
#########################################################################

ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) $(obj)u-boot.dis
ifeq ($(ARCH),blackfin)
ALL += $(obj)u-boot.ldr
endif

all:		$(ALL)

$(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_.*)/-u1/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

#$(ONENAND_IPL):	$(VERSION_FILE)	$(obj)include/autoconf.mk
#		$(MAKE) -C onenand_ipl/board/$(BOARDDIR) all
#
#$(U_BOOT_ONENAND):	$(ONENAND_IPL) $(obj)u-boot.bin $(obj)include/autoconf.mk
#		cat $(obj)onenand_ipl/onenand-ipl-2k.bin $(obj)u-boot.bin > $(obj)u-boot-onenand.bin
#		cat $(obj)onenand_ipl/onenand-ipl-4k.bin $(obj)u-boot.bin > $(obj)u-boot-flexonenand.bin

$(ONENAND_IPL):	$(VERSION_FILE)	$(obj)include/autoconf.mk
		$(MAKE) -C $(obj)onenand_bl1/$(BOARD) all

$(U_BOOT_ONENAND):	$(ONENAND_IPL) $(obj)u-boot.bin $(obj)include/autoconf.mk
		cat $(obj)onenand_bl1/$(BOARD)/BL1.bin.padding $(obj)u-boot.bin > $(U_BOOT_ONENAND)

$(VERSION_FILE):
		@( printf '#define U_BOOT_VERSION "U-Boot %s%s"n' "$(U_BOOT_VERSION)" 
		 '$(shell $(CONFIG_SHELL) $(TOPDIR)/tools/setlocalversion $(TOPDIR))' 
		 ) > $@.tmp
		@cmp -s $@ $@.tmp && rm -f $@.tmp || mv -f $@.tmp $@

gdbtools:
		$(MAKE) -C tools/gdb all || exit 1

updater:
		$(MAKE) -C tools/updater all || exit 1

env:
		$(MAKE) -C tools/env all MTD_VERSION=${MTD_VERSION} || exit 1

depend dep:	$(VERSION_FILE)
		for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir _depend ; done

TAG_SUBDIRS += include
TAG_SUBDIRS += lib_generic board/$(BOARDDIR)
TAG_SUBDIRS += cpu/$(CPU)
TAG_SUBDIRS += lib_$(ARCH)
TAG_SUBDIRS += fs/cramfs
TAG_SUBDIRS += fs/fat
TAG_SUBDIRS += fs/fdos
TAG_SUBDIRS += fs/jffs2
TAG_SUBDIRS += net
TAG_SUBDIRS += disk
TAG_SUBDIRS += common
TAG_SUBDIRS += drivers/bios_emulator
TAG_SUBDIRS += drivers/block
TAG_SUBDIRS += drivers/hwmon
TAG_SUBDIRS += drivers/i2c
TAG_SUBDIRS += drivers/input
TAG_SUBDIRS += drivers/misc
TAG_SUBDIRS += drivers/mmc
TAG_SUBDIRS += drivers/mtd
TAG_SUBDIRS += drivers/mtd/nand
TAG_SUBDIRS += drivers/mtd/nand_legacy
TAG_SUBDIRS += drivers/mtd/onenand
TAG_SUBDIRS += drivers/mtd/spi
TAG_SUBDIRS += drivers/net
TAG_SUBDIRS += drivers/net/sk98lin
TAG_SUBDIRS += drivers/pci
TAG_SUBDIRS += drivers/pcmcia
TAG_SUBDIRS += drivers/qe
TAG_SUBDIRS += drivers/rtc
TAG_SUBDIRS += drivers/serial
TAG_SUBDIRS += drivers/spi
TAG_SUBDIRS += drivers/usb
TAG_SUBDIRS += drivers/video

tags ctags:
		ctags -w -o $(obj)ctags `find $(SUBDIRS) $(TAG_SUBDIRS) 
						-name '*.[ch]' -print`

etags:
		etags -a -o $(obj)etags `find $(SUBDIRS) $(TAG_SUBDIRS) 
						-name '*.[ch]' -print`
cscope:
		find $(SUBDIRS) $(TAG_SUBDIRS) -name '*.[ch]' -print 
						> cscope.files
		cscope -b -q -k

$(obj)System.map:	$(obj)u-boot
		@$(NM) $< | 
		grep -v '(compiled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI)' | 
		sort > $(obj)System.map

#
# 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

#########################################################################
else	# !config.mk
all $(obj)u-boot.hex $(obj)u-boot.srec $(obj)u-boot.bin 
$(obj)u-boot.img $(obj)u-boot.dis $(obj)u-boot 
$(SUBDIRS) $(VERSION_FILE) gdbtools updater env depend 
dep tags ctags etags cscope $(obj)System.map:
	@echo "System not configured - see README" >&2
	@ exit 1
endif	# config.mk

.PHONY : CHANGELOG
CHANGELOG:
	git log --no-merges U-Boot-1_1_5.. | 
	unexpand -a | sed -e 's/ss*$$//' > $@

#########################################################################

unconfig:
	@rm -f $(obj)include/config.h $(obj)include/config.mk 
		$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp 
		$(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep 
		$(obj)board/$(VENDOR)/$(BOARD)/config.mk

#========================================================================
# PowerPC
#========================================================================

x210_sd_config :	unconfig
	@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
	@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk


clean:
	@rm -f $(obj)examples/82559_eeprom $(obj)examples/eepro100_eeprom 
	       $(obj)examples/hello_world  $(obj)examples/interrupt	  
	       $(obj)examples/mem_to_mem_idma2intr			  
	       $(obj)examples/sched	   $(obj)examples/smc91111_eeprom 
	       $(obj)examples/test_burst   $(obj)examples/timer
	@rm -f $(obj)tools/bmp_logo	   $(obj)tools/easylogo/easylogo  
	       $(obj)tools/env/{fw_printenv,fw_setenv}			  
	       $(obj)tools/envcrc					  
	       $(obj)tools/gdb/{astest,gdbcont,gdbsend}			  
	       $(obj)tools/gen_eth_addr    $(obj)tools/img2srec		  
	       $(obj)tools/mkimage	   $(obj)tools/mpc86x_clk	  
	       $(obj)tools/ncb		   $(obj)tools/ubsha1
	@rm -f $(obj)board/cray/L1/{bootscript.c,bootscript.image}	  
	       $(obj)board/netstar/{eeprom,crcek,crcit,*.srec,*.bin}	  
	       $(obj)board/trab/trab_fkt   $(obj)board/voiceblue/eeprom   
	       $(obj)board/{integratorap,integratorcp}/u-boot.lds	  
	       $(obj)board/{bf533-ezkit,bf533-stamp,bf537-stamp,bf561-ezkit}/u-boot.lds 
	       $(obj)cpu/blackfin/bootrom-asm-offsets.[chs]
	@rm -f $(obj)include/bmp_logo.h
	@rm -f $(obj)nand_spl/{u-boot-spl,u-boot-spl.map,System.map}
	@rm -f $(obj)onenand_ipl/onenand-{ipl,ipl.bin,ipl-2k.bin,ipl-4k.bin,ipl.map}
	@rm -f $(obj)api_examples/demo $(VERSION_FILE)
	@find $(OBJTREE) -type f 
		( -name 'core' -o -name '*.bak' -o -name '*~' 
		-o -name '*.o'	-o -name '*.a'	) -print 
		| xargs rm -f

clobber:	clean
	@find $(OBJTREE) -type f ( -name .depend 
		-o -name '*.srec' -o -name '*.bin' -o -name u-boot.img ) 
		-print0 
		| xargs -0 rm -f
	@rm -f $(OBJS) $(obj)*.bak $(obj)ctags $(obj)etags $(obj)TAGS 
		$(obj)cscope.* $(obj)*.*~
	@rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(ALL)
	@rm -f $(obj)tools/{crc32.c,environment.c,env/crc32.c,md5.c,sha1.c,inca-swap-bytes}
	@rm -f $(obj)tools/{image.c,fdt.c,fdt_ro.c,fdt_rw.c,fdt_strerror.c,zlib.h}
	@rm -f $(obj)tools/{fdt_wip.c,libfdt_internal.h}
	@rm -f $(obj)cpu/mpc824x/bedbug_603e.c
	@rm -f $(obj)include/asm/proc $(obj)include/asm/arch $(obj)include/asm
	@rm -f $(obj)include/regs.h
	@[ ! -d $(obj)nand_spl ] || find $(obj)nand_spl -lname "*" -print | xargs rm -f
	@[ ! -d $(obj)onenand_ipl ] || find $(obj)onenand_ipl -lname "*" -print | xargs rm -f
	@[ ! -d $(obj)api_examples ] || find $(obj)api_examples -lname "*" -print | xargs rm -f

ifeq ($(OBJTREE),$(SRCTREE))
mrproper 
distclean:	clobber unconfig
else
mrproper 
distclean:	clobber unconfig
	rm -rf $(obj)*
endif

backup:
	F=`basename $(TOPDIR)` ; cd .. ; 
	gtar --force-local -zcvf `date "+$$F-%Y-%m-%d-%T.tar.gz"` $$F

#########################################################################

​

 

最后

以上就是不安芒果为你收集整理的深入浅析Linux下uboot之(三)-----------------------:Makefile分析的全部内容,希望文章能够帮你解决深入浅析Linux下uboot之(三)-----------------------:Makefile分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部