Makefile 75.4 KB
Newer Older
1
# SPDX-License-Identifier: GPL-2.0+
2

Tom Rini's avatar
Tom Rini committed
3
4
VERSION = 2021
PATCHLEVEL = 01
Wolfgang Denk's avatar
Wolfgang Denk committed
5
SUBLEVEL =
Tom Rini's avatar
Tom Rini committed
6
EXTRAVERSION =
7
NAME =
8

9
10
11
12
13
14
# *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.

15
16
17
18
# 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)
19

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# Determine host architecture
include include/host_arch.h
MK_ARCH="${shell uname -m}"
unexport HOST_ARCH
ifeq ("x86_64", $(MK_ARCH))
  export HOST_ARCH=$(HOST_ARCH_X86_64)
else ifneq (,$(findstring $(MK_ARCH), "i386" "i486" "i586" "i686"))
  export HOST_ARCH=$(HOST_ARCH_X86)
else ifneq (,$(findstring $(MK_ARCH), "aarch64" "armv8l"))
  export HOST_ARCH=$(HOST_ARCH_AARCH64)
else ifeq ("armv7l", $(MK_ARCH))
  export HOST_ARCH=$(HOST_ARCH_ARM)
else ifeq ("riscv32", $(MK_ARCH))
  export HOST_ARCH=$(HOST_ARCH_RISCV32)
else ifeq ("riscv64", $(MK_ARCH))
  export HOST_ARCH=$(HOST_ARCH_RISCV64)
endif
undefine MK_ARCH

39
40
41
42
43
44
# Avoid funny character set dependencies
unexport LC_ALL
LC_COLLATE=C
LC_NUMERIC=C
export LC_COLLATE LC_NUMERIC

45
46
47
# Avoid interference with shell env settings
unexport GREP_OPTIONS

48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 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.

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# 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.
#
87
88
89
90
91
92
93
94
95
96
# 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

97
98
99
100
101
102
103
ifeq ($(KBUILD_VERBOSE),1)
  quiet =
  Q =
else
  quiet=quiet_
  Q = @
endif
104

105
106
107
108
109
110
# 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_
111
endif
112
113
114
else					# make-3.8x
ifneq ($(filter s% -s%,$(MAKEFLAGS)),)
  quiet=silent_
115
116
117
endif
endif

118
export quiet Q KBUILD_VERBOSE
119

120
121
122
123
124
# 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/"
125
#
126
127
128
129
130
# 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
131
#
132
133
134
135
136
137
# 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),)
138

139
140
# OK, Make called in directory where kernel src resides
# Do we want to locate output files in a separate directory?
141
ifeq ("$(origin O)", "command line")
142
143
144
145
146
147
148
149
150
151
152
153
154
155
  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)
156
157
KBUILD_OUTPUT := $(shell mkdir -p $(KBUILD_OUTPUT) && cd $(KBUILD_OUTPUT) \
								&& /bin/pwd)
158
$(if $(KBUILD_OUTPUT),, \
159
     $(error failed to create output directory "$(saved-output)"))
160
161
162
163
164
165
166

PHONY += $(MAKECMDGOALS) sub-make

$(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
	@:

sub-make: FORCE
167
168
	$(Q)$(MAKE) -C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR) \
	-f $(CURDIR)/Makefile $(filter-out _all sub-make,$(MAKECMDGOALS))
169
170
171
172
173
174
175
176
177

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

178
179
180
181
182
183
184
185
186
187
188
189
# 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.
#
190
# See the file "doc/sparse.txt" for more details, including
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
# 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

211
212
# If building an external module we do not care about the all: rule
# but instead _all depend on modules
213
PHONY += all
214
ifeq ($(KBUILD_EXTMOD),)
215
_all: all
216
else
217
_all: modules
218
endif
219

220
221
222
223
224
225
226
227
228
229
230
231
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		:= .
232
233
234
235
236
237
238
src		:= $(srctree)
obj		:= $(objtree)

VPATH		:= $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))

export srctree objtree VPATH

239
240
241
# Make sure CDPATH settings don't interfere
unexport CDPATH

wdenk's avatar
wdenk committed
242
243
244
#########################################################################

HOSTARCH := $(shell uname -m | \
Graeme Russ's avatar
Graeme Russ committed
245
	sed -e s/i.86/x86/ \
wdenk's avatar
wdenk committed
246
247
248
	    -e s/sun4u/sparc64/ \
	    -e s/arm.*/arm/ \
	    -e s/sa110/arm/ \
Kumar Gala's avatar
Kumar Gala committed
249
250
	    -e s/ppc64/powerpc/ \
	    -e s/ppc/powerpc/ \
251
252
	    -e s/macppc/powerpc/\
	    -e s/sh.*/sh/)
wdenk's avatar
wdenk committed
253

254
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
wdenk's avatar
wdenk committed
255
256
	    sed -e 's/\(cygwin\).*/cygwin/')

257
export	HOSTARCH HOSTOS
wdenk's avatar
wdenk committed
258

259
#########################################################################
260

261
# set default to nothing for native builds
Wolfgang Denk's avatar
Wolfgang Denk committed
262
ifeq ($(HOSTARCH),$(ARCH))
263
CROSS_COMPILE ?=
264
265
endif

Masahiro Yamada's avatar
Masahiro Yamada committed
266
267
268
KCONFIG_CONFIG	?= .config
export KCONFIG_CONFIG

269
270
271
272
273
# 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)

274
275
276
277
HOST_LFS_CFLAGS := $(shell getconf LFS_CFLAGS 2>/dev/null)
HOST_LFS_LDFLAGS := $(shell getconf LFS_LDFLAGS 2>/dev/null)
HOST_LFS_LIBS := $(shell getconf LFS_LIBS 2>/dev/null)

278
279
HOSTCC       = cc
HOSTCXX      = c++
280
KBUILD_HOSTCFLAGS   := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer \
281
		$(HOST_LFS_CFLAGS) $(HOSTCFLAGS)
282
283
284
KBUILD_HOSTCXXFLAGS := -O2 $(HOST_LFS_CFLAGS) $(HOSTCXXFLAGS)
KBUILD_HOSTLDFLAGS  := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS)
KBUILD_HOSTLDLIBS   := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
285

286
287
288
289
290
# With the move to GCC 6, we have implicitly upgraded our language
# standard to GNU11 (see https://gcc.gnu.org/gcc-5/porting_to.html).
# Some Linux distributions (including RHEL7, SLES13, Debian 8) still
# have older compilers as their default, so we make it explicit for
# these that our host tools are GNU11 (i.e. C11 w/ GNU extensions).
291
CSTD_FLAG := -std=gnu11
292
ifeq ($(HOSTOS),linux)
293
KBUILD_HOSTCFLAGS += $(CSTD_FLAG)
294
295
endif

296
ifeq ($(HOSTOS),cygwin)
297
KBUILD_HOSTCFLAGS	+= -ansi
298
299
300
301
302
303
304
305
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.
306
#
307
308
309
# 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.
310
#
311
312
313
314
315
316
317
318
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 ;)

默默's avatar
默默 committed
319
320
321
os_x_after = $(shell if [ $(DARWIN_MAJOR_VERSION) -ge $(1) -a \
	$(DARWIN_MINOR_VERSION) -ge $(2) ] ; then echo "$(3)"; else echo "$(4)"; fi ;)	

322
323
# Snow Leopards build environment has no longer restrictions as described above
HOSTCC       = $(call os_x_before, 10, 5, "cc", "gcc")
324
325
KBUILD_HOSTCFLAGS  += $(call os_x_before, 10, 4, "-traditional-cpp")
KBUILD_HOSTLDFLAGS += $(call os_x_before, 10, 5, "-multiply_defined suppress")
326
327
328
329

# 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
330
KBUILD_HOSTLDFLAGS += $(call os_x_before, 10, 7, "", "-Xlinker -no_pie")
默默's avatar
默默 committed
331
332
333

# macOS Mojave (10.14.X) 
# Undefined symbols for architecture x86_64: "_PyArg_ParseTuple"
334
KBUILD_HOSTLDFLAGS += $(call os_x_after, 10, 14, "-lpython -dynamclib", "")
335
336
endif

337
338
339
340
341
342
# Decide whether to build built-in, modular, or both.
# Normally, just do built-in.

KBUILD_MODULES :=
KBUILD_BUILTIN := 1

343
344
345
346
# 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.
347
348
349
350
351

ifeq ($(MAKECMDGOALS),modules)
  KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
endif

352
353
354
# 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
355
356
357
358
359
360
361
362
363
364

# U-Boot does not need modules
#ifneq ($(filter all _all modules,$(MAKECMDGOALS)),)
#  KBUILD_MODULES := 1
#endif

#ifeq ($(MAKECMDGOALS),)
#  KBUILD_MODULES := 1
#endif

365
366
367
368
# Check ths size of a binary:
# Args:
#   $1: File to check
#   #2: Size limit in bytes (decimal or 0xhex)
369
370
371
372
373
define size_check
	actual=$$( wc -c $1 | awk '{print $$1}'); \
	limit=$$( printf "%d" $2 ); \
	if test $$actual -gt $$limit; then \
		echo "$1 exceeds file size limit:" >&2; \
374
		echo "  limit:  $$(printf %#x $$limit) bytes" >&2; \
375
376
		echo "  actual: $$(printf %#x $$actual) bytes" >&2; \
		echo "  excess: $$(printf %#x $$((actual - limit))) bytes" >&2;\
377
378
379
380
381
		exit 1; \
	fi
endef
export size_check

382
383
384
export KBUILD_MODULES KBUILD_BUILTIN
export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD

Masahiro Yamada's avatar
Masahiro Yamada committed
385
# We need some generic definitions (do not try to remake the file).
386
387
scripts/Kbuild.include: ;
include scripts/Kbuild.include
388

389
# Make variables (CC, etc...)
wdenk's avatar
wdenk committed
390

391
392
393
394
AS		= $(CROSS_COMPILE)as
# Always use GNU ld
ifneq ($(shell $(CROSS_COMPILE)ld.bfd -v 2> /dev/null),)
LD		= $(CROSS_COMPILE)ld.bfd
395
else
396
397
398
399
400
401
402
403
404
405
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
406
407
LEX		= flex
YACC		= bison
408
AWK		= awk
409
PERL		= perl
410
PYTHON		?= python
411
412
PYTHON2		= python2
PYTHON3		= python3
413
DTC		?= $(objtree)/scripts/dtc/dtc
414
415
416
417
418
CHECK		= sparse

CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
		  -Wbitwise -Wno-return-void -D__CHECK_ENDIAN__ $(CF)

419
KBUILD_CPPFLAGS := -D__KERNEL__ -D__UBOOT__
420
421
422

KBUILD_CFLAGS   := -Wall -Wstrict-prototypes \
		   -Wno-format-security \
423
		   -fno-builtin -ffreestanding $(CSTD_FLAG)
424
KBUILD_CFLAGS	+= -fshort-wchar -fno-strict-aliasing
425
KBUILD_AFLAGS   := -D__ASSEMBLY__
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
KBUILD_LDFLAGS  :=

ifeq ($(cc-name),clang)
ifneq ($(CROSS_COMPILE),)
CLANG_TARGET	:= --target=$(notdir $(CROSS_COMPILE:%-=%))
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(LD)))
CLANG_PREFIX	:= --prefix=$(GCC_TOOLCHAIN_DIR)
GCC_TOOLCHAIN	:= $(realpath $(GCC_TOOLCHAIN_DIR)/..)
endif
ifneq ($(GCC_TOOLCHAIN),)
CLANG_GCC_TC	:= --gcc-toolchain=$(GCC_TOOLCHAIN)
endif
KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
KBUILD_CFLAGS += $(call cc-option, -no-integrated-as)
KBUILD_AFLAGS += $(call cc-option, -no-integrated-as)
endif
443

