diff --git a/assets/Icon.svg b/assets/Icon.svg index 8a6cd93..8179e66 100644 --- a/assets/Icon.svg +++ b/assets/Icon.svg @@ -1,5 +1,5 @@ - + @@ -129,17 +129,31 @@ + + + + + + + + + + + + + + - - + + + - - + @@ -193,7 +207,7 @@ - + diff --git a/scripts/android/clean.sh b/scripts/android/clean.sh new file mode 100755 index 0000000..3b5d5d8 --- /dev/null +++ b/scripts/android/clean.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/../.." && pwd)" + +rm -rf "$ROOT/build/android" "$ROOT/build/android-release" +rm -rf "$ROOT/android/app/build" "$ROOT/android/build" "$ROOT/android/.gradle" +rm -rf "$ROOT/android/app/src/main/jniLibs" +for d in "$ROOT/android/app/src/main/res"/mipmap-*; do + [ -d "$d" ] && rm -rf "$d" +done + +if [ "${1:-}" = "--cargo" ]; then + cargo clean --target aarch64-linux-android --release 2>/dev/null || true + cargo clean --target armv7-linux-androideabi --release 2>/dev/null || true +fi + +echo "cleaned: android build, gradle caches, jniLibs, mipmap-* buckets" diff --git a/scripts/android/generate-icons.sh b/scripts/android/generate-icons.sh index b98a73a..c9f5bf5 100755 --- a/scripts/android/generate-icons.sh +++ b/scripts/android/generate-icons.sh @@ -30,6 +30,7 @@ for entry in "${DENSITIES[@]}"; do bucket="${entry%% *}" size="${entry##* }" dir="$RES/mipmap-$bucket" + rm -rf "$dir" mkdir -p "$dir" rsvg-convert --width="$size" --height="$size" "$SVG" -o "$dir/ic_launcher.png" done diff --git a/scripts/ios/clean.sh b/scripts/ios/clean.sh new file mode 100755 index 0000000..a2e4db9 --- /dev/null +++ b/scripts/ios/clean.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/../.." && pwd)" + +rm -rf "$ROOT/build/ios" "$ROOT/build/ios-release" +rm -rf "$ROOT/ios/Assets.xcassets/AppIcon.appiconset" +rm -rf "$ROOT/ios/YrXtals.xcodeproj" + +if [ "${1:-}" = "--cargo" ]; then + cargo clean --target aarch64-apple-ios --release 2>/dev/null || true + cargo clean --target aarch64-apple-ios-sim --release 2>/dev/null || true + cargo clean --target aarch64-apple-ios --profile release-debug 2>/dev/null || true + cargo clean --target aarch64-apple-ios-sim --profile release-debug 2>/dev/null || true +fi + +echo "cleaned: build/ios, build/ios-release, AppIcon.appiconset, YrXtals.xcodeproj" diff --git a/scripts/ios/generate-icons.sh b/scripts/ios/generate-icons.sh index 6835037..9db5973 100755 --- a/scripts/ios/generate-icons.sh +++ b/scripts/ios/generate-icons.sh @@ -16,8 +16,26 @@ if ! command -v rsvg-convert >/dev/null 2>&1; then exit 1 fi +rm -rf "$APPICON" mkdir -p "$APPICON" +WORK_SVG="$(mktemp -t icon-svg.XXXXXX)" +trap 'rm -f "$WORK_SVG"' EXIT + +# pulls the gradient labeled #bg-color and paints it across the whole viewBox under the existing artwork. +BG_FLAG=() +if grep -q 'id="bg-color"' "$SVG"; then + VIEWBOX="$(grep -oE 'viewBox="[^"]+"' "$SVG" | head -1 | sed -E 's/viewBox="//;s/"$//')" + read -r VBX VBY VBW VBH <<<"$VIEWBOX" + INJECT="" + awk -v inj="$INJECT" '/<\/defs>/ {print; print inj; next} {print}' "$SVG" > "$WORK_SVG" + echo "Injected #bg-color full-canvas fill" +else + cp "$SVG" "$WORK_SVG" + BG_FLAG=(--background-color="${YRXTALS_ICON_BG:-black}") + echo "No #bg-color id; falling back to solid ${YRXTALS_ICON_BG:-black}" +fi + SIZES=( "Icon-20.png 20" "Icon-20@2x.png 40" @@ -39,9 +57,18 @@ SIZES=( for entry in "${SIZES[@]}"; do name="${entry%% *}" size="${entry##* }" - rsvg-convert --width="$size" --height="$size" "$SVG" -o "$APPICON/$name" + rsvg-convert "${BG_FLAG[@]}" --width="$size" --height="$size" "$WORK_SVG" -o "$APPICON/$name" done +# strips the alpha channel from the 1024 marketing icon for App Store validation. +if command -v magick >/dev/null 2>&1; then + magick "$APPICON/Icon-1024.png" -alpha remove -alpha off "$APPICON/Icon-1024.png" +elif command -v convert >/dev/null 2>&1; then + convert "$APPICON/Icon-1024.png" -alpha remove -alpha off "$APPICON/Icon-1024.png" +else + echo "WARNING: ImageMagick not on PATH; the 1024 icon still has an alpha channel. brew install imagemagick" >&2 +fi + cat > "$ASSETS/Contents.json" <<'EOF' { "info" : { diff --git a/scripts/ios/release.sh b/scripts/ios/release.sh index 4e53b83..e7593eb 100755 --- a/scripts/ios/release.sh +++ b/scripts/ios/release.sh @@ -75,6 +75,35 @@ if [ -f "$ACTOOL_PARTIAL" ]; then /usr/libexec/PlistBuddy -c "Merge $ACTOOL_PARTIAL" "$APP/Info.plist" 2>/dev/null || true fi +# injects the DT* and BuildMachineOSBuild keys App Store validation demands. +SDK_VER="$(xcrun --sdk "$SDK_NAME" --show-sdk-version)" +SDK_BUILD="$(xcrun --sdk "$SDK_NAME" --show-sdk-build-version)" +XCODE_VER_LINE="$(xcodebuild -version | head -1)" +XCODE_BUILD_LINE="$(xcodebuild -version | grep 'Build version')" +XCODE_VER="$(echo "$XCODE_VER_LINE" | awk '{print $2}')" +XCODE_BUILD="$(echo "$XCODE_BUILD_LINE" | awk '{print $3}')" +IFS='.' read -r XV_MAJ XV_MIN XV_PAT <<< "$XCODE_VER" +XV_MAJ="${XV_MAJ:-0}"; XV_MIN="${XV_MIN:-0}"; XV_PAT="${XV_PAT:-0}" +DT_XCODE="$((XV_MAJ * 100 + XV_MIN * 10 + XV_PAT))" +OS_BUILD="$(sw_vers -buildVersion)" + +set_or_add() { + local key="$1" val="$2" + /usr/libexec/PlistBuddy -c "Set :$key $val" "$APP/Info.plist" 2>/dev/null \ + || /usr/libexec/PlistBuddy -c "Add :$key string $val" "$APP/Info.plist" +} +plutil -replace CFBundleSupportedPlatforms -json '["iPhoneOS"]' "$APP/Info.plist" + +set_or_add BuildMachineOSBuild "$OS_BUILD" +set_or_add DTCompiler com.apple.compilers.llvm.clang.1_0 +set_or_add DTPlatformBuild "$SDK_BUILD" +set_or_add DTPlatformName "$SDK_NAME" +set_or_add DTPlatformVersion "$SDK_VER" +set_or_add DTSDKBuild "$SDK_BUILD" +set_or_add DTSDKName "${SDK_NAME}${SDK_VER}" +set_or_add DTXcode "$DT_XCODE" +set_or_add DTXcodeBuild "$XCODE_BUILD" + RUST_FLAGS=(-import-objc-header "$ROOT/include/yr_xtals.h" -L "$RUST_LIB" -lyr_crystals) echo "Compiling Swift (release, no DEBUG)..." diff --git a/scripts/linux/clean.sh b/scripts/linux/clean.sh new file mode 100755 index 0000000..4052119 --- /dev/null +++ b/scripts/linux/clean.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/../.." && pwd)" + +rm -rf "$ROOT/build" "$ROOT/target" /tmp/yr_crystals-target + +echo "cleaned: build/, target/, /tmp/yr_crystals-target" diff --git a/scripts/macos/clean.sh b/scripts/macos/clean.sh new file mode 100755 index 0000000..4052119 --- /dev/null +++ b/scripts/macos/clean.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/../.." && pwd)" + +rm -rf "$ROOT/build" "$ROOT/target" /tmp/yr_crystals-target + +echo "cleaned: build/, target/, /tmp/yr_crystals-target" diff --git a/xtask/src/main.rs b/xtask/src/main.rs index ef75f67..28ce2be 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -118,6 +118,9 @@ fn print_help() { eprintln!(" generate-icons-android rasterize assets/Icon.svg into android mipmap buckets"); eprintln!(" xcodeproj-ios generate ios/YrXtals.xcodeproj via xcodegen"); eprintln!(" release-ios build an App Store-signed .ipa for Transporter"); + eprintln!(" clean wipe build/, target/, /tmp/yr_crystals-target"); + eprintln!(" clean-ios wipe iOS build dirs + generated assets (--cargo also runs cargo clean)"); + eprintln!(" clean-android wipe android build dirs + generated assets (--cargo also runs cargo clean)"); eprintln!(); eprintln!("append -macos / -windows / -linux / -ios / -android to force a platform."); eprintln!("trailing args pass through to the script — iOS scripts take [sim|device].");