/ depends / funcs.mk
funcs.mk
  1  define int_vars
  2  #Set defaults for vars which may be overridden per-package
  3  $(1)_cc=$$($$($(1)_type)_CC)
  4  $(1)_cxx=$$($$($(1)_type)_CXX)
  5  $(1)_objc=$$($$($(1)_type)_OBJC)
  6  $(1)_objcxx=$$($$($(1)_type)_OBJCXX)
  7  $(1)_ar=$$($$($(1)_type)_AR)
  8  $(1)_ranlib=$$($$($(1)_type)_RANLIB)
  9  $(1)_nm=$$($$($(1)_type)_NM)
 10  $(1)_cflags=$$($$($(1)_type)_CFLAGS) \
 11              $$($$($(1)_type)_$$(release_type)_CFLAGS)
 12  $(1)_cxxflags=$$($$($(1)_type)_CXXFLAGS) \
 13                $$($$($(1)_type)_$$(release_type)_CXXFLAGS)
 14  $(1)_ldflags=$$($$($(1)_type)_LDFLAGS) \
 15               $$($$($(1)_type)_$$(release_type)_LDFLAGS) \
 16               -L$$($($(1)_type)_prefix)/lib
 17  $(1)_cppflags=$$($$($(1)_type)_CPPFLAGS) \
 18                $$($$($(1)_type)_$$(release_type)_CPPFLAGS) \
 19                -I$$($$($(1)_type)_prefix)/include
 20  $(1)_recipe_hash:=
 21  endef
 22  
 23  define int_get_all_dependencies
 24  $(sort $(foreach dep,$(2),$(2) $(call int_get_all_dependencies,$(1),$($(dep)_dependencies))))
 25  endef
 26  
 27  define fetch_file_inner
 28      ( mkdir -p $$($(1)_download_dir) && echo Fetching $(3) from $(2) && \
 29      $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" && \
 30      echo "$(5)  $$($(1)_download_dir)/$(4).temp" > $$($(1)_download_dir)/.$(4).hash && \
 31      $(build_SHA256SUM) -c $$($(1)_download_dir)/.$(4).hash && \
 32      mv $$($(1)_download_dir)/$(4).temp $$($(1)_source_dir)/$(4) && \
 33      rm -rf $$($(1)_download_dir) )
 34  endef
 35  
 36  define fetch_file
 37      ( test -f $$($(1)_source_dir)/$(4) || \
 38      ( $(call fetch_file_inner,$(1),$(2),$(3),$(4),$(5)) || \
 39        $(call fetch_file_inner,$(1),$(FALLBACK_DOWNLOAD_PATH),$(3),$(4),$(5))))
 40  endef
 41  
 42  define int_get_build_recipe_hash
 43  $(eval $(1)_all_file_checksums:=$(shell $(build_SHA256SUM) $(meta_depends) packages/$(1).mk $(addprefix $(PATCHES_PATH)/$(1)/,$($(1)_patches)) | cut -d" " -f1))
 44  $(eval $(1)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_SHA256SUM) | cut -d" " -f1))
 45  endef
 46  
 47  define int_get_build_id
 48  $(eval $(1)_dependencies += $($(1)_$(host_arch)_$(host_os)_dependencies) $($(1)_$(host_os)_dependencies))
 49  $(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($($(1)_type)_native_toolchain) $($($(1)_type)_native_binutils) $($(1)_dependencies)))
 50  $(foreach dep,$($(1)_all_dependencies),$(eval $(1)_build_id_deps+=$(dep)-$($(dep)_version)-$($(dep)_recipe_hash)))
 51  $(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id))
 52  $(eval $(1)_build_id:=$(shell echo -n "$($(1)_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH)))
 53  final_build_id_long+=$($(package)_build_id_long)
 54  
 55  #compute package-specific paths
 56  $(1)_build_subdir?=.
 57  $(1)_download_file?=$($(1)_file_name)
 58  $(1)_source_dir:=$(SOURCES_PATH)
 59  $(1)_source:=$$($(1)_source_dir)/$($(1)_file_name)
 60  $(1)_staging_dir=$(base_staging_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)
 61  $(1)_staging_prefix_dir:=$$($(1)_staging_dir)$($($(1)_type)_prefix)
 62  $(1)_extract_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)
 63  $(1)_download_dir:=$(base_download_dir)/$(1)-$($(1)_version)
 64  $(1)_build_dir:=$$($(1)_extract_dir)/$$($(1)_build_subdir)
 65  $(1)_cached_checksum:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.hash
 66  $(1)_patch_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)/.patches-$($(1)_build_id)
 67  $(1)_prefixbin:=$($($(1)_type)_prefix)/bin/
 68  $(1)_cached:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz
 69  $(1)_build_log:=$(BASEDIR)/$(1)-$($(1)_version)-$($(1)_build_id).log
 70  $(1)_all_sources=$($(1)_file_name) $($(1)_extra_sources)
 71  
 72  #stamps
 73  $(1)_fetched=$(SOURCES_PATH)/download-stamps/.stamp_fetched-$(1)-$($(1)_file_name).hash
 74  $(1)_extracted=$$($(1)_extract_dir)/.stamp_extracted
 75  $(1)_preprocessed=$$($(1)_extract_dir)/.stamp_preprocessed
 76  $(1)_cleaned=$$($(1)_extract_dir)/.stamp_cleaned
 77  $(1)_built=$$($(1)_build_dir)/.stamp_built
 78  $(1)_configured=$(host_prefix)/.$(1)_stamp_configured
 79  $(1)_staged=$$($(1)_staging_dir)/.stamp_staged
 80  $(1)_postprocessed=$$($(1)_staging_prefix_dir)/.stamp_postprocessed
 81  $(1)_download_path_fixed=$(subst :,\:,$$($(1)_download_path))
 82  
 83  
 84  #default commands
 85  # The default behavior for tar will try to set ownership when running as uid 0 and may not succeed, --no-same-owner disables this behavior
 86  $(1)_fetch_cmds ?= $(call fetch_file,$(1),$(subst \:,:,$$($(1)_download_path_fixed)),$$($(1)_download_file),$($(1)_file_name),$($(1)_sha256_hash))
 87  $(1)_extract_cmds ?= mkdir -p $$($(1)_extract_dir) && echo "$$($(1)_sha256_hash)  $$($(1)_source)" > $$($(1)_extract_dir)/.$$($(1)_file_name).hash &&  $(build_SHA256SUM) -c $$($(1)_extract_dir)/.$$($(1)_file_name).hash && $(build_TAR) --no-same-owner --strip-components=1 -xf $$($(1)_source)
 88  $(1)_preprocess_cmds ?= true
 89  $(1)_build_cmds ?= true
 90  $(1)_config_cmds ?= true
 91  $(1)_stage_cmds ?= true
 92  $(1)_set_vars ?=
 93  
 94  
 95  all_sources+=$$($(1)_fetched)
 96  endef
 97  #$(foreach dep_target,$($(1)_all_dependencies),$(eval $(1)_dependency_targets=$($(dep_target)_cached)))
 98  
 99  