444
445
446
447
# Don't generate position independent code
KBUILD_CFLAGS	+= $(call cc-option,-fno-PIE)
KBUILD_AFLAGS	+= $(call cc-option,-fno-PIE)

448
449
450
# 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)
451

452
export VERSION PATCHLEVEL SUBLEVEL UBOOTRELEASE UBOOTVERSION
Masahiro Yamada's avatar
Masahiro Yamada committed
453
export ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR
454
455
export CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC
export CPP AR NM LDR STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
456
export MAKE LEX YACC AWK PERL PYTHON PYTHON2 PYTHON3
457
export HOSTCXX KBUILD_HOSTCXXFLAGS CHECK CHECKFLAGS DTC DTC_FLAGS
458

459
export KBUILD_CPPFLAGS NOSTDINC_FLAGS UBOOTINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS
460
461
export KBUILD_CFLAGS KBUILD_AFLAGS

462
463
export CC_VERSION_TEXT := $(shell $(CC) --version | head -n 1)

464
465
466
467
468
469
470
# 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

471
472
473
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
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
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 ;

489
490
491
492
493
494
495
496
497
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)
498
endif
499

500
501
502
503
504
505
506
507
# 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).

508
509
version_h := include/generated/version_autogenerated.h
timestamp_h := include/generated/timestamp_autogenerated.h
510
defaultenv_h := include/generated/defaultenv_autogenerated.h
511
dt_h := include/generated/dt.h
512

513
no-dot-config-targets := clean clobber mrproper distclean \
514
			 help %docs check% coccicheck \
515
			 ubootversion backup tests check qcheck tcheck
516
517
518
519
520
521
522
523
524
525

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
526

527
528
529
ifeq ($(KBUILD_EXTMOD),)
        ifneq ($(filter config %config,$(MAKECMDGOALS)),)
                config-targets := 1
Masahiro Yamada's avatar
Masahiro Yamada committed
530
                ifneq ($(words $(MAKECMDGOALS)),1)
531
532
533
                        mixed-targets := 1
                endif
        endif
534
endif
wdenk's avatar
wdenk committed
535

536
537
538
539
ifeq ($(mixed-targets),1)
# ===========================================================================
# We're called with mixed targets (*config and build targets).
# Handle them one by one.
540

541
PHONY += $(MAKECMDGOALS) __build_one_by_one
542

543
$(filter-out __build_one_by_one, $(MAKECMDGOALS)): __build_one_by_one
544
545
	@:

546
__build_one_by_one:
547
548
549
550
	$(Q)set -e; \
	for i in $(MAKECMDGOALS); do \
		$(MAKE) -f $(srctree)/Makefile $$i; \
	done
551

552
553
554
555
556
else
ifeq ($(config-targets),1)
# ===========================================================================
# *config targets only - make sure prerequisites are updated, and descend
# in scripts/kconfig to make the *config target
wdenk's avatar
wdenk committed
557

Masahiro Yamada's avatar
Masahiro Yamada committed
558
559
KBUILD_DEFCONFIG := sandbox_defconfig
export KBUILD_DEFCONFIG KBUILD_KCONFIG
560

Masahiro Yamada's avatar
Masahiro Yamada committed
561
config: scripts_basic outputmakefile FORCE
562
	$(Q)$(MAKE) $(build)=scripts/kconfig $@
Masahiro Yamada's avatar
Masahiro Yamada committed
563
564

%config: scripts_basic outputmakefile FORCE
565
	$(Q)$(MAKE) $(build)=scripts/kconfig $@
566

567
568
569
570
else
# ===========================================================================
# Build targets only - this includes vmlinux, arch specific targets, clean
# targets and others. In general all targets except *config targets.
571

572
573
574
575
576
577
578
# 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)=$(@)

579
580
ifeq ($(dot-config),1)
# Read in config
Masahiro Yamada's avatar
Masahiro Yamada committed
581
582
583
584
585
586
587
588
589
590
591
592
593
594
-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
595
	$(Q)$(MAKE) -f $(srctree)/Makefile syncconfig
596
597
598
599
600
601
602
603
604
	@# 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
Masahiro Yamada's avatar
Masahiro Yamada committed
605

606
u-boot.cfg spl/u-boot.cfg tpl/u-boot.cfg:
607
608
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.autoconf $(@)

609
610
-include include/autoconf.mk
-include include/autoconf.mk.dep
wdenk's avatar
wdenk committed
611

Masahiro Yamada's avatar
Masahiro Yamada committed
612
613
614
615
# 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.
616
617
618
619
620
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),)
621
622
include config.mk
include arch/$(ARCH)/Makefile
623
endif
624
625
endif
endif
626

627
628
629
630
631
632
633
634
635
# 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

636
637
638
639
640
# 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
641
	#LDSCRIPT := $(srctree)/board/$(BOARDDIR)/u-boot.lds.debug
642
643
	ifdef CONFIG_SYS_LDSCRIPT
		# need to strip off double quotes
644
		LDSCRIPT := $(srctree)/$(CONFIG_SYS_LDSCRIPT:"%"=%)
645
646
647
	endif
endif

648
# If there is no specified link script, we look in a number of places for it
649
650
ifndef LDSCRIPT
	ifeq ($(wildcard $(LDSCRIPT)),)
651
		LDSCRIPT := $(srctree)/board/$(BOARDDIR)/u-boot.lds
652
653
	endif
	ifeq ($(wildcard $(LDSCRIPT)),)
654
		LDSCRIPT := $(srctree)/$(CPUDIR)/u-boot.lds
655
	endif
656
	ifeq ($(wildcard $(LDSCRIPT)),)
657
		LDSCRIPT := $(srctree)/arch/$(ARCH)/cpu/u-boot.lds
658
	endif
659
660
endif

661
else
Masahiro Yamada's avatar
Masahiro Yamada committed
662
663
# Dummy target needed, because used as prerequisite
include/config/auto.conf: ;
664
665
endif # $(dot-config)

666
667
668
669
670
671
672
673
#
# 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

674
675
676
677
678
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
KBUILD_CFLAGS	+= -Os
else
KBUILD_CFLAGS	+= -O2
endif
679
680

KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector)
681
KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks)
682

683
684
685
# disable stringop warnings in gcc 8+
KBUILD_CFLAGS += $(call cc-disable-warning, stringop-truncation)

686
687
688
# Enabled with W=2, disabled by default as noisy
KBUILD_CFLAGS += $(call cc-disable-warning, maybe-uninitialized)

689
690
691
# change __FILE__ to the relative path from the srctree
KBUILD_CFLAGS	+= $(call cc-option,-fmacro-prefix-map=$(srctree)/=)

692
693
694
695
696
697
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
698
699
700
# ARC tools based on GCC 7.1 has an issue with stack usage
# with naked functions, see commit message for more details
ifndef CONFIG_ARC
701
702
703
ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-stack-usage.sh $(CC)),y)
	KBUILD_CFLAGS += -fstack-usage
endif
704
endif
705
706

KBUILD_CFLAGS += $(call cc-option,-Wno-format-nonliteral)
707
708
KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)

709
710
711
712
ifeq ($(cc-name),clang)
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
713
714
715
716
717
718
719
KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
# Quiet clang warning: comparison of unsigned expression < 0 is always false
KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
# CLANG uses a _MergedGlobals as optimization, but this breaks modpost, as the
# source of a reference will be _MergedGlobals and not on of the whitelisted names.
# See modpost pattern 2
KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,)
720
KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior)
721
722
723
724
725
else

# These warnings generated too much noise in a regular build.
# Use make W=1 to enable them (see scripts/Makefile.extrawarn)
KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
726
endif
727

728
729
730
# Prohibit date/time macros, which would make the build non-deterministic
KBUILD_CFLAGS   += $(call cc-option,-Werror=date-time)

731
include scripts/Makefile.extrawarn
732

733
734
735
736
737
# Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
KBUILD_CPPFLAGS += $(KCPPFLAGS)
KBUILD_AFLAGS += $(KAFLAGS)
KBUILD_CFLAGS += $(KCFLAGS)

738
739
KBUILD_HOSTCFLAGS += $(if $(CONFIG_TOOLS_DEBUG),-g)

740
741
# Use UBOOTINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
742
UBOOTINCLUDE    := \
743
744
745
746
747
748
749
750
751
	-Iinclude \
	$(if $(KBUILD_SRC), -I$(srctree)/include) \
	$(if $(CONFIG_$(SPL_)SYS_THUMB_BUILD), \
		$(if $(CONFIG_HAS_THUMB2), \
			$(if $(CONFIG_CPU_V7M), \
				-I$(srctree)/arch/arm/thumb1/include), \
			-I$(srctree)/arch/arm/thumb1/include)) \
	-I$(srctree)/arch/$(ARCH)/include \
	-include $(srctree)/include/linux/kconfig.h
752
753
754
755

NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)

# FIX ME
Masahiro Yamada's avatar
Masahiro Yamada committed
756
757
cpp_flags := $(KBUILD_CPPFLAGS) $(PLATFORM_CPPFLAGS) $(UBOOTINCLUDE) \
							$(NOSTDINC_FLAGS)
758
759
c_flags := $(KBUILD_CFLAGS) $(cpp_flags)

wdenk's avatar
wdenk committed
760
761
762
#########################################################################
# U-Boot objects....order is important (i.e. start must be first)

763
HAVE_VENDOR_COMMON_LIB = $(if $(wildcard $(srctree)/board/$(VENDOR)/common/Makefile),y,n)
764

765
766
767
768
769
770
771
772
773
774
775
776
777
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/net/
libs-y += drivers/net/phy/
libs-y += drivers/power/ \
778
	drivers/power/domain/ \
779
780
781
	drivers/power/fuel_gauge/ \
	drivers/power/mfd/ \
	drivers/power/pmic/ \
782
783
	drivers/power/battery/ \
	drivers/power/regulator/
784
785
786
libs-y += drivers/spi/
libs-$(CONFIG_FMAN_ENET) += drivers/net/fm/
libs-$(CONFIG_SYS_FSL_DDR) += drivers/ddr/fsl/
787
libs-$(CONFIG_SYS_FSL_MMDC) += drivers/ddr/fsl/
788
libs-$(CONFIG_$(SPL_)ALTERA_SDRAM) += drivers/ddr/altera/
789
libs-y += drivers/serial/
790
libs-y += drivers/usb/cdns3/
791
libs-y += drivers/usb/dwc3/
792
libs-y += drivers/usb/common/
793
libs-y += drivers/usb/emul/
794
libs-y += drivers/usb/eth/
795
796
libs-$(CONFIG_USB_GADGET) += drivers/usb/gadget/
libs-$(CONFIG_USB_GADGET) += drivers/usb/gadget/udc/
797
libs-y += drivers/usb/host/
798
libs-y += drivers/usb/mtu3/
799
800
801
802
libs-y += drivers/usb/musb/
libs-y += drivers/usb/musb-new/
libs-y += drivers/usb/phy/
libs-y += drivers/usb/ulpi/
803
libs-y += cmd/
804
libs-y += common/
805
libs-y += env/
806
libs-$(CONFIG_API) += api/
Simon Glass's avatar
Simon Glass committed
807
808
809
ifdef CONFIG_POST
libs-y += post/
endif
810
libs-$(CONFIG_UNIT_TEST) += test/
811
libs-$(CONFIG_UT_ENV) += test/env/
Heiko Stuebner's avatar
Heiko Stuebner committed
812
libs-$(CONFIG_UT_OPTEE) += test/optee/
813
libs-$(CONFIG_UT_OVERLAY) += test/overlay/
814

