1define 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)_libtool=$$($$($(1)_type)_LIBTOOL) 10$(1)_nm=$$($$($(1)_type)_NM) 11$(1)_cflags=$$($$($(1)_type)_CFLAGS) \ 12 $$($$($(1)_type)_$$(release_type)_CFLAGS) 13$(1)_cxxflags=$$($$($(1)_type)_CXXFLAGS) \ 14 $$($$($(1)_type)_$$(release_type)_CXXFLAGS) 15$(1)_ldflags=$$($$($(1)_type)_LDFLAGS) \ 16 $$($$($(1)_type)_$$(release_type)_LDFLAGS) \ 17 -L$$($($(1)_type)_prefix)/lib 18$(1)_cppflags=$$($$($(1)_type)_CPPFLAGS) \ 19 $$($$($(1)_type)_$$(release_type)_CPPFLAGS) \ 20 -I$$($$($(1)_type)_prefix)/include 21$(1)_recipe_hash:= 22endef 23 24define int_get_all_dependencies 25$(sort $(foreach dep,$(2),$(2) $(call int_get_all_dependencies,$(1),$($(dep)_dependencies)))) 26endef 27 28define fetch_file_inner 29 ( mkdir -p $$($(1)_download_dir) && echo Fetching $(3) from $(2) && \ 30 $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" && \ 31 echo "$(5) $$($(1)_download_dir)/$(4).temp" > $$($(1)_download_dir)/.$(4).hash && \ 32 $(build_SHA256SUM) -c $$($(1)_download_dir)/.$(4).hash && \ 33 mv $$($(1)_download_dir)/$(4).temp $$($(1)_source_dir)/$(4) && \ 34 rm -rf $$($(1)_download_dir) ) 35endef 36 37define fetch_file 38 ( test -f $$($(1)_source_dir)/$(4) || \ 39 ( $(call fetch_file_inner,$(1),$(2),$(3),$(4),$(5)) || \ 40 $(call fetch_file_inner,$(1),$(FALLBACK_DOWNLOAD_PATH),$(3),$(4),$(5)))) 41endef 42 43define int_get_build_recipe_hash 44$(eval $(1)_all_file_checksums:=$(shell $(build_SHA256SUM) $(meta_depends) packages/$(1).mk $(addprefix $(PATCHES_PATH)/$(1)/,$($(1)_patches)) | cut -d" " -f1)) 45$(eval $(1)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_SHA256SUM) | cut -d" " -f1)) 46endef 47 48define int_get_build_id 49$(eval $(1)_dependencies += $($(1)_$(host_arch)_$(host_os)_dependencies) $($(1)_$(host_os)_dependencies)) 50$(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($($(1)_type)_native_toolchain) $($($(1)_type)_native_binutils) $($(1)_dependencies))) 51$(foreach dep,$($(1)_all_dependencies),$(eval $(1)_build_id_deps+=$(dep)-$($(dep)_version)-$($(dep)_recipe_hash))) 52$(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id)) 53$(eval $(1)_build_id:=$(shell echo -n "$($(1)_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))) 54final_build_id_long+=$($(package)_build_id_long) 55 56#compute package-specific paths 57$(1)_build_subdir?=. 58$(1)_download_file?=$($(1)_file_name) 59$(1)_source_dir:=$(SOURCES_PATH) 60$(1)_source:=$$($(1)_source_dir)/$($(1)_file_name) 61$(1)_staging_dir=$(base_staging_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id) 62$(1)_staging_prefix_dir:=$$($(1)_staging_dir)$($($(1)_type)_prefix) 63$(1)_extract_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id) 64$(1)_download_dir:=$(base_download_dir)/$(1)-$($(1)_version) 65$(1)_build_dir:=$$($(1)_extract_dir)/$$($(1)_build_subdir) 66$(1)_cached_checksum:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.hash 67$(1)_patch_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)/.patches-$($(1)_build_id) 68$(1)_prefixbin:=$($($(1)_type)_prefix)/bin/ 69$(1)_cached:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz 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=$$($(1)_build_dir)/.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 && tar --no-same-owner --strip-components=1 -xf $$($(1)_source) 88$(1)_preprocess_cmds ?= 89$(1)_build_cmds ?= 90$(1)_config_cmds ?= 91$(1)_stage_cmds ?= 92$(1)_set_vars ?= 93 94 95all_sources+=$$($(1)_fetched) 96endef 97#$(foreach dep_target,$($(1)_all_dependencies),$(eval $(1)_dependency_targets=$($(dep_target)_cached))) 98 99 100define 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+=CMAKE_MODULE_PATH=$($($(1)_type)_prefix)/lib/cmake 140$(1)_config_env+=PATH=$(build_prefix)/bin:$(PATH) 141$(1)_build_env+=PATH=$(build_prefix)/bin:$(PATH) 142$(1)_stage_env+=PATH=$(build_prefix)/bin:$(PATH) 143 144# Setting a --build type that differs from --host will explicitly enable 145# cross-compilation mode. Note that --build defaults to the output of 146# config.guess, which is what we set it too here. This also quells autoconf 147# warnings, "If you wanted to set the --build type, don't use --host.", 148# when using versions older than 2.70. 149$(1)_autoconf=./configure --build=$(BUILD) --host=$($($(1)_type)_host) --prefix=$($($(1)_type)_prefix) $$($(1)_config_opts) CC="$$($(1)_cc)" CXX="$$($(1)_cxx)" 150ifneq ($($(1)_nm),) 151$(1)_autoconf += NM="$$($(1)_nm)" 152endif 153ifneq ($($(1)_ranlib),) 154$(1)_autoconf += RANLIB="$$($(1)_ranlib)" 155endif 156ifneq ($($(1)_ar),) 157$(1)_autoconf += AR="$$($(1)_ar)" 158endif 159ifneq ($($(1)_cflags),) 160$(1)_autoconf += CFLAGS="$$($(1)_cflags)" 161endif 162ifneq ($($(1)_cxxflags),) 163$(1)_autoconf += CXXFLAGS="$$($(1)_cxxflags)" 164endif 165ifneq ($($(1)_cppflags),) 166$(1)_autoconf += CPPFLAGS="$$($(1)_cppflags)" 167endif 168ifneq ($($(1)_ldflags),) 169$(1)_autoconf += LDFLAGS="$$($(1)_ldflags)" 170endif 171 172$(1)_cmake=env CC="$$($(1)_cc)" \ 173 CFLAGS="$$($(1)_cppflags) $$($(1)_cflags)" \ 174 CXX="$$($(1)_cxx)" \ 175 CXXFLAGS="$$($(1)_cppflags) $$($(1)_cxxflags)" \ 176 LDFLAGS="$$($(1)_ldflags)" \ 177 cmake -DCMAKE_INSTALL_PREFIX:PATH="$$($($(1)_type)_prefix)" 178ifeq ($($(1)_type),build) 179$(1)_cmake += -DCMAKE_INSTALL_RPATH:PATH="$$($($(1)_type)_prefix)/lib" 180else 181ifneq ($(host),$(build)) 182$(1)_cmake += -DCMAKE_SYSTEM_NAME=$($(host_os)_cmake_system) 183$(1)_cmake += -DCMAKE_C_COMPILER_TARGET=$(host) 184$(1)_cmake += -DCMAKE_CXX_COMPILER_TARGET=$(host) 185endif 186endif 187endef 188 189define int_add_cmds 190$($(1)_fetched): 191 $(AT)mkdir -p $$(@D) $(SOURCES_PATH) 192 $(AT)rm -f $$@ 193 $(AT)touch $$@ 194 $(AT)cd $$(@D); $(call $(1)_fetch_cmds,$(1)) 195 $(AT)cd $($(1)_source_dir); $(foreach source,$($(1)_all_sources),$(build_SHA256SUM) $(source) >> $$(@);) 196 $(AT)touch $$@ 197$($(1)_extracted): | $($(1)_fetched) 198 $(AT)echo Extracting $(1)... 199 $(AT)mkdir -p $$(@D) 200 $(AT)cd $$(@D); $(call $(1)_extract_cmds,$(1)) 201 $(AT)touch $$@ 202$($(1)_preprocessed): | $($(1)_extracted) 203 $(AT)echo Preprocessing $(1)... 204 $(AT)mkdir -p $$(@D) $($(1)_patch_dir) 205 $(AT)$(foreach patch,$($(1)_patches),cd $(PATCHES_PATH)/$(1); cp $(patch) $($(1)_patch_dir) ;) 206 $(AT)cd $$(@D); $(call $(1)_preprocess_cmds, $(1)) 207 $(AT)touch $$@ 208$($(1)_configured): | $($(1)_dependencies) $($(1)_preprocessed) 209 $(AT)echo Configuring $(1)... 210 $(AT)rm -rf $(host_prefix); mkdir -p $(host_prefix)/lib; cd $(host_prefix); $(foreach package,$($(1)_all_dependencies), tar --no-same-owner -xf $($(package)_cached); ) 211 $(AT)mkdir -p $$(@D) 212 $(AT)+cd $$(@D); $($(1)_config_env) $(call $(1)_config_cmds, $(1)) 213 $(AT)touch $$@ 214$($(1)_built): | $($(1)_configured) 215 $(AT)echo Building $(1)... 216 $(AT)mkdir -p $$(@D) 217 $(AT)+cd $$(@D); $($(1)_build_env) $(call $(1)_build_cmds, $(1)) 218 $(AT)touch $$@ 219$($(1)_staged): | $($(1)_built) 220 $(AT)echo Staging $(1)... 221 $(AT)mkdir -p $($(1)_staging_dir)/$(host_prefix) 222 $(AT)cd $($(1)_build_dir); $($(1)_stage_env) $(call $(1)_stage_cmds, $(1)) 223 $(AT)rm -rf $($(1)_extract_dir) 224 $(AT)touch $$@ 225$($(1)_postprocessed): | $($(1)_staged) 226 $(AT)echo Postprocessing $(1)... 227 $(AT)cd $($(1)_staging_prefix_dir); $(call $(1)_postprocess_cmds) 228 $(AT)touch $$@ 229$($(1)_cached): | $($(1)_dependencies) $($(1)_postprocessed) 230 $(AT)echo Caching $(1)... 231 $(AT)cd $$($(1)_staging_dir)/$(host_prefix); find . | sort | tar --no-recursion -czf $$($(1)_staging_dir)/$$(@F) -T - 232 $(AT)mkdir -p $$(@D) 233 $(AT)rm -rf $$(@D) && mkdir -p $$(@D) 234 $(AT)mv $$($(1)_staging_dir)/$$(@F) $$(@) 235 $(AT)rm -rf $($(1)_staging_dir) 236$($(1)_cached_checksum): $($(1)_cached) 237 $(AT)cd $$(@D); $(build_SHA256SUM) $$(<F) > $$(@) 238 239.PHONY: $(1) 240$(1): | $($(1)_cached_checksum) 241.SECONDARY: $($(1)_cached) $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched) 242 243endef 244 245stages = fetched extracted preprocessed configured built staged postprocessed cached cached_checksum 246 247define ext_add_stages 248$(foreach stage,$(stages), 249 $(1)_$(stage): $($(1)_$(stage)) 250 .PHONY: $(1)_$(stage)) 251endef 252 253# These functions create the build targets for each package. They must be 254# broken down into small steps so that each part is done for all packages 255# before moving on to the next step. Otherwise, a package's info 256# (build-id for example) would only be available to another package if it 257# happened to be computed already. 258 259#set the type for host/build packages. 260$(foreach native_package,$(native_packages),$(eval $(native_package)_type=build)) 261$(foreach package,$(packages),$(eval $(package)_type=$(host_arch)_$(host_os))) 262 263#set overridable defaults 264$(foreach package,$(all_packages),$(eval $(call int_vars,$(package)))) 265 266#include package files 267$(foreach package,$(all_packages),$(eval include packages/$(package).mk)) 268 269#compute a hash of all files that comprise this package's build recipe 270$(foreach package,$(all_packages),$(eval $(call int_get_build_recipe_hash,$(package)))) 271 272#generate a unique id for this package, incorporating its dependencies as well 273$(foreach package,$(all_packages),$(eval $(call int_get_build_id,$(package)))) 274 275#compute final vars after reading package vars 276$(foreach package,$(all_packages),$(eval $(call int_config_attach_build_config,$(package)))) 277 278#create build targets 279$(foreach package,$(all_packages),$(eval $(call int_add_cmds,$(package)))) 280 281#special exception: if a toolchain package exists, all non-native packages depend on it 282$(foreach package,$(packages),$(eval $($(package)_extracted): |$($($(host_arch)_$(host_os)_native_toolchain)_cached) $($($(host_arch)_$(host_os)_native_binutils)_cached) )) 283