funcs.mk raw
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),$(4),$(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)_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/toolchain.cmake.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 -G "Unix Makefiles" \
183 -DCMAKE_INSTALL_PREFIX:PATH="$$($($(1)_type)_prefix)" \
184 -DCMAKE_AR=`which $$($(1)_ar)` \
185 -DCMAKE_NM=`which $$($(1)_nm)` \
186 -DCMAKE_RANLIB=`which $$($(1)_ranlib)` \
187 -DCMAKE_INSTALL_LIBDIR=lib/ \
188 -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
189 -DCMAKE_VERBOSE_MAKEFILE:BOOL=$(V) \
190 -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY:BOOL=TRUE \
191 $$($(1)_config_opts)
192 ifeq ($($(1)_type),build)
193 $(1)_cmake += -DCMAKE_INSTALL_RPATH:PATH="$$($($(1)_type)_prefix)/lib"
194 else
195 ifneq ($(host),$(build))
196 $(1)_cmake += -DCMAKE_SYSTEM_NAME=$($(host_os)_cmake_system_name)
197 $(1)_cmake += -DCMAKE_C_COMPILER_TARGET=$(host)
198 $(1)_cmake += -DCMAKE_CXX_COMPILER_TARGET=$(host)
199 endif
200 endif
201 endef
202
203 define int_add_cmds
204 ifneq ($(LOG),)
205 $(1)_logging = >>$$($(1)_build_log) 2>&1 || { if test -f $$($(1)_build_log); then cat $$($(1)_build_log); fi; exit 1; }
206 endif
207
208 $($(1)_fetched):
209 mkdir -p $$(@D) $(SOURCES_PATH)
210 rm -f $$@
211 cd $$(@D); $($(1)_fetch_cmds)
212 cd $($(1)_source_dir); $(foreach source,$($(1)_all_sources),$(build_SHA256SUM) $(source) >> $$(@);)
213 touch $$@
214 $($(1)_extracted): | $($(1)_fetched)
215 echo Extracting $(1)...
216 mkdir -p $$(@D)
217 cd $$(@D); $($(1)_extract_cmds)
218 touch $$@
219 $($(1)_preprocessed): | $($(1)_extracted)
220 echo Preprocessing $(1)...
221 mkdir -p $$(@D) $($(1)_patch_dir)
222 $(foreach patch,$($(1)_patches),cd $(PATCHES_PATH)/$(1); cp $(patch) $($(1)_patch_dir) ;)
223 { cd $$(@D); $($(1)_preprocess_cmds); } $$($(1)_logging)
224 touch $$@
225 $($(1)_configured): | $($(1)_dependencies) $($(1)_preprocessed)
226 echo Configuring $(1)...
227 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); )
228 mkdir -p $$($(1)_build_dir)
229 +{ cd $$($(1)_build_dir); export $($(1)_config_env); $($(1)_config_cmds); } $$($(1)_logging)
230 touch $$@
231 $($(1)_built): | $($(1)_configured)
232 echo Building $(1)...
233 mkdir -p $$(@D)
234 +{ cd $$(@D); export $($(1)_build_env); $($(1)_build_cmds); } $$($(1)_logging)
235 touch $$@
236 $($(1)_staged): | $($(1)_built)
237 echo Staging $(1)...
238 mkdir -p $($(1)_staging_dir)/$(host_prefix)
239 +{ cd $($(1)_build_dir); export $($(1)_stage_env); $($(1)_stage_cmds); } $$($(1)_logging)
240 rm -rf $($(1)_extract_dir)
241 touch $$@
242 $($(1)_postprocessed): | $($(1)_staged)
243 echo Postprocessing $(1)...
244 cd $($(1)_staging_prefix_dir); $($(1)_postprocess_cmds)
245 touch $$@
246 $($(1)_cached): | $($(1)_dependencies) $($(1)_postprocessed)
247 echo Caching $(1)...
248 cd $$($(1)_staging_dir)/$(host_prefix); \
249 find . ! -name '.stamp_postprocessed' -print0 | TZ=UTC xargs -0r $(build_TOUCH); \
250 find . ! -name '.stamp_postprocessed' | LC_ALL=C sort | $(build_TAR) --numeric-owner --no-recursion -czf $$($(1)_staging_dir)/$$(@F) -T -
251 mkdir -p $$(@D)
252 rm -rf $$(@D) && mkdir -p $$(@D)
253 mv $$($(1)_staging_dir)/$$(@F) $$(@)
254 rm -rf $($(1)_staging_dir)
255 if test -f $($(1)_build_log); then mv $($(1)_build_log) $$(@D); fi
256 $($(1)_cached_checksum): $($(1)_cached)
257 cd $$(@D); $(build_SHA256SUM) $$(<F) > $$(@)
258
259 .PHONY: $(1)
260 $(1): | $($(1)_cached_checksum)
261 .SECONDARY: $($(1)_cached) $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched)
262
263 endef
264
265 stages = fetched extracted preprocessed configured built staged postprocessed cached cached_checksum
266
267 define ext_add_stages
268 $(foreach stage,$(stages),
269 $(1)_$(stage): $($(1)_$(stage))
270 .PHONY: $(1)_$(stage))
271 endef
272
273 # These functions create the build targets for each package. They must be
274 # broken down into small steps so that each part is done for all packages
275 # before moving on to the next step. Otherwise, a package's info
276 # (build-id for example) would only be available to another package if it
277 # happened to be computed already.
278
279 #set the type for host/build packages.
280 $(foreach native_package,$(native_packages),$(eval $(native_package)_type=build))
281 $(foreach package,$(packages),$(eval $(package)_type=$(host_arch)_$(host_os)))
282
283 #set overridable defaults
284 $(foreach package,$(all_packages),$(eval $(call int_vars,$(package))))
285
286 #include package files
287 $(foreach native_package,$(native_packages),$(eval include packages/$(native_package).mk))
288 $(foreach package,$(packages),$(eval include packages/$(package).mk))
289
290 #compute a hash of all files that comprise this package's build recipe
291 $(foreach package,$(all_packages),$(eval $(call int_get_build_recipe_hash,$(package))))
292
293 #generate a unique id for this package, incorporating its dependencies as well
294 $(foreach package,$(all_packages),$(eval $(call int_get_build_id,$(package))))
295
296 #compute final vars after reading package vars
297 $(foreach package,$(all_packages),$(eval $(call int_config_attach_build_config,$(package))))
298
299 #create build targets
300 $(foreach package,$(all_packages),$(eval $(call int_add_cmds,$(package))))
301