815
libs-y += $(if $(BOARDDIR),board/$(BOARDDIR)/)
816
817

libs-y := $(sort $(libs-y))
818

819
820
821
822
823
824
825
826
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)
827

wdenk's avatar
wdenk committed
828

wdenk's avatar
wdenk committed
829
# Add GCC lib
830
ifeq ($(CONFIG_USE_PRIVATE_LIBGCC),y)
831
PLATFORM_LIBGCC = arch/$(ARCH)/lib/lib.a
832
else
833
PLATFORM_LIBGCC := -L $(shell dirname `$(CC) $(c_flags) -print-libgcc-file-name`) -lgcc
834
835
endif
PLATFORM_LIBS += $(PLATFORM_LIBGCC)
836
837
838
839
840
841

ifdef CONFIG_CC_COVERAGE
KBUILD_CFLAGS += --coverage
PLATFORM_LIBGCC += -lgcov
endif

842
export PLATFORM_LIBS
843
export PLATFORM_LIBGCC
844

845
846
847
848
# Special flags for CPP when processing the linker script.
# Pass the version down so we can handle backwards compatibility
# on the fly.
LDPPFLAGS += \
849
	-include $(srctree)/include/u-boot/u-boot.lds.h \
850
	-DCPUDIR=$(CPUDIR) \
851
852
853
	$(shell $(LD) --version | \
	  sed -ne 's/GNU ld version \([0-9][0-9]*\)\.\([0-9][0-9]*\).*/-DLD_MAJOR=\1 -DLD_MINOR=\2/p')

854
#########################################################################
wdenk's avatar
wdenk committed
855
856
#########################################################################

857
ifneq ($(CONFIG_BOARD_SIZE_LIMIT),)
858
BOARD_SIZE_CHECK= @ $(call size_check,$@,$(CONFIG_BOARD_SIZE_LIMIT))
859
860
861
862
else
BOARD_SIZE_CHECK =
endif

863
ifneq ($(CONFIG_SPL_SIZE_LIMIT),0x0)
864
SPL_SIZE_CHECK = @$(call size_check,$@,$$(tools/spl_size_limit))
865
866
867
868
else
SPL_SIZE_CHECK =
endif

869
ifneq ($(CONFIG_TPL_SIZE_LIMIT),0x0)
Simon Glass's avatar
Simon Glass committed
870
871
872
873
874
TPL_SIZE_CHECK = @$(call size_check,$@,$(CONFIG_TPL_SIZE_LIMIT))
else
TPL_SIZE_CHECK =
endif

875
# Statically apply RELA-style relocations (currently arm64 only)
876
877
878
# 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).
879
880
ifneq ($(CONFIG_STATIC_RELA),)
# $(1) is u-boot ELF, $(2) is u-boot bin, $(3) is text base
881
882
883
884
885
quiet_cmd_static_rela = RELOC   $@
cmd_static_rela = \
	start=$$($(NM) $(2) | grep __rel_dyn_start | cut -f 1 -d ' '); \
	end=$$($(NM) $(2) | grep __rel_dyn_end | cut -f 1 -d ' '); \
	tools/relocate-rela $(3) $(4) $$start $$end
886
else
887
quiet_cmd_static_rela =
888
cmd_static_rela = true
889
890
endif

891
892
# Always append INPUTS so that arch config.mk's can add custom ones
INPUTS-y += u-boot.srec u-boot.bin u-boot.sym System.map binary_size_check
893

894
INPUTS-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin
895
ifeq ($(CONFIG_SPL_FSL_PBL),y)
896
INPUTS-$(CONFIG_RAMBOOT_PBL) += u-boot-with-spl-pbl.bin
897
else
898
ifneq ($(CONFIG_NXP_ESBC), y)
899
900
# For Secure Boot The Image needs to be signed and Header must also
# be included. So The image has to be built explicitly
901
INPUTS-$(CONFIG_RAMBOOT_PBL) += u-boot.pbl
902
endif
903
endif
904
INPUTS-$(CONFIG_SPL) += spl/u-boot-spl.bin
905
ifeq ($(CONFIG_MX6)$(CONFIG_IMX_HAB), yy)
906
INPUTS-$(CONFIG_SPL_FRAMEWORK) += u-boot-ivt.img
907
else
908
ifeq ($(CONFIG_MX7)$(CONFIG_IMX_HAB), yy)
909
INPUTS-$(CONFIG_SPL_FRAMEWORK) += u-boot-ivt.img
910
else
911
INPUTS-$(CONFIG_SPL_FRAMEWORK) += u-boot.img
912
endif
913
endif
914
915
INPUTS-$(CONFIG_TPL) += tpl/u-boot-tpl.bin
INPUTS-$(CONFIG_OF_SEPARATE) += u-boot.dtb
916
ifeq ($(CONFIG_SPL_FRAMEWORK),y)
917
INPUTS-$(CONFIG_OF_SEPARATE) += u-boot-dtb.img
918
endif
919
INPUTS-$(CONFIG_OF_HOSTFILE) += u-boot.dtb
920
ifneq ($(CONFIG_SPL_TARGET),)
921
INPUTS-$(CONFIG_SPL) += $(CONFIG_SPL_TARGET:"%"=%)
922
endif
923
924
925
INPUTS-$(CONFIG_REMAKE_ELF) += u-boot.elf
INPUTS-$(CONFIG_EFI_APP) += u-boot-app.efi
INPUTS-$(CONFIG_EFI_STUB) += u-boot-payload.efi
926

927
928
# Generate this input file for binman
ifeq ($(CONFIG_SPL),)
929
INPUTS-$(CONFIG_ARCH_MEDIATEK) += u-boot-mtk.bin
930
endif
931

932
933
# Add optional build target if defined in board/cpu/soc headers
ifneq ($(CONFIG_BUILD_TARGET),)
934
INPUTS-y += $(CONFIG_BUILD_TARGET:"%"=%)
935
936
endif

937
ifeq ($(CONFIG_INIT_SP_RELATIVE)$(CONFIG_OF_SEPARATE),yy)
938
INPUTS-y += init_sp_bss_offset_check
939
940
endif

941
ifeq ($(CONFIG_MPC85xx)$(CONFIG_OF_SEPARATE),yy)
942
INPUTS-y += u-boot-with-dtb.bin
943
944
endif

945
946
947
948
949
ifeq ($(CONFIG_ARCH_ROCKCHIP),y)
# On ARM64 this target is produced by binman so we don't need this dep
ifeq ($(CONFIG_ARM64),y)
ifeq ($(CONFIG_SPL),y)
# TODO: Get binman to generate this too
950
INPUTS-y += u-boot-rockchip.bin
951
endif
952
953
954
955
956
957
958
else
ifeq ($(CONFIG_SPL),y)
# Generate these inputs for binman which will create the output files
INPUTS-y += idbloader.img u-boot.img
endif
endif
endif
959

960
961
962
963
INPUTS-$(CONFIG_X86) += u-boot-x86-start16.bin u-boot-x86-reset16.bin \
	$(if $(CONFIG_SPL_X86_16BIT_INIT),spl/u-boot-spl.bin) \
	$(if $(CONFIG_TPL_X86_16BIT_INIT),tpl/u-boot-tpl.bin)

964
LDFLAGS_u-boot += $(LDFLAGS_FINAL)
965
966
967
968

# Avoid 'Not enough room for program headers' error on binutils 2.28 onwards.
LDFLAGS_u-boot += $(call ld-option, --no-dynamic-linker)

969
ifeq ($(CONFIG_ARC)$(CONFIG_NIOS2)$(CONFIG_X86)$(CONFIG_XTENSA),)
970
971
LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE)
endif
972

973
974
975
976
977
978
# insure the checker run with the right endianness
CHECKFLAGS += $(if $(CONFIG_CPU_BIG_ENDIAN),-mbig-endian,-mlittle-endian)

# the checker needs the correct machine size
CHECKFLAGS += $(if $(CONFIG_64BIT),-m64,-m32)

979
# Normally we fill empty space with 0xff
980
quiet_cmd_objcopy = OBJCOPY $@
981
982
983
984
985
986
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)) $< $@
987

988
989
990
quiet_cmd_efipayload = OBJCOPY $@
cmd_efipayload = $(OBJCOPY) -I binary -O $(EFIPAYLOAD_BFDTARGET) -B $(EFIPAYLOAD_BFDARCH) $< $@

991
992
MKIMAGEOUTPUT ?= /dev/null

Marek Vasut's avatar
Marek Vasut committed
993
quiet_cmd_mkimage = MKIMAGE $@
994
cmd_mkimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) -d $< $@ \
995
	>$(MKIMAGEOUTPUT) $(if $(KBUILD_VERBOSE:0=), && cat $(MKIMAGEOUTPUT))
996

997
quiet_cmd_mkfitimage = MKIMAGE $@
998
999
cmd_mkfitimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) \
	-f $(U_BOOT_ITS) -p $(CONFIG_FIT_EXTERNAL_OFFSET) $@ \
1000
	>$(MKIMAGEOUTPUT) $(if $(KBUILD_VERBOSE:0=), && cat $(MKIMAGEOUTPUT))
1001

1002
1003
1004
quiet_cmd_cat = CAT     $@
cmd_cat = cat $(filter-out $(PHONY), $^) > $@

1005
1006
1007
1008
1009
append = cat $(filter-out $< $(PHONY), $^) >> $@

quiet_cmd_pad_cat = CAT     $@
cmd_pad_cat = $(cmd_objcopy) && $(append) || rm -f $@

1010
1011
1012
quiet_cmd_lzma = LZMA    $@
cmd_lzma = lzma -c -z -k -9 $< > $@

1013
1014
cfg: u-boot.cfg

1015
1016
1017
1018
quiet_cmd_cfgcheck = CFGCHK  $2
cmd_cfgcheck = $(srctree)/scripts/check-config.sh $2 \
		$(srctree)/scripts/config_whitelist.txt $(srctree)

1019
1020
1021
PHONY += inputs
inputs: $(INPUTS-y)

1022
1023
1024
1025
1026
1027
1028
1029
all: .binman_stamp inputs
ifeq ($(CONFIG_BINMAN),y)
	$(call if_changed,binman)
endif

# Timestamp file to make sure that binman always runs
.binman_stamp: FORCE
	@touch $@
1030

1031
1032
ifeq ($(CONFIG_DEPRECATED),y)
	$(warning "You have deprecated configuration options enabled in your .config! Please check your configuration.")
1033
1034
1035
1036
1037
ifeq ($(CONFIG_SPI),y)
ifneq ($(CONFIG_DM_SPI)$(CONFIG_OF_CONTROL),yy)
	$(warning "The relevant config item with associated code will remove in v2019.07 release.")
endif
endif
1038
endif
1039
1040
1041
1042
1043
1044
1045
1046
ifneq ($(CONFIG_DM),y)
	@echo >&2 "===================== WARNING ======================"
	@echo >&2 "This board does not use CONFIG_DM. CONFIG_DM will be"
	@echo >&2 "compulsory starting with the v2020.01 release."
	@echo >&2 "Failure to update may result in board removal."
	@echo >&2 "See doc/driver-model/migration.rst for more info."
	@echo >&2 "===================================================="
