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