Skip to content
Snippets Groups Projects
Makefile 47.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • Tom Rini's avatar
    Tom Rini committed
    VERSION = 2015
    PATCHLEVEL = 01
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    SUBLEVEL =
    
    Tom Rini's avatar
    Tom Rini committed
    EXTRAVERSION = -rc4
    
    # *DOCUMENTATION*
    # To see a list of typical targets execute "make help"
    # More info can be located in ./README
    # Comments in this file are targeted only to the developer, do not
    # expect to learn how to build the kernel reading this file.
    
    
    # Do not use make's built-in rules and variables
    # (this increases performance and avoids hard-to-debug behaviour);
    MAKEFLAGS += -rR
    
    
    # Avoid funny character set dependencies
    unexport LC_ALL
    LC_COLLATE=C
    LC_NUMERIC=C
    export LC_COLLATE LC_NUMERIC
    
    
    # Avoid interference with shell env settings
    unexport GREP_OPTIONS
    
    
    # We are using a recursive build, so we need to do a little thinking
    # to get the ordering right.
    #
    # Most importantly: sub-Makefiles should only ever modify files in
    # their own directory. If in some directory we have a dependency on
    # a file in another dir (which doesn't happen often, but it's often
    # unavoidable when linking the built-in.o targets which finally
    # turn into vmlinux), we will call a sub make in that other dir, and
    # after that we are sure that everything which is in that other dir
    # is now up to date.
    #
    # The only cases where we need to modify files which have global
    # effects are thus separated out and done before the recursive
    # descending is started. They are now explicitly listed as the
    # prepare rule.
    
    
    # Beautify output
    # ---------------------------------------------------------------------------
    #
    # Normally, we echo the whole command before executing it. By making
    # that echo $($(quiet)$(cmd)), we now have the possibility to set
    # $(quiet) to choose other forms of output instead, e.g.
    #
    #         quiet_cmd_cc_o_c = Compiling $(RELDIR)/$@
    #         cmd_cc_o_c       = $(CC) $(c_flags) -c -o $@ $<
    #
    # If $(quiet) is empty, the whole command will be printed.
    # If it is set to "quiet_", only the short version will be printed.
    # If it is set to "silent_", nothing will be printed at all, since
    # the variable $(silent_cmd_cc_o_c) doesn't exist.
    #
    # A simple variant is to prefix commands with $(Q) - that's useful
    # for commands that shall be hidden in non-verbose mode.
    #
    #	$(Q)ln $@ :<
    #
    # If KBUILD_VERBOSE equals 0 then the above command will be hidden.
    # If KBUILD_VERBOSE equals 1 then the above command is displayed.
    #
    
    # To put more focus on warnings, be less verbose as default
    # Use 'make V=1' to see the full commands
    
    ifeq ("$(origin V)", "command line")
      KBUILD_VERBOSE = $(V)
    endif
    ifndef KBUILD_VERBOSE
      KBUILD_VERBOSE = 0
    endif
    
    
    ifeq ($(KBUILD_VERBOSE),1)
      quiet =
      Q =
    else
      quiet=quiet_
      Q = @
    endif
    
    # If the user is running make -s (silent mode), suppress echoing of
    # commands
    
    ifneq ($(filter 4.%,$(MAKE_VERSION)),)	# make-4
    ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)
      quiet=silent_
    
    else					# make-3.8x
    ifneq ($(filter s% -s%,$(MAKEFLAGS)),)
      quiet=silent_
    
    export quiet Q KBUILD_VERBOSE
    
    # kbuild supports saving output files in a separate directory.
    # To locate output files in a separate directory two syntaxes are supported.
    # In both cases the working directory must be the root of the kernel src.
    # 1) O=
    # Use "make O=dir/to/store/output/files/"
    
    # 2) Set KBUILD_OUTPUT
    # Set the environment variable KBUILD_OUTPUT to point to the directory
    # where the output files shall be placed.
    # export KBUILD_OUTPUT=dir/to/store/output/files/
    # make
    
    # The O= assignment takes precedence over the KBUILD_OUTPUT environment
    # variable.
    
    # KBUILD_SRC is set on invocation of make in OBJ directory
    # KBUILD_SRC is not intended to be used by the regular user (for now)
    ifeq ($(KBUILD_SRC),)
    
    # OK, Make called in directory where kernel src resides
    # Do we want to locate output files in a separate directory?
    
    ifeq ("$(origin O)", "command line")
    
      KBUILD_OUTPUT := $(O)
    endif
    
    # That's our default target when none is given on the command line
    PHONY := _all
    _all:
    
    # Cancel implicit rules on top Makefile
    $(CURDIR)/Makefile Makefile: ;
    
    ifneq ($(KBUILD_OUTPUT),)
    # Invoke a second make in the output directory, passing relevant variables
    # check that the output directory actually exists
    saved-output := $(KBUILD_OUTPUT)
    
    KBUILD_OUTPUT := $(shell mkdir -p $(KBUILD_OUTPUT) && cd $(KBUILD_OUTPUT) \
    								&& /bin/pwd)
    
    $(if $(KBUILD_OUTPUT),, \
    
         $(error failed to create output directory "$(saved-output)"))
    
    
    PHONY += $(MAKECMDGOALS) sub-make
    
    $(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
    	@:
    
    sub-make: FORCE
    
    	$(Q)$(MAKE) -C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR) \
    	-f $(CURDIR)/Makefile $(filter-out _all sub-make,$(MAKECMDGOALS))
    
    
    # Leave processing to above invocation of make
    skip-makefile := 1
    endif # ifneq ($(KBUILD_OUTPUT),)
    endif # ifeq ($(KBUILD_SRC),)
    
    # We process the rest of the Makefile if this is the final invocation of make
    ifeq ($(skip-makefile),)
    
    
    # Do not print "Entering directory ...",
    # but we want to display it when entering to the output directory
    # so that IDEs/editors are able to understand relative filenames.
    MAKEFLAGS += --no-print-directory
    
    # Call a source code checker (by default, "sparse") as part of the
    # C compilation.
    #
    # Use 'make C=1' to enable checking of only re-compiled files.
    # Use 'make C=2' to enable checking of *all* source files, regardless
    # of whether they are re-compiled or not.
    #
    # See the file "Documentation/sparse.txt" for more details, including
    # where to get the "sparse" utility.
    
    ifeq ("$(origin C)", "command line")
      KBUILD_CHECKSRC = $(C)
    endif
    ifndef KBUILD_CHECKSRC
      KBUILD_CHECKSRC = 0
    endif
    
    # Use make M=dir to specify directory of external module to build
    # Old syntax make ... SUBDIRS=$PWD is still supported
    # Setting the environment variable KBUILD_EXTMOD take precedence
    ifdef SUBDIRS
      KBUILD_EXTMOD ?= $(SUBDIRS)
    endif
    
    ifeq ("$(origin M)", "command line")
      KBUILD_EXTMOD := $(M)
    endif
    
    
    # If building an external module we do not care about the all: rule
    # but instead _all depend on modules
    
    PHONY += all
    
    ifeq ($(KBUILD_EXTMOD),)
    
    _all: all
    
    _all: modules
    
    ifeq ($(KBUILD_SRC),)
            # building in the source tree
            srctree := .
    else
            ifeq ($(KBUILD_SRC)/,$(dir $(CURDIR)))
                    # building in a subdirectory of the source tree
                    srctree := ..
            else
                    srctree := $(KBUILD_SRC)
            endif
    endif
    objtree		:= .
    
    src		:= $(srctree)
    obj		:= $(objtree)
    
    VPATH		:= $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
    
    export srctree objtree VPATH
    
    
    # Make sure CDPATH settings don't interfere
    unexport CDPATH
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #########################################################################
    
    HOSTARCH := $(shell uname -m | \
    
    Graeme Russ's avatar
    Graeme Russ committed
    	sed -e s/i.86/x86/ \
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	    -e s/sun4u/sparc64/ \
    	    -e s/arm.*/arm/ \
    	    -e s/sa110/arm/ \
    
    	    -e s/ppc64/powerpc/ \
    	    -e s/ppc/powerpc/ \
    
    	    -e s/macppc/powerpc/\
    	    -e s/sh.*/sh/)
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	    sed -e 's/\(cygwin\).*/cygwin/')
    
    
    export	HOSTARCH HOSTOS
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    #########################################################################
    
    # set default to nothing for native builds
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    ifeq ($(HOSTARCH),$(ARCH))
    
    CROSS_COMPILE ?=
    
    KCONFIG_CONFIG	?= .config
    export KCONFIG_CONFIG
    
    
    # SHELL used by kbuild
    CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
    	  else if [ -x /bin/bash ]; then echo /bin/bash; \
    	  else echo sh; fi ; fi)
    
    
    HOSTCC       = cc
    HOSTCXX      = c++
    
    HOSTCFLAGS   = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
    
    ifeq ($(HOSTOS),cygwin)
    HOSTCFLAGS	+= -ansi
    endif
    
    # Mac OS X / Darwin's C preprocessor is Apple specific.  It
    # generates numerous errors and warnings.  We want to bypass it
    # and use GNU C's cpp.	To do this we pass the -traditional-cpp
    # option to the compiler.  Note that the -traditional-cpp flag
    # DOES NOT have the same semantics as GNU C's flag, all it does
    # is invoke the GNU preprocessor in stock ANSI/ISO C fashion.
    
    # Apple's linker is similar, thanks to the new 2 stage linking
    # multiple symbol definitions are treated as errors, hence the
    # -multiply_defined suppress option to turn off this error.
    
    ifeq ($(HOSTOS),darwin)
    # get major and minor product version (e.g. '10' and '6' for Snow Leopard)
    DARWIN_MAJOR_VERSION	= $(shell sw_vers -productVersion | cut -f 1 -d '.')
    DARWIN_MINOR_VERSION	= $(shell sw_vers -productVersion | cut -f 2 -d '.')
    
    os_x_before	= $(shell if [ $(DARWIN_MAJOR_VERSION) -le $(1) -a \
    	$(DARWIN_MINOR_VERSION) -le $(2) ] ; then echo "$(3)"; else echo "$(4)"; fi ;)
    
    # Snow Leopards build environment has no longer restrictions as described above
    HOSTCC       = $(call os_x_before, 10, 5, "cc", "gcc")
    HOSTCFLAGS  += $(call os_x_before, 10, 4, "-traditional-cpp")
    HOSTLDFLAGS += $(call os_x_before, 10, 5, "-multiply_defined suppress")
    endif
    
    
    # Decide whether to build built-in, modular, or both.
    # Normally, just do built-in.
    
    KBUILD_MODULES :=
    KBUILD_BUILTIN := 1
    
    
    # If we have only "make modules", don't compile built-in objects.
    # When we're building modules with modversions, we need to consider
    # the built-in objects during the descend as well, in order to
    # make sure the checksums are up to date before we record them.
    
    
    ifeq ($(MAKECMDGOALS),modules)
      KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
    endif
    
    
    # If we have "make <whatever> modules", compile modules
    # in addition to whatever we do anyway.
    # Just "make" or "make all" shall build modules as well
    
    
    # U-Boot does not need modules
    #ifneq ($(filter all _all modules,$(MAKECMDGOALS)),)
    #  KBUILD_MODULES := 1
    #endif
    
    #ifeq ($(MAKECMDGOALS),)
    #  KBUILD_MODULES := 1
    #endif
    
    export KBUILD_MODULES KBUILD_BUILTIN
    export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD
    
    
    # Look for make include files relative to root of kernel src
    MAKEFLAGS += --include-dir=$(srctree)
    
    # We need some generic definitions (do not try to remake the file).
    $(srctree)/scripts/Kbuild.include: ;
    include $(srctree)/scripts/Kbuild.include
    
    # Make variables (CC, etc...)
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    AS		= $(CROSS_COMPILE)as
    # Always use GNU ld
    ifneq ($(shell $(CROSS_COMPILE)ld.bfd -v 2> /dev/null),)
    LD		= $(CROSS_COMPILE)ld.bfd
    
    LD		= $(CROSS_COMPILE)ld
    endif
    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
    AWK		= awk
    
    PERL		= perl
    
    PYTHON		= python
    
    DTC		= dtc
    CHECK		= sparse
    
    CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
    		  -Wbitwise -Wno-return-void -D__CHECK_ENDIAN__ $(CF)
    
    
    KBUILD_CPPFLAGS := -D__KERNEL__ -D__UBOOT__
    
    
    KBUILD_CFLAGS   := -Wall -Wstrict-prototypes \
    		   -Wno-format-security \
    		   -fno-builtin -ffreestanding
    KBUILD_AFLAGS   := -D__ASSEMBLY__
    
    
    # Read UBOOTRELEASE from include/config/uboot.release (if it exists)
    UBOOTRELEASE = $(shell cat include/config/uboot.release 2> /dev/null)
    UBOOTVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
    
    export VERSION PATCHLEVEL SUBLEVEL UBOOTRELEASE UBOOTVERSION
    
    export ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR
    
    export CONFIG_SHELL HOSTCC HOSTCFLAGS HOSTLDFLAGS CROSS_COMPILE AS LD CC
    export CPP AR NM LDR STRIP OBJCOPY OBJDUMP
    
    export MAKE AWK PERL PYTHON
    
    export HOSTCXX HOSTCXXFLAGS DTC CHECK CHECKFLAGS
    
    export KBUILD_CPPFLAGS NOSTDINC_FLAGS UBOOTINCLUDE OBJCOPYFLAGS LDFLAGS
    
    export KBUILD_CFLAGS KBUILD_AFLAGS
    
    
    # When compiling out-of-tree modules, put MODVERDIR in the module
    # tree rather than in the kernel tree. The kernel tree might
    # even be read-only.
    export MODVERDIR := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_versions
    
    # Files to ignore in find ... statements
    
    
    export RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o    \
    			  -name CVS -o -name .pc -o -name .hg -o -name .git \) \
    			  -prune -o
    
    export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
    			 --exclude CVS --exclude .pc --exclude .hg --exclude .git
    
    # ===========================================================================
    # Rules shared between *config targets and build targets
    
    # Basic helpers built in scripts/
    PHONY += scripts_basic
    scripts_basic:
    	$(Q)$(MAKE) $(build)=scripts/basic
    	$(Q)rm -f .tmp_quiet_recordmcount
    
    # To avoid any implicit rule to kick in, define an empty command.
    scripts/basic/%: scripts_basic ;
    
    
    PHONY += outputmakefile
    # outputmakefile generates a Makefile in the output directory, if using a
    # separate output directory. This allows convenient use of make in the
    # output directory.
    outputmakefile:
    ifneq ($(KBUILD_SRC),)
    	$(Q)ln -fsn $(srctree) source
    	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
    	    $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
    
    # To make sure we do not include .config for any of the *config targets
    # catch them early, and hand them over to scripts/kconfig/Makefile
    # It is allowed to specify more targets when calling make, including
    # mixing *config targets and build targets.
    # For example 'make oldconfig all'.
    # Detect when mixed targets is specified, and make a second invocation
    # of make so .config is not included in this case either (for *config).
    
    
    version_h := include/generated/version_autogenerated.h
    timestamp_h := include/generated/timestamp_autogenerated.h
    
    
    no-dot-config-targets := clean clobber mrproper distclean \
    
    			 help %docs check% coccicheck \
    
    			 ubootversion backup
    
    
    config-targets := 0
    mixed-targets  := 0
    dot-config     := 1
    
    ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
    	ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
    		dot-config := 0
    	endif
    endif
    
    ifeq ($(KBUILD_EXTMOD),)
            ifneq ($(filter config %config,$(MAKECMDGOALS)),)
                    config-targets := 1
                    ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
                            mixed-targets := 1
                    endif
            endif
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    ifeq ($(mixed-targets),1)
    # ===========================================================================
    # We're called with mixed targets (*config and build targets).
    # Handle them one by one.
    
    PHONY += $(MAKECMDGOALS) __build_one_by_one
    
    $(filter-out __build_one_by_one, $(MAKECMDGOALS)): __build_one_by_one
    
    	$(Q)set -e; \
    	for i in $(MAKECMDGOALS); do \
    		$(MAKE) -f $(srctree)/Makefile $$i; \
    	done
    
    else
    ifeq ($(config-targets),1)
    # ===========================================================================
    # *config targets only - make sure prerequisites are updated, and descend
    # in scripts/kconfig to make the *config target
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    KBUILD_DEFCONFIG := sandbox_defconfig
    export KBUILD_DEFCONFIG KBUILD_KCONFIG
    
    config: scripts_basic outputmakefile FORCE
    
    	+$(Q)$(CONFIG_SHELL) $(srctree)/scripts/multiconfig.sh $@
    
    
    %config: scripts_basic outputmakefile FORCE
    
    	+$(Q)$(CONFIG_SHELL) $(srctree)/scripts/multiconfig.sh $@
    
    else
    # ===========================================================================
    # Build targets only - this includes vmlinux, arch specific targets, clean
    # targets and others. In general all targets except *config targets.
    
    ifeq ($(dot-config),1)
    # Read in config
    
    -include include/config/auto.conf
    
    # Read in dependencies to all Kconfig* files, make sure to run
    # oldconfig if changes are detected.
    -include include/config/auto.conf.cmd
    
    # To avoid any implicit rule to kick in, define an empty command
    $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;
    
    # If .config is newer than include/config/auto.conf, someone tinkered
    # with it and forgot to run make oldconfig.
    # if auto.conf.cmd is missing then we are probably in a cleaned tree so
    # we execute the config step to be sure to catch updated Kconfig files
    include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
    	$(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
    
    
    -include include/autoconf.mk
    -include include/autoconf.mk.dep
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    # We want to include arch/$(ARCH)/config.mk only when include/config/auto.conf
    # is up-to-date. When we switch to a different board configuration, old CONFIG
    # macros are still remaining in include/config/auto.conf. Without the following
    # gimmick, wrong config.mk would be included leading nasty warnings/errors.
    autoconf_is_current := $(if $(wildcard $(KCONFIG_CONFIG)),$(shell find . \
    		-path ./include/config/auto.conf -newer $(KCONFIG_CONFIG)))
    ifneq ($(autoconf_is_current),)
    
    include $(srctree)/config.mk
    
    include $(srctree)/arch/$(ARCH)/Makefile
    
    # If board code explicitly specified LDSCRIPT or CONFIG_SYS_LDSCRIPT, use
    # that (or fail if absent).  Otherwise, search for a linker script in a
    # standard location.
    
    ifndef LDSCRIPT
    
    	#LDSCRIPT := $(srctree)/board/$(BOARDDIR)/u-boot.lds.debug
    
    	ifdef CONFIG_SYS_LDSCRIPT
    		# need to strip off double quotes
    
    		LDSCRIPT := $(srctree)/$(CONFIG_SYS_LDSCRIPT:"%"=%)
    
    # If there is no specified link script, we look in a number of places for it
    
    ifndef LDSCRIPT
    	ifeq ($(wildcard $(LDSCRIPT)),)
    
    		LDSCRIPT := $(srctree)/board/$(BOARDDIR)/u-boot.lds
    
    	endif
    	ifeq ($(wildcard $(LDSCRIPT)),)
    
    		LDSCRIPT := $(srctree)/$(CPUDIR)/u-boot.lds
    
    	ifeq ($(wildcard $(LDSCRIPT)),)
    
    		LDSCRIPT := $(srctree)/arch/$(ARCH)/cpu/u-boot.lds
    
    # Dummy target needed, because used as prerequisite
    include/config/auto.conf: ;
    
    ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
    KBUILD_CFLAGS	+= -Os
    else
    KBUILD_CFLAGS	+= -O2
    endif
    
    
    ifdef BUILD_TAG
    KBUILD_CFLAGS += -DBUILD_TAG='"$(BUILD_TAG)"'
    endif
    
    KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector)
    
    KBUILD_CFLAGS	+= -g
    # $(KBUILD_AFLAGS) sets -g, which causes gcc to pass a suitable -g<format>
    # option to the assembler.
    KBUILD_AFLAGS	+= -g
    
    # Report stack usage if supported
    
    ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-stack-usage.sh $(CC)),y)
    	KBUILD_CFLAGS += -fstack-usage
    endif
    
    
    KBUILD_CFLAGS += $(call cc-option,-Wno-format-nonliteral)
    
    # turn jbsr into jsr for m68k
    ifeq ($(ARCH),m68k)
    ifeq ($(findstring 3.4,$(shell $(CC) --version)),3.4)
    KBUILD_AFLAGS += -Wa,-gstabs,-S
    endif
    endif
    
    
    # Prohibit date/time macros, which would make the build non-deterministic
    KBUILD_CFLAGS   += $(call cc-option,-Werror=date-time)
    
    
    ifneq ($(CONFIG_SYS_TEXT_BASE),)
    KBUILD_CPPFLAGS += -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE)
    endif
    
    export CONFIG_SYS_TEXT_BASE
    
    
    include $(srctree)/scripts/Makefile.extrawarn
    
    
    # Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
    KBUILD_CPPFLAGS += $(KCPPFLAGS)
    KBUILD_AFLAGS += $(KAFLAGS)
    KBUILD_CFLAGS += $(KCFLAGS)
    
    
    # Use UBOOTINCLUDE when you must reference the include/ directory.
    # Needed to be compatible with the O= option
    
    UBOOTINCLUDE    := \
    		-Iinclude \
    		$(if $(KBUILD_SRC), -I$(srctree)/include) \
    
    		-I$(srctree)/arch/$(ARCH)/include \
    		-include $(srctree)/include/linux/kconfig.h
    
    
    NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
    CHECKFLAGS     += $(NOSTDINC_FLAGS)
    
    # FIX ME
    
    cpp_flags := $(KBUILD_CPPFLAGS) $(PLATFORM_CPPFLAGS) $(UBOOTINCLUDE) \
    							$(NOSTDINC_FLAGS)
    
    c_flags := $(KBUILD_CFLAGS) $(cpp_flags)
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #########################################################################
    # U-Boot objects....order is important (i.e. start must be first)
    
    
    HAVE_VENDOR_COMMON_LIB = $(if $(wildcard $(srctree)/board/$(VENDOR)/common/Makefile),y,n)
    
    libs-y += lib/
    libs-$(HAVE_VENDOR_COMMON_LIB) += board/$(VENDOR)/common/
    libs-$(CONFIG_OF_EMBED) += dts/
    libs-y += fs/
    libs-y += net/
    libs-y += disk/
    libs-y += drivers/
    libs-y += drivers/dma/
    libs-y += drivers/gpio/
    libs-y += drivers/i2c/
    libs-y += drivers/mmc/
    libs-y += drivers/mtd/
    libs-$(CONFIG_CMD_NAND) += drivers/mtd/nand/
    libs-y += drivers/mtd/onenand/
    libs-$(CONFIG_CMD_UBI) += drivers/mtd/ubi/
    libs-y += drivers/mtd/spi/
    libs-y += drivers/net/
    libs-y += drivers/net/phy/
    libs-y += drivers/pci/
    libs-y += drivers/power/ \
    
    	drivers/power/fuel_gauge/ \
    	drivers/power/mfd/ \
    	drivers/power/pmic/ \
    	drivers/power/battery/
    
    libs-y += drivers/spi/
    libs-$(CONFIG_FMAN_ENET) += drivers/net/fm/
    libs-$(CONFIG_SYS_FSL_DDR) += drivers/ddr/fsl/
    libs-y += drivers/serial/
    libs-y += drivers/usb/eth/
    libs-y += drivers/usb/gadget/
    libs-y += drivers/usb/host/
    libs-y += drivers/usb/musb/
    libs-y += drivers/usb/musb-new/
    libs-y += drivers/usb/phy/
    libs-y += drivers/usb/ulpi/
    libs-y += common/
    libs-$(CONFIG_API) += api/
    libs-$(CONFIG_HAS_POST) += post/
    libs-y += test/
    
    Simon Glass's avatar
    Simon Glass committed
    libs-y += test/dm/
    
    libs-y += $(if $(BOARDDIR),board/$(BOARDDIR)/)
    
    
    libs-y := $(sort $(libs-y))
    
    u-boot-dirs	:= $(patsubst %/,%,$(filter %/, $(libs-y))) tools examples
    
    u-boot-alldirs	:= $(sort $(u-boot-dirs) $(patsubst %/,%,$(filter %/, $(libs-))))
    
    libs-y		:= $(patsubst %/, %/built-in.o, $(libs-y))
    
    u-boot-init := $(head-y)
    u-boot-main := $(libs-y)
    
    # Add GCC lib
    
    ifeq ($(CONFIG_USE_PRIVATE_LIBGCC),y)
    
    PLATFORM_LIBGCC = arch/$(ARCH)/lib/lib.a
    
    PLATFORM_LIBGCC := -L $(shell dirname `$(CC) $(c_flags) -print-libgcc-file-name`) -lgcc
    
    endif
    PLATFORM_LIBS += $(PLATFORM_LIBGCC)
    export PLATFORM_LIBS
    
    export PLATFORM_LIBGCC
    
    # Special flags for CPP when processing the linker script.
    # Pass the version down so we can handle backwards compatibility
    # on the fly.
    LDPPFLAGS += \
    
    	-include $(srctree)/include/u-boot/u-boot.lds.h \
    
    	-DCPUDIR=$(CPUDIR) \
    
    	$(shell $(LD) --version | \
    	  sed -ne 's/GNU ld version \([0-9][0-9]*\)\.\([0-9][0-9]*\).*/-DLD_MAJOR=\1 -DLD_MINOR=\2/p')
    
    
    #########################################################################
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    #########################################################################
    
    
    ifneq ($(CONFIG_BOARD_SIZE_LIMIT),)
    BOARD_SIZE_CHECK = \
    	@actual=`wc -c $@ | awk '{print $$1}'`; \
    
    	limit=`printf "%d" $(CONFIG_BOARD_SIZE_LIMIT)`; \
    
    	if test $$actual -gt $$limit; then \
    
    		echo "$@ exceeds file size limit:" >&2 ; \
    		echo "  limit:  $$limit bytes" >&2 ; \
    		echo "  actual: $$actual bytes" >&2 ; \
    		echo "  excess: $$((actual - limit)) bytes" >&2; \
    
    		exit 1; \
    	fi
    else
    BOARD_SIZE_CHECK =
    endif
    
    
    # Statically apply RELA-style relocations (currently arm64 only)
    ifneq ($(CONFIG_STATIC_RELA),)
    # $(1) is u-boot ELF, $(2) is u-boot bin, $(3) is text base
    DO_STATIC_RELA = \
    	start=$$($(NM) $(1) | grep __rel_dyn_start | cut -f 1 -d ' '); \
    	end=$$($(NM) $(1) | grep __rel_dyn_end | cut -f 1 -d ' '); \
    
    	tools/relocate-rela $(2) $(3) $$start $$end
    
    # Always append ALL so that arch config.mk's can add custom ones
    
    ALL-y += u-boot.srec u-boot.bin System.map binary_size_check
    
    
    ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin
    
    ifeq ($(CONFIG_SPL_FSL_PBL),y)
    ALL-$(CONFIG_RAMBOOT_PBL) += u-boot-with-spl-pbl.bin
    else
    
    ALL-$(CONFIG_RAMBOOT_PBL) += u-boot.pbl
    
    ALL-$(CONFIG_SPL) += spl/u-boot-spl.bin
    ALL-$(CONFIG_SPL_FRAMEWORK) += u-boot.img
    ALL-$(CONFIG_TPL) += tpl/u-boot-tpl.bin
    
    ALL-$(CONFIG_OF_SEPARATE) += u-boot.dtb u-boot-dtb.bin
    
    ifeq ($(CONFIG_SPL_FRAMEWORK),y)
    ALL-$(CONFIG_OF_SEPARATE) += u-boot-dtb.img
    endif
    
    ALL-$(CONFIG_OF_HOSTFILE) += u-boot.dtb
    
    ifneq ($(CONFIG_SPL_TARGET),)
    
    ALL-$(CONFIG_SPL) += $(CONFIG_SPL_TARGET:"%"=%)
    
    ALL-$(CONFIG_REMAKE_ELF) += u-boot.elf
    
    # We can't do this yet due to the need for binary blobs
    # ALL-$(CONFIG_X86_RESET_VECTOR) += u-boot.rom
    
    
    # enable combined SPL/u-boot/dtb rules for tegra
    
    ifneq ($(CONFIG_TEGRA),)
    
    ifeq ($(CONFIG_SPL),y)
    
    ifeq ($(CONFIG_OF_SEPARATE),y)
    
    ALL-y += u-boot-dtb-tegra.bin
    
    ALL-y += u-boot-nodtb-tegra.bin
    
    # Add optional build target if defined in board/cpu/soc headers
    ifneq ($(CONFIG_BUILD_TARGET),)
    ALL-y += $(CONFIG_BUILD_TARGET:"%"=%)
    endif
    
    
    LDFLAGS_u-boot += $(LDFLAGS_FINAL)
    
    ifneq ($(CONFIG_SYS_TEXT_BASE),)
    LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE)
    endif
    
    quiet_cmd_objcopy = OBJCOPY $@
    cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
    
    
    quiet_cmd_mkimage = MKIMAGE $@
    
    cmd_mkimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) -d $< $@ \
    	$(if $(KBUILD_VERBOSE:1=), >/dev/null)
    
    
    quiet_cmd_cat = CAT     $@
    cmd_cat = cat $(filter-out $(PHONY), $^) > $@
    
    
    append = cat $(filter-out $< $(PHONY), $^) >> $@
    
    quiet_cmd_pad_cat = CAT     $@
    cmd_pad_cat = $(cmd_objcopy) && $(append) || rm -f $@
    
    
    ifneq ($(CONFIG_SYS_GENERIC_BOARD),y)
    	@echo "===================== WARNING ======================"
    	@echo "Please convert this board to generic board."
    	@echo "Otherwise it will be removed by the end of 2014."
    	@echo "See doc/README.generic-board for further information"
    	@echo "===================================================="
    endif
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    PHONY += dtbs
    dtbs dts/dt.dtb: checkdtc u-boot
    	$(Q)$(MAKE) $(build)=dts dtbs
    
    u-boot-dtb.bin: u-boot.bin dts/dt.dtb FORCE
    	$(call if_changed,cat)
    
    %.imx: %.bin
    	$(Q)$(MAKE) $(build)=arch/arm/imx-common $@
    
    
    quiet_cmd_copy = COPY    $@
          cmd_copy = cp $< $@
    
    u-boot.dtb: dts/dt.dtb
    	$(call cmd,copy)
    
    
    OBJCOPYFLAGS_u-boot.hex := -O ihex
    
    OBJCOPYFLAGS_u-boot.srec := -O srec
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    u-boot.hex u-boot.srec: u-boot FORCE
    	$(call if_changed,objcopy)
    
    
    OBJCOPYFLAGS_u-boot.bin := -O binary \
    		$(if $(CONFIG_X86_RESET_VECTOR),-R .start16 -R .resetvec)
    
    binary_size_check: u-boot.bin FORCE
    
    	@file_size=$(shell wc -c u-boot.bin | awk '{print $$1}') ; \
    
    	map_size=$(shell cat u-boot.map | \
    
    		awk '/_image_copy_start/ {start = $$1} /_image_binary_end/ {end = $$1} END {if (start != "" && end != "") print "ibase=16; " toupper(end) " - " toupper(start)}' \
    
    		| sed 's/0X//g' \
    
    	if [ "" != "$$map_size" ]; then \
    		if test $$map_size -ne $$file_size; then \
    
    			echo "u-boot.map shows a binary size of $$map_size" >&2 ; \
    
    			echo "  but u-boot.bin shows $$file_size" >&2 ; \
    			exit 1; \
    		fi \
    	fi
    
    
    u-boot.bin: u-boot FORCE
    	$(call if_changed,objcopy)
    	$(call DO_STATIC_RELA,$<,$@,$(CONFIG_SYS_TEXT_BASE))
    	$(BOARD_SIZE_CHECK)
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    u-boot.ldr:	u-boot
    
    		$(LDR) -T $(CONFIG_CPU) -c $@ $< $(LDR_FLAGS)
    
    		$(BOARD_SIZE_CHECK)
    
    OBJCOPYFLAGS_u-boot.ldr.hex := -I binary -O ihex
    
    OBJCOPYFLAGS_u-boot.ldr.srec := -I binary -O srec
    
    u-boot.ldr.hex u-boot.ldr.srec: u-boot.ldr FORCE
    	$(call if_changed,objcopy)
    
    #
    # U-Boot entry point, needed for booting of full-blown U-Boot
    # from the SPL U-Boot version.
    #
    ifndef CONFIG_SYS_UBOOT_START
    CONFIG_SYS_UBOOT_START := 0
    endif
    
    
    MKIMAGEFLAGS_u-boot.img = -A $(ARCH) -T firmware -C none -O u-boot \
    	-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_UBOOT_START) \
    	-n "U-Boot $(UBOOTRELEASE) for $(BOARD) board"
    
    MKIMAGEFLAGS_u-boot.kwb = -n $(srctree)/$(CONFIG_SYS_KWD_CONFIG:"%"=%) \
    	-T kwbimage -a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE)
    
    MKIMAGEFLAGS_u-boot.pbl = -n $(srctree)/$(CONFIG_SYS_FSL_PBL_RCW:"%"=%) \
    		-R $(srctree)/$(CONFIG_SYS_FSL_PBL_PBI:"%"=%) -T pblimage
    
    u-boot.img u-boot.kwb u-boot.pbl: u-boot.bin FORCE
    
    	$(call if_changed,mkimage)
    
    
    MKIMAGEFLAGS_u-boot-dtb.img = $(MKIMAGEFLAGS_u-boot.img)
    
    u-boot-dtb.img: u-boot-dtb.bin FORCE
    	$(call if_changed,mkimage)
    
    
    u-boot.sha1:	u-boot.bin
    		tools/ubsha1 u-boot.bin
    
    u-boot.dis:	u-boot
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    		$(OBJDUMP) -d $< > $@
    
    
    ifdef CONFIG_TPL
    
    SPL_PAYLOAD := tpl/u-boot-with-tpl.bin
    
    SPL_PAYLOAD := u-boot.bin
    
    OBJCOPYFLAGS_u-boot-with-spl.bin = -I binary -O binary \
    				   --pad-to=$(CONFIG_SPL_PAD_TO)
    u-boot-with-spl.bin: spl/u-boot-spl.bin $(SPL_PAYLOAD) FORCE
    	$(call if_changed,pad_cat)
    
    OBJCOPYFLAGS_u-boot-with-tpl.bin = -I binary -O binary \
    				   --pad-to=$(CONFIG_TPL_PAD_TO)
    tpl/u-boot-with-tpl.bin: tpl/u-boot-tpl.bin u-boot.bin FORCE
    	$(call if_changed,pad_cat)
    
    SPL: spl/u-boot-spl.bin FORCE
    	$(Q)$(MAKE) $(build)=arch/arm/imx-common $@
    
    u-boot-with-spl.imx u-boot-with-nand-spl.imx: SPL u-boot.bin FORCE
    
    	$(Q)$(MAKE) $(build)=arch/arm/imx-common $@
    
    MKIMAGEFLAGS_u-boot.ubl = -n $(UBL_CONFIG) -T ublimage -e $(CONFIG_SYS_TEXT_BASE)
    
    u-boot.ubl: u-boot-with-spl.bin FORCE
    	$(call if_changed,mkimage)
    
    MKIMAGEFLAGS_u-boot-spl.ais = -s -n $(if $(CONFIG_AIS_CONFIG_FILE), \
    	$(srctree)/$(CONFIG_AIS_CONFIG_FILE:"%"=%),"/dev/null") \
    	-T aisimage -e $(CONFIG_SPL_TEXT_BASE)
    spl/u-boot-spl.ais: spl/u-boot-spl.bin FORCE
    	$(call if_changed,mkimage)
    
    OBJCOPYFLAGS_u-boot.ais = -I binary -O binary --pad-to=$(CONFIG_SPL_PAD_TO)
    
    u-boot.ais: spl/u-boot-spl.ais u-boot.img FORCE
    	$(call if_changed,pad_cat)
    
    u-boot-signed.sb: u-boot.bin spl/u-boot-spl.bin
    	$(Q)$(MAKE) $(build)=arch/arm/cpu/arm926ejs/mxs u-boot-signed.sb
    
    u-boot.sb: u-boot.bin spl/u-boot-spl.bin
    
    	$(Q)$(MAKE) $(build)=arch/arm/cpu/arm926ejs/mxs u-boot.sb
    
    # On x600 (SPEAr600) U-Boot is appended to U-Boot SPL.
    # Both images are created using mkimage (crc etc), so that the ROM
    # bootloader can check its integrity. Padding needs to be done to the
    # SPL image (with mkimage header) and not the binary. Otherwise the resulting image
    # which is loaded/copied by the ROM bootloader to SRAM doesn't fit.
    # The resulting image containing both U-Boot images is called u-boot.spr
    
    MKIMAGEFLAGS_u-boot-spl.img = -A $(ARCH) -T firmware -C none \
    	-a $(CONFIG_SPL_TEXT_BASE) -e $(CONFIG_SPL_TEXT_BASE) -n XLOADER
    spl/u-boot-spl.img: spl/u-boot-spl.bin FORCE
    	$(call if_changed,mkimage)
    
    OBJCOPYFLAGS_u-boot.spr = -I binary -O binary --pad-to=$(CONFIG_SPL_PAD_TO) \
    			  --gap-fill=0xff
    u-boot.spr: spl/u-boot-spl.img u-boot.img FORCE
    	$(call if_changed,pad_cat)
    
    MKIMAGEFLAGS_u-boot-spl.gph = -A $(ARCH) -T gpimage -C none \
    	-a $(CONFIG_SPL_TEXT_BASE) -e $(CONFIG_SPL_TEXT_BASE) -n SPL
    spl/u-boot-spl.gph: spl/u-boot-spl.bin FORCE
    	$(call if_changed,mkimage)
    
    OBJCOPYFLAGS_u-boot-spi.gph = -I binary -O binary --pad-to=$(CONFIG_SPL_PAD_TO) \
    			  --gap-fill=0
    u-boot-spi.gph: spl/u-boot-spl.gph u-boot.img FORCE
    	$(call if_changed,pad_cat)
    
    
    MKIMAGEFLAGS_u-boot-nand.gph = -A $(ARCH) -T gpimage -C none \
    	-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE) -n U-Boot
    u-boot-nand.gph: u-boot.bin FORCE
    	$(call if_changed,mkimage)
    	@dd if=/dev/zero bs=8 count=1 2>/dev/null >> $@
    
    
    # x86 uses a large ROM. We fill it with 0xff, put the 16-bit stuff (including
    # reset vector) at the top, Intel ME descriptor at the bottom, and U-Boot in
    # the middle.
    ifneq ($(CONFIG_X86_RESET_VECTOR),)
    rom: u-boot.rom FORCE
    
    
    IFDTOOL=$(objtree)/tools/ifdtool
    
    IFDTOOL_FLAGS  = -f 0:$(objtree)/u-boot.dtb
    IFDTOOL_FLAGS += -m 0x$(shell $(NM) u-boot |grep _dt_ucode_base_size |cut -d' ' -f1)
    IFDTOOL_FLAGS += -U $(CONFIG_SYS_TEXT_BASE):$(objtree)/u-boot.bin
    
    IFDTOOL_FLAGS += -w $(CONFIG_SYS_X86_START16):$(objtree)/u-boot-x86-16bit.bin
    
    ifneq ($(CONFIG_HAVE_INTEL_ME),)
    IFDTOOL_ME_FLAGS  = -D $(srctree)/board/$(BOARDDIR)/descriptor.bin
    IFDTOOL_ME_FLAGS += -i ME:$(srctree)/board/$(BOARDDIR)/me.bin
    endif
    
    ifneq ($(CONFIG_HAVE_MRC),)
    
    IFDTOOL_FLAGS += -w $(CONFIG_X86_MRC_ADDR):$(srctree)/board/$(BOARDDIR)/mrc.bin
    
    ifneq ($(CONFIG_HAVE_FSP),)
    IFDTOOL_FLAGS += -w $(CONFIG_FSP_ADDR):$(srctree)/board/$(BOARDDIR)/$(CONFIG_FSP_FILE)
    endif
    
    ifneq ($(CONFIG_HAVE_CMC),)
    IFDTOOL_FLAGS += -w $(CONFIG_CMC_ADDR):$(srctree)/board/$(BOARDDIR)/$(CONFIG_CMC_FILE)
    endif
    
    
    ifneq ($(CONFIG_X86_OPTION_ROM_ADDR),)
    
    IFDTOOL_FLAGS += -w $(CONFIG_X86_OPTION_ROM_ADDR):$(srctree)/board/$(BOARDDIR)/$(CONFIG_X86_OPTION_ROM_FILE)
    
    endif
    
    quiet_cmd_ifdtool = IFDTOOL $@
    cmd_ifdtool  = $(IFDTOOL) -c -r $(CONFIG_ROM_SIZE) u-boot.tmp;
    ifneq ($(CONFIG_HAVE_INTEL_ME),)
    cmd_ifdtool += $(IFDTOOL) $(IFDTOOL_ME_FLAGS) u-boot.tmp;
    endif
    cmd_ifdtool += $(IFDTOOL) $(IFDTOOL_FLAGS) u-boot.tmp;
    cmd_ifdtool += mv u-boot.tmp $@
    
    u-boot.rom: u-boot-x86-16bit.bin u-boot-dtb.bin
    	$(call if_changed,ifdtool)
    
    
    OBJCOPYFLAGS_u-boot-x86-16bit.bin := -O binary -j .start16 -j .resetvec
    u-boot-x86-16bit.bin: u-boot FORCE
    	$(call if_changed,objcopy)
    endif
    
    
    ifneq ($(CONFIG_SUNXI),)
    OBJCOPYFLAGS_u-boot-sunxi-with-spl.bin = -I binary -O binary \
    				   --pad-to=$(CONFIG_SPL_PAD_TO) --gap-fill=0xff
    
    u-boot-sunxi-with-spl.bin: spl/sunxi-spl.bin \
    			u-boot$(if $(CONFIG_OF_CONTROL),-dtb,).img FORCE
    
    	$(call if_changed,pad_cat)
    endif
    
    
    ifneq ($(CONFIG_TEGRA),)