3 ## Copyright (C) 2008 Advanced Micro Devices, Inc.
4 ## Copyright (C) 2008 Uwe Hermann <uwe@hermann-uwe.de>
5 ## Copyright (C) 2009-2010 coresystems GmbH
6 ## Copyright (C) 2011 secunet Security Networks AG
8 ## Redistribution and use in source and binary forms, with or without
9 ## modification, are permitted provided that the following conditions
11 ## 1. Redistributions of source code must retain the above copyright
12 ## notice, this list of conditions and the following disclaimer.
13 ## 2. Redistributions in binary form must reproduce the above copyright
14 ## notice, this list of conditions and the following disclaimer in the
15 ## documentation and/or other materials provided with the distribution.
16 ## 3. The name of the author may not be used to endorse or promote products
17 ## derived from this software without specific prior written permission.
19 ## THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 ## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 ## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 ## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 ## FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 ## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 ## OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 ## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 ## LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 ## OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 ifneq ($(words $(CURDIR
)),1)
33 $(error ERROR
: Path to the main directory cannot contain spaces
)
36 ifeq ($(INNER_SCANBUILD
),y
)
40 export top
:= $(CURDIR
)
41 export coreboottop ?
= $(abspath
$(top
)/..
/..
/)
43 export srck
:= $(abspath
$(top
)/..
/..
/util
/kconfig
)
45 export objutil ?
= $(obj
)/util
46 export objk
:= $(objutil
)/lp_kconfig
47 export absobj
:= $(abspath
$(obj
))
48 VBOOT_SOURCE ?
= $(coreboottop
)/3rdparty
/vboot
50 export KCONFIG_AUTOHEADER
:= $(obj
)/config.h
51 export KCONFIG_AUTOCONFIG
:= $(obj
)/auto.conf
52 export KCONFIG_DEPENDENCIES
:= $(obj
)/auto.conf.cmd
53 export KCONFIG_SPLITCONFIG
:= $(obj
)/config
/
54 export KCONFIG_TRISTATE
:= $(obj
)/tristate.conf
55 export KCONFIG_NEGATIVES
:= 1
56 export KBUILD_KCONFIG
:= Kconfig
57 export CONFIG_
:= CONFIG_LP_
59 # directory containing the toplevel Makefile.mk
63 KBUILD_DEFCONFIG ?
= configs
/defconfig
64 UNAME_RELEASE
:= $(shell uname
-r
)
66 KCONFIG_CONFIG
= $(DOTCONFIG
)
68 HAVE_DOTCONFIG
:= $(wildcard $(DOTCONFIG
))
69 MAKEFLAGS
+= -rR
--no-print-directory
71 # Make is silent per default, but 'make V=1' will show all compiler calls.
79 CPP
:= $(CC
) -x assembler-with-cpp
-DASSEMBLY
-E
82 HOSTCFLAGS
:= -I
$(srck
) -I
$(objk
) -g
83 HOSTCXXFLAGS
:= -I
$(srck
) -I
$(objk
)
87 HOSTOBJCOPY ?
= objcopy
88 HOSTOBJDUMP ?
= objdump
89 HOSTREADELF ?
= readelf
94 DOXYGEN_OUTPUT_DIR
:= doxygen
98 ifeq ($(INNER_SCANBUILD
),y
)
100 HOSTCC
:=$(CC_real
) --hostcc
101 HOSTCXX
:=$(CC_real
) --hostcxx
104 # This include must come _before_ the pattern rules below!
105 # Order _does_ matter for pattern rules.
106 include $(srck
)/Makefile.mk
108 include $(HAVE_DOTCONFIG
)
110 ARCHDIR-
$(CONFIG_LP_ARCH_ARM
) := arm
111 ARCHDIR-
$(CONFIG_LP_ARCH_ARM64
) := arm64
112 ARCHDIR-
$(CONFIG_LP_ARCH_X86
) := x86
113 ARCHDIR-
$(CONFIG_LP_ARCH_MOCK
) := mock
115 ARCH-y
:= $(ARCHDIR-y
)
117 # If architecture folder name is different from xcompile architecture name,
119 ARCH-
$(CONFIG_LP_ARCH_ARM
) := arm
120 ARCH-
$(CONFIG_LP_ARCH_ARM64
) := arm64
121 ARCH-
$(CONFIG_LP_ARCH_X86_32
) := x86_32
122 ARCH-
$(CONFIG_LP_ARCH_X86_64
) := x86_64
123 ARCH-
$(CONFIG_LP_ARCH_MOCK
) := mock
125 # Five cases where we don't need fully populated $(obj) lists:
126 # 1. when no .config exists
127 # 2. when make config (in any flavour) is run
128 # 3. when make distclean is run
129 # 4. when make help% or make clean% is run
130 # 5. when make %-test or make %-tests or make %coverage-report is run
131 # Don't waste time on reading all Makefiles in these cases
132 ifeq ($(strip $(HAVE_DOTCONFIG
)),)
135 ifneq ($(MAKECMDGOALS
),)
136 ifneq ($(filter %config
%clean clean-
% help
%,$(MAKECMDGOALS
)),)
139 ifneq ($(filter %clean help
% clean%, $(MAKECMDGOALS
)),)
144 ifneq ($(filter help
%, $(MAKECMDGOALS
)),)
148 ifneq ($(filter %-test %-tests
%coverage-report
, $(MAKECMDGOALS
)),)
149 ifneq ($(filter-out %-test %-tests
%coverage-report
, $(MAKECMDGOALS
)),)
150 $(error Cannot mix unit-tests targets with other targets
)
157 xcompile ?
= $(obj
)/xcompile
158 $(xcompile
): $(top
)/..
/..
/util
/xcompile
/xcompile
159 $< $(XGCCPATH
) > $@.tmp
160 \mv
-f
$@.tmp
$@
2> /dev
/null
162 ifeq ($(NOCOMPILE
),1)
163 include $(TOPLEVEL
)/Makefile.mk
164 include $(TOPLEVEL
)/tests
/Makefile.mk
169 ifeq ($(CONFIG_LP_ARCH_MOCK
),y
)
171 # Create empty xcompile to satisfy install script
172 $(shell echo
'' > $(xcompile
))
182 OBJCOPY
:= $(HOSTOBJCOPY
)
183 OBJCOPY-mock
:= $(HOSTOBJCOPY
)
184 OBJDUMP
:= $(HOSTOBJDUMP
)
185 OBJDUMP-mock
:= $(HOSTOBJDUMP
)
186 READELF
:= $(HOSTREADELF
)
187 READELF-mock
:= $(HOSTEADELF
)
188 STRIP
:= $(HOSTSTRIP
)
189 STRIP-mock
:= $(HOSTSTRIP
)
194 # in addition to the dependency below, create the file if it doesn't exist
195 # to silence stupid warnings about a file that would be generated anyway.
196 $(if
$(wildcard $(xcompile
)),,$(shell \
197 mkdir
-p
$(dir $(xcompile
)) && \
198 $(top
)/..
/..
/util
/xcompile
/xcompile
$(XGCCPATH
) > $(xcompile
) ||
rm -f
$(xcompile
)))
202 ifneq ($(XCOMPILE_COMPLETE
),1)
203 $(shell rm -f
$(xcompile
))
204 $(error
$(xcompile
) deleted because it
's invalid. \
205 Restarting the build should fix that, or explain the problem)
208 CC := $(CC_$(ARCH-y))
209 AS := $(AS_$(ARCH-y))
210 LD := $(LD_$(ARCH-y))
211 NM := $(NM_$(ARCH-y))
212 OBJCOPY := $(OBJCOPY_$(ARCH-y))
213 OBJDUMP := $(OBJDUMP_$(ARCH-y))
214 READELF := $(READELF_$(ARCH-y))
215 STRIP := $(STRIP_$(ARCH-y))
216 AR := $(AR_$(ARCH-y))
219 CFLAGS += -std=gnu11 $(CFLAGS_$(ARCH-y))
221 ifneq ($(INNER_SCANBUILD),y)
222 ifeq ($(CONFIG_LP_COMPILER_LLVM_CLANG),y)
224 ifneq ($(CONFIG_LP_ARCH_MOCK),y)
231 ifeq ($(CONFIG_LP_CCACHE),y)
232 CCACHE:=$(word 1,$(wildcard $(addsuffix /ccache,$(subst :, ,$(PATH)))))
234 $(error ccache selected, but not found in PATH)
236 CCACHE:=CCACHE_COMPILERCHECK=content CCACHE_BASEDIR=$(top) $(CCACHE)
237 CC := $(CCACHE) $(CC)
238 HOSTCC := $(CCACHE) $(HOSTCC)
239 HOSTCXX := $(CCACHE) $(HOSTCXX)
242 strip_quotes = $(subst ",,$(subst \",,$(1)))
244 # The primary target needs to be here before we include the
247 ifeq ($(INNER_SCANBUILD),y)
248 CONFIG_LP_SCANBUILD_ENABLE:=
251 ifeq ($(CONFIG_LP_SCANBUILD_ENABLE),y)
252 ifneq ($(CONFIG_LP_SCANBUILD_REPORT_LOCATION),)
253 CONFIG_LP_SCANBUILD_REPORT_LOCATION:=-o $(CONFIG_LP_SCANBUILD_REPORT_LOCATION)
256 echo '#!/bin/sh' > .ccwrap
257 echo
'CC="$(CC)"' >> .ccwrap
258 echo
'if [ "$$1" = "--hostcc" ]; then shift; CC="$(HOSTCC)"; fi' >> .ccwrap
259 echo
'if [ "$$1" = "--hostcxx" ]; then shift; CC="$(HOSTCXX)"; fi' >> .ccwrap
260 echo
'eval $$CC $$*' >> .ccwrap
262 scan-build
$(CONFIG_LP_SCANBUILD_REPORT_LOCATION
) -analyze-headers
--use-cc
=$(top
)/.ccwrap
--use-c
++=$(top
)/.ccwrap
$(MAKE
) INNER_SCANBUILD
=y
264 real-all
: real-target
267 # must come rather early
270 $(KCONFIG_AUTOHEADER
): $(KCONFIG_CONFIG
)
271 $(MAKE
) CONFIG_
=CONFIG_LP_ olddefconfig
272 $(MAKE
) CONFIG_
=CONFIG_LP_ syncconfig
274 # Add a new class of source/object files to the build system
276 $(eval
$(1)-srcs
:=) \
277 $(eval
$(1)-objs
:=) \
278 $(eval classes
+=$(1))
280 # Special classes are managed types with special behaviour
281 # On parse time, for each entry in variable $(1)-y
282 # a handler $(1)-handler is executed with the arguments:
283 # * $(1): directory the parser is in
284 # * $(2): current entry
287 $(eval special-classes
+=$(1))
289 # Clean -y variables, include Makefile.mk
290 # Add paths to files in X-y to X-srcs
291 # Add subdirs-y to subdirs
293 $(foreach class
,classes subdirs
$(classes
) $(special-classes
), $(eval
$(class
)-y
:=)) \
294 $(eval
-include $(1)) \
295 $(foreach class
,$(classes-y
), $(call add-class
,$(class
))) \
296 $(foreach special
,$(special-classes
), \
297 $(foreach item
,$($(special
)-y
), $(call
$(special
)-handler
,$(dir $(1)),$(item
)))) \
298 $(foreach class
,$(classes
), \
299 $(eval
$(class
)-srcs
+= \
300 $$(subst $(absobj
)/,$(obj
)/, \
302 $$(abspath
$$(subst $(dir $(1))/,/,$$(addprefix $(dir $(1)),$$($(class
)-y
)))))))) \
303 $(eval subdirs
+=$$(subst $(CURDIR
)/,,$$(wildcard $$(abspath
$$(addprefix $(dir $(1)),$$(subdirs-y
))))))
306 # For each path in $(subdirs) call includemakefiles
307 # Repeat until subdirs is empty
309 $(eval cursubdirs
:=$(subdirs
)) \
311 $(foreach dir,$(cursubdirs
), \
312 $(eval
$(call includemakefiles
,$(dir)/Makefile.mk
))) \
313 $(if
$(subdirs
),$(eval
$(call evaluate_subdirs
)))
315 # collect all object files eligible for building or run unit-tests
316 ifneq ($(UNIT_TEST
),1)
318 $(eval
$(call evaluate_subdirs
))
320 include $(TOPLEVEL
)/tests
/Makefile.mk
323 # Converts one or more source file paths to the corresponding build/ paths.
325 # $2 file path (list)
327 $(addsuffix .
$(1).o
,\
329 $(addprefix $(obj
)/,\
330 $(subst $(coreboottop
)/,coreboot
/,$(2)))))
331 $(foreach class
,$(classes
),$(eval
$(class
)-objs
+=$(call src-to-obj
,$(class
),$($(class
)-srcs
))))
333 allsrcs
:=$(foreach var
, $(addsuffix -srcs
,$(classes
)), $($(var
)))
334 allobjs
:=$(foreach var
, $(addsuffix -objs
,$(classes
)), $($(var
)))
335 alldirs
:=$(sort $(abspath
$(dir $(allobjs
))))
337 # macro to define template macros that are used by use_template macro
338 define create_cc_template
340 # $2 source suffix (c, S)
341 # $3 additional compiler flags
342 # $4 additional dependencies
343 ifn
$(EMPTY
)def
$(1)-objs_
$(2)_template
344 de
$(EMPTY
)fine
$(1)-objs_
$(2)_template
345 $$(call src-to-obj
,$(1), $$(1).
$(2)): $$(1).
$(2) $(obj
)/libpayload-config.h
$(4)
346 @printf
" CC $$$$(subst $$$$(obj)/,,$$$$(@))\n"
347 $(CC
) $(3) -MMD
$$$$(CFLAGS
) $(EXTRA_CFLAGS
) -c
-o
$$$$@
$$$$<
352 filetypes-of-class
=$(subst .
,,$(sort $(suffix $($(1)-srcs
))))
353 $(foreach class
,$(classes
), \
354 $(foreach type
,$(call filetypes-of-class
,$(class
)), \
355 $(eval
$(call create_cc_template
,$(class
),$(type
),$($(class
)-$(type
)-ccopts
),$($(class
)-$(type
)-deps
)))))
357 foreach-src
=$(foreach file
,$($(1)-srcs
),$(eval
$(call
$(1)-objs_
$(subst .
,,$(suffix $(file
)))_template
,$(basename $(file
)))))
358 $(eval
$(foreach class
,$(classes
),$(call foreach-src
,$(class
))))
360 DEPENDENCIES
= $($(filter %.o
,%(allobjs
)):.o
=.d
)
361 -include $(DEPENDENCIES
)
364 @
$(foreach class
,$(classes
),echo
$(class
)-objs
:=$($(class
)-objs
); )
365 @echo alldirs
:=$(alldirs
)
366 @echo allsrcs
=$(allsrcs
)
367 @echo DEPENDENCIES
=$(DEPENDENCIES
)
368 @
$(foreach class
,$(special-classes
),echo
$(class
):='$($(class))'; )
372 $(shell mkdir
-p
$(KCONFIG_SPLITCONFIG
) $(obj
) $(objk
)/lxdialog
$(additional-dirs
) $(alldirs
))
381 doxyclean
: doxygen-clean
383 rm -rf
$(DOXYGEN_OUTPUT_DIR
)
385 clean-for-update
: doxygen-clean clean-for-update-target
386 rm -f
$(allobjs
) $(xcompile
)
387 rm -f
$(DEPENDENCIES
)
388 rmdir
-p
$(alldirs
) 2>/dev
/null
>/dev
/null || true
390 clean: clean-for-update clean-target
391 rm -f .ccwrap junit_config junit_config.old
397 distclean: clean-cscope
clean
398 rm -f .config .config.old ..config.tmp .kconfig.d .tmpconfig
* .ccwrap .xcompile junit.xml
400 .PHONY
: $(PHONY
) clean clean-cscope cscope
distclean doxygen doxy