endif
1047
ifeq ($(CONFIG_MMC),y)
1048
ifneq ($(CONFIG_DM_MMC)$(CONFIG_BLK),yy)
1049
1050
1051
1052
	@echo >&2 "===================== WARNING ======================"
	@echo >&2 "This board does not use CONFIG_DM_MMC. Please update"
	@echo >&2 "the board to use CONFIG_DM_MMC before the v2019.04 release."
	@echo >&2 "Failure to update by the deadline may result in board removal."
1053
	@echo >&2 "See doc/driver-model/migration.rst for more info."
1054
	@echo >&2 "===================================================="
1055
1056
1057
1058
endif
endif
ifeq ($(CONFIG_USB),y)
ifneq ($(CONFIG_DM_USB)$(CONFIG_OF_CONTROL)$(CONFIG_BLK),yyy)
1059
1060
1061
1062
	@echo >&2 "===================== WARNING ======================"
	@echo >&2 "This board does not use CONFIG_DM_USB. Please update"
	@echo >&2 "the board to use CONFIG_DM_USB before the v2019.07 release."
	@echo >&2 "Failure to update by the deadline may result in board removal."
1063
	@echo >&2 "See doc/driver-model/migration.rst for more info."
1064
	@echo >&2 "===================================================="
1065
endif
1066
endif
1067
ifeq ($(CONFIG_MVSATA_IDE),y)
1068
	@echo >&2 "===================== WARNING ======================"
1069
1070
1071
1072
1073
	@echo >&2 "This board does use CONFIG_MVSATA_IDE which is not"
	@echo >&2 "ported to driver-model (DM) yet. Please update the storage"
	@echo >&2 "controller driver to use CONFIG_AHCI before the v2019.07"
	@echo >&2 "release."
	@echo >&2 "Failure to update by the deadline may result in board removal."
1074
	@echo >&2 "See doc/driver-model/migration.rst for more info."
1075
1076
1077
1078
1079
1080
1081
1082
	@echo >&2 "===================================================="
endif
ifeq ($(CONFIG_LIBATA),y)
ifneq ($(CONFIG_AHCI),y)
	@echo >&2 "===================== WARNING ======================"
	@echo >&2 "This board does use CONFIG_LIBATA but has CONFIG_AHCI not"
	@echo >&2 "enabled. Please update the storage controller driver to use"
	@echo >&2 "CONFIG_AHCI before the v2019.07 release."
1083
	@echo >&2 "Failure to update by the deadline may result in board removal."
1084
	@echo >&2 "See doc/driver-model/migration.rst for more info."
1085
	@echo >&2 "===================================================="
1086
endif
1087
endif
1088
1089
1090
1091
1092
1093
ifeq ($(CONFIG_PCI),y)
ifneq ($(CONFIG_DM_PCI),y)
	@echo >&2 "===================== WARNING ======================"
	@echo >&2 "This board does not use CONFIG_DM_PCI Please update"
	@echo >&2 "the board to use CONFIG_DM_PCI before the v2019.07 release."
	@echo >&2 "Failure to update by the deadline may result in board removal."
1094
	@echo >&2 "See doc/driver-model/migration.rst for more info."
1095
1096
1097
	@echo >&2 "===================================================="
endif
endif
1098
1099
1100
1101
1102
1103
ifneq ($(CONFIG_LCD)$(CONFIG_VIDEO),)
ifneq ($(CONFIG_DM_VIDEO),y)
	@echo >&2 "===================== WARNING ======================"
	@echo >&2 "This board does not use CONFIG_DM_VIDEO Please update"
	@echo >&2 "the board to use CONFIG_DM_VIDEO before the v2019.07 release."
	@echo >&2 "Failure to update by the deadline may result in board removal."
1104
	@echo >&2 "See doc/driver-model/migration.rst for more info."
1105
1106
1107
	@echo >&2 "===================================================="
endif
endif
1108
ifeq ($(CONFIG_OF_EMBED),y)
1109
1110
1111
1112
1113
1114
	@echo >&2 "===================== WARNING ======================"
	@echo >&2 "CONFIG_OF_EMBED is enabled. This option should only"
	@echo >&2 "be used for debugging purposes. Please use"
	@echo >&2 "CONFIG_OF_SEPARATE for boards in mainline."
	@echo >&2 "See doc/README.fdt-control for more info."
	@echo >&2 "===================================================="
1115
endif
1116
1117
1118
1119
1120
1121
ifeq ($(CONFIG_SPI_FLASH),y)
ifneq ($(CONFIG_DM_SPI_FLASH)$(CONFIG_OF_CONTROL),yy)
	@echo >&2 "===================== WARNING ======================"
	@echo >&2 "This board does not use CONFIG_DM_SPI_FLASH. Please update"
	@echo >&2 "the board to use CONFIG_SPI_FLASH before the v2019.07 release."
	@echo >&2 "Failure to update by the deadline may result in board removal."
1122
	@echo >&2 "See doc/driver-model/migration.rst for more info."
1123
	@echo >&2 "===================================================="
1124
endif
1125
1126
1127
1128
1129
1130
1131
1132
endif
ifneq ($(CONFIG_WATCHDOG)$(CONFIG_HW_WATCHDOG),)
ifneq ($(CONFIG_WDT),y)
	@echo >&2 "===================== WARNING ======================"
	@echo >&2 "This board does not use CONFIG_WDT (DM watchdog support)."
	@echo >&2 "Please update the board to use CONFIG_WDT before the"
	@echo >&2 "v2019.10 release."
	@echo >&2 "Failure to update by the deadline may result in board removal."
1133
	@echo >&2 "See doc/driver-model/migration.rst for more info."
1134
1135
	@echo >&2 "===================================================="
endif
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
endif
ifneq ($(CONFIG_NET),)
ifneq ($(CONFIG_DM_ETH),y)
	@echo >&2 "===================== WARNING ======================"
	@echo >&2 "This board does not use CONFIG_DM_ETH (Driver Model"
	@echo >&2 "for Ethernet drivers). Please update the board to use"
	@echo >&2 "CONFIG_DM_ETH before the v2020.07 release. Failure to"
	@echo >&2 "update by the deadline may result in board removal."
	@echo >&2 "See doc/driver-model/migration.rst for more info."
	@echo >&2 "===================================================="
endif
1147
1148
1149
1150
1151
1152
1153
endif
ifneq ($(CONFIG_SPL_FIT_GENERATOR),)
	@echo >&2 "===================== WARNING ======================"
	@echo >&2 "This board uses CONFIG_SPL_FIT_GENERATOR. Please migrate"
	@echo >&2 "to binman instead, to avoid the proliferation of"
	@echo >&2 "arch-specific scripts with no tests."
	@echo >&2 "===================================================="
1154
endif
1155
1156
1157
	@# 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.
1158
	$(call cmd,cfgcheck,u-boot.cfg)
wdenk's avatar
wdenk committed
1159

1160
PHONY += dtbs
1161
1162
dtbs: dts/dt.dtb
	@:
1163
dts/dt.dtb: u-boot
1164
	$(Q)$(MAKE) $(build)=dts dtbs
1165

1166
1167
1168
quiet_cmd_copy = COPY    $@
      cmd_copy = cp $< $@

1169
ifeq ($(CONFIG_MULTI_DTB_FIT),y)
1170

1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
ifeq ($(CONFIG_MULTI_DTB_FIT_LZO),y)
FINAL_DTB_CONTAINER = fit-dtb.blob.lzo
else ifeq ($(CONFIG_MULTI_DTB_FIT_GZIP),y)
FINAL_DTB_CONTAINER = fit-dtb.blob.gz
else
FINAL_DTB_CONTAINER = fit-dtb.blob
endif

fit-dtb.blob.gz: fit-dtb.blob
	@gzip -kf9 $< > $@

fit-dtb.blob.lzo: fit-dtb.blob
	@lzop -f9 $< > $@

1185
1186
fit-dtb.blob: dts/dt.dtb FORCE
	$(call if_changed,mkimage)
1187
1188
1189
1190
ifneq ($(SOURCE_DATE_EPOCH),)
	touch -d @$(SOURCE_DATE_EPOCH) fit-dtb.blob
	chmod 0600 fit-dtb.blob
endif
1191
1192
1193
1194
1195

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

1196
1197
1198
1199
ifneq ($(EXT_DTB),)
u-boot-fit-dtb.bin: u-boot-nodtb.bin $(EXT_DTB)
		$(call if_changed,cat)
else
1200
u-boot-fit-dtb.bin: u-boot-nodtb.bin $(FINAL_DTB_CONTAINER)
1201
	$(call if_changed,cat)
1202
endif
1203
1204
1205

u-boot.bin: u-boot-fit-dtb.bin FORCE
	$(call if_changed,copy)
1206
1207
1208
1209

u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE
	$(call if_changed,cat)

1210
else ifeq ($(CONFIG_OF_SEPARATE),y)
1211
u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE
1212
	$(call if_changed,cat)
1213

1214
1215
1216
1217
1218
1219
1220
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

1221
1222
1223
1224
1225
1226
1227
1228
1229
# we call Makefile in arch/arm/mach-imx which
# has targets which are dependent on targets defined
# here. make could not resolve them and we must ensure
# that they are finished before calling imx targets
ifeq ($(CONFIG_MULTI_DTB_FIT),y)
IMX_DEPS = u-boot-fit-dtb.bin
endif

%.imx: $(IMX_DEPS) %.bin
1230
	$(Q)$(MAKE) $(build)=arch/arm/mach-imx $@
1231
	$(BOARD_SIZE_CHECK)
1232

1233
1234
1235
1236
1237
1238
%.vyb: %.imx
	$(Q)$(MAKE) $(build)=arch/arm/cpu/armv7/vf610 $@

quiet_cmd_copy = COPY    $@
      cmd_copy = cp $< $@

1239
1240
1241
u-boot.dtb: dts/dt.dtb
	$(call cmd,copy)

1242
OBJCOPYFLAGS_u-boot.hex := -O ihex
wdenk's avatar
wdenk committed
1243

1244
OBJCOPYFLAGS_u-boot.srec := -O srec
wdenk's avatar
wdenk committed
1245

1246
1247
1248
u-boot.hex u-boot.srec: u-boot FORCE
	$(call if_changed,objcopy)

1249
1250
1251
1252
1253
OBJCOPYFLAGS_u-boot-elf.srec := $(OBJCOPYFLAGS_u-boot.srec)

u-boot-elf.srec: u-boot.elf FORCE
	$(call if_changed,objcopy)

1254
1255
1256
1257
1258
OBJCOPYFLAGS_u-boot-spl.srec = $(OBJCOPYFLAGS_u-boot.srec)

spl/u-boot-spl.srec: spl/u-boot-spl FORCE
	$(call if_changed,objcopy)

1259
1260
1261
%.scif: %.srec
	$(Q)$(MAKE) $(build)=arch/arm/mach-rmobile $@

1262
OBJCOPYFLAGS_u-boot-nodtb.bin := -O binary \
1263
1264
		$(if $(CONFIG_X86_16BIT_INIT),-R .start16 -R .resetvec) \
		$(if $(CONFIG_MPC85XX_HAVE_RESET_VECTOR),-R .bootpg -R .resetvec)
1265

1266
1267
1268
1269
1270
OBJCOPYFLAGS_u-boot-spl.hex = $(OBJCOPYFLAGS_u-boot.hex)

spl/u-boot-spl.hex: spl/u-boot-spl FORCE
	$(call if_changed,objcopy)

