1.NOTPARALLEL :
2
3# Pattern rule to print variables, e.g. make print-top_srcdir
4print-%:
5	@echo $* = $($*)
6
7SOURCES_PATH ?= $(BASEDIR)/sources
8WORK_PATH = $(BASEDIR)/work
9BASE_CACHE ?= $(BASEDIR)/built
10SDK_PATH ?= $(BASEDIR)/SDKs
11NO_QT ?=
12NO_QR ?=
13NO_WALLET ?=
14NO_ZMQ ?=
15NO_UPNP ?=
16FALLBACK_DOWNLOAD_PATH ?= https://bitcoincore.org/depends-sources
17
18BUILD = $(shell ./config.guess)
19HOST ?= $(BUILD)
20PATCHES_PATH = $(BASEDIR)/patches
21BASEDIR = $(CURDIR)
22HASH_LENGTH:=11
23DOWNLOAD_CONNECT_TIMEOUT:=30
24DOWNLOAD_RETRIES:=3
25HOST_ID_SALT ?= salt
26BUILD_ID_SALT ?= salt
27
28host:=$(BUILD)
29ifneq ($(HOST),)
30host:=$(HOST)
31endif
32
33ifneq ($(DEBUG),)
34release_type=debug
35else
36release_type=release
37endif
38
39base_build_dir=$(WORK_PATH)/build
40base_staging_dir=$(WORK_PATH)/staging
41base_download_dir=$(WORK_PATH)/download
42canonical_host:=$(shell ./config.sub $(HOST))
43build:=$(shell ./config.sub $(BUILD))
44
45build_arch =$(firstword $(subst -, ,$(build)))
46build_vendor=$(word 2,$(subst -, ,$(build)))
47full_build_os:=$(subst $(build_arch)-$(build_vendor)-,,$(build))
48build_os:=$(findstring linux,$(full_build_os))
49build_os+=$(findstring darwin,$(full_build_os))
50build_os:=$(strip $(build_os))
51ifeq ($(build_os),)
52build_os=$(full_build_os)
53endif
54
55host_arch=$(firstword $(subst -, ,$(canonical_host)))
56host_vendor=$(word 2,$(subst -, ,$(canonical_host)))
57full_host_os:=$(subst $(host_arch)-$(host_vendor)-,,$(canonical_host))
58host_os:=$(findstring linux,$(full_host_os))
59host_os+=$(findstring darwin,$(full_host_os))
60host_os+=$(findstring mingw32,$(full_host_os))
61
62ifeq (android,$(findstring android,$(full_host_os)))
63host_os:=android
64endif
65
66host_os:=$(strip $(host_os))
67ifeq ($(host_os),)
68host_os=$(full_host_os)
69endif
70
71$(host_arch)_$(host_os)_prefix=$(BASEDIR)/$(host)
72$(host_arch)_$(host_os)_host=$(host)
73host_prefix=$($(host_arch)_$(host_os)_prefix)
74build_prefix=$(host_prefix)/native
75build_host=$(build)
76
77AT_$(V):=
78AT_:=@
79AT:=$(AT_$(V))
80
81all: install
82
83include hosts/$(host_os).mk
84include hosts/default.mk
85include builders/$(build_os).mk
86include builders/default.mk
87include packages/packages.mk
88
89build_id_string:=$(BUILD_ID_SALT)
90build_id_string+=$(shell $(build_CC) --version 2>/dev/null)
91build_id_string+=$(shell $(build_AR) --version 2>/dev/null)
92build_id_string+=$(shell $(build_CXX) --version 2>/dev/null)
93build_id_string+=$(shell $(build_RANLIB) --version 2>/dev/null)
94build_id_string+=$(shell $(build_STRIP) --version 2>/dev/null)
95
96$(host_arch)_$(host_os)_id_string:=$(HOST_ID_SALT)
97$(host_arch)_$(host_os)_id_string+=$(shell $(host_CC) --version 2>/dev/null)
98$(host_arch)_$(host_os)_id_string+=$(shell $(host_AR) --version 2>/dev/null)
99$(host_arch)_$(host_os)_id_string+=$(shell $(host_CXX) --version 2>/dev/null)
100$(host_arch)_$(host_os)_id_string+=$(shell $(host_RANLIB) --version 2>/dev/null)
101$(host_arch)_$(host_os)_id_string+=$(shell $(host_STRIP) --version 2>/dev/null)
102
103qrencode_packages_$(NO_QR) = $(qrencode_packages)
104
105qt_packages_$(NO_QT) = $(qt_packages) $(qt_$(host_os)_packages) $(qt_$(host_arch)_$(host_os)_packages) $(qrencode_packages_)
106
107wallet_packages_$(NO_WALLET) = $(wallet_packages)
108upnp_packages_$(NO_UPNP) = $(upnp_packages)
109zmq_packages_$(NO_ZMQ) = $(zmq_packages)
110
111packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(qt_packages_) $(wallet_packages_) $(upnp_packages_)
112native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages)
113
114ifneq ($(zmq_packages_),)
115packages += $(zmq_packages)
116endif
117
118all_packages = $(packages) $(native_packages)
119
120meta_depends = Makefile funcs.mk builders/default.mk hosts/default.mk hosts/$(host_os).mk builders/$(build_os).mk
121
122$(host_arch)_$(host_os)_native_toolchain?=$($(host_os)_native_toolchain)
123
124include funcs.mk
125
126toolchain_path=$($($(host_arch)_$(host_os)_native_toolchain)_prefixbin)
127final_build_id_long+=$(shell $(build_SHA256SUM) config.site.in)
128final_build_id+=$(shell echo -n "$(final_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))
129$(host_prefix)/.stamp_$(final_build_id): $(native_packages) $(packages)
130	$(AT)rm -rf $(@D)
131	$(AT)mkdir -p $(@D)
132	$(AT)echo copying packages: $^
133	$(AT)echo to: $(@D)
134	$(AT)cd $(@D); $(foreach package,$^, tar xf $($(package)_cached); )
135	$(AT)touch $@
136
137$(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_build_id)
138	$(AT)@mkdir -p $(@D)
139	$(AT)sed -e 's|@HOST@|$(host)|' \
140            -e 's|@CC@|$(toolchain_path)$(host_CC)|' \
141            -e 's|@CXX@|$(toolchain_path)$(host_CXX)|' \
142            -e 's|@AR@|$(toolchain_path)$(host_AR)|' \
143            -e 's|@RANLIB@|$(toolchain_path)$(host_RANLIB)|' \
144            -e 's|@NM@|$(toolchain_path)$(host_NM)|' \
145            -e 's|@STRIP@|$(toolchain_path)$(host_STRIP)|' \
146            -e 's|@build_os@|$(build_os)|' \
147            -e 's|@host_os@|$(host_os)|' \
148            -e 's|@CFLAGS@|$(strip $(host_CFLAGS) $(host_$(release_type)_CFLAGS))|' \
149            -e 's|@CXXFLAGS@|$(strip $(host_CXXFLAGS) $(host_$(release_type)_CXXFLAGS))|' \
150            -e 's|@CPPFLAGS@|$(strip $(host_CPPFLAGS) $(host_$(release_type)_CPPFLAGS))|' \
151            -e 's|@LDFLAGS@|$(strip $(host_LDFLAGS) $(host_$(release_type)_LDFLAGS))|' \
152            -e 's|@allow_host_packages@|$(ALLOW_HOST_PACKAGES)|' \
153            -e 's|@no_qt@|$(NO_QT)|' \
154            -e 's|@no_qr@|$(NO_QR)|' \
155            -e 's|@no_zmq@|$(NO_ZMQ)|' \
156            -e 's|@no_wallet@|$(NO_WALLET)|' \
157            -e 's|@no_upnp@|$(NO_UPNP)|' \
158            -e 's|@debug@|$(DEBUG)|' \
159            $< > $@
160	$(AT)touch $@
161
162
163define check_or_remove_cached
164  mkdir -p $(BASE_CACHE)/$(host)/$(package) && cd $(BASE_CACHE)/$(host)/$(package); \
165  $(build_SHA256SUM) -c $($(package)_cached_checksum) >/dev/null 2>/dev/null || \
166  ( rm -f $($(package)_cached_checksum); \
167    if test -f "$($(package)_cached)"; then echo "Checksum mismatch for $(package). Forcing rebuild.."; rm -f $($(package)_cached_checksum) $($(package)_cached); fi )
168endef
169
170define check_or_remove_sources
171  mkdir -p $($(package)_source_dir); cd $($(package)_source_dir); \
172  test -f $($(package)_fetched) && ( $(build_SHA256SUM) -c $($(package)_fetched) >/dev/null 2>/dev/null || \
173    ( echo "Checksum missing or mismatched for $(package) source. Forcing re-download."; \
174      rm -f $($(package)_all_sources) $($(1)_fetched))) || true
175endef
176
177check-packages:
178	@$(foreach package,$(all_packages),$(call check_or_remove_cached,$(package));)
179check-sources:
180	@$(foreach package,$(all_packages),$(call check_or_remove_sources,$(package));)
181
182$(host_prefix)/share/config.site: check-packages
183
184check-packages: check-sources
185
186clean-all: clean
187	@rm -rf $(SOURCES_PATH) x86_64* i686* mips* arm* aarch64* powerpc* riscv32* riscv64* s390x*
188
189clean:
190	@rm -rf $(WORK_PATH) $(BASE_CACHE) $(BUILD)
191
192install: check-packages $(host_prefix)/share/config.site
193
194
195download-one: check-sources $(all_sources)
196
197download-osx:
198	@$(MAKE) -s HOST=x86_64-apple-darwin14 download-one
199download-linux:
200	@$(MAKE) -s HOST=x86_64-unknown-linux-gnu download-one
201download-win:
202	@$(MAKE) -s HOST=x86_64-w64-mingw32 download-one
203download: download-osx download-linux download-win
204
205$(foreach package,$(all_packages),$(eval $(call ext_add_stages,$(package))))
206
207.PHONY: install cached clean clean-all download-one download-osx download-linux download-win download check-packages check-sources
208