|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +set -euo pipefail |
| 4 | + |
| 5 | +# Configurable variables (can be set via env) |
| 6 | +XCODE_APP_PATH="${XCODE_APP_PATH:-/root/xcode/Xcode.app}" |
| 7 | +XCODE_XIP_PATH="${XCODE_XIP_PATH:-/root/files/Xcode_${XCODE_SDKV}.xip}" |
| 8 | +EXTRACT_FROM_XIP="${EXTRACT_FROM_XIP:-1}" |
| 9 | + |
| 10 | +OUT_DIR="${OUT_DIR:-/root/files}" |
| 11 | + |
| 12 | +# SDK versions (should be set via env or Dockerfile) |
| 13 | +OSX_SDKV="${OSX_SDKV:-}" |
| 14 | +IOS_SDKV="${IOS_SDKV:-}" |
| 15 | +TVOS_SDKV="${TVOS_SDKV:-}" |
| 16 | +VISIONOS_SDKV="${VISIONOS_SDKV:-}" |
| 17 | + |
| 18 | +# Which SDKs to extract (set to 1 to enable) |
| 19 | +# Note: These defaults are overridden below based on execution context |
| 20 | + |
| 21 | +# Optionally extract Xcode.app from .xip if needed |
| 22 | +if [[ "$EXTRACT_FROM_XIP" == "1" ]]; then |
| 23 | + mkdir -p /root/xcode |
| 24 | + cd /root/xcode |
| 25 | + xar -xf "$XCODE_XIP_PATH" |
| 26 | + /root/pbzx/pbzx -n Content | cpio -i |
| 27 | + XCODE_APP_PATH="/root/xcode/Xcode.app" |
| 28 | +fi |
| 29 | + |
| 30 | +if [[ "${EXTRACT_FROM_XIP:-1}" == "1" ]]; then |
| 31 | + EXTRACT_MACOS="${EXTRACT_MACOS:-1}" |
| 32 | + EXTRACT_IOS="${EXTRACT_IOS:-1}" |
| 33 | + EXTRACT_IOS_SIM="${EXTRACT_IOS_SIM:-1}" |
| 34 | + EXTRACT_TVOS="${EXTRACT_TVOS:-1}" |
| 35 | + EXTRACT_TVOS_SIM="${EXTRACT_TVOS_SIM:-1}" |
| 36 | + EXTRACT_VISIONOS="${EXTRACT_VISIONOS:-1}" |
| 37 | + EXTRACT_VISIONOS_SIM="${EXTRACT_VISIONOS_SIM:-1}" |
| 38 | +else |
| 39 | + # When called manually, require explicit SDK selection |
| 40 | + EXTRACT_MACOS="${EXTRACT_MACOS:-0}" |
| 41 | + EXTRACT_IOS="${EXTRACT_IOS:-0}" |
| 42 | + EXTRACT_IOS_SIM="${EXTRACT_IOS_SIM:-0}" |
| 43 | + EXTRACT_TVOS="${EXTRACT_TVOS:-0}" |
| 44 | + EXTRACT_TVOS_SIM="${EXTRACT_TVOS_SIM:-0}" |
| 45 | + EXTRACT_VISIONOS="${EXTRACT_VISIONOS:-0}" |
| 46 | + EXTRACT_VISIONOS_SIM="${EXTRACT_VISIONOS_SIM:-0}" |
| 47 | +fi |
| 48 | + |
| 49 | +extract_and_pack() { |
| 50 | + local sdk_dir="$1" |
| 51 | + local sdk_name="$2" |
| 52 | + local versioned_name="$3" |
| 53 | + local tar_name="$4" |
| 54 | + |
| 55 | + if [[ -d "$sdk_dir/$sdk_name" ]]; then |
| 56 | + |
| 57 | + # Use tar to copy and preserve everything, then repackage |
| 58 | + echo "=== Copying SDK using tar to preserve special files ===" |
| 59 | + cd "$sdk_dir" |
| 60 | + tar -cf - "$sdk_name" | (cd "/tmp" && tar -xf -) |
| 61 | + |
| 62 | + # Rename to versioned name |
| 63 | + mv "/tmp/$sdk_name" "/tmp/$versioned_name" |
| 64 | + |
| 65 | + # Verify SDKSettings.json exists and has content |
| 66 | + if [[ -f "/tmp/$versioned_name/SDKSettings.json" ]]; then |
| 67 | + echo "=== SDKSettings.json found, size: $(wc -c < "/tmp/$versioned_name/SDKSettings.json") bytes ===" |
| 68 | + echo "=== MD5 check ===" |
| 69 | + echo "Source file MD5: $(md5sum "$sdk_dir/$sdk_name/SDKSettings.json" | cut -d' ' -f1)" |
| 70 | + echo "Copied file MD5: $(md5sum "/tmp/$versioned_name/SDKSettings.json" | cut -d' ' -f1)" |
| 71 | + else |
| 72 | + echo "⚠️ Warning: SDKSettings.json not found in extracted SDK" |
| 73 | + fi |
| 74 | + |
| 75 | + # Create tar with versioned directory name |
| 76 | + tar -cJf "$OUT_DIR/$tar_name" -C "/tmp" "$versioned_name" |
| 77 | + |
| 78 | + # Clean up temporary directory |
| 79 | + rm -rf "/tmp/$versioned_name" |
| 80 | + |
| 81 | + echo "✓ Packed $tar_name" |
| 82 | + else |
| 83 | + echo "✗ SDK not found: $sdk_dir/$sdk_name" |
| 84 | + exit 1 |
| 85 | + fi |
| 86 | +} |
| 87 | + |
| 88 | +# macOS SDK |
| 89 | +if [[ "$EXTRACT_MACOS" == "1" ]]; then |
| 90 | + extract_and_pack \ |
| 91 | + "$XCODE_APP_PATH/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs" \ |
| 92 | + "MacOSX.sdk" \ |
| 93 | + "MacOSX${OSX_SDKV}.sdk" \ |
| 94 | + "MacOSX${OSX_SDKV}.sdk.tar.xz" |
| 95 | +fi |
| 96 | + |
| 97 | +# iOS SDK |
| 98 | +if [[ "$EXTRACT_IOS" == "1" ]]; then |
| 99 | + extract_and_pack \ |
| 100 | + "$XCODE_APP_PATH/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs" \ |
| 101 | + "iPhoneOS.sdk" \ |
| 102 | + "iPhoneOS${IOS_SDKV}.sdk" \ |
| 103 | + "iPhoneOS${IOS_SDKV}.sdk.tar.xz" |
| 104 | +fi |
| 105 | + |
| 106 | +# iOS Simulator SDK |
| 107 | +if [[ "$EXTRACT_IOS_SIM" == "1" ]]; then |
| 108 | + extract_and_pack \ |
| 109 | + "$XCODE_APP_PATH/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs" \ |
| 110 | + "iPhoneSimulator.sdk" \ |
| 111 | + "iPhoneSimulator${IOS_SDKV}.sdk" \ |
| 112 | + "iPhoneSimulator${IOS_SDKV}.sdk.tar.xz" |
| 113 | +fi |
| 114 | + |
| 115 | +# tvOS SDK |
| 116 | +if [[ "$EXTRACT_TVOS" == "1" ]]; then |
| 117 | + extract_and_pack \ |
| 118 | + "$XCODE_APP_PATH/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs" \ |
| 119 | + "AppleTVOS.sdk" \ |
| 120 | + "AppleTVOS${TVOS_SDKV}.sdk" \ |
| 121 | + "AppleTVOS${TVOS_SDKV}.sdk.tar.xz" |
| 122 | +fi |
| 123 | + |
| 124 | +# tvOS Simulator SDK |
| 125 | +if [[ "$EXTRACT_TVOS_SIM" == "1" ]]; then |
| 126 | + extract_and_pack \ |
| 127 | + "$XCODE_APP_PATH/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs" \ |
| 128 | + "AppleTVSimulator.sdk" \ |
| 129 | + "AppleTVSimulator${TVOS_SDKV}.sdk" \ |
| 130 | + "AppleTVSimulator${TVOS_SDKV}.sdk.tar.xz" |
| 131 | +fi |
| 132 | + |
| 133 | +# visionOS SDK |
| 134 | +if [[ "$EXTRACT_VISIONOS" == "1" ]]; then |
| 135 | + extract_and_pack \ |
| 136 | + "$XCODE_APP_PATH/Contents/Developer/Platforms/XROS.platform/Developer/SDKs" \ |
| 137 | + "XROS.sdk" \ |
| 138 | + "XROS${VISIONOS_SDKV}.sdk" \ |
| 139 | + "XROS${VISIONOS_SDKV}.sdk.tar.xz" |
| 140 | +fi |
| 141 | + |
| 142 | +# visionOS Simulator SDK |
| 143 | +if [[ "$EXTRACT_VISIONOS_SIM" == "1" ]]; then |
| 144 | + extract_and_pack \ |
| 145 | + "$XCODE_APP_PATH/Contents/Developer/Platforms/XRSimulator.platform/Developer/SDKs" \ |
| 146 | + "XRSimulator.sdk" \ |
| 147 | + "XRSimulator${VISIONOS_SDKV}.sdk" \ |
| 148 | + "XRSimulator${VISIONOS_SDKV}.sdk.tar.xz" |
| 149 | +fi |
| 150 | + |
| 151 | +echo "Done extracting selected SDKs." |
0 commit comments