1271
1272
binary_size_check: u-boot-nodtb.bin FORCE
	@file_size=$(shell wc -c u-boot-nodtb.bin | awk '{print $$1}') ; \
1273
	map_size=$(shell cat u-boot.map | \
1274
		awk '/_image_copy_start/ {start = $$1} /_image_binary_end/ {end = $$1} END {if (start != "" && end != "") print "ibase=16; " toupper(end) " - " toupper(start)}' \
1275
		| sed 's/0X//g' \
1276
		| bc); \
1277
1278
	if [ "" != "$$map_size" ]; then \
		if test $$map_size -ne $$file_size; then \
1279
			echo "u-boot.map shows a binary size of $$map_size" >&2 ; \
1280
			echo "  but u-boot-nodtb.bin shows $$file_size" >&2 ; \
1281
1282
1283
1284
			exit 1; \
		fi \
	fi

1285
ifeq ($(CONFIG_INIT_SP_RELATIVE)$(CONFIG_OF_SEPARATE),yy)
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
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

1312
shell_cmd = { $(call echo-cmd,$(1)) $(cmd_$(1)); }
1313
1314
1315
1316

quiet_cmd_objcopy_uboot = OBJCOPY $@
cmd_objcopy_uboot = $(cmd_objcopy) && $(call shell_cmd,static_rela,$<,$@,$(CONFIG_SYS_TEXT_BASE)) || rm -f $@

1317
u-boot-nodtb.bin: u-boot FORCE
1318
	$(call if_changed,objcopy_uboot)
1319
	$(BOARD_SIZE_CHECK)
wdenk's avatar
wdenk committed
1320

1321
u-boot.ldr:	u-boot
1322
		$(CREATE_LDR_ENV)
1323
		$(LDR) -T $(CONFIG_CPU) -c $@ $< $(LDR_FLAGS)
1324
		$(BOARD_SIZE_CHECK)
1325

1326
1327
# binman
# ---------------------------------------------------------------------------
1328
# Use 'make BINMAN_DEBUG=1' to enable debugging
1329
default_dt := $(if $(DEVICE_TREE),$(DEVICE_TREE),$(CONFIG_DEFAULT_DEVICE_TREE))
1330
quiet_cmd_binman = BINMAN  $@
1331
cmd_binman = $(srctree)/tools/binman/binman $(if $(BINMAN_DEBUG),-D) \
1332
                --toolpath $(objtree)/tools \
1333
		$(if $(BINMAN_VERBOSE),-v$(BINMAN_VERBOSE)) \
1334
		build -u -d u-boot.dtb -O . -m --allow-missing \
1335
		-I . -I $(srctree) -I $(srctree)/board/$(BOARDDIR) \
1336
1337
		-I arch/$(ARCH)/dts -a of-list=$(CONFIG_OF_LIST) \
		-a atf-bl31-path=${BL31} \
1338
		-a default-dt=$(default_dt) \
1339
		-a scp-path=$(SCP) \
1340
		$(BINMAN_$(@F))
1341

1342
1343
1344
OBJCOPYFLAGS_u-boot.ldr.hex := -I binary -O ihex

OBJCOPYFLAGS_u-boot.ldr.srec := -I binary -O srec
1345

1346
1347
u-boot.ldr.hex u-boot.ldr.srec: u-boot.ldr FORCE
	$(call if_changed,objcopy)
1348

1349
1350
1351
1352
1353
#
# U-Boot entry point, needed for booting of full-blown U-Boot
# from the SPL U-Boot version.
#
ifndef CONFIG_SYS_UBOOT_START
1354
CONFIG_SYS_UBOOT_START := $(CONFIG_SYS_TEXT_BASE)
1355
1356
endif

1357
# Boards with more complex image requirements can provide an .its source file
1358
# or a generator script
1359
1360
# NOTE: Please do not use this. We are migrating away from Makefile rules to use
# binman instead.
1361
ifneq ($(CONFIG_SPL_FIT_SOURCE),"")
1362
1363
1364
U_BOOT_ITS := u-boot.its
$(U_BOOT_ITS): $(subst ",,$(CONFIG_SPL_FIT_SOURCE))
	$(call if_changed,copy)
1365
else
1366
ifneq ($(CONFIG_USE_SPL_FIT_GENERATOR),)
1367
U_BOOT_ITS := u-boot.its
1368
1369
1370
ifeq ($(CONFIG_SPL_FIT_GENERATOR),"arch/arm/mach-imx/mkimage_fit_atf.sh")
U_BOOT_ITS_DEPS += u-boot-nodtb.bin
endif
1371
1372
1373
1374
ifeq ($(CONFIG_SPL_FIT_GENERATOR),"arch/arm/mach-rockchip/make_fit_atf.py")
U_BOOT_ITS_DEPS += u-boot
endif
$(U_BOOT_ITS): $(U_BOOT_ITS_DEPS) FORCE
1375
1376
1377
1378
1379
	$(srctree)/$(CONFIG_SPL_FIT_GENERATOR) \
	$(patsubst %,arch/$(ARCH)/dts/%.dtb,$(subst ",,$(CONFIG_OF_LIST))) > $@
endif
endif

1380
1381
1382
ifdef CONFIG_SPL_LOAD_FIT
MKIMAGEFLAGS_u-boot.img = -f auto -A $(ARCH) -T firmware -C none -O u-boot \
	-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_UBOOT_START) \
1383
	-p $(CONFIG_FIT_EXTERNAL_OFFSET) \
1384
	-n "U-Boot $(UBOOTRELEASE) for $(BOARD) board" -E \
1385
1386
	$(patsubst %,-b arch/$(ARCH)/dts/%.dtb,$(subst ",,$(CONFIG_OF_LIST))) \
	$(patsubst %,-b arch/$(ARCH)/dts/%.dtbo,$(subst ",,$(CONFIG_OF_OVERLAY_LIST)))
1387
else
1388
1389
1390
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"
1391
1392
1393
MKIMAGEFLAGS_u-boot-ivt.img = -A $(ARCH) -T firmware_ivt -C none -O u-boot \
	-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_UBOOT_START) \
	-n "U-Boot $(UBOOTRELEASE) for $(BOARD) board"
1394
u-boot-ivt.img: MKIMAGEOUTPUT = u-boot-ivt.img.log
1395
endif
1396

1397
1398
MKIMAGEFLAGS_u-boot-dtb.img = $(MKIMAGEFLAGS_u-boot.img)

1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
# Some boards have the kwbimage.cfg file written in advance, while some
# other boards generate it on the fly during the build in the build tree.
# Let's check if the file exists in the build tree first, otherwise we
# fall back to use the one in the source tree.
KWD_CONFIG_FILE = $(shell \
	if [ -f $(objtree)/$(CONFIG_SYS_KWD_CONFIG:"%"=%) ]; then \
		echo -n $(objtree)/$(CONFIG_SYS_KWD_CONFIG:"%"=%); \
	else \
		echo -n $(srctree)/$(CONFIG_SYS_KWD_CONFIG:"%"=%); \
	fi)

MKIMAGEFLAGS_u-boot.kwb = -n $(KWD_CONFIG_FILE) \
1411
	-T kwbimage -a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE)
1412

1413
MKIMAGEFLAGS_u-boot-spl.kwb = -n $(KWD_CONFIG_FILE) \
Mario Six's avatar
Mario Six committed
1414
1415
	-T kwbimage -a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE) \
	$(if $(KEYDIR),-k $(KEYDIR))
1416

1417
1418
MKIMAGEFLAGS_u-boot.pbl = -n $(srctree)/$(CONFIG_SYS_FSL_PBL_RCW:"%"=%) \
		-R $(srctree)/$(CONFIG_SYS_FSL_PBL_PBI:"%"=%) -T pblimage
1419

1420
1421
1422
1423
1424
1425
ifeq ($(CONFIG_MPC85xx)$(CONFIG_OF_SEPARATE),yy)
UBOOT_BIN := u-boot-with-dtb.bin
else
UBOOT_BIN := u-boot.bin
endif

1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
MKIMAGEFLAGS_u-boot-lzma.img = -A $(ARCH) -T standalone -C lzma -O u-boot \
	-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_UBOOT_START) \
	-n "U-Boot $(UBOOTRELEASE) for $(BOARD) board"

u-boot.bin.lzma: u-boot.bin FORCE
	$(call if_changed,lzma)

u-boot-lzma.img: u-boot.bin.lzma FORCE
	$(call if_changed,mkimage)

1436
u-boot-dtb.img u-boot.img u-boot.kwb u-boot.pbl u-boot-ivt.img: \
1437
1438
		$(if $(CONFIG_SPL_LOAD_FIT),u-boot-nodtb.bin \
			$(if $(CONFIG_OF_SEPARATE)$(CONFIG_OF_EMBED)$(CONFIG_OF_HOSTFILE),dts/dt.dtb) \
1439
		,$(UBOOT_BIN)) FORCE
1440
	$(call if_changed,mkimage)
1441
	$(BOARD_SIZE_CHECK)
1442

1443
1444
1445
1446
1447
1448
ifeq ($(CONFIG_SPL_LOAD_FIT_FULL),y)
MKIMAGEFLAGS_u-boot.itb =
else
MKIMAGEFLAGS_u-boot.itb = -E
endif

1449
ifdef U_BOOT_ITS
1450
1451
1452
u-boot.itb: u-boot-nodtb.bin \
		$(if $(CONFIG_OF_SEPARATE)$(CONFIG_OF_EMBED)$(CONFIG_OF_HOSTFILE),dts/dt.dtb) \
		$(U_BOOT_ITS) FORCE
1453
	$(call if_changed,mkfitimage)
1454
	$(BOARD_SIZE_CHECK)
1455
endif
1456

1457
u-boot-spl.kwb: u-boot.img spl/u-boot-spl.bin FORCE
1458
1459
	$(call if_changed,mkimage)

1460
1461
u-boot.sha1:	u-boot.bin
		tools/ubsha1 u-boot.bin
1462

1463
u-boot.dis:	u-boot
wdenk's avatar
wdenk committed
1464
1465
		$(OBJDUMP) -d $< > $@

York Sun's avatar
York Sun committed
1466
1467
ifneq ($(CONFIG_SPL_PAYLOAD),)
SPL_PAYLOAD := $(CONFIG_SPL_PAYLOAD:"%"=%)
1468
else
1469
SPL_PAYLOAD := u-boot.bin
1470
endif
1471

1472
1473
SPL_IMAGE := $(CONFIG_SPL_IMAGE:"%"=%)

1474
1475
OBJCOPYFLAGS_u-boot-with-spl.bin = -I binary -O binary \
				   --pad-to=$(CONFIG_SPL_PAD_TO)
1476
u-boot-with-spl.bin: $(SPL_IMAGE) $(SPL_PAYLOAD) FORCE
1477
	$(call if_changed,pad_cat)
1478

1479
ifeq ($(CONFIG_ARCH_ROCKCHIP),y)
Jagan Teki's avatar
Jagan Teki committed
1480

1481
1482
# TPL + SPL
ifeq ($(CONFIG_SPL)$(CONFIG_TPL),yy)
1483
MKIMAGEFLAGS_u-boot-tpl-rockchip.bin = -n $(CONFIG_SYS_SOC) -T rksd
1484
tpl/u-boot-tpl-rockchip.bin: tpl/u-boot-tpl.bin FORCE
1485
	$(call if_changed,mkimage)
1486
idbloader.img: tpl/u-boot-tpl-rockchip.bin spl/u-boot-spl.bin FORCE
1487
	$(call if_changed,cat)
