VENDOR=
#########################################################################
- # Allow for silent builds
- ifeq (,$(findstring s,$(MAKEFLAGS)))
- XECHO = echo
- else
- XECHO = :
+
+ # set default to nothing for native builds
+ ifeq ($(HOSTARCH),$(ARCH))
+ CROSS_COMPILE ?=
endif
- #########################################################################
+ # 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 = gcc
+ 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.
#
- # U-boot build supports generating object files in a separate external
- # directory. Two use cases are supported:
+ 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
+
+ # Beautify output
+ # ---------------------------------------------------------------------------
#
- # 1) Add O= to the make command line
- # 'make O=/tmp/build all'
+ # 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.
#
- # 2) Set environment variable BUILD_DIR to point to the desired location
- # 'export BUILD_DIR=/tmp/build'
- # 'make'
+ # quiet_cmd_cc_o_c = Compiling $(RELDIR)/$@
+ # cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
#
- # The second approach can also be used with a MAKEALL script
- # 'export BUILD_DIR=/tmp/build'
- # './MAKEALL'
+ # 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 "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.
#
- # Command line 'O=' setting overrides BUILD_DIR environment variable.
+ # A simple variant is to prefix commands with $(Q) - that's useful
+ # for commands that shall be hidden in non-verbose mode.
#
- # When none of the above methods is used the local build is performed and
- # the object files are placed in the source directory.
+ # $(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.
- ifeq ("$(origin O)", "command line")
- BUILD_DIR := $(O)
+ ifeq ($(KBUILD_VERBOSE),1)
+ quiet =
+ Q =
+ else
+ quiet=quiet_
+ Q = @
endif
- # Call a source code checker (by default, "sparse") as part of the
- # C compilation.
- #
- # Use 'make C=1' to enable checking of re-compiled files.
- #
- # See the linux kernel file "Documentation/sparse.txt" for more details,
- # including where to get the "sparse" utility.
+ # If the user is running make -s (silent mode), suppress echoing of
+ # commands
- ifdef C
- ifeq ("$(origin C)", "command line")
- CHECKSRC := $(C)
+ ifneq ($(filter s% -s%,$(MAKEFLAGS)),)
+ quiet=silent_
endif
+
+ export quiet Q KBUILD_VERBOSE
+
+
+ # 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...)
+
+ AS = $(CROSS_COMPILE)as
+ # Always use GNU ld
+ ifneq ($(shell $(CROSS_COMPILE)ld.bfd -v 2> /dev/null),)
+ LD = $(CROSS_COMPILE)ld.bfd
+ else
+ LD = $(CROSS_COMPILE)ld
endif
- ifndef CHECKSRC
- CHECKSRC = 0
+ 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
+ RANLIB = $(CROSS_COMPILE)RANLIB
+ 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__
+
+ 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
+ export 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
+
+ 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)
endif
- export CHECKSRC
- ifneq ($(BUILD_DIR),)
- saved-output := $(BUILD_DIR)
+ # 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).
- # Attempt to create a output directory.
- $(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})
+ version_h := include/generated/version_autogenerated.h
+ timestamp_h := include/generated/timestamp_autogenerated.h
- # 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),)
+ no-dot-config-targets := clean clobber mrproper distclean \
+ help %docs check% coccicheck \
+ ubootversion backup tools-only
- OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
- SPLTREE := $(OBJTREE)/spl
- TPLTREE := $(OBJTREE)/tpl
- SRCTREE := $(CURDIR)
- TOPDIR := $(SRCTREE)
- LNDIR := $(OBJTREE)
- export TOPDIR SRCTREE OBJTREE SPLTREE TPLTREE
+ config-targets := 0
+ mixed-targets := 0
+ dot-config := 1
- MKCONFIG := $(SRCTREE)/mkconfig
- export MKCONFIG
+ ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
+ ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
+ dot-config := 0
+ endif
+ 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 :=
+ ifeq ($(KBUILD_EXTMOD),)
+ ifneq ($(filter config %config,$(MAKECMDGOALS)),)
+ config-targets := 1
+ ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
+ mixed-targets := 1
+ endif
+ endif
endif
- export obj src
- # Make sure CDPATH settings don't interfere
- unexport CDPATH
+ 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
- # The "tools" are needed early, so put this first
- # Don't include stuff already done in $(LIBS)
- # The "examples" conditionally depend on U-Boot (say, when USE_PRIVATE_LIBGCC
- # is "yes"), so compile examples after U-Boot is compiled.
- SUBDIR_TOOLS = tools
- SUBDIRS = $(SUBDIR_TOOLS)
+ $(MAKECMDGOALS): build-one-by-one
+ @:
- .PHONY : $(SUBDIRS) $(VERSION_FILE) $(TIMESTAMP_FILE)
+ build-one-by-one:
+ $(Q)set -e; \
+ for i in $(MAKECMDGOALS); do \
+ $(MAKE) -f $(srctree)/Makefile $$i; \
+ done
- ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))
+ else
+ ifeq ($(config-targets),1)
+ # ===========================================================================
+ # *config targets only - make sure prerequisites are updated, and descend
+ # in scripts/kconfig to make the *config target
- # Include autoconf.mk before config.mk so that the config options are available
- # to all top level build files. We need the dummy all: target to prevent the
- # dependency target in autoconf.mk.dep from being the default.
- all:
- sinclude $(obj)include/autoconf.mk.dep
- sinclude $(obj)include/autoconf.mk
+ # Read arch specific Makefile to set KBUILD_DEFCONFIG as needed.
+ # KBUILD_DEFCONFIG may point out an alternative default configuration
+ # used for 'make defconfig'
- SUBDIR_EXAMPLES-y := examples/standalone
- SUBDIR_EXAMPLES-$(CONFIG_API) += examples/api
- ifndef CONFIG_SANDBOX
- SUBDIRS += $(SUBDIR_EXAMPLES-y)
- endif
+ %_config:: outputmakefile
+ @$(MKCONFIG) -A $(@:_config=)
+
+ else
+ # ===========================================================================
+ # Build targets only - this includes vmlinux, arch specific targets, clean
+ # targets and others. In general all targets except *config targets.
# load ARCH, BOARD, and CPU configuration
- include $(obj)include/config.mk
- export ARCH CPU BOARD VENDOR SOC
+ -include include/config.mk
- # set default to nothing for native builds
- ifeq ($(HOSTARCH),$(ARCH))
- CROSS_COMPILE ?=
- endif
+ ifeq ($(dot-config),1)
+ # Read in config
+ -include include/autoconf.mk
+ -include include/autoconf.mk.dep
# load other configuration
- include $(TOPDIR)/config.mk
-
- # Targets which don't build the source code
- NON_BUILD_TARGETS = backup clean clobber distclean mrproper tidy unconfig
+ include $(srctree)/config.mk
- # Only do the generic board check when actually building, not configuring
- ifeq ($(filter $(NON_BUILD_TARGETS),$(MAKECMDGOALS)),)
- ifeq ($(findstring _config,$(MAKECMDGOALS)),)
- $(CHECK_GENERIC_BOARD)
- endif
+ ifeq ($(wildcard include/config.mk),)
+ $(error "System not configured - see README")
endif
# If board code explicitly specified LDSCRIPT or CONFIG_SYS_LDSCRIPT, use
endif
endif
- ALL-y += $(obj)boot.bin
+ifneq ($(CONFIG_ZYNQ),)
+ifeq ($(CONFIG_SPL),y)
- build := -f $(TOPDIR)/scripts/Makefile.build -C
++ALL-y += boot.bin
+endif
+endif
+
+ LDFLAGS_u-boot += $(LDFLAGS_FINAL)
+ ifneq ($(CONFIG_SYS_TEXT_BASE),)
+ LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE)
+ endif
- all: $(ALL-y) $(SUBDIR_EXAMPLES-y)
+ quiet_cmd_objcopy = OBJCOPY $@
+ cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
- $(obj)u-boot.dtb: checkdtc $(obj)u-boot
- $(MAKE) $(build) dts binary
- mv $(obj)dts/dt.dtb $@
+ quiet_cmd_mkimage = MKIMAGE $@
+ cmd_mkimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) -d $< $@ \
+ $(if $(KBUILD_VERBOSE:1=), >/dev/null)
- $(obj)u-boot-dtb.bin: $(obj)u-boot.bin $(obj)u-boot.dtb
- cat $^ >$@
+ quiet_cmd_cat = CAT $@
+ cmd_cat = cat $(filter-out $(PHONY), $^) > $@
- $(obj)u-boot.hex: $(obj)u-boot
- $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
+ append = cat $(filter-out $< $(PHONY), $^) >> $@
- $(obj)u-boot.srec: $(obj)u-boot
- $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
+ quiet_cmd_pad_cat = CAT $@
+ cmd_pad_cat = $(cmd_objcopy) && $(append) || rm -f $@
- $(obj)u-boot.bin: $(obj)u-boot
- $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
- $(call DO_STATIC_RELA,$<,$@,$(CONFIG_SYS_TEXT_BASE))
- $(BOARD_SIZE_CHECK)
+ all: $(ALL-y)
+
+ 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
- $(obj)u-boot.ldr: $(obj)u-boot
+ OBJCOPYFLAGS_u-boot.srec := -O srec
+
+ u-boot.hex u-boot.srec: u-boot FORCE
+ $(call if_changed,objcopy)
+
+ OBJCOPYFLAGS_u-boot.bin := -O binary
+
+ u-boot.bin: u-boot FORCE
+ $(call if_changed,objcopy)
+ $(call DO_STATIC_RELA,$<,$@,$(CONFIG_SYS_TEXT_BASE))
+ $(BOARD_SIZE_CHECK)
+
+ u-boot.ldr: u-boot
$(CREATE_LDR_ENV)
$(LDR) -T $(CONFIG_BFIN_CPU) -c $@ $< $(LDR_FLAGS)
$(BOARD_SIZE_CHECK)
endif
endif
- $(obj)u-boot-img.bin: $(obj)spl/u-boot-spl.bin $(obj)u-boot.img
- cat $(obj)spl/u-boot-spl.bin $(obj)u-boot.img > $@
+ u-boot-img.bin: spl/u-boot-spl.bin u-boot.img FORCE
+ $(call if_changed,cat)
- $(obj)boot.bin: $(obj)spl/u-boot-spl.bin
- tools/zynq-boot-bin.py -o $(obj)boot.bin -u $(obj)spl/u-boot-spl.bin
++boot.bin: spl/u-boot-spl.bin
++ tools/zynq-boot-bin.py -o boot.bin -u spl/u-boot-spl.bin
+
# PPC4xx needs the SPL at the end of the image, since the reset vector
# is located at 0xfffffffc. So we can't use the "u-boot-img.bin" target
# and need to introduce a new build target with the full blown U-Boot
--defsym=_start=$(CONFIG_SYS_TEXT_BASE) \
-Ttext=$(CONFIG_SYS_TEXT_BASE)
- ifeq ($(CONFIG_SANDBOX),y)
- GEN_UBOOT = \
- cd $(LNDIR) && $(CC) $(SYMS) -T $(obj)u-boot.lds \
- -Wl,--start-group $(__LIBS) -Wl,--end-group \
- $(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot.map -o u-boot
- else
- GEN_UBOOT = \
- cd $(LNDIR) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \
- $(__OBJS) \
- --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
- -Map u-boot.map -o u-boot
- endif
+ # Rule to link u-boot
+ # May be overridden by arch/$(ARCH)/config.mk
+ quiet_cmd_u-boot__ ?= LD $@
+ cmd_u-boot__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_u-boot) -o $@ \
+ -T u-boot.lds $(u-boot-init) \
+ --start-group $(u-boot-main) --end-group \
+ $(PLATFORM_LIBS) -Map u-boot.map
- $(obj)u-boot: depend \
- $(SUBDIR_TOOLS) $(OBJS) $(LIBS) $(obj)u-boot.lds
- $(GEN_UBOOT)
+ u-boot: $(u-boot-init) $(u-boot-main) u-boot.lds
+ $(call if_changed,u-boot__)
ifeq ($(CONFIG_KALLSYMS),y)
- smap=`$(call SYSTEM_MAP,$(obj)u-boot) | \
- awk '$$2 ~ /[tTwW]/ {printf $$1 $$3 "\\\\000"}'` ; \
- $(CC) $(CFLAGS) -DSYSTEM_MAP="\"$${smap}\"" \
- -c common/system_map.c -o $(obj)common/system_map.o
- $(GEN_UBOOT) $(obj)common/system_map.o
+ smap=`$(call SYSTEM_MAP,u-boot) | \
+ awk '$$2 ~ /[tTwW]/ {printf $$1 $$3 "\\\\000"}'` ; \
+ $(CC) $(c_flags) -DSYSTEM_MAP="\"$${smap}\"" \
+ -c $(srctree)/common/system_map.c -o common/system_map.o
+ $(call cmd,u-boot__) common/system_map.o
endif
- $(OBJS):
- @:
-# The actual objects are generated when descending,
++# The actual objects are generated when descending,
+ # make sure no implicit rule kicks in
+ $(sort $(u-boot-init) $(u-boot-main)): $(u-boot-dirs) ;
+
+ # Handle descending into subdirectories listed in $(vmlinux-dirs)
+ # Preset locale variables to speed up the build process. Limit locale
+ # tweaks to this spot to avoid wrong language settings when running
+ # make menuconfig etc.
+ # Error messages still appears in the original language
+
+ PHONY += $(u-boot-dirs)
+ $(u-boot-dirs): prepare scripts
+ $(Q)$(MAKE) $(build)=$@
+
+ tools: prepare
+ # The "tools" are needed early
+ $(filter-out tools, $(u-boot-dirs)): tools
+ # The "examples" conditionally depend on U-Boot (say, when USE_PRIVATE_LIBGCC
+ # is "yes"), so compile examples after U-Boot is compiled.
+ examples: $(filter-out examples, $(u-boot-dirs))
+
+ define filechk_uboot.release
+ echo "$(UBOOTVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
+ endef
+
+ # Store (new) UBOOTRELEASE string in include/config/uboot.release
+ include/config/uboot.release: Makefile FORCE
+ $(call filechk,uboot.release)
+
+
+ # Things we need to do before we recursively start building the kernel
+ # or the modules are listed in "prepare".
+ # A multi level approach is used. prepareN is processed before prepareN-1.
+ # archprepare is used in arch Makefiles and when processed asm symlink,
+ # version.h and scripts_basic is processed / created.
+
+ # Listed in dependency order
+ PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3
+
+ # prepare3 is used to check if we are building in a separate output directory,
+ # and if so do:
+ # 1) Check that make has not been executed in the kernel src $(srctree)
+ prepare3: include/config/uboot.release
+ ifneq ($(KBUILD_SRC),)
+ @$(kecho) ' Using $(srctree) as source for u-boot'
+ $(Q)if [ -f $(srctree)/include/config.mk ]; then \
+ echo >&2 " $(srctree) is not clean, please run 'make mrproper'"; \
+ echo >&2 " in the '$(srctree)' directory.";\
+ /bin/false; \
+ fi;
+ endif
+
+ # prepare2 creates a makefile if using a separate output directory
+ prepare2: prepare3 outputmakefile
+
+ prepare1: prepare2 $(version_h) $(timestamp_h)
+ ifeq ($(__HAVE_ARCH_GENERIC_BOARD),)
+ ifeq ($(CONFIG_SYS_GENERIC_BOARD),y)
+ @echo >&2 " Your architecture does not support generic board."
+ @echo >&2 " Please undefine CONFIG_SYS_GENERIC_BOARD in your board config file."
+ @/bin/false
+ endif
+ endif
+ ifeq ($(wildcard $(LDSCRIPT)),)
+ @echo >&2 " Could not find linker script."
+ @/bin/false
+ endif
+
+ archprepare: prepare1 scripts_basic
+
+ prepare0: archprepare FORCE
+ $(Q)$(MAKE) $(build)=.
+
+ # All the preparing..
+ prepare: prepare0
+
+ # Generate some files
+ # ---------------------------------------------------------------------------
+
+ define filechk_version.h
+ (echo \#define PLAIN_VERSION \"$(UBOOTRELEASE)\"; \
+ echo \#define U_BOOT_VERSION \"U-Boot \" PLAIN_VERSION; \
+ echo \#define CC_VERSION_STRING \"$$($(CC) --version | head -n 1)\"; \
+ echo \#define LD_VERSION_STRING \"$$($(LD) --version | head -n 1)\"; )
+ endef
+
+ define filechk_timestamp.h
+ (LC_ALL=C date +'#define U_BOOT_DATE "%b %d %C%y"'; \
+ LC_ALL=C date +'#define U_BOOT_TIME "%T"')
+ endef
+
+ $(version_h): include/config/uboot.release FORCE
+ $(call filechk,version.h)
+
+ $(timestamp_h): $(srctree)/Makefile FORCE
+ $(call filechk,timestamp.h)
+
+ #
+ # 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.
+
+ quiet_cmd_autoconf_dep = GEN $@
+ cmd_autoconf_dep = $(CC) -x c -DDO_DEPS_ONLY -M $(c_flags) \
+ -MQ include/autoconf.mk $(srctree)/include/common.h > $@ || rm $@
+
+ include/autoconf.mk.dep: include/config.h include/common.h
+ $(call cmd,autoconf_dep)
+
+ quiet_cmd_autoconf = GEN $@
+ cmd_autoconf = \
+ $(CPP) $(c_flags) -DDO_DEPS_ONLY -dM $(srctree)/include/common.h > $@.tmp && \
+ sed -n -f $(srctree)/tools/scripts/define2mk.sed $@.tmp > $@; \
+ rm $@.tmp
+
+ include/autoconf.mk: include/config.h
+ $(call cmd,autoconf)
- $(LIBS): depend $(SUBDIR_TOOLS)
- $(MAKE) $(build) $(dir $(subst $(obj),,$@))
+ # ---------------------------------------------------------------------------
- $(SUBDIRS): depend
- $(MAKE) -C $@ all
+ PHONY += depend dep
+ depend dep:
+ @echo '*** Warning: make $@ is unnecessary now.'
- $(SUBDIR_EXAMPLES-y): $(obj)u-boot
+ # ---------------------------------------------------------------------------
+ quiet_cmd_cpp_lds = LDS $@
+ cmd_cpp_lds = $(CPP) -Wp,-MD,$(depfile) $(cpp_flags) $(LDPPFLAGS) -ansi \
+ -D__ASSEMBLY__ -x assembler-with-cpp -P -o $@ $<
- $(obj)u-boot.lds: $(LDSCRIPT) depend
- $(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$< >$@
+ u-boot.lds: $(LDSCRIPT) prepare FORCE
+ $(call if_changed_dep,cpp_lds)
- nand_spl: $(TIMESTAMP_FILE) $(VERSION_FILE) depend
- $(MAKE) -C nand_spl/board/$(BOARDDIR) all
+ PHONY += nand_spl
+ nand_spl: prepare
+ $(Q)$(MAKE) $(build)=nand_spl/board/$(BOARDDIR) all
+ @echo >&2
+ @echo >&2 "==================== WARNING ====================="
+ @echo >&2 "nand_spl will not be included in v2014.07 release."
+ @echo >&2 "Please switch over to SPL."
+ @echo >&2 "Otherwise, this board will be removed."
+ @echo >&2 "=================================================="
+ @echo >&2
- $(obj)u-boot-nand.bin: nand_spl $(obj)u-boot.bin
- cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin
+ nand_spl/u-boot-spl-16k.bin: nand_spl
+ @:
- $(obj)spl/u-boot-spl.bin: $(SUBDIR_TOOLS) depend
- $(MAKE) -C spl all
+ u-boot-nand.bin: nand_spl/u-boot-spl-16k.bin u-boot.bin FORCE
+ $(call if_changed,cat)
- $(obj)tpl/u-boot-tpl.bin: $(SUBDIR_TOOLS) depend
- $(MAKE) -C spl all CONFIG_TPL_BUILD=y
+ spl/u-boot-spl.bin: spl/u-boot-spl
+ @:
+ spl/u-boot-spl: tools prepare
+ $(Q)$(MAKE) obj=spl -f $(srctree)/spl/Makefile all
- # Explicitly make _depend in subdirs containing multiple targets to prevent
- # parallel sub-makes creating .depend files simultaneously.
- depend dep: $(TIMESTAMP_FILE) $(VERSION_FILE) \
- $(obj)include/spl-autoconf.mk \
- $(obj)include/tpl-autoconf.mk \
- $(obj)include/autoconf.mk \
- $(obj)include/generated/generic-asm-offsets.h \
- $(obj)include/generated/asm-offsets.h
+ tpl/u-boot-tpl.bin: tools prepare
+ $(Q)$(MAKE) obj=tpl -f $(srctree)/spl/Makefile all CONFIG_TPL_BUILD=y
- TAG_SUBDIRS = $(SUBDIRS)
- TAG_SUBDIRS += $(dir $(__LIBS))
- TAG_SUBDIRS += include
+ TAG_SUBDIRS := $(u-boot-dirs) include
FIND := find
FINDFLAGS := -L
cat COPYING | gzip -9 -c | ./tools/bin2header license_gzip > include/license.h
#########################################################################
- 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)include/spl-autoconf.mk \
- $(obj)include/tpl-autoconf.mk
+ ###
+ # Cleaning is done on three levels.
+ # make clean Delete most generated files
+ # Leave enough to build external modules
+ # make mrproper Delete the current configuration, and all generated files
+ # make distclean Remove editor backup files, patch leftover files and the like
+
+ # Directories & files removed with 'make clean'
+ CLEAN_DIRS += $(MODVERDIR)
+ CLEAN_FILES += u-boot.lds include/bmp_logo.h include/bmp_logo_data.h \
+ include/autoconf.mk* include/spl-autoconf.mk \
+ include/tpl-autoconf.mk
+
+ # Directories & files removed with 'make clobber'
+ CLOBBER_DIRS += $(patsubst %,spl/%, $(filter-out Makefile, \
+ $(shell ls -1 spl 2>/dev/null))) \
+ tpl
+ CLOBBER_FILES += u-boot* MLO* SPL System.map nand_spl/u-boot*
+
+ # Directories & files removed with 'make mrproper'
+ MRPROPER_DIRS += include/config include/generated
+ MRPROPER_FILES += .config .config.old \
+ tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
+ include/config.h include/config.mk
+
+ # clean - Delete most, but leave enough to build external modules
+ #
+ clean: rm-dirs := $(CLEAN_DIRS)
+ clean: rm-files := $(CLEAN_FILES)
+
+ clean-dirs := $(foreach f,$(u-boot-alldirs),$(if $(wildcard $(srctree)/$f/Makefile),$f))
+
+ clean-dirs := $(addprefix _clean_, $(clean-dirs) doc/DocBook)
+
+ PHONY += $(clean-dirs) clean archclean
+ $(clean-dirs):
+ $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
+
+ # TODO: Do not use *.cfgtmp
+ clean: $(clean-dirs)
+ $(call cmd,rmdirs)
+ $(call cmd,rmfiles)
+ @find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
+ \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
+ -o -name '*.ko.*' -o -name '*.su' -o -name '*.cfgtmp' \
+ -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
+ -o -name '*.symtypes' -o -name 'modules.order' \
+ -o -name modules.builtin -o -name '.tmp_*.o.*' \
+ -o -name '*.gcno' \) -type f -print | xargs rm -f
+ @find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
+ -path './nand_spl/*' -type l -print | xargs rm -f
+
+ # clobber
+ #
+ clobber: rm-dirs := $(CLOBBER_DIRS)
+ clobber: rm-files := $(CLOBBER_FILES)
- %_config:: unconfig
- @$(MKCONFIG) -A $(@:_config=)
+ PHONY += clobber
- sinclude $(obj).boards.depend
- $(obj).boards.depend: boards.cfg
- @awk '(NF && $$1 !~ /^#/) { print $$7 ": " $$7 "_config; $$(MAKE)" }' $< > $@
+ clobber: clean
+ $(call cmd,rmdirs)
+ $(call cmd,rmfiles)
- #########################################################################
- #########################################################################
+ # mrproper - Delete all generated files, including .config
+ #
+ mrproper: rm-dirs := $(wildcard $(MRPROPER_DIRS))
+ mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
+ mrproper-dirs := $(addprefix _mrproper_,scripts)
- clean:
- @rm -f $(obj)examples/standalone/atmel_df_pow2 \
- $(obj)examples/standalone/hello_world \
- $(obj)examples/standalone/interrupt \
- $(obj)examples/standalone/mem_to_mem_idma2intr \
- $(obj)examples/standalone/sched \
- $(obj)examples/standalone/smc911{11,x}_eeprom \
- $(obj)examples/standalone/test_burst \
- $(obj)examples/standalone/timer
- @rm -f $(obj)examples/api/demo{,.bin}
- @rm -f $(obj)tools/bmp_logo $(obj)tools/easylogo/easylogo \
- $(obj)tools/env/fw_printenv \
- $(obj)tools/envcrc \
- $(obj)tools/gdb/{gdbcont,gdbsend} \
- $(obj)tools/gen_eth_addr $(obj)tools/img2srec \
- $(obj)tools/dump{env,}image \
- $(obj)tools/mk{env,}image $(obj)tools/mpc86x_clk \
- $(obj)tools/mk{$(BOARD),}spl \
- $(obj)tools/mxsboot \
- $(obj)tools/ncb $(obj)tools/ubsha1 \
- $(obj)tools/kernel-doc/docproc \
- $(obj)tools/proftool
- @rm -f $(obj)board/cray/L1/{bootscript.c,bootscript.image} \
- $(obj)board/matrix_vision/*/bootscript.img \
- $(obj)u-boot.lds \
- $(obj)arch/blackfin/cpu/init.{lds,elf}
- @rm -f $(obj)include/bmp_logo.h
- @rm -f $(obj)include/bmp_logo_data.h
- @rm -f $(obj)lib/asm-offsets.s
- @rm -f $(obj)include/generated/asm-offsets.h
- @rm -f $(obj)$(CPUDIR)/$(SOC)/asm-offsets.s
- @rm -f $(TIMESTAMP_FILE) $(VERSION_FILE)
- @$(MAKE) -s -C doc/DocBook/ cleandocs
- @find $(OBJTREE) -type f \
- \( -name 'core' -o -name '*.bak' -o -name '*~' -o -name '*.su' \
- -o -name '*.o' -o -name '*.a' -o -name '*.exe' \
- -o -name '*.cfgtmp' \) -print \
- | xargs rm -f
-
- # Removes everything not needed for testing u-boot
- tidy: clean
- @find $(OBJTREE) -type f \( -name '*.depend*' \) -print | xargs rm -f
-
- clobber: tidy
- @find $(OBJTREE) -type f \( -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-y)
- @rm -f $(obj)u-boot.kwb
- @rm -f $(obj)u-boot.pbl
- @rm -f $(obj)u-boot.imx
- @rm -f $(obj)u-boot-with-spl.imx
- @rm -f $(obj)u-boot-with-nand-spl.imx
- @rm -f $(obj)u-boot.ubl
- @rm -f $(obj)u-boot.ais
- @rm -f $(obj)u-boot.dtb
- @rm -f $(obj)u-boot.sb
- @rm -f $(obj)u-boot.spr
- @rm -f $(obj)nand_spl/{u-boot.{lds,lst},System.map}
- @rm -f $(obj)nand_spl/{u-boot-nand_spl.lds,u-boot-spl,u-boot-spl.map}
- @rm -f $(obj)spl/{u-boot-spl,u-boot-spl.bin,u-boot-spl.map}
- @rm -f $(obj)spl/u-boot-spl.lds
- @rm -f $(obj)tpl/{u-boot-tpl,u-boot-tpl.bin,u-boot-tpl.map}
- @rm -f $(obj)tpl/u-boot-spl.lds
- @rm -f $(obj)MLO MLO.byteswap
- @rm -f $(obj)SPL
- @rm -f $(obj)tools/xway-swap-bytes
- @rm -fr $(obj)include/asm/proc $(obj)include/asm/arch $(obj)include/asm
- @rm -fr $(obj)include/generated
- @[ ! -d $(obj)nand_spl ] || find $(obj)nand_spl -name "*" -type l -print | xargs rm -f
- @rm -f $(obj)dts/*.tmp
- @rm -f $(obj)spl/u-boot-spl{,-pad}.ais
-
- mrproper \
- distclean: clobber unconfig
- ifneq ($(OBJTREE),$(SRCTREE))
- rm -rf $(obj)*
- endif
+ PHONY += $(mrproper-dirs) mrproper archmrproper
+ $(mrproper-dirs):
+ $(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)
+
+ mrproper: clobber $(mrproper-dirs)
+ $(call cmd,rmdirs)
+ $(call cmd,rmfiles)
+ @rm -f arch/*/include/asm/arch arch/*/include/asm/proc
+
+ # distclean
+ #
+ PHONY += distclean
+
+ distclean: mrproper
+ @find $(srctree) $(RCS_FIND_IGNORE) \
+ \( -name '*.orig' -o -name '*.rej' -o -name '*~' \
+ -o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
+ -o -name '.*.rej' -o -name '*.pyc' \
+ -o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
+ -type f -print | xargs rm -f
backup:
- F=`basename $(TOPDIR)` ; cd .. ; \
+ F=`basename $(srctree)` ; cd .. ; \
gtar --force-local -zcvf `LC_ALL=C date "+$$F-%Y-%m-%d-%T.tar.gz"` $$F
- #########################################################################
+ help:
+ @echo 'Cleaning targets:'
+ @echo ' clean - Remove most generated files but keep the config and'
+ @echo ' necessities for testing u-boot'
+ @echo ' clobber - Remove most generated files but keep the config'
+ @echo ' mrproper - Remove all generated files + config + various backup files'
+ @echo ' distclean - mrproper + remove editor backup and patch files'
+ @echo ''
+ # uncomment after adding Kconfig feature
+ # @echo 'Configuration targets:'
+ # @$(MAKE) -f $(srctree)/scripts/kconfig/Makefile help
+ # @echo ''
+ @echo 'Other generic targets:'
+ @echo ' all - Build all necessary images depending on configuration'
+ @echo ' u-boot - Build the bare u-boot'
+ @echo ' dir/ - Build all files in dir and below'
+ @echo ' dir/file.[oisS] - Build specified target only'
+ @echo ' dir/file.lst - Build specified mixed source/assembly target only'
+ @echo ' (requires a recent binutils and recent build (System.map))'
+ @echo ' tags/TAGS - Generate tags file for editors'
+ @echo ' cscope - Generate cscope index'
+ @echo ' ubootrelease - Output the release version string'
+ @echo ' ubootversion - Output the version stored in Makefile'
+ @echo ''
+ @echo 'Static analysers'
+ @echo ' checkstack - Generate a list of stack hogs'
+ @echo ''
+ @echo 'Documentation targets:'
+ @$(MAKE) -f $(srctree)/doc/DocBook/Makefile dochelp
+ @echo ''
+ @echo ' make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
+ @echo ' make V=2 [targets] 2 => give reason for rebuild of target'
+ @echo ' make O=dir [targets] Locate all output files in "dir", including .config'
+ @echo ' make C=1 [targets] Check all c source with $$CHECK (sparse by default)'
+ @echo ' make C=2 [targets] Force check of all c source with $$CHECK'
+ @echo ' make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections'
+ @echo ' make W=n [targets] Enable extra gcc checks, n=1,2,3 where'
+ @echo ' 1: warnings which may be relevant and do not occur too often'
+ @echo ' 2: warnings which occur quite often but may still be relevant'
+ @echo ' 3: more obscure warnings, can most likely be ignored'
+ @echo ' Multiple levels can be combined with W=12 or W=123'
+ @echo ''
+ @echo 'Execute "make" or "make all" to build all targets marked with [*] '
+ @echo 'For further info see the ./README file'
+
+
+ # Documentation targets
+ # ---------------------------------------------------------------------------
+ %docs: scripts_basic FORCE
+ $(Q)$(MAKE) $(build)=scripts build_docproc
+ $(Q)$(MAKE) $(build)=doc/DocBook $@
+
+ # Dummies...
+ PHONY += prepare scripts
+ prepare: ;
+ scripts: ;
+
+ endif #ifeq ($(config-targets),1)
+ endif #ifeq ($(mixed-targets),1)
+
+ PHONY += checkstack ubootrelease ubootversion
+
+ checkstack:
+ $(OBJDUMP) -d u-boot $$(find . -name u-boot-spl) | \
+ $(PERL) $(src)/scripts/checkstack.pl $(ARCH)
+
+ ubootrelease:
+ @echo "$(UBOOTVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
+
+ ubootversion:
+ @echo $(UBOOTVERSION)
+
+ # Single targets
+ # ---------------------------------------------------------------------------
+ # Single targets are compatible with:
+ # - build with mixed source and output
+ # - build with separate output dir 'make O=...'
+ # - external modules
+ #
+ # target-dir => where to store outputfile
+ # build-dir => directory in kernel source tree to use
+
+ ifeq ($(KBUILD_EXTMOD),)
+ build-dir = $(patsubst %/,%,$(dir $@))
+ target-dir = $(dir $@)
+ else
+ zap-slash=$(filter-out .,$(patsubst %/,%,$(dir $@)))
+ build-dir = $(KBUILD_EXTMOD)$(if $(zap-slash),/$(zap-slash))
+ target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@))
+ endif
+
+ %.s: %.c prepare scripts FORCE
+ $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+ %.i: %.c prepare scripts FORCE
+ $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+ %.o: %.c prepare scripts FORCE
+ $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+ %.lst: %.c prepare scripts FORCE
+ $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+ %.s: %.S prepare scripts FORCE
+ $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+ %.o: %.S prepare scripts FORCE
+ $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+ %.symtypes: %.c prepare scripts FORCE
+ $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+
+ # Modules
+ /: prepare scripts FORCE
+ $(cmd_crmodverdir)
+ $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
+ $(build)=$(build-dir)
+ %/: prepare scripts FORCE
+ $(cmd_crmodverdir)
+ $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
+ $(build)=$(build-dir)
+ %.ko: prepare scripts FORCE
+ $(cmd_crmodverdir)
+ $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
+ $(build)=$(build-dir) $(@:.ko=.o)
+ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+
-# FIXME Should go into a make.lib or something
++# FIXME Should go into a make.lib or something
+ # ===========================================================================
+
+ quiet_cmd_rmdirs = $(if $(wildcard $(rm-dirs)),CLEAN $(wildcard $(rm-dirs)))
+ cmd_rmdirs = rm -rf $(rm-dirs)
+
+ quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files)))
+ cmd_rmfiles = rm -f $(rm-files)
+
+ # read all saved command lines
+
+ targets := $(wildcard $(sort $(targets)))
+ cmd_files := $(wildcard .*.cmd $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
+
+ ifneq ($(cmd_files),)
+ $(cmd_files): ; # Do not try to update included dependency files
+ include $(cmd_files)
+ endif
+
+ # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=dir
+ # Usage:
+ # $(Q)$(MAKE) $(clean)=dir
+ clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj
+
+ endif # skip-makefile
+
+ PHONY += FORCE
+ FORCE:
+
+ # Declare the contents of the .PHONY variable as phony. We keep that
+ # information in a variable so we can use it in if_changed and friends.
+ .PHONY: $(PHONY)