Add should_build_for_arch check

This commit is contained in:
Ryan Hughes committed 2025-11-04 11:54:52 -05:00
1 parent dea7849c31
commit fd5fec490c
1 file changed
+71 -32
+71 -32
View File
@@ -74,13 +74,38 @@ get_local_version() {
fi fi
} }
# Check if package should be built for current architecture
# Returns 0 (success) if should build, 1 if should skip
should_build_for_arch() {
local pkg="$1"
local current_arch="$ARCH"
local pkgbuild="/pkgbuilds/$pkg/PKGBUILD"
[[ ! -f "$pkgbuild" ]] && return 1
# Check PKGBUILD arch=() array
local pkgbuild_archs=$(cd "/pkgbuilds/$pkg" && bash -c 'source PKGBUILD 2>/dev/null; echo "${arch[@]}"')
# If arch=('any'), build for all architectures
if [[ "$pkgbuild_archs" == "any" ]]; then
return 0
fi
# Check if current arch is in PKGBUILD arch=()
if echo "$pkgbuild_archs" | grep -qw "$current_arch"; then
return 0 # Build
else
return 1 # Skip
fi
}
# Build a package from /pkgbuilds/ # Build a package from /pkgbuilds/
build_package() { build_package() {
local pkg="$1" local pkg="$1"
echo "" echo ""
echo " -> Processing: $pkg" echo " -> Processing: $pkg"
# Copy to build directory # Copy to build directory
cd /src cd /src
rm -rf "$pkg" rm -rf "$pkg"
@@ -89,13 +114,13 @@ build_package() {
# Get PKGBUILD version (including epoch if present) # Get PKGBUILD version (including epoch if present)
local pkgbuild_version=$(bash -c 'source PKGBUILD; if [[ -n "$epoch" ]]; then echo "${epoch}:${pkgver}-${pkgrel}"; else echo "${pkgver}-${pkgrel}"; fi' 2>/dev/null) local pkgbuild_version=$(bash -c 'source PKGBUILD; if [[ -n "$epoch" ]]; then echo "${epoch}:${pkgver}-${pkgrel}"; else echo "${pkgver}-${pkgrel}"; fi' 2>/dev/null)
if [[ -z "$pkgbuild_version" ]]; then if [[ -z "$pkgbuild_version" ]]; then
echo " ❌ Failed to read PKGBUILD version" echo " ❌ Failed to read PKGBUILD version"
FAILED_PACKAGES="$FAILED_PACKAGES $pkg" FAILED_PACKAGES="$FAILED_PACKAGES $pkg"
return 1 return 1
fi fi
# Show version info (version check already done in first pass) # Show version info (version check already done in first pass)
local local_version=$(get_local_version "$pkg") local local_version=$(get_local_version "$pkg")
if [[ -n "$local_version" ]]; then if [[ -n "$local_version" ]]; then
@@ -103,7 +128,7 @@ build_package() {
else else
echo " New package (version: $pkgbuild_version)" echo " New package (version: $pkgbuild_version)"
fi fi
# Import package-specific PGP keys if they exist # Import package-specific PGP keys if they exist
if [[ -d "keys/pgp" ]]; then if [[ -d "keys/pgp" ]]; then
echo " Importing package-specific PGP keys..." echo " Importing package-specific PGP keys..."
@@ -113,10 +138,10 @@ build_package() {
fi fi
done done
fi fi
# Build package without signing (signing is done separately) # Build package without signing (signing is done separately)
MAKEPKG_FLAGS="-scf --noconfirm" MAKEPKG_FLAGS="-scf --noconfirm"
if makepkg $MAKEPKG_FLAGS; then if makepkg $MAKEPKG_FLAGS; then
for pkg_file in *.pkg.tar.*; do for pkg_file in *.pkg.tar.*; do
[[ -f "$pkg_file" ]] && cp "$pkg_file" "$BUILD_OUTPUT_DIR/" [[ -f "$pkg_file" ]] && cp "$pkg_file" "$BUILD_OUTPUT_DIR/"
@@ -132,9 +157,9 @@ build_package() {
ln -sf omarchy-build.db.tar.zst omarchy-build.db ln -sf omarchy-build.db.tar.zst omarchy-build.db
sudo pacman -Sy >/dev/null 2>&1 sudo pacman -Sy >/dev/null 2>&1
fi fi
cd /src/$pkg cd /src/$pkg
echo " ✓ Successfully built $pkg" echo " ✓ Successfully built $pkg"
SUCCESSFUL_PACKAGES="$SUCCESSFUL_PACKAGES $pkg" SUCCESSFUL_PACKAGES="$SUCCESSFUL_PACKAGES $pkg"
return 0 return 0
@@ -151,11 +176,11 @@ build_package() {
get_package_deps() { get_package_deps() {
local pkg="$1" local pkg="$1"
local pkgbuild="/pkgbuilds/$pkg/PKGBUILD" local pkgbuild="/pkgbuilds/$pkg/PKGBUILD"
if [[ ! -f "$pkgbuild" ]]; then if [[ ! -f "$pkgbuild" ]]; then
return return
fi fi
# Extract depends and makedepends, filter for packages in our pkgbuilds/ # Extract depends and makedepends, filter for packages in our pkgbuilds/
( (
source "$pkgbuild" 2>/dev/null source "$pkgbuild" 2>/dev/null
@@ -176,14 +201,14 @@ build_order() {
local -a all_packages=() local -a all_packages=()
local -a result=() local -a result=()
local -A package_deps_count=() local -A package_deps_count=()
# Collect all packages # Collect all packages
for pkgdir in /pkgbuilds/*/; do for pkgdir in /pkgbuilds/*/; do
[[ ! -d "$pkgdir" ]] && continue [[ ! -d "$pkgdir" ]] && continue
local pkg=$(basename "$pkgdir") local pkg=$(basename "$pkgdir")
[[ ! -f "$pkgdir/PKGBUILD" ]] && continue [[ ! -f "$pkgdir/PKGBUILD" ]] && continue
all_packages+=("$pkg") all_packages+=("$pkg")
# Count internal dependencies # Count internal dependencies
local dep_count=0 local dep_count=0
while read -r dep; do while read -r dep; do
@@ -191,7 +216,7 @@ build_order() {
done < <(get_package_deps "$pkg") done < <(get_package_deps "$pkg")
package_deps_count[$pkg]=$dep_count package_deps_count[$pkg]=$dep_count
done done
# Sort: packages with fewer deps first # Sort: packages with fewer deps first
while IFS= read -r pkg; do while IFS= read -r pkg; do
result+=("$pkg") result+=("$pkg")
@@ -200,7 +225,7 @@ build_order() {
echo "${package_deps_count[$pkg]} $pkg" echo "${package_deps_count[$pkg]} $pkg"
done | sort -n | cut -d' ' -f2- done | sort -n | cut -d' ' -f2-
) )
# Output in build order # Output in build order
printf '%s\n' "${result[@]}" printf '%s\n' "${result[@]}"
} }
@@ -209,16 +234,16 @@ build_order() {
check_needs_build() { check_needs_build() {
local pkg="$1" local pkg="$1"
local pkgbuild="/pkgbuilds/$pkg/PKGBUILD" local pkgbuild="/pkgbuilds/$pkg/PKGBUILD"
[[ ! -f "$pkgbuild" ]] && return 1 [[ ! -f "$pkgbuild" ]] && return 1
# Get PKGBUILD version (including epoch if present) # Get PKGBUILD version (including epoch if present)
local pkgbuild_version=$(cd "/pkgbuilds/$pkg" && bash -c 'source PKGBUILD; if [[ -n "$epoch" ]]; then echo "${epoch}:${pkgver}-${pkgrel}"; else echo "${pkgver}-${pkgrel}"; fi' 2>/dev/null) local pkgbuild_version=$(cd "/pkgbuilds/$pkg" && bash -c 'source PKGBUILD; if [[ -n "$epoch" ]]; then echo "${epoch}:${pkgver}-${pkgrel}"; else echo "${pkgver}-${pkgrel}"; fi' 2>/dev/null)
[[ -z "$pkgbuild_version" ]] && return 1 [[ -z "$pkgbuild_version" ]] && return 1
# Check if already built # Check if already built
local local_version=$(get_local_version "$pkg") local local_version=$(get_local_version "$pkg")
if [[ "$local_version" == "$pkgbuild_version" ]]; then if [[ "$local_version" == "$pkgbuild_version" ]]; then
return 1 # Already up to date return 1 # Already up to date
else else
@@ -244,7 +269,14 @@ if [[ -n "$PACKAGES" ]]; then
echo "==> ERROR: Package '$pkg_name' not found in /pkgbuilds/" echo "==> ERROR: Package '$pkg_name' not found in /pkgbuilds/"
exit 1 exit 1
fi fi
# Check if package should be built for this architecture
if ! should_build_for_arch "$pkg_name"; then
echo " ⊘ $pkg_name - not built for $ARCH"
SKIPPED_PACKAGES="$SKIPPED_PACKAGES $pkg_name"
continue
fi
if check_needs_build "$pkg_name"; then if check_needs_build "$pkg_name"; then
PACKAGES_TO_BUILD+=("$pkg_name") PACKAGES_TO_BUILD+=("$pkg_name")
else else
@@ -258,7 +290,14 @@ else
[[ ! -d "$pkgdir" ]] && continue [[ ! -d "$pkgdir" ]] && continue
pkg=$(basename "$pkgdir") pkg=$(basename "$pkgdir")
[[ ! -f "$pkgdir/PKGBUILD" ]] && continue [[ ! -f "$pkgdir/PKGBUILD" ]] && continue
# Check if package should be built for this architecture
if ! should_build_for_arch "$pkg"; then
echo " ⊘ $pkg - not built for $ARCH"
SKIPPED_PACKAGES="$SKIPPED_PACKAGES $pkg"
continue
fi
if check_needs_build "$pkg"; then if check_needs_build "$pkg"; then
PACKAGES_TO_BUILD+=("$pkg") PACKAGES_TO_BUILD+=("$pkg")
else else
@@ -273,17 +312,17 @@ if [[ ${#PACKAGES_TO_BUILD[@]} -eq 0 ]]; then
else else
echo "==> ${#PACKAGES_TO_BUILD[@]} package(s) need building: ${PACKAGES_TO_BUILD[@]}" echo "==> ${#PACKAGES_TO_BUILD[@]} package(s) need building: ${PACKAGES_TO_BUILD[@]}"
echo "==> Determining build order based on dependencies..." echo "==> Determining build order based on dependencies..."
# Second pass: order only the packages that need building # Second pass: order only the packages that need building
# Strategy: build packages with no unmet dependencies first # Strategy: build packages with no unmet dependencies first
declare -A unmet_deps_count # How many dependencies does this package still need? declare -A unmet_deps_count # How many dependencies does this package still need?
declare -A blocks_packages # Which packages are waiting for this one? declare -A blocks_packages # Which packages are waiting for this one?
# Count unmet dependencies for each package # Count unmet dependencies for each package
for pkg in "${PACKAGES_TO_BUILD[@]}"; do for pkg in "${PACKAGES_TO_BUILD[@]}"; do
unmet_deps_count[$pkg]=0 unmet_deps_count[$pkg]=0
done done
# Build the dependency relationships # Build the dependency relationships
for pkg in "${PACKAGES_TO_BUILD[@]}"; do for pkg in "${PACKAGES_TO_BUILD[@]}"; do
while IFS= read -r dep; do while IFS= read -r dep; do
@@ -298,7 +337,7 @@ else
done done
done < <(get_package_deps "$pkg") done < <(get_package_deps "$pkg")
done done
# Start with packages that have all dependencies met (count = 0) # Start with packages that have all dependencies met (count = 0)
ready_to_build=() ready_to_build=()
for pkg in "${PACKAGES_TO_BUILD[@]}"; do for pkg in "${PACKAGES_TO_BUILD[@]}"; do
@@ -306,7 +345,7 @@ else
ready_to_build+=("$pkg") ready_to_build+=("$pkg")
fi fi
done done
# Build packages as dependencies become available # Build packages as dependencies become available
ORDERED_PACKAGES=() ORDERED_PACKAGES=()
while [[ ${#ready_to_build[@]} -gt 0 ]]; do while [[ ${#ready_to_build[@]} -gt 0 ]]; do
@@ -314,7 +353,7 @@ else
current="${ready_to_build[0]}" current="${ready_to_build[0]}"
ready_to_build=("${ready_to_build[@]:1}") ready_to_build=("${ready_to_build[@]:1}")
ORDERED_PACKAGES+=("$current") ORDERED_PACKAGES+=("$current")
# This package is now built, so packages waiting for it can proceed # This package is now built, so packages waiting for it can proceed
for blocked_pkg in ${blocks_packages[$current]}; do for blocked_pkg in ${blocks_packages[$current]}; do
((unmet_deps_count[$blocked_pkg]--)) ((unmet_deps_count[$blocked_pkg]--))
@@ -323,15 +362,15 @@ else
fi fi
done done
done done
# Check for circular dependencies # Check for circular dependencies
if [[ ${#ORDERED_PACKAGES[@]} -ne ${#PACKAGES_TO_BUILD[@]} ]]; then if [[ ${#ORDERED_PACKAGES[@]} -ne ${#PACKAGES_TO_BUILD[@]} ]]; then
echo "ERROR: Circular dependency detected!" echo "ERROR: Circular dependency detected!"
exit 1 exit 1
fi fi
echo "==> Build order: ${ORDERED_PACKAGES[@]}" echo "==> Build order: ${ORDERED_PACKAGES[@]}"
# Determine which packages need to be installed for other packages being built # Determine which packages need to be installed for other packages being built
declare -A INSTALL_PACKAGES declare -A INSTALL_PACKAGES
for pkg in "${ORDERED_PACKAGES[@]}"; do for pkg in "${ORDERED_PACKAGES[@]}"; do
@@ -343,11 +382,11 @@ else
done done
done < <(get_package_deps "$pkg") done < <(get_package_deps "$pkg")
done done
if [[ ${#INSTALL_PACKAGES[@]} -gt 0 ]]; then if [[ ${#INSTALL_PACKAGES[@]} -gt 0 ]]; then
echo "==> Packages needed as dependencies: ${!INSTALL_PACKAGES[@]}" echo "==> Packages needed as dependencies: ${!INSTALL_PACKAGES[@]}"
fi fi
# Build packages in dependency order # Build packages in dependency order
for pkg in "${ORDERED_PACKAGES[@]}"; do for pkg in "${ORDERED_PACKAGES[@]}"; do
((TOTAL_COUNT++)) ((TOTAL_COUNT++))