1488
else
1489
MKIMAGEFLAGS_idbloader.img = -n $(CONFIG_SYS_SOC) -T rksd
1490
1491
idbloader.img: spl/u-boot-spl.bin FORCE
	$(call if_changed,mkimage)
1492
1493
endif

1494
ifeq ($(CONFIG_ARM64),y)
1495
1496
1497
1498
1499
1500
1501
OBJCOPYFLAGS_u-boot-rockchip.bin = -I binary -O binary \
	--pad-to=$(CONFIG_SPL_PAD_TO) --gap-fill=0xff
u-boot-rockchip.bin: idbloader.img u-boot.itb FORCE
	$(call if_changed,pad_cat)
endif # CONFIG_ARM64

endif # CONFIG_ARCH_ROCKCHIP
1502

1503
ifeq ($(CONFIG_ARCH_LPC32XX)$(CONFIG_SPL),yy)
1504
1505
1506
1507
1508
1509
1510
MKIMAGEFLAGS_lpc32xx-spl.img = -T lpc32xximage -a $(CONFIG_SPL_TEXT_BASE)

lpc32xx-spl.img: spl/u-boot-spl.bin FORCE
	$(call if_changed,mkimage)

OBJCOPYFLAGS_lpc32xx-boot-0.bin = -I binary -O binary --pad-to=$(CONFIG_SPL_PAD_TO)

1511
lpc32xx-boot-0.bin: lpc32xx-spl.img FORCE
1512
1513
1514
1515
	$(call if_changed,objcopy)

OBJCOPYFLAGS_lpc32xx-boot-1.bin = -I binary -O binary --pad-to=$(CONFIG_SPL_PAD_TO)

1516
lpc32xx-boot-1.bin: lpc32xx-spl.img FORCE
1517
1518
	$(call if_changed,objcopy)

1519
lpc32xx-full.bin: lpc32xx-boot-0.bin lpc32xx-boot-1.bin u-boot.img FORCE
1520
1521
	$(call if_changed,cat)

1522
endif
1523

1524
1525
1526
1527
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)
1528

1529
SPL: spl/u-boot-spl.bin FORCE
1530
	$(Q)$(MAKE) $(build)=arch/arm/mach-imx $@
1531

Peng Fan's avatar
Peng Fan committed
1532
ifeq ($(CONFIG_ARCH_IMX8M)$(CONFIG_ARCH_IMX8), y)
Peng Fan's avatar
Peng Fan committed
1533
1534
1535
1536
1537
1538
1539
ifeq ($(CONFIG_SPL_LOAD_IMX_CONTAINER), y)
u-boot.cnt: u-boot.bin FORCE
	$(Q)$(MAKE) $(build)=arch/arm/mach-imx $@

flash.bin: spl/u-boot-spl.bin u-boot.cnt FORCE
	$(Q)$(MAKE) $(build)=arch/arm/mach-imx $@
else
Peng Fan's avatar
Peng Fan committed
1540
1541
1542
flash.bin: spl/u-boot-spl.bin u-boot.itb FORCE
	$(Q)$(MAKE) $(build)=arch/arm/mach-imx $@
endif
Peng Fan's avatar
Peng Fan committed
1543
endif
Peng Fan's avatar
Peng Fan committed
1544

1545
u-boot-with-spl.imx u-boot-with-nand-spl.imx: SPL u-boot.bin FORCE
1546
	$(Q)$(MAKE) $(build)=arch/arm/mach-imx $@
1547

1548
1549
1550
1551
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)
1552

1553
1554
1555
1556
1557
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)
1558

1559
OBJCOPYFLAGS_u-boot.ais = -I binary -O binary --pad-to=$(CONFIG_SPL_PAD_TO)
1560
1561
u-boot.ais: spl/u-boot-spl.ais u-boot.img FORCE
	$(call if_changed,pad_cat)
1562

1563
1564
u-boot-signed.sb: u-boot.bin spl/u-boot-spl.bin
	$(Q)$(MAKE) $(build)=arch/arm/cpu/arm926ejs/mxs u-boot-signed.sb
1565
u-boot.sb: u-boot.bin spl/u-boot-spl.bin
1566
	$(Q)$(MAKE) $(build)=arch/arm/cpu/arm926ejs/mxs u-boot.sb
1567

1568
1569
1570
1571
1572
1573
# 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
1574
1575
1576
1577
1578
1579
1580
1581
1582
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)
1583

1584
ifneq ($(CONFIG_ARCH_SOCFPGA),)
1585
1586
1587
1588
1589
1590
quiet_cmd_gensplx4 = GENSPLX4 $@
cmd_gensplx4 = cat	spl/u-boot-spl.sfp spl/u-boot-spl.sfp	\
			spl/u-boot-spl.sfp spl/u-boot-spl.sfp > $@ || rm -f $@
spl/u-boot-splx4.sfp: spl/u-boot-spl.sfp FORCE
	$(call if_changed,gensplx4)

1591
quiet_cmd_socboot = SOCBOOT $@
1592
1593
cmd_socboot = cat	spl/u-boot-splx4.sfp u-boot.img > $@ || rm -f $@
u-boot-with-spl.sfp: spl/u-boot-splx4.sfp u-boot.img FORCE
1594
	$(call if_changed,socboot)
1595

1596
1597
quiet_cmd_gensplpadx4 = GENSPLPADX4 $@
cmd_gensplpadx4 =  dd if=/dev/zero of=spl/u-boot-spl.pad bs=64 count=1024 ; \
1598
1599
1600
		   cat	spl/u-boot-spl.sfp spl/u-boot-spl.pad \
			spl/u-boot-spl.sfp spl/u-boot-spl.pad \
			spl/u-boot-spl.sfp spl/u-boot-spl.pad \
1601
1602
1603
1604
1605
1606
1607
1608
			spl/u-boot-spl.sfp spl/u-boot-spl.pad > $@ || \
			rm -f $@ spl/u-boot-spl.pad
u-boot-spl-padx4.sfp: spl/u-boot-spl.sfp FORCE
	$(call if_changed,gensplpadx4)

quiet_cmd_socnandboot = SOCNANDBOOT $@
cmd_socnandboot = cat	u-boot-spl-padx4.sfp u-boot.img > $@ || rm -f $@
u-boot-with-nand-spl.sfp: u-boot-spl-padx4.sfp u-boot.img FORCE
1609
1610
	$(call if_changed,socnandboot)

1611
1612
endif

1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
ifeq ($(CONFIG_MPC85xx)$(CONFIG_OF_SEPARATE),yy)
u-boot-with-dtb.bin: u-boot.bin u-boot.dtb \
	$(if $(CONFIG_MPC85XX_HAVE_RESET_VECTOR), u-boot-br.bin) FORCE
	$(call if_changed,binman)

ifeq ($(CONFIG_MPC85XX_HAVE_RESET_VECTOR),y)
OBJCOPYFLAGS_u-boot-br.bin := -O binary -j .bootpg -j .resetvec
u-boot-br.bin: u-boot FORCE
	$(call if_changed,objcopy)
endif
endif

1625
1626
1627
1628
quiet_cmd_ldr = LD      $@
cmd_ldr = $(LD) $(LDFLAGS_$(@F)) \
	       $(filter-out FORCE,$^) -o $@

1629
ifdef CONFIG_X86
1630
1631
1632
1633
1634
1635
OBJCOPYFLAGS_u-boot-x86-start16.bin := -O binary -j .start16
u-boot-x86-start16.bin: u-boot FORCE
	$(call if_changed,objcopy)

OBJCOPYFLAGS_u-boot-x86-reset16.bin := -O binary -j .resetvec
u-boot-x86-reset16.bin: u-boot FORCE
1636
	$(call if_changed,objcopy)
1637

1638
endif # CONFIG_X86
1639

1640
1641
1642
1643
OBJCOPYFLAGS_u-boot-app.efi := $(OBJCOPYFLAGS_EFI)
u-boot-app.efi: u-boot FORCE
	$(call if_changed,zobjcopy)

1644
u-boot.bin.o: u-boot.bin FORCE
1645
1646
1647
1648
1649
1650
1651
1652
	$(call if_changed,efipayload)

u-boot-payload.lds: $(LDSCRIPT_EFI) FORCE
	$(call if_changed_dep,cpp_lds)

# Rule to link the EFI payload which contains a stub and a U-Boot binary
quiet_cmd_u-boot_payload ?= LD      $@
      cmd_u-boot_payload ?= $(LD) $(LDFLAGS_EFI_PAYLOAD) -o $@ \
Simon Glass's avatar
Simon Glass committed
1653
      -T u-boot-payload.lds arch/x86/cpu/call32.o \
1654
      lib/efi/efi.o lib/efi/efi_stub.o u-boot.bin.o \
1655
      $(addprefix arch/$(ARCH)/lib/,$(EFISTUB))
1656

1657
u-boot-payload: u-boot.bin.o u-boot-payload.lds FORCE
1658
1659
1660
1661
1662
1663
	$(call if_changed,u-boot_payload)

OBJCOPYFLAGS_u-boot-payload.efi := $(OBJCOPYFLAGS_EFI)
u-boot-payload.efi: u-boot-payload FORCE
	$(call if_changed,zobjcopy)

1664
1665
u-boot-img.bin: spl/u-boot-spl.bin u-boot.img FORCE
	$(call if_changed,cat)
1666

1667
1668
1669
1670
#Add a target to create boot binary having SPL binary in PBI format
#concatenated with u-boot binary. It is need by PowerPC SoC having
#internal SRAM <= 512KB.
MKIMAGEFLAGS_u-boot-spl.pbl = -n $(srctree)/$(CONFIG_SYS_FSL_PBL_RCW:"%"=%) \
1671
1672
		-R $(srctree)/$(CONFIG_SYS_FSL_PBL_PBI:"%"=%) -T pblimage \
		-A $(ARCH) -a $(CONFIG_SPL_TEXT_BASE)
1673
1674
1675
1676

spl/u-boot-spl.pbl: spl/u-boot-spl.bin FORCE
	$(call if_changed,mkimage)

1677
1678
1679
ifeq ($(ARCH),arm)
UBOOT_BINLOAD := u-boot.img
else
1680
1681
1682
ifeq ($(CONFIG_MPC85xx)$(CONFIG_OF_SEPARATE),yy)
UBOOT_BINLOAD := u-boot-with-dtb.bin
else
1683
1684
UBOOT_BINLOAD := u-boot.bin
endif
1685
endif
1686

1687
1688
1689
OBJCOPYFLAGS_u-boot-with-spl-pbl.bin = -I binary -O binary --pad-to=$(CONFIG_SPL_PAD_TO) \
			  --gap-fill=0xff

1690
u-boot-with-spl-pbl.bin: spl/u-boot-spl.pbl $(UBOOT_BINLOAD) FORCE
1691
1692
	$(call if_changed,pad_cat)

1693
1694
1695
1696
1697
# 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
# at the start padded up to the start of the SPL image. And then concat
# the SPL image to the end.
1698
1699
1700
1701
1702

OBJCOPYFLAGS_u-boot-img-spl-at-end.bin := -I binary -O binary \
	--pad-to=$(CONFIG_UBOOT_PAD_TO) --gap-fill=0xff
u-boot-img-spl-at-end.bin: u-boot.img spl/u-boot-spl.bin FORCE
	$(call if_changed,pad_cat)
1703

1704
1705
quiet_cmd_u-boot-elf ?= LD      $@
	cmd_u-boot-elf ?= $(LD) u-boot-elf.o -o $@ \
