reef: fmap.dts: Add label for device-extension region
[depthcharge.git] / Makefile
1 ##
2 ## This file is part of the depthcharge project.
3 ##
4 ## Copyright (C) 2008 Advanced Micro Devices, Inc.
5 ## Copyright (C) 2008 Uwe Hermann <uwe@hermann-uwe.de>
6 ## Copyright 2012 Google Inc.
7 ##
8 ## This program is free software; you can redistribute it and/or modify
9 ## it under the terms of the GNU General Public License as published by
10 ## the Free Software Foundation; version 2 of the License.
11 ##
12 ## This program is distributed in the hope that it will be useful,
13 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 ## GNU General Public License for more details.
16 ##
17
18 .SECONDEXPANSION:
19
20 export src ?= $(shell pwd)
21 export srck ?= $(src)/util/kconfig
22 export obj ?= $(src)/build
23 export objk ?= $(obj)/util/kconfig
24
25 export KERNELVERSION      := 0.1.0
26
27 export KCONFIG_AUTOHEADER := $(obj)/config.h
28 export KCONFIG_AUTOCONFIG := $(obj)/auto.conf
29 export KCONFIG_DEPENDENCIES := $(obj)/auto.conf.cmd
30 export KCONFIG_SPLITCONFIG := $(obj)/config
31 export KCONFIG_TRISTATE := $(obj)/tristate.conf
32 export KCONFIG_NEGATIVES := 1
33 export KCONFIG_STRICT := 1
34 DOTCONFIG ?= .config
35 export KCONFIG_CONFIG = $(DOTCONFIG)
36
37
38 CONFIG_SHELL := sh
39 ifdef BOARD
40 KBUILD_DEFCONFIG := $(src)/board/$(BOARD)/defconfig
41 endif
42 UNAME_RELEASE := $(shell uname -r)
43 HAVE_DOTCONFIG := $(wildcard $(DOTCONFIG))
44 MAKEFLAGS += -rR --no-print-directory
45
46 # Make is silent per default, but 'make V=1' will show all compiler calls.
47 ifneq ($(V),1)
48 Q:=@
49 .SILENT:
50 endif
51
52 HOSTCC = gcc
53 HOSTCXX = g++
54 HOSTCFLAGS := -I$(srck) -I$(objk)
55 HOSTCXXFLAGS := -I$(srck) -I$(objk)
56
57 ifdef LIBPAYLOAD_DIR
58 # libpayload's xcompile script checks for this config flag to decide which
59 # compiler to use
60 CONFIG_LP_COMPILER_GCC=y
61 include $(LIBPAYLOAD_DIR)/libpayload.xcompile
62 endif
63 LIBPAYLOAD_DIR ?= ../libpayload/install/libpayload
64 LZMA := lzma
65
66 ifeq ($(strip $(HAVE_DOTCONFIG)),)
67
68 all: help
69
70 else
71
72 include $(src)/.config
73
74 ifeq ($(CONFIG_ARCH_X86),y)
75 ARCH = x86
76 endif
77 ifeq ($(CONFIG_ARCH_ARM),y)
78 ARCH = arm
79 endif
80 ifeq ($(CONFIG_ARCH_ARM_V8),y)
81 ARCH = arm64
82 ARCH_DIR = arm
83 else
84 ARCH_DIR = $(ARCH)
85 endif
86 ifeq ($(CONFIG_ARCH_MIPS),y)
87 ARCH = mips
88 ARCH_DIR = mips
89 endif
90
91 ifeq ($(CONFIG_LDSCRIPT_ARCH),y)
92 LDSCRIPT := $(src)/src/arch/$(ARCH_DIR)/depthcharge.ldscript
93 ifeq ("$(wildcard $(LDSCRIPT))","")
94 $(error $(LDSCRIPT): no such file.)
95 endif
96 else
97 LDSCRIPT := $(src)/src/image/depthcharge.ldscript
98 endif
99
100 ARCH_TO_TOOLCHAIN_x86    := i386
101 ARCH_TO_TOOLCHAIN_arm    := arm
102 ARCH_TO_TOOLCHAIN_arm64  := arm64
103 ARCH_TO_TOOLCHAIN_mips   := mipsel
104
105 toolchain := $(ARCH_TO_TOOLCHAIN_$(ARCH))
106
107 # libpayload's xcompile adapted the coreboot naming scheme, which is different
108 # in some places. If the names above don't work, use another set.
109 ifeq ($(CC_$(toolchain)),)
110 new_toolchain_name_i386 := x86_32
111 new_toolchain_name_mipsel := mips
112
113 toolchain := $(new_toolchain_name_$(toolchain))
114 endif
115
116 CC:=$(firstword $(CC_$(toolchain)))
117 XCC := CC=$(CC) $(LIBPAYLOAD_DIR)/bin/lpgcc
118 AS = $(LIBPAYLOAD_DIR)/bin/lpas
119 OBJCOPY ?= $(OBJCOPY_$(toolchain))
120 STRIP ?= $(STRIP_$(toolchain))
121
122 include $(src)/src/arch/$(ARCH_DIR)/build_vars
123
124 INCLUDES = -I$(obj) -I$(src)/src/ -I$(src)/src/arch/$(ARCH_DIR)/includes/ \
125         -I$(VB_SOURCE)/firmware/include
126 ABI_FLAGS := $(ARCH_ABI_FLAGS) -ffreestanding -fno-builtin \
127         -fno-stack-protector -fomit-frame-pointer
128 LINK_FLAGS = $(ARCH_LINK_FLAGS) $(ABI_FLAGS) -fuse-ld=bfd \
129         -Wl,-T,$(LDSCRIPT) -Wl,--gc-sections -Wl,-Map=$@.map
130 CFLAGS := $(ARCH_CFLAGS) -Wall -Werror $(INCLUDES) -std=gnu99 \
131         $(ABI_FLAGS) -ffunction-sections -fdata-sections -ggdb3
132
133 ifneq ($(SOURCE_DEBUG),)
134 CFLAGS += -O0 -g
135 else
136 CFLAGS += -Os
137 endif
138
139 all:
140         @echo  'You must specify one of the following targets to build:'
141         @echo
142         @echo  '  depthcharge_unified   - Build unified depthcharge (with no'
143         @echo  '                          firmware selection, for use with EFS)'
144         @echo  '  depthcharge_ro_rw     - Build depthcharge RO and RW (with'
145         @echo  '                          old trampoline and VbSelectFirmware)'
146         @echo  '  netboot_unified       - Build netboot binary'
147         @echo  '  fastboot_bin          - Build fastboot binary'
148         @echo  '  dev_unified           - Build unified developer binary (with'
149         @echo  '                          (EFS) vboot, netboot and gdb)'
150         @echo  '  dev_ro_rw             - Build RO/RW developer binary (with
151         @echo  '                          (legacy) vboot, netboot and gdb)'
152         @echo  '  dts                   - Preprocess fmap.dts file'
153         @echo  '  clean                 - Delete final output binaries'
154         @echo  '  distclean             - Delete whole build directory'
155
156 endif
157
158 $(KCONFIG_AUTOHEADER): $(KCONFIG_CONFIG)
159         $(MAKE) oldconfig
160
161 strip_quotes = $(subst ",,$(subst \",,$(1)))
162
163 # Add a new class of source/object files to the build system
164 add-class= \
165         $(eval $(1)-srcs:=) \
166         $(eval $(1)-objs:=) \
167         $(eval classes+=$(1))
168
169 # Special classes are managed types with special behaviour
170 # On parse time, for each entry in variable $(1)-y
171 # a handler $(1)-handler is executed with the arguments:
172 # * $(1): directory the parser is in
173 # * $(2): current entry
174 add-special-class= \
175         $(eval $(1):=) \
176         $(eval special-classes+=$(1))
177
178 # Clean -y variables, include Makefile.inc
179 # Add paths to files in X-y to X-srcs
180 # Add subdirs-y to subdirs
181 includemakefiles= \
182         $(foreach class,classes subdirs $(classes) $(special-classes), $(eval $(class)-y:=)) \
183         $(eval -include $(1)) \
184         $(foreach class,$(classes-y), $(call add-class,$(class))) \
185         $(foreach class,$(classes), \
186                 $(eval $(class)-srcs+= \
187                         $$(subst $(src)/,, \
188                         $$(abspath $$(subst $(dir $(1))/,/,$$(addprefix $(dir $(1)),$$($(class)-y))))))) \
189         $(foreach special,$(special-classes), \
190                 $(foreach item,$($(special)-y), $(call $(special)-handler,$(dir $(1)),$(item)))) \
191         $(eval subdirs+=$$(subst $(CURDIR)/,,$$(abspath $$(addprefix $(dir $(1)),$$(subdirs-y)))))
192
193 # For each path in $(subdirs) call includemakefiles
194 # Repeat until subdirs is empty
195 evaluate_subdirs= \
196         $(eval cursubdirs:=$(subdirs)) \
197         $(eval subdirs:=) \
198         $(foreach dir,$(cursubdirs), \
199                 $(eval $(call includemakefiles,$(dir)/Makefile.inc))) \
200         $(if $(subdirs),$(eval $(call evaluate_subdirs)))
201
202 # collect all object files eligible for building
203 subdirs:=$(src)
204 $(eval $(call evaluate_subdirs))
205
206 # Eliminate duplicate mentions of source files in a class
207 $(foreach class,$(classes),$(eval $(class)-srcs:=$(sort $($(class)-srcs))))
208
209 src-to-obj=$(addsuffix .$(1).o, $(basename $(patsubst src/%, $(obj)/%, $($(1)-srcs))))
210 $(foreach class,$(classes),$(eval $(class)-objs:=$(call src-to-obj,$(class))))
211
212 allsrcs:=$(foreach var, $(addsuffix -srcs,$(classes)), $($(var)))
213 allobjs:=$(foreach var, $(addsuffix -objs,$(classes)), $($(var)))
214 alldirs:=$(sort $(abspath $(dir $(allobjs))))
215
216 printall:
217         @$(foreach class,$(classes),echo $(class)-objs:=$($(class)-objs); )
218         @echo alldirs:=$(alldirs)
219         @echo allsrcs=$(allsrcs)
220         @echo DEPENDENCIES=$(DEPENDENCIES)
221         @echo LIBGCC_FILE_NAME=$(LIBGCC_FILE_NAME)
222         @$(foreach class,$(special-classes),echo $(class):='$($(class))'; )
223
224 ifndef NOMKDIR
225 $(shell mkdir -p $(obj) $(KCONFIG_SPLITCONFIG) $(objk)/lxdialog $(additional-dirs) $(alldirs))
226 endif
227
228 # macro to define template macros that are used by use_template macro
229 define create_cc_template
230 # $1 obj class
231 # $2 source suffix (c, S)
232 # $3 additional compiler flags
233 # $4 additional dependencies
234 ifn$(EMPTY)def $(1)-objs_$(2)_template
235 de$(EMPTY)fine $(1)-objs_$(2)_template
236 $(obj)/$$(1).$(1).o: src/$$(1).$(2) $(KCONFIG_AUTOHEADER) $(4)
237         @printf "    CC         $$$$(subst $$$$(obj)/,,$$$$(@))\n"
238         $(Q)$(XCC) $(3) -MMD $$$$(CFLAGS) -c -o $$$$@ $$$$<
239 en$(EMPTY)def
240 end$(EMPTY)if
241 endef
242
243 filetypes-of-class=$(subst .,,$(sort $(suffix $($(1)-srcs))))
244 $(foreach class,$(classes), \
245         $(foreach type,$(call filetypes-of-class,$(class)), \
246                 $(eval $(call create_cc_template,$(class),$(type),$($(class)-$(type)-ccopts),$($(class)-$(type)-deps)))))
247
248 foreach-src=$(foreach file,$($(1)-srcs),$(eval $(call $(1)-objs_$(subst .,,$(suffix $(file)))_template,$(subst src/,,$(basename $(file))))))
249 $(eval $(foreach class,$(classes),$(call foreach-src,$(class))))
250
251 # Kconfig options intended for the linker.
252 $(foreach option,$(link_config_options), \
253         $(eval LINK_FLAGS += -Wl,--defsym=$(option)=$$(CONFIG_$(option))))
254
255 DEPENDENCIES = $(allobjs:.o=.d)
256 -include $(DEPENDENCIES)
257
258 DTS_DIR := $(src)/board/$(BOARD)
259 DTS_CPPFLAGS := -x assembler-with-cpp
260 $(obj)/%.dts : $(DTS_DIR)/%.dts $(KCONFIG_AUTOHEADER)
261         $(HOSTCC) -E -P $(DTS_CPPFLAGS) --include $(KCONFIG_AUTOHEADER) $< -o $@
262 dts: $(obj)/fmap.dts
263
264 prepare:
265         $(Q)mkdir -p $(obj)/util/kconfig/lxdialog
266
267 clean:
268         $(Q)rm -rf $(obj)/*.elf $(obj)/*.o
269
270 distclean: clean
271         $(Q)rm -rf $(obj)
272         $(Q)rm -f .config .config.old ..config.tmp .kconfig.d .tmpconfig*
273
274 include util/kconfig/Makefile
275
276 .PHONY: $(PHONY) prepare clean distclean
277