diff options
| author | Czarek Nakamoto <cyjan@mrcyjanek.net> | 2025-07-10 02:15:40 +0200 |
|---|---|---|
| committer | Czarek Nakamoto <cyjan@mrcyjanek.net> | 2025-07-10 02:18:08 +0200 |
| commit | 160663493702daf9408c50330d2ab894bbd234b5 (patch) | |
| tree | bd0a59afaa89cc239cbe211de82a3670a4643e44 | |
| parent | eed45614ef1e49d4800a5c6714dad7932e660f1c (diff) | |
feat: prebuild download logic
| -rw-r--r-- | contrib/depends/Makefile | 12 | ||||
| -rw-r--r-- | contrib/depends/funcs.mk | 56 |
2 files changed, 64 insertions, 4 deletions
diff --git a/contrib/depends/Makefile b/contrib/depends/Makefile index 3efa8b0..7e9f0f4 100644 --- a/contrib/depends/Makefile +++ b/contrib/depends/Makefile @@ -13,6 +13,17 @@ DOWNLOAD_CONNECT_TIMEOUT:=30 DOWNLOAD_RETRIES:=5 HOST_ID_SALT ?= salt BUILD_ID_SALT ?= salt + +DEPENDS_UNTRUSTED_FAST_BUILDS ?= +PREBUILT_BASE_URL ?= https://static.mrcyjanek.net/lfs/depends/contrib/depends/built +ifneq ($(DEPENDS_UNTRUSTED_FAST_BUILDS),) +ifneq ($(DEPENDS_UNTRUSTED_FAST_BUILDS),yes) +ifneq ($(DEPENDS_UNTRUSTED_FAST_BUILDS),forced) +$(error DEPENDS_UNTRUSTED_FAST_BUILDS must be empty, "yes", or "forced", got "$(DEPENDS_UNTRUSTED_FAST_BUILDS)") +endif +endif +endif + # Detect the number of CPU cores ifeq ($(shell uname), Darwin) NUM_CORES := $(shell sysctl -n hw.ncpu) @@ -125,7 +136,6 @@ $(host_arch)_$(host_os)_id_string_legacy+=$(shell $(host_CXX) --version 2>/dev/n $(host_arch)_$(host_os)_id_string_legacy+=$(shell $(host_RANLIB) --version 2>/dev/null) $(host_arch)_$(host_os)_id_string_legacy+=$(shell $(host_STRIP) --version 2>/dev/null) -# Simplified build ID strings (more portable) build_id_string:=$(BUILD_ID_SALT) build_id_string+=$(shell basename $(build_CC) 2>/dev/null || echo "unknown") build_id_string+=$(shell basename $(build_AR) 2>/dev/null || echo "unknown") diff --git a/contrib/depends/funcs.mk b/contrib/depends/funcs.mk index 063fc94..c085dec 100644 --- a/contrib/depends/funcs.mk +++ b/contrib/depends/funcs.mk @@ -66,6 +66,9 @@ $(1)_patch_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)/ $(1)_prefixbin:=$($($(1)_type)_prefix)/bin/ $(1)_cached:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz $(1)_all_sources=$($(1)_file_name) $($(1)_extra_sources) +$(1)_prebuilt_url:=$(PREBUILT_BASE_URL)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz +$(1)_prebuilt_checksum_url:=$(PREBUILT_BASE_URL)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.hash +$(1)_prebuilt_buildinfo_url:=$(PREBUILT_BASE_URL)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.txt #stamps $(1)_fetched=$(SOURCES_PATH)/download-stamps/.stamp_fetched-$(1)-$($(1)_file_name).hash @@ -76,6 +79,8 @@ $(1)_built=$$($(1)_build_dir)/.stamp_built $(1)_configured=$$($(1)_build_dir)/.stamp_configured $(1)_staged=$$($(1)_staging_dir)/.stamp_staged $(1)_postprocessed=$$($(1)_staging_prefix_dir)/.stamp_postprocessed +$(1)_prebuilt_downloaded:=$(BASE_CACHE)/$(host)/$(1)/.stamp_prebuilt_downloaded-$($(1)_build_id) +$(1)_cached_or_prebuilt:=$(BASE_CACHE)/$(host)/$(1)/.stamp_cached_or_prebuilt-$($(1)_build_id) $(1)_download_path_fixed=$(subst :,\:,$$($(1)_download_path)) @@ -263,6 +268,36 @@ $($(1)_postprocessed): | $($(1)_staged) $(AT)cd $($(1)_staging_prefix_dir); $(call $(1)_postprocess_cmds) $(AT)echo " Postprocessing completed: $$@" $(AT)touch $$@ +$($(1)_prebuilt_downloaded): | $($(1)_dependencies) + $(AT)echo "=== Attempting to download prebuilt $(1) v$($(1)_version) ===" + $(AT)echo " Build ID: $($(1)_build_id)" + $(AT)echo " Download URL: $($(1)_prebuilt_url)" + $(AT)mkdir -p $$(@D) + $(AT)mkdir -p $(dir $($(1)_cached)) + $(AT)( \ + echo " Downloading $(1) prebuilt files..." && \ + $(build_DOWNLOAD) "$($(1)_cached).tmp" "$($(1)_prebuilt_url)" && \ + $(build_DOWNLOAD) "$($(1)_cached_checksum).tmp" "$($(1)_prebuilt_checksum_url)" && \ + $(build_DOWNLOAD) "$($(1)_cached_buildinfo).tmp" "$($(1)_prebuilt_buildinfo_url)" && \ + echo " Verifying checksum..." && \ + cd $(dir $($(1)_cached)) && $(build_SHA256SUM) -c "$($(1)_cached_checksum).tmp" && \ + echo " Moving files to final location..." && \ + mv "$($(1)_cached).tmp" "$($(1)_cached)" && \ + mv "$($(1)_cached_checksum).tmp" "$($(1)_cached_checksum)" && \ + mv "$($(1)_cached_buildinfo).tmp" "$($(1)_cached_buildinfo)" && \ + echo " Prebuilt download completed: $$@" && \ + touch $$@ \ + ) || ( \ + echo " Download failed for $(1)" && \ + rm -f "$($(1)_cached).tmp" "$($(1)_cached_checksum).tmp" "$($(1)_cached_buildinfo).tmp" && \ + if [ "$(DEPENDS_UNTRUSTED_FAST_BUILDS)" = "forced" ]; then \ + echo " Error: DEPENDS_UNTRUSTED_FAST_BUILDS=forced but prebuilt download failed" && \ + exit 1; \ + else \ + echo " Falling back to building from source..." && \ + exit 1; \ + fi \ + ) $($(1)_cached): | $($(1)_dependencies) $($(1)_postprocessed) $(AT)echo "=== Caching $(1) v$($(1)_version) ===" $(AT)echo " Build ID: $($(1)_build_id)" @@ -323,13 +358,28 @@ $($(1)_cached_checksum): $($(1)_cached) $(AT)echo " HOST_ID_SALT: $(HOST_ID_SALT)" >> $$($(1)_cached_buildinfo) $(AT)echo " Build info completed: $$($(1)_cached_buildinfo)" +$($(1)_cached_or_prebuilt): + $(AT)mkdir -p $$(@D) + $(AT)if [ "$(DEPENDS_UNTRUSTED_FAST_BUILDS)" = "yes" ]; then \ + echo "=== Trying prebuilt download for $(1) v$($(1)_version) ===" && \ + ($(MAKE) -f $(BASEDIR)/Makefile $($(1)_prebuilt_downloaded) && touch $$@) || \ + (echo " Prebuilt download failed, falling back to building from source..." && \ + $(MAKE) -f $(BASEDIR)/Makefile $($(1)_cached_checksum) && touch $$@); \ + elif [ "$(DEPENDS_UNTRUSTED_FAST_BUILDS)" = "forced" ]; then \ + echo "=== Forced prebuilt download for $(1) v$($(1)_version) ===" && \ + $(MAKE) -f $(BASEDIR)/Makefile $($(1)_prebuilt_downloaded) && touch $$@; \ + else \ + echo "=== Building from source for $(1) v$($(1)_version) ===" && \ + $(MAKE) -f $(BASEDIR)/Makefile $($(1)_cached_checksum) && touch $$@; \ + fi + .PHONY: $(1) -$(1): | $($(1)_cached_checksum) -.SECONDARY: $($(1)_cached) $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched) $($(1)_cached_buildinfo) +$(1): | $($(1)_cached_or_prebuilt) +.SECONDARY: $($(1)_cached) $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched) $($(1)_cached_buildinfo) $($(1)_prebuilt_downloaded) $($(1)_cached_or_prebuilt) endef -stages = fetched extracted preprocessed configured built staged postprocessed cached cached_checksum +stages = fetched extracted preprocessed configured built staged postprocessed cached cached_checksum prebuilt_downloaded define ext_add_stages $(foreach stage,$(stages), |
