feat: jenkins CI initial (#142)
* feat: jenkins CI initial * feat: publish over SSH * feat: more details regarding build-id generation * feat: prebuild download logic * feat: force fast_builds on GitHub CI runs * feat: add make clean to contrib/depends and invoke it on CI to reduce SSH upload step time * fix: correct linux save path * revert: make clean * separate builds * enhance sshPublisher * fix: github CI: depracate GitHub cache, fix DEPENDS_UNTRUSTED_FAST_BUILDS * fix: sha256sum logic * chore: refactor github actions and Jenkinsfile to only execute when required * ci: update ci to 15 and xcode to 16.4 * ci: cleanup builddir before starting
This commit is contained in:
committed by
Some Random Crypto Guy
parent
1a01d3f06c
commit
3aba4e8522
Vendored
+208
@@ -0,0 +1,208 @@
|
||||
pipeline {
|
||||
agent none
|
||||
|
||||
parameters {
|
||||
string(
|
||||
name: 'LINUX_TARGETS',
|
||||
defaultValue: 'x86_64-linux-gnu,aarch64-linux-gnu,i686-linux-gnu',
|
||||
description: 'Comma-separated list of Linux targets to build'
|
||||
)
|
||||
string(
|
||||
name: 'ANDROID_TARGETS',
|
||||
defaultValue: 'x86_64-linux-android,armv7a-linux-androideabi,aarch64-linux-android',
|
||||
description: 'Comma-separated list of Android targets to build'
|
||||
)
|
||||
string(
|
||||
name: 'MINGW_TARGETS',
|
||||
defaultValue: 'x86_64-w64-mingw32,i686-w64-mingw32',
|
||||
description: 'Comma-separated list of MinGW targets to build'
|
||||
)
|
||||
string(
|
||||
name: 'DARWIN_TARGETS',
|
||||
defaultValue: 'aarch64-apple-darwin,x86_64-apple-darwin,aarch64-apple-ios,aarch64-apple-iossimulator',
|
||||
description: 'Comma-separated list of Darwin targets to build'
|
||||
)
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Check Changes') {
|
||||
agent any
|
||||
steps {
|
||||
script {
|
||||
def changes = sh(
|
||||
script: "git diff --name-only HEAD~1 HEAD | grep '^contrib/depends' || echo 'NO_CHANGES'",
|
||||
returnStdout: true
|
||||
).trim()
|
||||
|
||||
if (changes == 'NO_CHANGES') {
|
||||
echo "No changes detected in contrib/depends directory. Skipping build."
|
||||
currentBuild.result = 'NOT_BUILT'
|
||||
return
|
||||
} else {
|
||||
echo "Changes detected in contrib/depends directory:"
|
||||
echo changes
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Build Dependencies') {
|
||||
when {
|
||||
not {
|
||||
equals expected: 'NOT_BUILT', actual: currentBuild.result
|
||||
}
|
||||
}
|
||||
parallel {
|
||||
stage('Linux Builds') {
|
||||
agent {
|
||||
dockerfile {
|
||||
filename '.devcontainer/Dockerfile'
|
||||
args '-v /opt/builds:/opt/builds'
|
||||
label 'linux && amd64'
|
||||
}
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
def targets = params.LINUX_TARGETS.split(',').collect { it.trim() }
|
||||
|
||||
checkout scm
|
||||
|
||||
for (target in targets) {
|
||||
echo "Building Linux dependencies for ${target}"
|
||||
|
||||
dir('contrib/depends') {
|
||||
sh "rm -rf built/${target}/*"
|
||||
sh "make HOST=${target} DEPENDS_UNTRUSTED_FAST_BUILDS=yes"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
def targets = params.LINUX_TARGETS.split(',').collect { it.trim() }
|
||||
for (target in targets) {
|
||||
// archiveArtifacts artifacts: "contrib/depends/built/${target}/*/*.tar.gz*", allowEmptyArchive: true
|
||||
sshPublisher(publishers: [sshPublisherDesc(configName: 'static.mrcyjanek.net', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'depends', remoteDirectorySDF: false, sourceFiles: "contrib/depends/built/${target}/*/*.tar.gz*")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Android Builds') {
|
||||
agent {
|
||||
dockerfile {
|
||||
filename '.devcontainer/Dockerfile'
|
||||
args '-v /opt/builds:/opt/builds'
|
||||
label 'linux && amd64'
|
||||
}
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
def targets = params.ANDROID_TARGETS.split(',').collect { it.trim() }
|
||||
|
||||
checkout scm
|
||||
|
||||
for (target in targets) {
|
||||
echo "Building Android dependencies for ${target}"
|
||||
|
||||
dir('contrib/depends') {
|
||||
sh "rm -rf built/${target}/*"
|
||||
sh "make HOST=${target} DEPENDS_UNTRUSTED_FAST_BUILDS=yes"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
def targets = params.ANDROID_TARGETS.split(',').collect { it.trim() }
|
||||
for (target in targets) {
|
||||
// archiveArtifacts artifacts: "contrib/depends/built/${target}/*/*.tar.gz*", allowEmptyArchive: true
|
||||
sshPublisher(publishers: [sshPublisherDesc(configName: 'static.mrcyjanek.net', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'depends', remoteDirectorySDF: false, sourceFiles: "contrib/depends/built/${target}/*/*.tar.gz*")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('MinGW Builds') {
|
||||
agent {
|
||||
dockerfile {
|
||||
filename '.devcontainer/Dockerfile'
|
||||
args '-v /opt/builds:/opt/builds'
|
||||
label 'linux && amd64'
|
||||
}
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
def targets = params.MINGW_TARGETS.split(',').collect { it.trim() }
|
||||
|
||||
checkout scm
|
||||
|
||||
for (target in targets) {
|
||||
echo "Building MinGW dependencies for ${target}"
|
||||
|
||||
dir('contrib/depends') {
|
||||
sh "rm -rf built/${target}/*"
|
||||
sh "make HOST=${target} DEPENDS_UNTRUSTED_FAST_BUILDS=yes"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
def targets = params.MINGW_TARGETS.split(',').collect { it.trim() }
|
||||
for (target in targets) {
|
||||
// archiveArtifacts artifacts: "contrib/depends/built/${target}/*/*.tar.gz*", allowEmptyArchive: true
|
||||
sshPublisher(publishers: [sshPublisherDesc(configName: 'static.mrcyjanek.net', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'depends', remoteDirectorySDF: false, sourceFiles: "contrib/depends/built/${target}/*/*.tar.gz*")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Darwin Builds') {
|
||||
agent {
|
||||
label 'darwin && arm64'
|
||||
}
|
||||
steps {
|
||||
script {
|
||||
def targets = params.DARWIN_TARGETS.split(',').collect { it.trim() }
|
||||
|
||||
checkout scm
|
||||
|
||||
for (target in targets) {
|
||||
echo "Building dependencies for ${target}"
|
||||
|
||||
dir('contrib/depends') {
|
||||
sh "rm -rf built/${target}/*"
|
||||
sh "make HOST=${target} DEPENDS_UNTRUSTED_FAST_BUILDS=yes"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
def targets = params.DARWIN_TARGETS.split(',').collect { it.trim() }
|
||||
for (target in targets) {
|
||||
// archiveArtifacts artifacts: "contrib/depends/built/${target}/*/*.tar.gz*", allowEmptyArchive: true
|
||||
sshPublisher(publishers: [sshPublisherDesc(configName: 'static.mrcyjanek.net', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'depends', remoteDirectorySDF: false, sourceFiles: "contrib/depends/built/${target}/*/*.tar.gz*")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
post {
|
||||
always {
|
||||
echo "Build completed."
|
||||
}
|
||||
}
|
||||
}
|
||||
+38
-12
@@ -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)
|
||||
@@ -110,19 +121,34 @@ include builders/$(build_os).mk
|
||||
include builders/default.mk
|
||||
include packages/packages.mk
|
||||
|
||||
# Legacy build ID strings (kept for debugging info)
|
||||
build_id_string_legacy:=$(BUILD_ID_SALT)
|
||||
build_id_string_legacy+=$(shell $(build_CC) --version 2>/dev/null)
|
||||
build_id_string_legacy+=$(shell $(build_AR) --version 2>/dev/null)
|
||||
build_id_string_legacy+=$(shell $(build_CXX) --version 2>/dev/null)
|
||||
build_id_string_legacy+=$(shell $(build_RANLIB) --version 2>/dev/null)
|
||||
build_id_string_legacy+=$(shell $(build_STRIP) --version 2>/dev/null)
|
||||
|
||||
$(host_arch)_$(host_os)_id_string_legacy:=$(HOST_ID_SALT)
|
||||
$(host_arch)_$(host_os)_id_string_legacy+=$(shell $(host_CC) --version 2>/dev/null)
|
||||
$(host_arch)_$(host_os)_id_string_legacy+=$(shell $(host_AR) --version 2>/dev/null)
|
||||
$(host_arch)_$(host_os)_id_string_legacy+=$(shell $(host_CXX) --version 2>/dev/null)
|
||||
$(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)
|
||||
|
||||
build_id_string:=$(BUILD_ID_SALT)
|
||||
build_id_string+=$(shell $(build_CC) --version 2>/dev/null)
|
||||
build_id_string+=$(shell $(build_AR) --version 2>/dev/null)
|
||||
build_id_string+=$(shell $(build_CXX) --version 2>/dev/null)
|
||||
build_id_string+=$(shell $(build_RANLIB) --version 2>/dev/null)
|
||||
build_id_string+=$(shell $(build_STRIP) --version 2>/dev/null)
|
||||
build_id_string+=$(shell basename $(build_CC) 2>/dev/null || echo "unknown")
|
||||
build_id_string+=$(shell basename $(build_AR) 2>/dev/null || echo "unknown")
|
||||
build_id_string+=$(shell basename $(build_CXX) 2>/dev/null || echo "unknown")
|
||||
build_id_string+=$(shell basename $(build_RANLIB) 2>/dev/null || echo "unknown")
|
||||
build_id_string+=$(shell basename $(build_STRIP) 2>/dev/null || echo "unknown")
|
||||
|
||||
$(host_arch)_$(host_os)_id_string:=$(HOST_ID_SALT)
|
||||
$(host_arch)_$(host_os)_id_string+=$(shell $(host_CC) --version 2>/dev/null)
|
||||
$(host_arch)_$(host_os)_id_string+=$(shell $(host_AR) --version 2>/dev/null)
|
||||
$(host_arch)_$(host_os)_id_string+=$(shell $(host_CXX) --version 2>/dev/null)
|
||||
$(host_arch)_$(host_os)_id_string+=$(shell $(host_RANLIB) --version 2>/dev/null)
|
||||
$(host_arch)_$(host_os)_id_string+=$(shell $(host_STRIP) --version 2>/dev/null)
|
||||
$(host_arch)_$(host_os)_id_string+=$(shell basename $(host_CC) 2>/dev/null || echo "unknown")
|
||||
$(host_arch)_$(host_os)_id_string+=$(shell basename $(host_AR) 2>/dev/null || echo "unknown")
|
||||
$(host_arch)_$(host_os)_id_string+=$(shell basename $(host_CXX) 2>/dev/null || echo "unknown")
|
||||
$(host_arch)_$(host_os)_id_string+=$(shell basename $(host_RANLIB) 2>/dev/null || echo "unknown")
|
||||
$(host_arch)_$(host_os)_id_string+=$(shell basename $(host_STRIP) 2>/dev/null || echo "unknown")
|
||||
|
||||
packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages)
|
||||
native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages)
|
||||
@@ -204,8 +230,8 @@ $(host_prefix)/share/toolchain.cmake : toolchain.cmake.in $(host_prefix)/.stamp_
|
||||
define check_or_remove_cached
|
||||
mkdir -p $(BASE_CACHE)/$(host)/$(package) && cd $(BASE_CACHE)/$(host)/$(package); \
|
||||
$(build_SHA256SUM) -c $($(package)_cached_checksum) >/dev/null 2>/dev/null || \
|
||||
( rm -f $($(package)_cached_checksum); \
|
||||
if test -f "$($(package)_cached)"; then echo "Checksum mismatch for $(package). Forcing rebuild.."; rm -f $($(package)_cached_checksum) $($(package)_cached); fi )
|
||||
( rm -f $($(package)_cached_checksum) $($(package)_cached_buildinfo); \
|
||||
if test -f "$($(package)_cached)"; then echo "Checksum mismatch for $(package). Forcing rebuild.."; rm -f $($(package)_cached_checksum) $($(package)_cached) $($(package)_cached_buildinfo); fi )
|
||||
endef
|
||||
|
||||
define check_or_remove_sources
|
||||
|
||||
+142
-12
@@ -36,7 +36,7 @@ define fetch_file
|
||||
endef
|
||||
|
||||
define int_get_build_recipe_hash
|
||||
$(eval $(1)_all_file_checksums:=$(shell $(build_SHA256SUM) $(meta_depends) packages/$(1).mk $(addprefix $(PATCHES_PATH)/$(1)/,$($(1)_patches)) | cut -d" " -f1))
|
||||
$(eval $(1)_all_file_checksums:=$(shell cd $(BASEDIR) && $(build_SHA256SUM) $(subst $(BASEDIR)/,,$(meta_depends)) packages/$(1).mk $(addprefix patches/$(1)/,$($(1)_patches)) 2>/dev/null | cut -d" " -f1))
|
||||
$(eval $(1)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_SHA256SUM) | cut -d" " -f1))
|
||||
endef
|
||||
|
||||
@@ -46,6 +46,8 @@ $(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($($(1)_type
|
||||
$(foreach dep,$($(1)_all_dependencies),$(eval $(1)_build_id_deps+=$(dep)-$($(dep)_version)-$($(dep)_recipe_hash)))
|
||||
$(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id_string))
|
||||
$(eval $(1)_build_id:=$(shell echo -n "$($(1)_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH)))
|
||||
$(eval $(1)_build_id_long_legacy:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id_string_legacy))
|
||||
$(eval $(1)_build_id_legacy:=$(shell echo -n "$($(1)_build_id_long_legacy)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH)))
|
||||
final_build_id_long+=$($(package)_build_id_long)
|
||||
|
||||
#compute package-specific paths
|
||||
@@ -59,10 +61,14 @@ $(1)_extract_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id
|
||||
$(1)_download_dir:=$(base_download_dir)/$(1)-$($(1)_version)
|
||||
$(1)_build_dir:=$$($(1)_extract_dir)/$$($(1)_build_subdir)
|
||||
$(1)_cached_checksum:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.hash
|
||||
$(1)_cached_buildinfo:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.txt
|
||||
$(1)_patch_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)/.patches-$($(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
|
||||
@@ -73,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))
|
||||
|
||||
|
||||
@@ -198,61 +206,183 @@ COMPRESS_CMD := $(shell if command -v pigz >/dev/null 2>&1; then echo "pigz"; el
|
||||
|
||||
define int_add_cmds
|
||||
$($(1)_fetched):
|
||||
$(AT)echo "=== Fetching $(1) v$($(1)_version) ==="
|
||||
$(AT)echo " Source directory: $($(1)_source_dir)"
|
||||
$(AT)echo " Download file: $($(1)_download_file)"
|
||||
$(AT)mkdir -p $$(@D) $(SOURCES_PATH)
|
||||
$(AT)rm -f $$@
|
||||
$(AT)touch $$@
|
||||
$(AT)cd $$(@D); $(call $(1)_fetch_cmds,$(1))
|
||||
$(AT)cd $($(1)_source_dir); $(foreach source,$($(1)_all_sources),$(build_SHA256SUM) $(source) >> $$(@);)
|
||||
$(AT)echo " Fetch completed: $$@"
|
||||
$(AT)touch $$@
|
||||
$($(1)_extracted): | $($(1)_fetched)
|
||||
$(AT)echo Extracting $(1)...
|
||||
$(AT)echo "=== Extracting $(1) v$($(1)_version) ==="
|
||||
$(AT)echo " Build ID: $($(1)_build_id)"
|
||||
$(AT)echo " Extract directory: $($(1)_extract_dir)"
|
||||
$(AT)mkdir -p $$(@D)
|
||||
$(AT)cd $$(@D); $(call $(1)_extract_cmds,$(1))
|
||||
$(AT)echo " Extract completed: $$@"
|
||||
$(AT)touch $$@
|
||||
$($(1)_preprocessed): | $($(1)_dependencies) $($(1)_extracted)
|
||||
$(AT)echo Preprocessing $(1)...
|
||||
$(AT)echo "=== Preprocessing $(1) v$($(1)_version) ==="
|
||||
$(AT)echo " Dependencies: $($(1)_dependencies)"
|
||||
$(AT)echo " Patch directory: $($(1)_patch_dir)"
|
||||
$(AT)echo " Patches: $($(1)_patches)"
|
||||
$(AT)mkdir -p $$(@D) $($(1)_patch_dir)
|
||||
$(AT)$(foreach patch,$($(1)_patches),cd $(PATCHES_PATH)/$(1); cp $(patch) $($(1)_patch_dir) ;)
|
||||
$(AT)cd $$(@D); $(call $(1)_preprocess_cmds, $(1))
|
||||
$(AT)echo " Preprocessing completed: $$@"
|
||||
$(AT)touch $$@
|
||||
$($(1)_configured): | $($(1)_preprocessed)
|
||||
$(AT)echo Configuring $(1)...
|
||||
$(AT)echo "=== Configuring $(1) v$($(1)_version) ==="
|
||||
$(AT)echo " Build directory: $($(1)_build_dir)"
|
||||
$(AT)echo " Host prefix: $(host_prefix)"
|
||||
$(AT)echo " All dependencies: $($(1)_all_dependencies)"
|
||||
$(AT)rm -rf $(host_prefix); mkdir -p $(host_prefix)/lib; cd $(host_prefix); $(foreach package,$($(1)_all_dependencies), tar xf $($(package)_cached); )
|
||||
$(AT)mkdir -p $$(@D)
|
||||
$(AT)+cd $$(@D); $($(1)_config_env) $(call $(1)_config_cmds, $(1))
|
||||
$(AT)echo " Configuration completed: $$@"
|
||||
$(AT)touch $$@
|
||||
$($(1)_built): | $($(1)_configured)
|
||||
$(AT)echo Building $(1)...
|
||||
$(AT)echo "=== Building $(1) v$($(1)_version) ==="
|
||||
$(AT)echo " Build directory: $($(1)_build_dir)"
|
||||
$(AT)echo " Build environment: $($(1)_build_env)"
|
||||
$(AT)mkdir -p $$(@D)
|
||||
$(AT)+cd $$(@D); $($(1)_build_env) $(call $(1)_build_cmds, $(1))
|
||||
$(AT)echo " Build completed: $$@"
|
||||
$(AT)touch $$@
|
||||
$($(1)_staged): | $($(1)_built)
|
||||
$(AT)echo Staging $(1)...
|
||||
$(AT)echo "=== Staging $(1) v$($(1)_version) ==="
|
||||
$(AT)echo " Staging directory: $($(1)_staging_dir)"
|
||||
$(AT)echo " Staging prefix: $($(1)_staging_prefix_dir)"
|
||||
$(AT)mkdir -p $($(1)_staging_dir)/$(host_prefix)
|
||||
$(AT)cd $($(1)_build_dir); $($(1)_stage_env) $(call $(1)_stage_cmds, $(1))
|
||||
$(AT)echo " Removing extract directory: $($(1)_extract_dir)"
|
||||
$(AT)rm -rf $($(1)_extract_dir)
|
||||
$(AT)echo " Staging completed: $$@"
|
||||
$(AT)touch $$@
|
||||
$($(1)_postprocessed): | $($(1)_staged)
|
||||
$(AT)echo Postprocessing $(1)...
|
||||
$(AT)echo "=== Postprocessing $(1) v$($(1)_version) ==="
|
||||
$(AT)echo " Postprocessing directory: $($(1)_staging_prefix_dir)"
|
||||
$(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)) && \
|
||||
sed 's/$(notdir $($(1)_cached))/$(notdir $($(1)_cached)).tmp/' "$($(1)_cached_checksum).tmp" > "$($(1)_cached_checksum).tmp.verify" && \
|
||||
$(build_SHA256SUM) -c "$($(1)_cached_checksum).tmp.verify" && \
|
||||
rm -f "$($(1)_cached_checksum).tmp.verify" && \
|
||||
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)...
|
||||
$(AT)echo "=== Caching $(1) v$($(1)_version) ==="
|
||||
$(AT)echo " Build ID: $($(1)_build_id)"
|
||||
$(AT)echo " Cache file: $$@"
|
||||
$(AT)echo " Compression: $(COMPRESS_CMD)"
|
||||
$(AT)cd $$($(1)_staging_dir)/$(host_prefix); find . | sort | tar --no-recursion --use-compress-program='$(COMPRESS_CMD)' -cf $$($(1)_staging_dir)/$$(@F) -T -
|
||||
$(AT)mkdir -p $$(@D)
|
||||
$(AT)rm -rf $$(@D) && mkdir -p $$(@D)
|
||||
$(AT)mv $$($(1)_staging_dir)/$$(@F) $$(@)
|
||||
$(AT)echo " Removing staging directory: $($(1)_staging_dir)"
|
||||
$(AT)rm -rf $($(1)_staging_dir)
|
||||
$(AT)echo " Caching completed: $$@"
|
||||
$($(1)_cached_checksum): $($(1)_cached)
|
||||
$(AT)echo "=== Generating checksum for $(1) v$($(1)_version) ==="
|
||||
$(AT)echo " Checksum file: $$@"
|
||||
$(AT)cd $$(@D); $(build_SHA256SUM) $$(<F) > $$(@)
|
||||
$(AT)echo " Checksum completed: $$@"
|
||||
$(AT)echo "=== Generating build info for $(1) v$($(1)_version) ==="
|
||||
$(AT)echo " Build info file: $$($(1)_cached_buildinfo)"
|
||||
$(AT)echo "# Build Info for $(1) v$($(1)_version)" > $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "# Generated on: $$(shell date)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Package: $(1)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Version: $($(1)_version)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Host: $(host)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Release Type: $(release_type)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Build ID (current): $($(1)_build_id)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Build ID (legacy): $($(1)_build_id_legacy)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Build ID String (current): $($(1)_build_id_long)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Build ID String (legacy): $($(1)_build_id_long_legacy)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Dependencies: $($(1)_dependencies)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "All Dependencies: $($(1)_all_dependencies)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Recipe Hash: $($(1)_recipe_hash)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Recipe Files: $($(1)_all_file_checksums)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Toolchain (current): $($($(1)_type)_id_string)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Toolchain (legacy): $($($(1)_type)_id_string_legacy)" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Build Tools (current):" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo " CC: $$(shell basename $($($(1)_type)_CC) 2>/dev/null || echo "unknown")" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo " CXX: $$(shell basename $($($(1)_type)_CXX) 2>/dev/null || echo "unknown")" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo " AR: $$(shell basename $($($(1)_type)_AR) 2>/dev/null || echo "unknown")" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo " RANLIB: $$(shell basename $($($(1)_type)_RANLIB) 2>/dev/null || echo "unknown")" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo " STRIP: $$(shell basename $($($(1)_type)_STRIP) 2>/dev/null || echo "unknown")" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Build Tools (legacy versions):" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo " CC: $$(shell $($($(1)_type)_CC) --version 2>/dev/null | head -1 || echo "unknown")" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo " CXX: $$(shell $($($(1)_type)_CXX) --version 2>/dev/null | head -1 || echo "unknown")" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo " AR: $$(shell $($($(1)_type)_AR) --version 2>/dev/null | head -1 || echo "unknown")" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo " RANLIB: $$(shell $($($(1)_type)_RANLIB) --version 2>/dev/null | head -1 || echo "unknown")" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo " STRIP: $$(shell $($($(1)_type)_STRIP) --version 2>/dev/null | head -1 || echo "unknown")" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo "Salt Values:" >> $$($(1)_cached_buildinfo)
|
||||
$(AT)echo " BUILD_ID_SALT: $(BUILD_ID_SALT)" >> $$($(1)_cached_buildinfo)
|
||||
$(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): | $($(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),
|
||||
|
||||
Reference in New Issue
Block a user