1706
	-T u-boot-elf.lds --defsym=$(CONFIG_PLATFORM_ELFENTRY)=$(CONFIG_SYS_TEXT_BASE) \
1707
	-Ttext=$(CONFIG_SYS_TEXT_BASE)
1708
u-boot.elf: u-boot.bin u-boot-elf.lds
1709
1710
	$(Q)$(OBJCOPY) -I binary $(PLATFORM_ELFFLAGS) $< u-boot-elf.o
	$(call if_changed,u-boot-elf)
1711

1712
1713
1714
u-boot-elf.lds: arch/u-boot-elf.lds prepare FORCE
	$(call if_changed_dep,cpp_lds)

1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
# MediaTek's ARM-based u-boot needs a header to contains its load address
# which is parsed by the BootROM.
# If the SPL build is enabled, the header will be added to the spl binary,
# and the spl binary and the u-boot.img will be combined into one file.
# Otherwise the header will be added to the u-boot.bin directly.

ifeq ($(CONFIG_SPL),y)
spl/u-boot-spl-mtk.bin: spl/u-boot-spl
else
MKIMAGEFLAGS_u-boot-mtk.bin = -T mtk_image \
	-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE) \
	-n "$(patsubst "%",%,$(CONFIG_MTK_BROM_HEADER_INFO))"

u-boot-mtk.bin: u-boot.bin FORCE
	$(call if_changed,mkimage)
endif

1732
1733
1734
1735
1736
1737
quiet_cmd_endian_swap = SWAP    $@
      cmd_endian_swap = $(srctree)/tools/endian-swap.py $< $@

u-boot-swap.bin: u-boot.bin FORCE
	$(call if_changed,endian_swap)

1738
1739
ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(ARCH)/Makefile.postlink)

1740
1741
1742
# Rule to link u-boot
# May be overridden by arch/$(ARCH)/config.mk
quiet_cmd_u-boot__ ?= LD      $@
1743
      cmd_u-boot__ ?= $(LD) $(KBUILD_LDFLAGS) $(LDFLAGS_u-boot) -o $@ \
1744
1745
      -T u-boot.lds $(u-boot-init)                             \
      --start-group $(u-boot-main) --end-group                 \
1746
1747
      $(PLATFORM_LIBS) -Map u-boot.map;                        \
      $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
1748

1749
1750
quiet_cmd_smap = GEN     common/system_map.o
cmd_smap = \
1751
1752
1753
1754
	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
1755

1756
u-boot:	$(u-boot-init) $(u-boot-main) u-boot.lds FORCE
1757
	+$(call if_changed,u-boot__)
1758
1759
ifeq ($(CONFIG_KALLSYMS),y)
	$(call cmd,smap)
1760
	$(call cmd,u-boot__) common/system_map.o
1761
endif
wdenk's avatar
wdenk committed
1762

Rick Chen's avatar
Rick Chen committed
1763
1764
1765
1766
ifeq ($(CONFIG_RISCV),y)
	@tools/prelink-riscv $@ 0
endif

1767
1768
1769
1770
1771
quiet_cmd_sym ?= SYM     $@
      cmd_sym ?= $(OBJDUMP) -t $< > $@
u-boot.sym: u-boot FORCE
	$(call if_changed,sym)

1772
# The actual objects are generated when descending,
1773
1774
# make sure no implicit rule kicks in
$(sort $(u-boot-init) $(u-boot-main)): $(u-boot-dirs) ;
1775

1776
# Handle descending into subdirectories listed in $(u-boot-dirs)
1777
1778
1779
1780
# 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
wdenk's avatar
wdenk committed
1781

1782
PHONY += $(u-boot-dirs)
1783
$(u-boot-dirs): prepare scripts
1784
1785
	$(Q)$(MAKE) $(build)=$@

1786
tools: prepare
1787
1788
1789
1790
1791
# 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))
1792

1793
1794
1795
1796
1797
define filechk_uboot.release
	echo "$(UBOOTVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
endef

# Store (new) UBOOTRELEASE string in include/config/uboot.release
Masahiro Yamada's avatar
Masahiro Yamada committed
1798
include/config/uboot.release: include/config/auto.conf FORCE
1799
1800
1801
	$(call filechk,uboot.release)


