meta-dreambox: drop COMPATIBLE_MACHINE from recipes inheriting opendreambox-precompil...
[opendreambox.git] / Makefile
1 #!/usr/bin/make -f
2 #
3 # Copyright (c) 2016 Dream Property GmbH, Germany
4 #                    https://dreambox.de/
5 # Author:
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 platforms:
32 # dm520, dm820, dm900, dm7080
33 #
34 # This only sets the default value. All platforms now use a shared build
35 # directory. Run "MACHINE=dm820 bitbake dreambox-image" to build an image
36 # for the dm820, if it is not the default.
37 MACHINE ?= dm900
38
39 USER_MACHINE := $(MACHINE)
40
41 MAKE_IMAGE_BB ?= dreambox-image
42
43 # Adjust according to the number CPU cores to use for parallel build.
44 # Default: Number of processors in /proc/cpuinfo, if present, or 1.
45 NR_CPU := $(shell [ -f /proc/cpuinfo ] && grep -c '^processor\s*:' /proc/cpuinfo || echo 1)
46 BB_NUMBER_THREADS ?= $(NR_CPU)
47 PARALLEL_MAKE ?= -j $(NR_CPU)
48
49 NICE ?= nice -n 19
50 XSUM ?= md5sum
51
52 BUILD_DIR = $(CURDIR)/build
53 TOPDIR = $(BUILD_DIR)/$(MACHINE)
54 DL_DIR = $(CURDIR)/sources
55 PERSISTENT_DIR = $(CURDIR)/persist-cache
56 SSTATE_DIR = $(CURDIR)/sstate-cache
57 TMPDIR = $(TOPDIR)/tmp
58 DEPDIR = $(CURDIR)/.deps
59
60 BITBAKE = . $(CURDIR)/bitbake.env && cd $(TOPDIR) && $(NICE) bitbake
61
62 BBLAYERS ?= \
63         $(CURDIR)/meta-dreambox \
64         $(CURDIR)/meta-opendreambox \
65         $(CURDIR)/meta-openembedded/meta-filesystems \
66         $(CURDIR)/meta-openembedded/meta-multimedia \
67         $(CURDIR)/meta-openembedded/meta-networking \
68         $(CURDIR)/meta-openembedded/meta-oe \
69         $(CURDIR)/meta-openembedded/meta-python \
70         $(CURDIR)/meta-openembedded/meta-ruby \
71         $(CURDIR)/meta-openembedded/meta-webserver \
72         $(CURDIR)/meta-qt5 \
73         $(CURDIR)/openembedded-core/meta
74
75 CONFFILES_AUTO = \
76         bitbake.env \
77         conf/opendreambox.conf \
78         $(TOPDIR)/Makefile \
79         $(TOPDIR)/bitbake.env \
80         $(TOPDIR)/conf/bblayers.conf \
81         $(TOPDIR)/conf/local.conf
82
83 CONFFILES_MANUAL = \
84         .cross-compile-$(MACHINE).env
85
86 CONFDEPS = \
87         $(DEPDIR)/.bitbake.env.$(BITBAKE_ENV_HASH) \
88         $(DEPDIR)/.opendreambox.conf.$(OPENDREAMBOX_CONF_HASH) \
89         $(DEPDIR)/.bblayers.conf.$(MACHINE).$(BBLAYERS_CONF_HASH) \
90         $(DEPDIR)/.local.conf.$(MACHINE).$(LOCAL_CONF_HASH) \
91         $(DEPDIR)/.cross-compile.env.$(MACHINE).$(CROSS_COMPILE_ENV_HASH)
92
93 CONFFILES_BITBAKE = \
94         conf/opendreambox.conf \
95         openembedded-core/meta/conf/bitbake.conf \
96         $(wildcard \
97                 conf/bblayers-ext.conf \
98                 conf/bblayers-$(MACHINE)-ext.conf \
99                 conf/local-ext.conf \
100                 conf/local-$(MACHINE)-ext.conf)
101
102 GIT ?= git
103 GIT_REMOTE := $(shell $(GIT) remote)
104 GIT_AUTHOR_NAME ?= $(shell $(GIT) config user.name)
105 GIT_AUTHOR_EMAIL ?= $(shell $(GIT) config user.email)
106
107 hash = $(shell echo $(1) | $(XSUM) | awk '{print $$1}')
108
109 .DEFAULT_GOAL := all
110 all: init usage
111
112 $(BBLAYERS):
113         [ -d $@ ] || $(MAKE) $(MFLAGS) update
114
115 init: $(BBLAYERS) $(CONFFILES_AUTO)
116
117 help:
118         @echo "Your options:"
119         @echo
120         @echo "  * Update the SDK"
121         @echo "      $$ $(MAKE) update"
122         @echo
123         @echo "  * Build the PDF documentation (doc/opendreambox.pdf, requires pdfTeX):"
124         @echo "      $$ $(MAKE) doc"
125         @echo
126         @echo "  * View the documentation in text format:"
127         @echo "      $$ view doc/opendreambox.txt"
128         @echo
129         @echo "  * Select a new target machine:"
130         @echo "      $$ echo MACHINE=dm820 >> conf/make.conf"
131         @echo "    [Valid values: dm520, dm820, dm900, dm7080]"
132         @echo
133         @echo "  * Build a firmware image for the selected target machine:"
134         @echo "      $$ $(MAKE) image"
135         @echo
136         @echo "  * Build a firmware image for a different target machine:"
137         @echo "      $$ $(MAKE) image MACHINE=dm820"
138         @echo "    [Valid values: dm520, dm820, dm900, dm7080]"
139         @echo
140         @echo "  * Download all source files at once:"
141         @echo "      $$ $(MAKE) download"
142         @echo
143         @echo "  * Set up the environment to build recipes manually:"
144         @echo "      $$ source bitbake.env"
145         @echo "      $$ cd build/$(MACHINE)"
146         @echo "      $$ bitbake <target>"
147         @echo "    [Replace <target> with a recipe name, e.g. $(MAKE_IMAGE_BB) or enigma2]"
148         @echo
149         @echo "Your current settings:"
150         @echo "  MACHINE = $(USER_MACHINE)"
151         @echo
152         @echo "  BB_NUMBER_THREADS = $(BB_NUMBER_THREADS)"
153         @echo "  PARALLEL_MAKE = $(PARALLEL_MAKE)"
154         @echo
155         @echo "Trouble finding a recipe? Try ./scripts/drepo grep 'search string'"
156         @echo "or ./scripts/drepo find -name \"*recipe*\"."
157         @echo
158         @if [ -z "$(GIT_AUTHOR_NAME)" -o -z "$(GIT_AUTHOR_EMAIL)" ]; then \
159                 echo "Before doing any commits, please configure your name and email"; \
160                 echo "address using the following commands:"; \
161                 echo; \
162                 echo "  $$ $(GIT) config user.name \"Your Name\""; \
163                 echo "  $$ $(GIT) config user.email \"mail@example.com\""; \
164         else \
165                 echo "Git has been configured for $(GIT_AUTHOR_NAME) <$(GIT_AUTHOR_EMAIL)>."; \
166                 echo "Please submit patches to <enigma2-devel@lists.elitedvb.net>."; \
167         fi
168
169 usage:
170         @echo "[*] Please run '$(MAKE) help' to display further information!"
171
172 clean:
173         @echo '[*] Deleting generated configuration files'
174         @$(RM) $(CONFFILES_AUTO) $(CONFFILES_MANUAL) $(CONFDEPS)
175         @$(MAKE) $(MFLAGS) -C doc clean
176
177 distclean: clean
178         @echo '[*] Deleting dependencies directory'
179         @$(RM) -r $(DEPDIR)
180         @echo '[*] Deleting download directory'
181         @$(RM) -r $(DL_DIR)
182         @echo '[*] Deleting tmp directory'
183         @$(RM) -r $(TMPDIR)
184         @echo '[*] Deleting sstate directory'
185         @$(RM) -r $(SSTATE_DIR)
186         @echo '[*] Deleting persistent directory'
187         @$(RM) -r $(PERSISTENT_DIR)
188         @echo '[*] Deleting build directory'
189         @$(RM) -r $(BUILD_DIR)
190         @echo '[*] Deleting git submodules'
191         @$(GIT) submodule foreach 'rm -rf .* * 2>/dev/null || true'
192
193 # function to convert simple space separated list to csv
194 space :=
195 space +=
196 comma := ,
197 csv = $(subst $(space),$(comma),$(strip $1))
198
199 sstate-cache-clean: init
200         @echo '[*] Cleaning up sstate-cache'
201         @. $(CURDIR)/bitbake.env && sstate-cache-management.sh --cache-dir=$(SSTATE_DIR) --stamps-dir=$(call csv,$(wildcard $(CURDIR)/build/*/tmp*/stamps)) -v
202
203 doc:
204         @$(MAKE) $(MFLAGS) -C doc
205
206 dreambox-image enigma2 package-index: init
207         @echo '[*] Building $@ for $(USER_MACHINE)'
208         @$(BITBAKE) $@
209
210 image: init
211         @echo '[*] Building $@ for $(USER_MACHINE)'
212         @$(BITBAKE) $(MAKE_IMAGE_BB)
213
214 console-image: init
215         @echo '[*] Building $@ for $(USER_MACHINE)'
216         @$(BITBAKE) dreambox-$@
217
218 rescue-image: init
219         @echo '[*] Building $@ for $(USER_MACHINE)'
220         @$(BITBAKE) linux-dreambox
221
222 download: init
223         @echo '[*] Downloading sources'
224         @$(BITBAKE) -cfetchall -k $(MAKE_IMAGE_BB)
225
226 update:
227         @echo '[*] Updating Git repositories...'
228         @HASH=`$(XSUM) $(MAKEFILE_LIST)`; \
229         if [ -n "$(GIT_REMOTE)" ]; then \
230                 $(GIT) pull --ff-only || $(GIT) pull --rebase || exit 1; \
231         fi; \
232         if [ "$$HASH" != "`$(XSUM) $(MAKEFILE_LIST)`" ]; then \
233                 echo '[*] Makefile changed. Restarting...'; \
234                 $(MAKE) $(MFLAGS) --no-print-directory $(MAKECMDGOALS); \
235         else \
236                 $(GIT) submodule sync && \
237                 $(GIT) submodule update --init && \
238                 echo "[*] The Dreambox SDK is now up-to-date."; \
239         fi
240
241 .PHONY: all clean doc help image init update usage
242
243 MACHINE_INCLUDE_CONF = $(CURDIR)/conf/$(basename $(@F))-$(MACHINE)-ext.conf
244 DISTRO_INCLUDE_CONF = $(CURDIR)/conf/$(basename $(@F))-ext.conf
245
246 BB_ENV_EXTRAWHITE = MACHINE DISTRO TCMODE TCLIBC HTTP_PROXY http_proxy \
247         HTTPS_PROXY https_proxy FTP_PROXY ftp_proxy FTPS_PROXY ftps_proxy ALL_PROXY \
248         all_proxy NO_PROXY no_proxy SSH_AGENT_PID SSH_AUTH_SOCK BB_SRCREV_POLICY \
249         SDKMACHINE BB_NUMBER_THREADS BB_NO_NETWORK PARALLEL_MAKE GIT_PROXY_COMMAND \
250         SOCKS5_PASSWD SOCKS5_USER SCREENDIR STAMPS_DIR
251
252 BITBAKE_ENV_HASH := $(call hash, \
253         'BITBAKE_ENV_VERSION = "0"' \
254         'BB_ENV_EXTRAWHITE = "$(BB_ENV_EXTRAWHITE)"' \
255         'CURDIR = "$(CURDIR)"' \
256         )
257
258 bitbake.env: $(DEPDIR)/.bitbake.env.$(BITBAKE_ENV_HASH)
259         @echo '[*] Generating $@'
260         @echo '# Automatically generated file. Do not edit!' > $@
261         @echo 'export BB_ENV_EXTRAWHITE="$(BB_ENV_EXTRAWHITE)"' >> $@
262         @echo 'export PATH="$(CURDIR)/openembedded-core/scripts:$(CURDIR)/bitbake/bin:$${PATH}"' >> $@
263
264 OPENDREAMBOX_CONF_HASH := $(call hash, \
265         'OPENDREAMBOX_CONF_VERSION = "2"' \
266         'CURDIR = "$(CURDIR)"' \
267         'BB_NUMBER_THREADS = "$(BB_NUMBER_THREADS)"' \
268         'PARALLEL_MAKE = "$(PARALLEL_MAKE)"' \
269         'DL_DIR = "$(DL_DIR)"' \
270         'PERSISTENT_DIR = "$(PERSISTENT_DIR)"' \
271         'SSTATE_DIR = "$(SSTATE_DIR)"' \
272         'BB_GENERATE_MIRROR_TARBALLS = "$(BB_GENERATE_MIRROR_TARBALLS)"' \
273         'BBINCLUDELOGS = "$(BBINCLUDELOGS)"' \
274         'CONF_VERSION = "$(CONF_VERSION)"' \
275         'DISTRO = "$(DISTRO)"' \
276         'USER_CLASSES = "$(USER_CLASSES)"' \
277         'PATCHRESOLVE = "$(PATCHRESOLVE)"' \
278         'PRSERV_HOST = "$(PRSERV_HOST)"' \
279         )
280
281 conf/opendreambox.conf: $(DEPDIR)/.opendreambox.conf.$(OPENDREAMBOX_CONF_HASH)
282         @echo '[*] Generating $@'
283         @test -d $(@D) || mkdir -p $(@D)
284         @echo '# Automatically generated file. Do not edit!' > $@
285         @echo 'BB_NUMBER_THREADS = "$(BB_NUMBER_THREADS)"' >> $@
286         @echo 'PARALLEL_MAKE = "$(PARALLEL_MAKE)"' >> $@
287         @echo 'DL_DIR = "$(DL_DIR)"' >> $@
288         @echo 'PERSISTENT_DIR = "$(PERSISTENT_DIR)"' >> $@
289         @echo 'SSTATE_DIR = "$(SSTATE_DIR)"' >> $@
290         @echo 'BB_GENERATE_MIRROR_TARBALLS = "0"' >> $@
291         @echo 'BBINCLUDELOGS = "yes"' >> $@
292         @echo 'CONF_VERSION = "1"' >> $@
293         @echo 'DISTRO = "opendreambox"' >> $@
294         @echo 'USER_CLASSES = "buildstats"' >> $@
295         @echo 'PATCHRESOLVE = "noop"' >> $@
296         @echo 'PRSERV_HOST = "localhost:0"' >> $@
297
298 LOCAL_CONF_HASH := $(call hash, \
299         'LOCAL_CONF_VERSION = "0"' \
300         'CURDIR = "$(CURDIR)"' \
301         'TOPDIR = "$(TOPDIR)"' \
302         'MACHINE = "$(MACHINE)"' \
303         'TMPDIR = "$(TMPDIR)"' \
304         'DISTRO_INCLUDE_CONF = "$(DISTRO_INCLUDE_CONF)"' \
305         'MACHINE_INCLUDE_CONF = "$(MACHINE_INCLUDE_CONF)"' \
306         )
307
308 $(TOPDIR)/conf/local.conf: $(DEPDIR)/.local.conf.$(MACHINE).$(LOCAL_CONF_HASH)
309         @echo '[*] Generating $@'
310         @test -d $(@D) || mkdir -p $(@D)
311         @echo '# Automatically generated file. Do not edit!' > $@
312         @echo 'TOPDIR = "$(TOPDIR)"' >> $@
313         @echo 'MACHINE = "$(MACHINE)"' >> $@
314         @echo 'TMPDIR = "$(TMPDIR)"' >> $@
315         @echo 'require $(CURDIR)/conf/opendreambox.conf' >> $@
316         @echo 'include $(DISTRO_INCLUDE_CONF)' >> $@
317         @echo 'include $(MACHINE_INCLUDE_CONF)' >> $@
318
319 BBLAYERS_CONF_HASH := $(call hash, \
320         'BBLAYERS_CONF_VERSION = "0"' \
321         'CURDIR = "$(CURDIR)"' \
322         'LCONF_VERSION = "$(LCONF_VERSION)"' \
323         'BBFILES = "$(BBFILES)"' \
324         'BBLAYERS = "$(BBLAYERS)"' \
325         'DISTRO_INCLUDE_CONF = "$(DISTRO_INCLUDE_CONF)"' \
326         'MACHINE_INCLUDE_CONF = "$(MACHINE_INCLUDE_CONF)"' \
327         )
328
329 $(TOPDIR)/conf/bblayers.conf: $(DEPDIR)/.bblayers.conf.$(MACHINE).$(BBLAYERS_CONF_HASH)
330         @echo '[*] Generating $@'
331         @test -d $(@D) || mkdir -p $(@D)
332         @echo '# Automatically generated file. Do not edit!' > $@
333         @echo 'LCONF_VERSION = "4"' >> $@
334         @echo 'BBFILES = ""' >> $@
335         @echo 'BBLAYERS = "$(BBLAYERS)"' >> $@
336         @echo 'include $(DISTRO_INCLUDE_CONF)' >> $@
337         @echo 'include $(MACHINE_INCLUDE_CONF)' >> $@
338
339 $(TOPDIR)/Makefile:
340         @echo '[*] Generating $@'
341         @test -d $(@D) || mkdir -p $(@D)
342         @printf '%%::\n\tMACHINE=$(MACHINE) $$(MAKE) -C ../.. $$(MAKECMDGOALS)\n' > $@
343
344 $(TOPDIR)/bitbake.env:
345         @echo '[*] Generating $@'
346         @test -d $(@D) || mkdir -p $(@D)
347         @echo '. ../../bitbake.env' > $@
348
349 CROSS_COMPILE_ENV_BLACKLIST = \
350         HOME LOGNAME PWD SHELL SSH_AGENT_PID SSH_AUTH_SOCK TERM USER
351
352 CROSS_COMPILE_ENV_HASH := $(call hash, \
353         'CROSS_COMPILE_ENV_VERSION = "0"' \
354         'CURDIR = "$(CURDIR)"' \
355         'PARALLEL_MAKE = "$(PARALLEL_MAKE)"' \
356         'TMPDIR = "$(TMPDIR)"' \
357         'TOPDIR = "$(TOPDIR)"' \
358         'CROSS_COMPILE_ENV_BLACKLIST = "$(CROSS_COMPILE_ENV_BLACKLIST)"' \
359         )
360
361 .cross-compile-$(MACHINE).env: $(DEPDIR)/.cross-compile.env.$(MACHINE).$(CROSS_COMPILE_ENV_HASH) $(CONFFILES_BITBAKE)
362         @test -d $(TOPDIR) || (echo 'The directory "$(TOPDIR)" does not exist. Is "$(MACHINE)" a valid machine? Try running "make MACHINE=$(MACHINE)" first.' && exit 1)
363         @echo '[*] Generating $@'
364         @($(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) > $@.tmp && [ -s $@.tmp ] && mv $@.tmp $@ || ($(RM) $@.tmp && echo 'Failed! Please verify that no instance of bitbake is currently running for this machine.' && exit 1)
365
366 $(CONFDEPS):
367         @test -d $(@D) || mkdir -p $(@D)
368         @$(RM) $(basename $@).*
369         @touch $@