100  define int_config_attach_build_config
101  $(eval $(call $(1)_set_vars,$(1)))
102  $(1)_cflags+=$($(1)_cflags_$(release_type))
103  $(1)_cflags+=$($(1)_cflags_$(host_arch)) $($(1)_cflags_$(host_arch)_$(release_type))
104  $(1)_cflags+=$($(1)_cflags_$(host_os)) $($(1)_cflags_$(host_os)_$(release_type))
105  $(1)_cflags+=$($(1)_cflags_$(host_arch)_$(host_os)) $($(1)_cflags_$(host_arch)_$(host_os)_$(release_type))
106  
107  $(1)_cxxflags+=$($(1)_cxxflags_$(release_type))
108  $(1)_cxxflags+=$($(1)_cxxflags_$(host_arch)) $($(1)_cxxflags_$(host_arch)_$(release_type))
109  $(1)_cxxflags+=$($(1)_cxxflags_$(host_os)) $($(1)_cxxflags_$(host_os)_$(release_type))
110  $(1)_cxxflags+=$($(1)_cxxflags_$(host_arch)_$(host_os)) $($(1)_cxxflags_$(host_arch)_$(host_os)_$(release_type))
111  
112  $(1)_cppflags+=$($(1)_cppflags_$(release_type))
113  $(1)_cppflags+=$($(1)_cppflags_$(host_arch)) $($(1)_cppflags_$(host_arch)_$(release_type))
114  $(1)_cppflags+=$($(1)_cppflags_$(host_os)) $($(1)_cppflags_$(host_os)_$(release_type))
115  $(1)_cppflags+=$($(1)_cppflags_$(host_arch)_$(host_os)) $($(1)_cppflags_$(host_arch)_$(host_os)_$(release_type))
116  
117  $(1)_ldflags+=$($(1)_ldflags_$(release_type))
118  $(1)_ldflags+=$($(1)_ldflags_$(host_arch)) $($(1)_ldflags_$(host_arch)_$(release_type))
119  $(1)_ldflags+=$($(1)_ldflags_$(host_os)) $($(1)_ldflags_$(host_os)_$(release_type))
120  $(1)_ldflags+=$($(1)_ldflags_$(host_arch)_$(host_os)) $($(1)_ldflags_$(host_arch)_$(host_os)_$(release_type))
121  
122  $(1)_build_opts+=$$($(1)_build_opts_$(release_type))
123  $(1)_build_opts+=$$($(1)_build_opts_$(host_arch)) $$($(1)_build_opts_$(host_arch)_$(release_type))
124  $(1)_build_opts+=$$($(1)_build_opts_$(host_os)) $$($(1)_build_opts_$(host_os)_$(release_type))
125  $(1)_build_opts+=$$($(1)_build_opts_$(host_arch)_$(host_os)) $$($(1)_build_opts_$(host_arch)_$(host_os)_$(release_type))
126  
127  $(1)_config_opts+=$$($(1)_config_opts_$(release_type))
128  $(1)_config_opts+=$$($(1)_config_opts_$(host_arch)) $$($(1)_config_opts_$(host_arch)_$(release_type))
129  $(1)_config_opts+=$$($(1)_config_opts_$(host_os)) $$($(1)_config_opts_$(host_os)_$(release_type))
130  $(1)_config_opts+=$$($(1)_config_opts_$(host_arch)_$(host_os)) $$($(1)_config_opts_$(host_arch)_$(host_os)_$(release_type))
131  
132  $(1)_config_env+=$$($(1)_config_env_$(release_type))
133  $(1)_config_env+=$($(1)_config_env_$(host_arch)) $($(1)_config_env_$(host_arch)_$(release_type))
134  $(1)_config_env+=$($(1)_config_env_$(host_os)) $($(1)_config_env_$(host_os)_$(release_type))
135  $(1)_config_env+=$($(1)_config_env_$(host_arch)_$(host_os)) $($(1)_config_env_$(host_arch)_$(host_os)_$(release_type))
136  
137  $(1)_config_env+=PKG_CONFIG_LIBDIR=$($($(1)_type)_prefix)/lib/pkgconfig
138  $(1)_config_env+=PKG_CONFIG_PATH=$($($(1)_type)_prefix)/share/pkgconfig
139  $(1)_config_env+=PKG_CONFIG_SYSROOT_DIR=/
140  $(1)_config_env+=CMAKE_MODULE_PATH=$($($(1)_type)_prefix)/lib/cmake
141  $(1)_config_env+=PATH="$(build_prefix)/bin:$(PATH)"
142  $(1)_build_env+=PATH="$(build_prefix)/bin:$(PATH)"
143  $(1)_stage_env+=PATH="$(build_prefix)/bin:$(PATH)"
144  
145  # Setting a --build type that differs from --host will explicitly enable
146  # cross-compilation mode. Note that --build defaults to the output of
147  # config.guess, which is what we set it too here. This also quells autoconf
148  # warnings, "If you wanted to set the --build type, don't use --host.",
149  # when using versions older than 2.70.
150  $(1)_autoconf=./configure --build=$(BUILD) --host=$($($(1)_type)_host) --prefix=$($($(1)_type)_prefix) --with-pic $$($(1)_config_opts) CC="$$($(1)_cc)" CXX="$$($(1)_cxx)"
151  ifneq ($($(1)_nm),)
152  $(1)_autoconf += NM="$$($(1)_nm)"
153  endif
154  ifneq ($($(1)_ranlib),)
155  $(1)_autoconf += RANLIB="$$($(1)_ranlib)"
156  endif
157  ifneq ($($(1)_ar),)
158  $(1)_autoconf += AR="$$($(1)_ar)"
159  endif
160  ifneq ($($(1)_cflags),)
161  $(1)_autoconf += CFLAGS="$$($(1)_cflags)"
162  endif
163  ifneq ($($(1)_cxxflags),)
164  $(1)_autoconf += CXXFLAGS="$$($(1)_cxxflags)"
165  endif
166  ifneq ($($(1)_cppflags),)
167  $(1)_autoconf += CPPFLAGS="$$($(1)_cppflags)"
168  endif
169  ifneq ($($(1)_ldflags),)
170  $(1)_autoconf += LDFLAGS="$$($(1)_ldflags)"
171  endif
172  
173  # We hardcode the library install path to "lib" to match the PKG_CONFIG_PATH
174  # setting in depends/config.site.in, which also hardcodes "lib".
175  # Without this setting, CMake by default would use the OS library
176  # directory, which might be "lib64" or something else, not "lib", on multiarch systems.
177  $(1)_cmake=env CC="$$($(1)_cc)" \
178                 CFLAGS="$$($(1)_cppflags) $$($(1)_cflags)" \
179                 CXX="$$($(1)_cxx)" \
180                 CXXFLAGS="$$($(1)_cppflags) $$($(1)_cxxflags)" \
181                 LDFLAGS="$$($(1)_ldflags)" \
182                 cmake -DCMAKE_INSTALL_PREFIX:PATH="$$($($(1)_type)_prefix)" \
183                 -DCMAKE_INSTALL_LIBDIR=lib/ \
184                 -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
185                 $$($(1)_config_opts)
186  ifeq ($($(1)_type),build)
187  $(1)_cmake += -DCMAKE_INSTALL_RPATH:PATH="$$($($(1)_type)_prefix)/lib"
188  else
189  ifneq ($(host),$(build))
190  $(1)_cmake += -DCMAKE_SYSTEM_NAME=$($(host_os)_cmake_system)
191  $(1)_cmake += -DCMAKE_C_COMPILER_TARGET=$(host)
192  $(1)_cmake += -DCMAKE_CXX_COMPILER_TARGET=$(host)
193  endif
194  endif
195  endef
196  
197  define int_add_cmds
198  ifneq ($(LOG),)
199  $(1)_logging = >>$$($(1)_build_log) 2>&1 || { if test -f $$($(1)_build_log); then cat $$($(1)_build_log); fi; exit 1; }
200  endif
201  
202  $($(1)_fetched):
203  	mkdir -p $$(@D) $(SOURCES_PATH)
204  	rm -f $$@
205  	touch $$@
206  	cd $$(@D); $($(1)_fetch_cmds)
207  	cd $($(1)_source_dir); $(foreach source,$($(1)_all_sources),$(build_SHA256SUM) $(source) >> $$(@);)
208  	touch $$@
209  $($(1)_extracted): | $($(1)_fetched)
210  	echo Extracting $(1)...
211  	mkdir -p $$(@D)
212  	cd $$(@D); $($(1)_extract_cmds)
213  	touch $$@
214  $($(1)_preprocessed): | $($(1)_extracted)
215  	echo Preprocessing $(1)...
216  	mkdir -p $$(@D) $($(1)_patch_dir)
217  	$(foreach patch,$($(1)_patches),cd $(PATCHES_PATH)/$(1); cp $(patch) $($(1)_patch_dir) ;)
218  	{ cd $$(@D); $($(1)_preprocess_cmds); } $$($(1)_logging)
219  	touch $$@
220  $($(1)_configured): | $($(1)_dependencies) $($(1)_preprocessed)
221  	echo Configuring $(1)...
222  	rm -rf $(host_prefix); mkdir -p $(host_prefix)/lib; cd $(host_prefix); $(foreach package,$($(1)_all_dependencies), $(build_TAR) --no-same-owner -xf $($(package)_cached); )
223  	mkdir -p $$($(1)_build_dir)
224  	+{ cd $$($(1)_build_dir); export $($(1)_config_env); $($(1)_config_cmds); } $$($(1)_logging)
225  	touch $$@
226  $($(1)_built): | $($(1)_configured)
227  	echo Building $(1)...
228  	mkdir -p $$(@D)
229  	+{ cd $$(@D); export $($(1)_build_env); $($(1)_build_cmds); } $$($(1)_logging)
230  	touch $$@
231  $($(1)_staged): | $($(1)_built)
232  	echo Staging $(1)...
233  	mkdir -p $($(1)_staging_dir)/$(host_prefix)
234  	+{ cd $($(1)_build_dir); export $($(1)_stage_env); $($(1)_stage_cmds); } $$($(1)_logging)
235  	rm -rf $($(1)_extract_dir)
236  	touch $$@
237  $($(1)_postprocessed): | $($(1)_staged)
238  	echo Postprocessing $(1)...
239  	cd $($(1)_staging_prefix_dir); $($(1)_postprocess_cmds)
240  	touch $$@
241  $($(1)_cached): | $($(1)_dependencies) $($(1)_postprocessed)
242  	echo Caching $(1)...
243  	cd $$($(1)_staging_dir)/$(host_prefix); \
244  	  find . ! -name '.stamp_postprocessed' -print0 | TZ=UTC xargs -0r $(build_TOUCH); \
245  	  find . ! -name '.stamp_postprocessed' | LC_ALL=C sort | $(build_TAR) --numeric-owner --no-recursion -czf $$($(1)_staging_dir)/$$(@F) -T -
246  	mkdir -p $$(@D)
247  	rm -rf $$(@D) && mkdir -p $$(@D)
248  	mv $$($(1)_staging_dir)/$$(@F) $$(@)
249  	rm -rf $($(1)_staging_dir)
250  	if test -f $($(1)_build_log); then mv $($(1)_build_log) $$(@D); fi
251  $($(1)_cached_checksum): $($(1)_cached)
252  	cd $$(@D); $(build_SHA256SUM) $$(<F) > $$(@)
253  
254  .PHONY: $(1)
255  $(1): | $($(1)_cached_checksum)
256  .SECONDARY: $($(1)_cached) $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched)
257  
258  endef
259  
260  stages = fetched extracted preprocessed configured built staged postprocessed cached cached_checksum
261  
262  define ext_add_stages
263  $(foreach stage,$(stages),
264            $(1)_$(stage): $($(1)_$(stage))
265            .PHONY: $(1)_$(stage))
266  endef
267  
268  # These functions create the build targets for each package. They must be
269  # broken down into small steps so that each part is done for all packages
270  # before moving on to the next step. Otherwise, a package's info
271  # (build-id for example) would only be available to another package if it
272  # happened to be computed already.
273  
274  #set the type for host/build packages.
275  $(foreach native_package,$(native_packages),$(eval $(native_package)_type=build))
276  $(foreach package,$(packages),$(eval $(package)_type=$(host_arch)_$(host_os)))
277  
278  #set overridable defaults
279  $(foreach package,$(all_packages),$(eval $(call int_vars,$(package))))
280  
281  #include package files
282  $(foreach native_package,$(native_packages),$(eval include packages/$(native_package).mk))
283  $(foreach package,$(packages),$(eval include packages/$(package).mk))
284  
285  #compute a hash of all files that comprise this package's build recipe
286  $(foreach package,$(all_packages),$(eval $(call int_get_build_recipe_hash,$(package))))
287  
288  #generate a unique id for this package, incorporating its dependencies as well
289  $(foreach package,$(all_packages),$(eval $(call int_get_build_id,$(package))))
290  
291  #compute final vars after reading package vars
292  $(foreach package,$(all_packages),$(eval $(call int_config_attach_build_config,$(package))))
293  
294  #create build targets
295  $(foreach package,$(all_packages),$(eval $(call int_add_cmds,$(package))))
296  
297  #special exception: if a toolchain package exists, all non-native packages depend on it
298  $(foreach package,$(packages),$(eval $($(package)_extracted): |$($($(host_arch)_$(host_os)_native_toolchain)_cached) $($($(host_arch)_$(host_os)_native_binutils)_cached) ))