Skip to content
Snippets Groups Projects
Makefile 57.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • #
    # SPDX-License-Identifier:	GPL-2.0+
    #
    
    
    Tom Rini's avatar
    Tom Rini committed
    VERSION = 2018
    
    Tom Rini's avatar
    Tom Rini committed
    PATCHLEVEL = 03
    
    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.
    
    
    # o Do not use make's built-in rules and variables
    #   (this increases performance and avoids hard-to-debug behaviour);
    # o Look for make include files relative to root of kernel src
    MAKEFLAGS += -rR --include-dir=$(CURDIR)
    
    
    # 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 \
    		$(if $(CONFIG_TOOLS_DEBUG),-g)
    
    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")
    
    
    # since Lion (10.7) ASLR is on by default, but we use linker generated lists
    # in some host tools which is a problem then ... so disable ASLR for these
    # tools
    HOSTLDFLAGS += $(call os_x_before, 10, 7, "", "-Xlinker -no_pie")
    
    # 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
    
    
    # We need some generic definitions (do not try to remake the file).
    
    scripts/Kbuild.include: ;
    include 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		?= $(objtree)/scripts/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
    
    Rob Clark's avatar
    Rob Clark committed
    KBUILD_CFLAGS	+= -fshort-wchar
    
    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 CHECK CHECKFLAGS DTC DTC_FLAGS
    
    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 tests
    
    
    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 ($(words $(MAKECMDGOALS)),1)
    
    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)$(MAKE) $(build)=scripts/kconfig $@
    
    
    %config: scripts_basic outputmakefile FORCE
    
    	$(Q)$(MAKE) $(build)=scripts/kconfig $@
    
    else
    # ===========================================================================
    # Build targets only - this includes vmlinux, arch specific targets, clean
    # targets and others. In general all targets except *config targets.
    
    # Additional helpers built in scripts/
    # Carefully list dependencies so we do not try to build scripts twice
    # in parallel
    PHONY += scripts
    scripts: scripts_basic include/config/auto.conf
    	$(Q)$(MAKE) $(build)=$(@)
    
    
    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
    
    	@# If the following part fails, include/config/auto.conf should be
    	@# deleted so "make silentoldconfig" will be re-run on the next build.
    	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.autoconf || \
    		{ rm -f include/config/auto.conf; false; }
    	@# include/config.h has been updated after "make silentoldconfig".
    	@# We need to touch include/config/auto.conf so it gets newer
    	@# than include/config.h.
    	@# Otherwise, 'make silentoldconfig' would be invoked twice.
    	$(Q)touch include/config/auto.conf
    
    u-boot.cfg spl/u-boot.cfg tpl/u-boot.cfg: include/config.h FORCE
    	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.autoconf $(@)
    
    
    -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.
    
    ifneq ($(wildcard $(KCONFIG_CONFIG)),)
    ifneq ($(wildcard include/config/auto.conf),)
    autoconf_is_old := $(shell find . -path ./$(KCONFIG_CONFIG) -newer \
    						include/config/auto.conf)
    ifeq ($(autoconf_is_old),)
    
    include config.mk
    include arch/$(ARCH)/Makefile
    
    # These are set by the arch-specific config.mk. Make sure they are exported
    # so they can be used when building an EFI application.
    export EFI_LDS		# Filename of EFI link script in arch/$(ARCH)/lib
    export EFI_CRT0		# Filename of EFI CRT0 in arch/$(ARCH)/lib
    export EFI_RELOC	# Filename of EFU relocation code in arch/$(ARCH)/lib
    export CFLAGS_EFI	# Compiler flags to add when building EFI app
    export CFLAGS_NON_EFI	# Compiler flags to remove when building EFI app
    export EFI_TARGET	# binutils target if EFI is natively supported
    
    
    # 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: ;
    
    #
    # Xtensa linker script cannot be preprocessed with -ansi because of
    # preprocessor operations on strings that don't make C identifiers.
    #
    ifeq ($(CONFIG_XTENSA),)
    LDPPFLAGS	+= -ansi
    endif
    
    
    ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
    KBUILD_CFLAGS	+= -Os
    else
    KBUILD_CFLAGS	+= -O2
    endif
    
    
    KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector)
    
    KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks)
    
    
    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)
    
    
    include 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) \
    
    		$(if $(CONFIG_$(SPL_)SYS_THUMB_BUILD), \
    			$(if $(CONFIG_HAS_THUMB2),, \
    				-I$(srctree)/arch/$(ARCH)/thumb1/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/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/domain/ \
    
    	drivers/power/fuel_gauge/ \
    	drivers/power/mfd/ \
    	drivers/power/pmic/ \
    
    	drivers/power/battery/ \
    	drivers/power/regulator/
    
    libs-y += drivers/spi/
    libs-$(CONFIG_FMAN_ENET) += drivers/net/fm/
    libs-$(CONFIG_SYS_FSL_DDR) += drivers/ddr/fsl/
    
    libs-$(CONFIG_SYS_FSL_MMDC) += drivers/ddr/fsl/
    
    libs-$(CONFIG_ALTERA_SDRAM) += drivers/ddr/altera/
    
    libs-y += drivers/serial/
    
    libs-y += drivers/usb/emul/
    
    libs-y += drivers/usb/eth/
    libs-y += drivers/usb/gadget/
    
    libs-y += drivers/usb/gadget/udc/
    
    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-$(CONFIG_API) += api/
    libs-$(CONFIG_HAS_POST) += post/
    libs-y += test/
    
    Simon Glass's avatar
    Simon Glass committed
    libs-y += test/dm/
    
    libs-$(CONFIG_UT_ENV) += test/env/
    
    libs-$(CONFIG_UT_OVERLAY) += test/overlay/
    
    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)
    
    # This is useful for arm64 where static relocation needs to be performed on
    # the raw binary, but certain simulators only accept an ELF file (but don't
    # do the relocation).
    
    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 u-boot.sym 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
    
    ifneq ($(CONFIG_SECURE_BOOT), y)
    # For Secure Boot The Image needs to be signed and Header must also
    # be included. So The image has to be built explicitly
    
    ALL-$(CONFIG_RAMBOOT_PBL) += u-boot.pbl
    
    ALL-$(CONFIG_SPL) += spl/u-boot-spl.bin
    
    ifeq ($(CONFIG_MX6)$(CONFIG_SECURE_BOOT), yy)
    ALL-$(CONFIG_SPL_FRAMEWORK) += u-boot-ivt.img
    else
    
    ifeq ($(CONFIG_MX7)$(CONFIG_SECURE_BOOT), yy)
    ALL-$(CONFIG_SPL_FRAMEWORK) += u-boot-ivt.img
    else
    
    ALL-$(CONFIG_SPL_FRAMEWORK) += u-boot.img
    
    ALL-$(CONFIG_TPL) += tpl/u-boot-tpl.bin
    
    ALL-$(CONFIG_OF_SEPARATE) += u-boot.dtb
    
    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
    
    ALL-$(CONFIG_EFI_APP) += u-boot-app.efi
    
    ALL-$(CONFIG_EFI_STUB) += u-boot-payload.efi
    
    ifneq ($(BUILD_ROM)$(CONFIG_BUILD_ROM),)
    
    ALL-$(CONFIG_X86_RESET_VECTOR) += u-boot.rom
    endif
    
    # enable combined SPL/u-boot/dtb rules for tegra
    
    ifeq ($(CONFIG_TEGRA)$(CONFIG_SPL),yy)
    
    ALL-y += u-boot-tegra.bin u-boot-nodtb-tegra.bin
    
    ALL-$(CONFIG_OF_SEPARATE) += u-boot-dtb-tegra.bin
    
    # Add optional build target if defined in board/cpu/soc headers
    ifneq ($(CONFIG_BUILD_TARGET),)
    ALL-y += $(CONFIG_BUILD_TARGET:"%"=%)
    endif
    
    
    ifneq ($(CONFIG_SYS_INIT_SP_BSS_OFFSET),)
    ALL-y += init_sp_bss_offset_check
    endif
    
    
    LDFLAGS_u-boot += $(LDFLAGS_FINAL)
    
    
    # Avoid 'Not enough room for program headers' error on binutils 2.28 onwards.
    LDFLAGS_u-boot += $(call ld-option, --no-dynamic-linker)
    
    
    ifeq ($(CONFIG_ARC)$(CONFIG_NIOS2)$(CONFIG_X86)$(CONFIG_XTENSA),)
    
    LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE)
    endif
    
    # Normally we fill empty space with 0xff
    
    quiet_cmd_objcopy = OBJCOPY $@
    
    cmd_objcopy = $(OBJCOPY) --gap-fill=0xff $(OBJCOPYFLAGS) \
    	$(OBJCOPYFLAGS_$(@F)) $< $@
    
    # Provide a version which does not do this, for use by EFI
    quiet_cmd_zobjcopy = OBJCOPY $@
    cmd_zobjcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
    
    quiet_cmd_efipayload = OBJCOPY $@
    cmd_efipayload = $(OBJCOPY) -I binary -O $(EFIPAYLOAD_BFDTARGET) -B $(EFIPAYLOAD_BFDARCH) $< $@
    
    
    quiet_cmd_mkimage = MKIMAGE $@
    
    cmd_mkimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) -d $< $@ \
    
    	$(if $(KBUILD_VERBOSE:1=), >$(MKIMAGEOUTPUT))
    
    quiet_cmd_mkfitimage = MKIMAGE $@
    cmd_mkfitimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) -f $(U_BOOT_ITS) -E $@ \
    	$(if $(KBUILD_VERBOSE:1=), >$(MKIMAGEOUTPUT))
    
    
    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 $@
    
    
    quiet_cmd_cfgcheck = CFGCHK  $2
    cmd_cfgcheck = $(srctree)/scripts/check-config.sh $2 \
    		$(srctree)/scripts/config_whitelist.txt $(srctree)
    
    
    ifeq ($(CONFIG_DM_I2C_COMPAT)$(CONFIG_SANDBOX),y)
    
    	@echo "===================== WARNING ======================"
    	@echo "This board uses CONFIG_DM_I2C_COMPAT. Please remove"
    	@echo "(possibly in a subsequent patch in your series)"
    	@echo "before sending patches to the mailing list."
    	@echo "===================================================="
    endif
    
    	@# Check that this build does not use CONFIG options that we do not
    	@# know about unless they are in Kconfig. All the existing CONFIG
    	@# options are whitelisted, so new ones should not be added.
    
    	$(call cmd,cfgcheck,u-boot.cfg)
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    	$(Q)$(MAKE) $(build)=dts dtbs
    
    quiet_cmd_copy = COPY    $@
          cmd_copy = cp $< $@
    
    
    
    fit-dtb.blob: dts/dt.dtb FORCE
    	$(call if_changed,mkimage)
    
    MKIMAGEFLAGS_fit-dtb.blob = -f auto -A $(ARCH) -T firmware -C none -O u-boot \
    	-a 0 -e 0 -E \
    	$(patsubst %,-b arch/$(ARCH)/dts/%.dtb,$(subst ",,$(CONFIG_OF_LIST))) -d /dev/null
    
    u-boot-fit-dtb.bin: u-boot-nodtb.bin fit-dtb.blob
    	$(call if_changed,cat)
    
    u-boot.bin: u-boot-fit-dtb.bin FORCE
    	$(call if_changed,copy)
    else ifeq ($(CONFIG_OF_SEPARATE),y)
    
    u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE
    
    	$(call if_changed,cat)
    
    u-boot.bin: u-boot-dtb.bin FORCE
    	$(call if_changed,copy)
    else
    u-boot.bin: u-boot-nodtb.bin FORCE
    	$(call if_changed,copy)
    endif
    
    
    %.imx: %.bin
    
    	$(Q)$(MAKE) $(build)=arch/arm/mach-imx $@
    
    %.vyb: %.imx
    	$(Q)$(MAKE) $(build)=arch/arm/cpu/armv7/vf610 $@
    
    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-elf.srec := $(OBJCOPYFLAGS_u-boot.srec)
    
    u-boot-elf.srec: u-boot.elf FORCE
    	$(call if_changed,objcopy)
    
    
    OBJCOPYFLAGS_u-boot-spl.srec = $(OBJCOPYFLAGS_u-boot.srec)
    
    spl/u-boot-spl.srec: spl/u-boot-spl FORCE
    	$(call if_changed,objcopy)
    
    
    OBJCOPYFLAGS_u-boot-nodtb.bin := -O binary \
    
    		$(if $(CONFIG_X86_16BIT_INIT),-R .start16 -R .resetvec)
    
    binary_size_check: u-boot-nodtb.bin FORCE
    	@file_size=$(shell wc -c u-boot-nodtb.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-nodtb.bin shows $$file_size" >&2 ; \
    
    ifneq ($(CONFIG_SYS_INIT_SP_BSS_OFFSET),)
    ifneq ($(CONFIG_SYS_MALLOC_F_LEN),)
    subtract_sys_malloc_f_len = space=$$(($${space} - $(CONFIG_SYS_MALLOC_F_LEN)))
    else
    subtract_sys_malloc_f_len = true
    endif
    # The 1/4 margin below is somewhat arbitrary. The likely initial SP usage is
    # so low that the DTB could probably use 90%+ of the available space, for
    # current values of CONFIG_SYS_INIT_SP_BSS_OFFSET at least. However, let's be
    # safe for now and tweak this later if space becomes tight.
    # A rejected alternative would be to check that some absolute minimum stack
    # space was available. However, since CONFIG_SYS_INIT_SP_BSS_OFFSET is
    # deliberately build-specific, to take account of build-to-build stack usage
    # differences due to different feature sets, there is no common absolute value
    # to check against.
    init_sp_bss_offset_check: u-boot.dtb FORCE
    	@dtb_size=$(shell wc -c u-boot.dtb | awk '{print $$1}') ; \
    	space=$(CONFIG_SYS_INIT_SP_BSS_OFFSET) ; \
    	$(subtract_sys_malloc_f_len) ; \
    	quarter_space=$$(($${space} / 4)) ; \
    	if [ $${dtb_size} -gt $${quarter_space} ]; then \
    		echo "u-boot.dtb is larger than 1 quarter of " >&2 ; \
    		echo "(CONFIG_SYS_INIT_SP_BSS_OFFSET - CONFIG_SYS_MALLOC_F_LEN)" >&2 ; \
    		exit 1 ; \
    	fi
    endif
    
    
    u-boot-nodtb.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)
    
    # binman
    # ---------------------------------------------------------------------------
    quiet_cmd_binman = BINMAN  $@
    cmd_binman = $(srctree)/tools/binman/binman -d u-boot.dtb -O . \