cross-compile.env: blacklist some variables, make them local, sort output
[opendreambox.git] / Makefile
1 #!/usr/bin/make -f
2 #
3 # Copyright (c) 2010-2012 Dream Multimedia GmbH, Germany
4 #                         http://www.dream-multimedia-tv.de/
5 # Authors:
6 #   Andreas Oberritter <obi@opendreambox.org>
7 #
8 # Permission is hereby granted, free of charge, to any person obtaining a copy
9 # of this software and associated documentation files (the "Software"), to deal
10 # in the Software without restriction, including without limitation the rights
11 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 # copies of the Software, and to permit persons to whom the Software is
13 # furnished to do so, subject to the following conditions:
14 #
15 # The above copyright notice and this permission notice shall be included in
16 # all copies or substantial portions of the Software.
17 #
18 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 # THE SOFTWARE.
25 #
26
27 # Note: You can override all variables by storing them
28 # in an external file called "make.conf".
29 -include conf/make.conf
30
31 # Target platform:
32 # dm800, dm8000, dm500hd, dm800se, dm7020hd, dm500hdv2, dm800sev2, dm7020hdv2
33 #
34 # This only sets the default value. All platforms now use a shared build
35 # directory. Run "MACHINE=dm800se bitbake dreambox-image" to build an image
36 # for the dm800se, if it is not the default.
37 MACHINE ?= dm7020hd
38
39 USER_MACHINE := $(MACHINE)
40
41 ifeq ($(MACHINE),dm7020hdv2)
42 override MACHINE := dm7020hd
43 MAKE_IMAGE_BB ?= dreambox-image-dm7020hdv2
44 endif
45
46 MAKE_IMAGE_BB ?= dreambox-image
47
48 # Adjust according to the number CPU cores to use for parallel build.
49 # Default: Number of processors in /proc/cpuinfo, if present, or 1.
50 NR_CPU := $(shell [ -f /proc/cpuinfo ] && grep -c '^processor\s*:' /proc/cpuinfo || echo 1)
51 BB_NUMBER_THREADS ?= $(NR_CPU)
52 PARALLEL_MAKE ?= -j $(NR_CPU)
53
54 XSUM ?= md5sum
55
56 BUILD_DIR = $(CURDIR)/build
57 TOPDIR = $(BUILD_DIR)/$(MACHINE)
58 DL_DIR = $(CURDIR)/sources
59 PERSISTENT_DIR = $(CURDIR)/persist-cache
60 SSTATE_DIR = $(CURDIR)/sstate-cache
61 TMPDIR = $(TOPDIR)/tmp
62 DEPDIR = $(CURDIR)/.deps
63
64 BITBAKE = . $(CURDIR)/bitbake.env && cd $(TOPDIR) && bitbake
65
66 BBLAYERS ?= \
67         $(wildcard $(CURDIR)/meta-bsp/$(MACHINE)) \
68         $(CURDIR)/meta-bsp/common \
69         $(CURDIR)/meta-opendreambox \
70         $(CURDIR)/meta-openembedded/meta-oe \
71         $(CURDIR)/meta-openembedded/meta-multimedia \
72         $(CURDIR)/meta-openembedded/meta-networking \
73         $(CURDIR)/openembedded-core/meta
74
75 CONFFILES_AUTO = \
76         bitbake.env \
77         conf/opendreambox.conf \
78         $(TOPDIR)/conf/bblayers.conf \
79         $(TOPDIR)/conf/local.conf
80
81 CONFFILES_MANUAL = \
82         .cross-compile-$(MACHINE).env
83
84 CONFDEPS = \
85         $(DEPDIR)/.bitbake.env.$(BITBAKE_ENV_HASH) \
86         $(DEPDIR)/.opendreambox.conf.$(OPENDREAMBOX_CONF_HASH) \
87         $(DEPDIR)/.bblayers.conf.$(MACHINE).$(BBLAYERS_CONF_HASH) \
88         $(DEPDIR)/.local.conf.$(MACHINE).$(LOCAL_CONF_HASH) \
89         $(DEPDIR)/.cross-compile.env.$(MACHINE).$(CROSS_COMPILE_ENV_HASH)
90
91 GIT ?= git
92 GIT_REMOTE := $(shell $(GIT) remote)
93 GIT_USER_NAME := $(shell $(GIT) config user.name)
94 GIT_USER_EMAIL := $(shell $(GIT) config user.email)
95
96 hash = $(shell echo $(1) | $(XSUM) | awk '{print $$1}')
97
98 .DEFAULT_GOAL := all
99 all: init usage
100
101 $(BBLAYERS):
102         [ -d $@ ] || $(MAKE) $(MFLAGS) update
103
104 init: $(BBLAYERS) $(CONFFILES_AUTO)
105
106 help:
107         @echo "Your options:"
108         @echo
109         @echo "  * Update the SDK"
110         @echo "      $$ $(MAKE) update"
111         @echo
112         @echo "  * Build the PDF documentation (doc/opendreambox.pdf, requires pdfTeX):"
113         @echo "      $$ $(MAKE) doc"
114         @echo
115         @echo "  * View the documentation in text format:"
116         @echo "      $$ view doc/opendreambox.txt"
117         @echo
118         @echo "  * Select a new target machine:"
119         @echo "      $$ echo MACHINE=dm800se >> conf/make.conf"
120         @echo "    [Valid values: dm800, dm8000, dm500hd, dm800se, dm7020hd, dm7020hdv2, dm800sev2, dm500hdv2]"
121         @echo
122         @echo "  * Build a firmware image for the selected target machine:"
123         @echo "      $$ $(MAKE) image"
124         @echo
125         @echo "  * Build a firmware image for a different target machine:"
126         @echo "      $$ $(MAKE) image MACHINE=dm800se"
127         @echo "    [Valid values: dm800, dm8000, dm500hd, dm800se, dm7020hd, dm7020hdv2, dm800sev2, dm500hdv2]"
128         @echo
129         @echo "  * Download all source files at once:"
130         @echo "      $$ $(MAKE) download"
131         @echo
132         @echo "  * Set up the environment to build recipes manually:"
133         @echo "      $$ source bitbake.env"
134         @echo "      $$ cd build/$(MACHINE)"
135         @echo "      $$ bitbake <target>"
136         @echo "    [Replace <target> with a recipe name, e.g. $(MAKE_IMAGE_BB) or enigma2]"
137         @echo
138         @echo "Your current settings:"
139         @echo "  MACHINE = $(USER_MACHINE)"
140         @echo
141         @echo "  BB_NUMBER_THREADS = $(BB_NUMBER_THREADS)"
142         @echo "  PARALLEL_MAKE = $(PARALLEL_MAKE)"
143         @echo
144         @echo "Trouble finding a recipe? Try ./scripts/drepo grep 'search string'"
145         @echo "or ./scripts/drepo find -name \"*recipe*\"."
146         @echo
147         @if [ -z "$(GIT_USER_NAME)" -o -z "$(GIT_USER_EMAIL)" ]; then \
148                 echo "Before doing any commits, please configure your name and email"; \
149                 echo "address using the following commands:"; \
150                 echo; \
151                 echo "  $$ $(GIT) config user.name \"Your Name\""; \
152                 echo "  $$ $(GIT) config user.email \"mail@example.com\""; \
153         else \
154                 echo "Git has been configured for $(GIT_USER_NAME) <$(GIT_USER_EMAIL)>."; \
155                 echo "Please submit patches to <enigma2-devel@lists.elitedvb.net>."; \
156         fi
157
158 usage:
159         @echo "[*] Please run '$(MAKE) help' to display further information!"
160
161 clean:
162         @echo '[*] Deleting generated configuration files'
163         @$(RM) $(CONFFILES_AUTO) $(CONFFILES_MANUAL) $(CONFDEPS)
164         @$(MAKE) $(MFLAGS) -C doc clean
165
166 distclean: clean
167         @echo '[*] Deleting dependencies directory'
168         @$(RM) -r $(DEPDIR)
169         @echo '[*] Deleting download directory'
170         @$(RM) -r $(DL_DIR)
171         @echo '[*] Deleting tmp directory'
172         @$(RM) -r $(TMPDIR)
173         @echo '[*] Deleting sstate directory'
174         @$(RM) -r $(SSTATE_DIR)
175         @echo '[*] Deleting persistent directory'
176         @$(RM) -r $(PERSISTENT_DIR)
177         @echo '[*] Deleting build directory'
178         @$(RM) -r $(BUILD_DIR)
179         @echo '[*] Deleting git submodules'
180         @$(GIT) submodule foreach 'rm -rf .* * 2>/dev/null || true'
181
182 sstate-cache-clean: init
183         @echo '[*] Cleaning up sstate-cache'
184         @. $(CURDIR)/bitbake.env && sstate-cache-management.sh --cache-dir=$(SSTATE_DIR) --stamps-dir=$(TMPDIR)/stamps -v || true
185
186 doc:
187         @$(MAKE) $(MFLAGS) -C doc
188
189 image: init
190         @echo '[*] Building image for $(USER_MACHINE)'
191         @$(BITBAKE) $(MAKE_IMAGE_BB)
192
193 download: init
194         @echo '[*] Downloading sources'
195         @$(BITBAKE) -cfetchall -k $(MAKE_IMAGE_BB)
196
197 update:
198         @echo '[*] Updating Git repositories...'
199         @HASH=`$(XSUM) $(MAKEFILE_LIST)`; \
200         if [ -n "$(GIT_REMOTE)" ]; then \
201                 $(GIT) pull --ff-only || $(GIT) pull --rebase; \
202         fi; \
203         if [ "$$HASH" != "`$(XSUM) $(MAKEFILE_LIST)`" ]; then \
204                 echo '[*] Makefile changed. Restarting...'; \
205                 $(MAKE) $(MFLAGS) --no-print-directory $(MAKECMDGOALS); \
206         else \
207                 $(GIT) submodule sync && \
208                 $(GIT) submodule update --init && \
209                 echo "[*] The Dreambox SDK is now up-to-date."; \
210         fi
211
212 .PHONY: all clean doc help image init update usage
213
214 MACHINE_INCLUDE_CONF = $(CURDIR)/conf/$(basename $(@F))-$(MACHINE)-ext.conf
215 DISTRO_INCLUDE_CONF = $(CURDIR)/conf/$(basename $(@F))-ext.conf
216
217 BITBAKE_ENV_HASH := $(call hash, \
218         'BITBAKE_ENV_VERSION = "0"' \
219         'CURDIR = "$(CURDIR)"' \
220         )
221
222 bitbake.env: $(DEPDIR)/.bitbake.env.$(BITBAKE_ENV_HASH)
223         @echo '[*] Generating $@'
224         @echo '# Automatically generated file. Do not edit!' > $@
225         @echo 'export PATH=$(CURDIR)/openembedded-core/scripts:$(CURDIR)/bitbake/bin:$${PATH}' >> $@
226
227 OPENDREAMBOX_CONF_HASH := $(call hash, \
228         'OPENDREAMBOX_CONF_VERSION = "2"' \
229         'CURDIR = "$(CURDIR)"' \
230         'BB_NUMBER_THREADS = "$(BB_NUMBER_THREADS)"' \
231         'PARALLEL_MAKE = "$(PARALLEL_MAKE)"' \
232         'DL_DIR = "$(DL_DIR)"' \
233         'PERSISTENT_DIR = "$(PERSISTENT_DIR)"' \
234         'SSTATE_DIR = "$(SSTATE_DIR)"' \
235         )
236
237 conf/opendreambox.conf: $(DEPDIR)/.opendreambox.conf.$(OPENDREAMBOX_CONF_HASH)
238         @echo '[*] Generating $@'
239         @test -d $(@D) || mkdir -p $(@D)
240         @echo '# Automatically generated file. Do not edit!' > $@
241         @echo 'BB_NUMBER_THREADS = "$(BB_NUMBER_THREADS)"' >> $@
242         @echo 'PARALLEL_MAKE = "$(PARALLEL_MAKE)"' >> $@
243         @echo 'DL_DIR = "$(DL_DIR)"' >> $@
244         @echo 'PERSISTENT_DIR = "$(PERSISTENT_DIR)"' >> $@
245         @echo 'SSTATE_DIR = "$(SSTATE_DIR)"' >> $@
246         @echo 'BB_GENERATE_MIRROR_TARBALLS = "0"' >> $@
247         @echo 'BBINCLUDELOGS = "yes"' >> $@
248         @echo 'CONF_VERSION = "1"' >> $@
249         @echo 'DISTRO = "opendreambox"' >> $@
250         @echo 'EXTRA_IMAGE_FEATURES = "debug-tweaks"' >> $@
251         @echo 'USER_CLASSES = "buildstats"' >> $@
252         @echo 'PATCHRESOLVE = "noop"' >> $@
253         @echo 'PRSERV_HOST = "localhost:0"' >> $@
254
255 LOCAL_CONF_HASH := $(call hash, \
256         'LOCAL_CONF_VERSION = "0"' \
257         'CURDIR = "$(CURDIR)"' \
258         'TOPDIR = "$(TOPDIR)"' \
259         'MACHINE = "$(MACHINE)"' \
260         'TMPDIR = "$(TMPDIR)"' \
261         )
262
263 $(TOPDIR)/conf/local.conf: $(DEPDIR)/.local.conf.$(MACHINE).$(LOCAL_CONF_HASH)
264         @echo '[*] Generating $@'
265         @test -d $(@D) || mkdir -p $(@D)
266         @echo '# Automatically generated file. Do not edit!' > $@
267         @echo 'TOPDIR = "$(TOPDIR)"' >> $@
268         @echo 'MACHINE = "$(MACHINE)"' >> $@
269         @echo 'TMPDIR = "$(TMPDIR)"' >> $@
270         @echo 'require $(CURDIR)/conf/opendreambox.conf' >> $@
271         @echo 'include $(DISTRO_INCLUDE_CONF)' >> $@
272         @echo 'include $(MACHINE_INCLUDE_CONF)' >> $@
273
274 BBLAYERS_CONF_HASH := $(call hash, \
275         'BBLAYERS_CONF_VERSION = "0"' \
276         'CURDIR = "$(CURDIR)"' \
277         'BBLAYERS = "$(BBLAYERS)"' \
278         )
279
280 $(TOPDIR)/conf/bblayers.conf: $(DEPDIR)/.bblayers.conf.$(MACHINE).$(BBLAYERS_CONF_HASH)
281         @echo '[*] Generating $@'
282         @test -d $(@D) || mkdir -p $(@D)
283         @echo '# Automatically generated file. Do not edit!' > $@
284         @echo 'LCONF_VERSION = "4"' >> $@
285         @echo 'BBFILES = ""' >> $@
286         @echo 'BBLAYERS = "$(BBLAYERS)"' >> $@
287         @echo 'include $(DISTRO_INCLUDE_CONF)' >> $@
288         @echo 'include $(MACHINE_INCLUDE_CONF)' >> $@
289
290 CROSS_COMPILE_ENV_BLACKLIST = \
291         HOME LOGNAME PWD SHELL SSH_AGENT_PID SSH_AUTH_SOCK TERM USER
292
293 CROSS_COMPILE_ENV_HASH := $(call hash, \
294         'CROSS_COMPILE_ENV_VERSION = "0"' \
295         'CURDIR = "$(CURDIR)"' \
296         'PARALLEL_MAKE = "$(PARALLEL_MAKE)"' \
297         'TMPDIR = "$(TMPDIR)"' \
298         'TOPDIR = "$(TOPDIR)"' \
299         'CROSS_COMPILE_ENV_BLACKLIST = "$(CROSS_COMPILE_ENV_BLACKLIST)"' \
300         )
301
302 .cross-compile-$(MACHINE).env: $(DEPDIR)/.cross-compile.env.$(MACHINE).$(CROSS_COMPILE_ENV_HASH)
303         @test -d $(TOPDIR) || (echo 'The directory "$(TOPDIR)" does not exist. Is "$(MACHINE)" a valid machine? Try running "make MACHINE=$(MACHINE)" first.' && exit 1)
304         @echo '[*] Generating $@'
305         @echo '# Automatically generated file. Do not edit!' > $@
306         @($(BITBAKE) -e | grep '^\(export\s\)\?[a-zA-Z0-9_]\+=".*"$$' | sed -e 's,^export\s,,' | grep -v $(foreach v,$(CROSS_COMPILE_ENV_BLACKLIST),-e ^$(v)=) | sed -e 's,^,local ,' | sort) >> $@ || ($(RM) $@ && exit 1)
307
308 $(CONFDEPS):
309         @test -d $(@D) || mkdir -p $(@D)
310         @$(RM) $(basename $@).*
311         @touch $@