1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
# 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)
1814
prepare3: include/config/uboot.release
1815
ifneq ($(KBUILD_SRC),)
Masahiro Yamada's avatar
Masahiro Yamada committed
1816
1817
	@$(kecho) '  Using $(srctree) as source for U-Boot'
	$(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then \
1818
1819
1820
1821
		echo >&2 "  $(srctree) is not clean, please run 'make mrproper'"; \
		echo >&2 "  in the '$(srctree)' directory.";\
		/bin/false; \
	fi;
1822
endif
wdenk's avatar
wdenk committed
1823

1824
# prepare2 creates a makefile if using a separate output directory
1825
prepare2: prepare3 outputmakefile cfg
1826

1827
prepare1: prepare2 $(version_h) $(timestamp_h) $(dt_h) \
Masahiro Yamada's avatar
Masahiro Yamada committed
1828
                   include/config/auto.conf
1829
1830
1831
1832
ifeq ($(wildcard $(LDSCRIPT)),)
	@echo >&2 "  Could not find linker script."
	@/bin/false
endif
1833

1834
1835
1836
1837
ifeq ($(CONFIG_USE_DEFAULT_ENV_FILE),y)
prepare1: $(defaultenv_h)
endif

1838
1839
archprepare: prepare1 scripts_basic

1840
1841
prepare0: archprepare FORCE
	$(Q)$(MAKE) $(build)=.
wdenk's avatar
wdenk committed
1842

1843
1844
# All the preparing..
prepare: prepare0
wdenk's avatar
wdenk committed
1845

1846
1847
1848
1849
1850
1851
# Generate some files
# ---------------------------------------------------------------------------

define filechk_version.h
	(echo \#define PLAIN_VERSION \"$(UBOOTRELEASE)\"; \
	echo \#define U_BOOT_VERSION \"U-Boot \" PLAIN_VERSION; \
1852
1853
	echo \#define CC_VERSION_STRING \"$$(LC_ALL=C $(CC) --version | head -n 1)\"; \
	echo \#define LD_VERSION_STRING \"$$(LC_ALL=C $(LD) --version | head -n 1)\"; )
1854
1855
endef

1856
1857
1858
1859
# The SOURCE_DATE_EPOCH mechanism requires a date that behaves like GNU date.
# The BSD date on the other hand behaves different and would produce errors
# with the misused '-d' switch.  Respect that and search a working date with
# well known pre- and suffixes for the GNU variant of date.
1860
define filechk_timestamp.h
1861
1862
	(if test -n "$${SOURCE_DATE_EPOCH}"; then \
		SOURCE_DATE="@$${SOURCE_DATE_EPOCH}"; \
1863
1864
1865
1866
1867
1868
1869
1870
		DATE=""; \
		for date in gdate date.gnu date; do \
			$${date} -u -d "$${SOURCE_DATE}" >/dev/null 2>&1 && DATE="$${date}"; \
		done; \
		if test -n "$${DATE}"; then \
			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_DATE "%b %d %C%y"'; \
			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_TIME "%T"'; \
			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_TZ "%z"'; \
1871
			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_DMI_DATE "%m/%d/%Y"'; \
1872
			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_BUILD_DATE 0x%Y%m%d'; \
1873
			LC_ALL=C $${DATE} -u -d "$${SOURCE_DATE}" +'#define U_BOOT_EPOCH %s'; \
1874
1875
1876
		else \
			return 42; \
		fi; \
1877
1878
1879
1880
	else \
		LC_ALL=C date +'#define U_BOOT_DATE "%b %d %C%y"'; \
		LC_ALL=C date +'#define U_BOOT_TIME "%T"'; \
		LC_ALL=C date +'#define U_BOOT_TZ "%z"'; \
1881
		LC_ALL=C date +'#define U_BOOT_DMI_DATE "%m/%d/%Y"'; \
1882
		LC_ALL=C date +'#define U_BOOT_BUILD_DATE 0x%Y%m%d'; \
1883
		LC_ALL=C date +'#define U_BOOT_EPOCH %s'; \
1884
	fi)
1885
1886
endef

1887
1888
1889
1890
define filechk_defaultenv.h
	(grep -v '^#' | \
	 grep -v '^$$' | \
	 tr '\n' '\0' | \
1891
	 sed -e 's/\\\x0\s*//g' | \
1892
1893
1894
	 xxd -i ; echo ", 0x00" ; )
endef

1895
1896
1897
1898
1899
1900
1901
1902
define filechk_dt.h
	(if test -n "$${DEVICE_TREE}"; then \
		echo \#define DEVICE_TREE \"$(DEVICE_TREE)\"; \
	else \
		echo \#define DEVICE_TREE CONFIG_DEFAULT_DEVICE_TREE; \
	fi)
endef

1903
$(version_h): include/config/uboot.release FORCE
1904
1905
1906
1907
1908
	$(call filechk,version.h)

$(timestamp_h): $(srctree)/Makefile FORCE
	$(call filechk,timestamp.h)

1909
1910
1911
$(dt_h): $(srctree)/Makefile FORCE
	$(call filechk,dt.h)

1912
1913
1914
$(defaultenv_h): $(CONFIG_DEFAULT_ENV_FILE:"%"=%) FORCE
	$(call filechk,defaultenv.h)

1915
# ---------------------------------------------------------------------------
1916
quiet_cmd_cpp_lds = LDS     $@
1917
cmd_cpp_lds = $(CPP) -Wp,-MD,$(depfile) $(cpp_flags) $(LDPPFLAGS) \
1918
		-D__ASSEMBLY__ -x assembler-with-cpp -std=c99 -P -o $@ $<
1919

1920
u-boot.lds: $(LDSCRIPT) prepare FORCE
1921
	$(call if_changed_dep,cpp_lds)
1922

1923
1924
spl/u-boot-spl.bin: spl/u-boot-spl
	@:
1925
1926
	$(SPL_SIZE_CHECK)

1927
spl/u-boot-spl: tools prepare \
1928
1929
		$(if $(CONFIG_OF_SEPARATE)$(CONFIG_OF_EMBED)$(CONFIG_SPL_OF_PLATDATA),dts/dt.dtb) \
		$(if $(CONFIG_OF_SEPARATE)$(CONFIG_OF_EMBED)$(CONFIG_TPL_OF_PLATDATA),dts/dt.dtb)
1930
	$(Q)$(MAKE) obj=spl -f $(srctree)/scripts/Makefile.spl all
1931

1932
1933
1934
spl/sunxi-spl.bin: spl/u-boot-spl
	@:

1935
1936
1937
spl/sunxi-spl-with-ecc.bin: spl/sunxi-spl.bin
	@:

1938
spl/u-boot-spl.sfp: spl/u-boot-spl
1939
1940
	@:

1941
1942
1943
spl/boot.bin: spl/u-boot-spl
	@:

1944
tpl/u-boot-tpl.bin: tools prepare \
1945
		$(if $(CONFIG_OF_SEPARATE)$(CONFIG_OF_EMBED)$(CONFIG_SPL_OF_PLATDATA),dts/dt.dtb)
Masahiro Yamada's avatar
Masahiro Yamada committed
1946
	$(Q)$(MAKE) obj=tpl -f $(srctree)/scripts/Makefile.spl all
Simon Glass's avatar
Simon Glass committed
1947
	$(TPL_SIZE_CHECK)
1948

1949
TAG_SUBDIRS := $(patsubst %,$(srctree)/%,$(u-boot-dirs) include)
1950

1951
1952
1953
FIND := find
FINDFLAGS := -L

1954
tags ctags:
1955
		ctags -w -o ctags `$(FIND) $(FINDFLAGS) $(TAG_SUBDIRS) \
Li Yang's avatar
Li Yang committed
1956
						-name '*.[chS]' -print`
1957
		ln -s ctags tags
wdenk's avatar
wdenk committed
1958
1959

etags:
1960
		etags -a -o etags `$(FIND) $(FINDFLAGS) $(TAG_SUBDIRS) \
Li Yang's avatar
Li Yang committed
1961
						-name '*.[chS]' -print`
Li Yang's avatar
Li Yang committed
1962
cscope:
1963
1964
		$(FIND) $(FINDFLAGS) $(TAG_SUBDIRS) -name '*.[chS]' -print > \
						cscope.files
1965
1966
1967
		@find $(TAG_SUBDIRS) -name '*.[chS]' -type l -print | \
			grep -xvf - cscope.files > cscope.files.no-symlinks; \
		mv cscope.files.no-symlinks cscope.files
Li Yang's avatar
Li Yang committed
1968
		cscope -b -q -k
wdenk's avatar
wdenk committed
1969

1970
1971
SYSTEM_MAP = \
		$(NM) $1 | \
wdenk's avatar
wdenk committed
1972
		grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
1973
		LC_ALL=C sort
1974
System.map:	u-boot
Masahiro Yamada's avatar
Masahiro Yamada committed
1975
		@$(call SYSTEM_MAP,$<) > $@
wdenk's avatar
wdenk committed
1976
1977
1978

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

1979
1980
# ARM relocations should all be R_ARM_RELATIVE (32-bit) or
# R_AARCH64_RELATIVE (64-bit).
1981
checkarmreloc: u-boot
1982
1983
1984
1985
1986
1987
1988
	@RELOC="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
		grep R_A | sort -u`"; \
	if test "$$RELOC" != "R_ARM_RELATIVE" -a \
		 "$$RELOC" != "R_AARCH64_RELATIVE"; then \
		echo "$< contains unexpected relocations: $$RELOC"; \
		false; \
	fi
1989

1990
tools/version.h: include/version.h
1991
	$(Q)mkdir -p $(dir $@)
1992
1993
1994
	$(call if_changed,copy)

envtools: scripts_basic $(version_h) $(timestamp_h) tools/version.h
1995
	$(Q)$(MAKE) $(build)=tools/env
Mike Frysinger's avatar
Mike Frysinger committed
1996

1997
tools-only: export TOOLS_ONLY=y
1998
tools-only: scripts_basic $(version_h) $(timestamp_h) tools/version.h
1999
2000
	$(Q)$(MAKE) $(build)=tools

2001
tools-all: export HOST_TOOLS_ALL=y
2002
tools-all: envtools tools ;
Mike Frysinger's avatar
Mike Frysinger committed
2003

2004
2005
2006
cross_tools: export CROSS_BUILD_TOOLS=y
cross_tools: tools ;

2007
2008
.PHONY : CHANGELOG
CHANGELOG:
2009
2010
	git log --no-merges U-Boot-1_1_5.. | \
	unexpand -a | sed -e 's/\s\s*$$//' > $@
2011

wdenk's avatar
wdenk committed
2012
2013
#########################################################################

2014
2015
2016
2017
2018
2019
2020
2021
###
# 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'
2022
2023
CLEAN_DIRS  += $(MODVERDIR) \
	       $(foreach d, spl tpl, $(patsubst %,$d/%, \
Masahiro Yamada's avatar
Masahiro Yamada committed
2024
			$(filter-out include, $(shell ls -1 $d 2>/dev/null))))
2025

2026
CLEAN_FILES += include/bmp_logo.h include/bmp_logo_data.h tools/version.h \
2027
2028
	       boot* u-boot* MLO* SPL System.map fit-dtb.blob* \
	       u-boot-ivt.img.log u-boot-dtb.imx.log SPL.log u-boot.imx.log \
2029
	       lpc32xx-* bl31.c bl31.elf bl31_*.bin image.map tispl.bin* \
2030
	       idbloader.img flash.bin flash.log defconfig
2031
2032

# Directories & files removed with 'make mrproper'
Masahiro Yamada's avatar
Masahiro Yamada committed
2033
MRPROPER_DIRS  += include/config include/generated spl tpl \
2034
		  .tmp_objdiff doc/output
Masahiro Yamada's avatar
Masahiro Yamada committed
2035
MRPROPER_FILES += .config .config.old include/autoconf.mk* include/config.h \
2036
2037
		  ctags etags tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
		  drivers/video/fonts/*.S
2038
2039
2040
2041
2042
2043

# clean - Delete most, but leave enough to build external modules
#
clean: rm-dirs  := $(CLEAN_DIRS)
clean: rm-files := $(CLEAN_FILES)

2044
clean-dirs	:= $(foreach f,$(u-boot-alldirs),$(if $(wildcard $(srctree)/$f/Makefile),$f))
2045

Tom Rini's avatar
Tom Rini committed
2046
clean-dirs      := $(addprefix _clean_, $(clean-dirs))
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056

PHONY += $(clean-dirs) clean archclean
$(clean-dirs):
	$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)

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' \
2057
		-o -name '*.ko.*' -o -name '*.su' -o -name '*.pyc' \
2058
		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
2059
		-o -name '*.lex.c' -o -name '*.tab.[ch]' \
2060
		-o -name '*.asn1.[ch]' \
2061
2062
		-o -name '*.symtypes' -o -name 'modules.order' \
		-o -name modules.builtin -o -name '.tmp_*.o.*' \
2063
		-o -name 'dsdt.aml' -o -name 'dsdt.asl.tmp' -o -name 'dsdt.c' \
2064
		-o -name '*.efi' -o -name '*.gcno' -o -name '*.so' \) \
2065
		-type f -print | xargs rm -f
2066
2067
2068
2069
2070
2071

# mrproper - Delete all generated files, including .config
#
mrproper: rm-dirs  := $(wildcard $(MRPROPER_DIRS))
mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
mrproper-dirs      := $(addprefix _mrproper_,scripts)
wdenk's avatar
wdenk committed
2072

2073
2074
2075
2076
PHONY += $(mrproper-dirs) mrproper archmrproper
$(mrproper-dirs):
	$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)

2077
mrproper: clean $(mrproper-dirs)
2078
2079
	$(call cmd,rmdirs)
	$(call cmd,rmfiles)
2080
	@rm -f arch/*/include/asm/arch
2081
2082
2083
2084

# distclean
#
PHONY += distclean
2085
2086

distclean: mrproper
2087
2088
2089
	@find $(srctree) $(RCS_FIND_IGNORE) \
		\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
		-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
2090
2091
		-o -name '.*.rej' -o -name '*%' -o -name 'core' \
		-o -name '*.pyc' \) \
2092
		-type f -print | xargs rm -f
2093
	@rm -f boards.cfg CHANGELOG
wdenk's avatar
wdenk committed
2094
2095

backup:
2096
	F=`basename $(srctree)` ; cd .. ; \
2097
	gtar --force-local -zcvf `LC_ALL=C date "+$$F-%Y-%m-%d-%T.tar.gz"` $$F
wdenk's avatar
wdenk committed
2098

2099
2100
help:
	@echo  'Cleaning targets:'
2101
	@echo  '  clean		  - Remove most generated files but keep the config'
2102
2103
2104
	@echo  '  mrproper	  - Remove all generated files + config + various backup files'
	@echo  '  distclean	  - mrproper + remove editor backup and patch files'
	@echo  ''
Masahiro Yamada's avatar
Masahiro Yamada committed
2105
2106
2107
	@echo  'Configuration targets:'
	@$(MAKE) -f $(srctree)/scripts/kconfig/Makefile help
	@echo  ''
2108
2109
2110
	@echo  'Test targets:'
	@echo  ''
	@echo  '  check           - Run all automated tests that use sandbox'
2111
	@echo  '  qcheck          - Run quick automated tests that use sandbox'
2112
	@echo  '  tcheck          - Run quick automated tests on tools'
2113
	@echo  ''
2114
2115
	@echo  'Other generic targets:'
	@echo  '  all		  - Build all necessary images depending on configuration'
2116
	@echo  '  tests		  - Build U-Boot for sandbox and run tests'
2117
	@echo  '* u-boot	  - Build the bare u-boot'
2118
2119
2120
2121
	@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))'
2122
2123
	@echo  '  tags/ctags	  - Generate ctags file for editors'
	@echo  '  etags		  - Generate etags file for editors'
2124
	@echo  '  cscope	  - Generate cscope index'
2125
2126
	@echo  '  ubootrelease	  - Output the release version string (use with make -s)'
	@echo  '  ubootversion	  - Output the version stored in Makefile (use with make -s)'
2127
	@echo  "  cfg		  - Don't build, just create the .cfg files"
2128
	@echo  "  envtools	  - Build only the target-side environment tools"
2129
2130
2131
	@echo  ''
	@echo  'Static analysers'
	@echo  '  checkstack      - Generate a list of stack hogs'
2132
	@echo  '  coccicheck      - Execute static code analysis with Coccinelle'
2133
2134
	@echo  ''
	@echo  'Documentation targets:'
2135
	@$(MAKE) -f $(srctree)/doc/Makefile dochelp
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
	@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'

2152
tests check:
2153
	$(srctree)/test/run
2154

2155
2156
2157
qcheck:
	$(srctree)/test/run quick

2158
2159
2160
tcheck:
	$(srctree)/test/run tools

2161
2162
# Documentation targets
# ---------------------------------------------------------------------------
2163
2164
2165
2166
DOC_TARGETS := xmldocs latexdocs pdfdocs htmldocs epubdocs cleandocs \
	       linkcheckdocs dochelp refcheckdocs
PHONY += $(DOC_TARGETS)
$(DOC_TARGETS): scripts_basic FORCE
2167
	$(Q)$(MAKE) $(build)=doc $@
2168

2169
2170
2171
endif #ifeq ($(config-targets),1)
endif #ifeq ($(mixed-targets),1)

2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
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)

2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
# 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

2233
2234
2235
2236
2237
2238
2239
quiet_cmd_genenv = GENENV $@
cmd_genenv = $(OBJCOPY) --dump-section .rodata.default_environment=$@ env/common.o; \
	sed --in-place -e 's/\x00/\x0A/g' $@

u-boot-initial-env: u-boot.bin
	$(call if_changed,genenv)

2240
2241
2242
2243
2244
2245
2246
2247
# Consistency checks
# ---------------------------------------------------------------------------

PHONY += coccicheck

coccicheck:
	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/$@

2248
# FIXME Should go into a make.lib or something
2249
2250
# ===========================================================================

2251
2252
2253
2254
2255
2256
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)

2257
2258
# read all saved command lines

2259
cmd_files := $(wildcard .*.cmd $(foreach f,$(sort $(targets)),$(dir $(f)).$(notdir $(f)).cmd))
2260
2261
2262
2263
2264
2265

ifneq ($(cmd_files),)
  $(cmd_files): ;	# Do not try to update included dependency files
  include $(cmd_files)
endif

2266
2267
2268
2269
2270
endif	# skip-makefile

PHONY += FORCE
FORCE:

2271
# Declare the contents of the PHONY variable as phony.  We keep that
2272
2273
# information in a variable so we can use it in if_changed and friends.
.PHONY: $(PHONY)