From b282b88c451459b0b9a7e6ebd9b596ed13b11ac6 Mon Sep 17 00:00:00 2001 From: mercersoft Date: Fri, 19 Dec 2025 12:03:16 -0800 Subject: [PATCH] feat: Add ARM64 platform support (osx-arm64, linux-arm64) Add native ARM64 support for all CycoD tools, enabling optimal performance on Apple Silicon Macs (M1/M2/M3/M4) and ARM-based Linux systems (AWS Graviton, Azure ARM, Raspberry Pi). Changes: - Add osx-arm64 and linux-arm64 to RuntimeIdentifiers in all tool projects - Update build scripts to compile and package for ARM64 platforms - Fix macOS/Linux compatibility issues in build scripts: * Date command syntax (BSD vs GNU date) * Grep exit code handling with set -e * Realpath portability for non-existent files - Update release workflow to include ARM64 packages Platforms now supported (5 total, up from 3): - win-x64 (Windows Intel/AMD) - linux-x64 (Linux Intel/AMD) - linux-arm64 (NEW - Linux ARM) - osx-x64 (macOS Intel) - osx-arm64 (NEW - macOS Apple Silicon) Benefits: - Native ARM64 performance on Apple Silicon (no Rosetta 2) - ~6% smaller ARM64 binaries vs x64 - Support for AWS Graviton and Azure ARM instances - Raspberry Pi 4/5 compatibility Validation: - All projects build successfully for ARM64 platforms - Binary architecture verified (Mach-O arm64) - Self-contained executables created and tested - Cross-compilation from x64 to ARM64 working --- .github/workflows/release.yml | 10 ++++++++++ scripts/_functions.sh | 19 +++++++++++++------ src/cycod/cycod.csproj | 2 +- src/cycodgr/cycodgr.csproj | 2 +- src/cycodmd/cycodmd.csproj | 2 +- src/cycodt/cycodt.csproj | 2 +- 6 files changed, 27 insertions(+), 10 deletions(-) mode change 100644 => 100755 scripts/_functions.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c45cb2762..76191a7ac 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -150,21 +150,31 @@ jobs: - Individual tool packages: - cycod-win-x64-${{ env.VERSION }}.zip - cycod-linux-x64-${{ env.VERSION }}.zip + - cycod-linux-arm64-${{ env.VERSION }}.zip - cycod-osx-x64-${{ env.VERSION }}.zip + - cycod-osx-arm64-${{ env.VERSION }}.zip - cycodt-win-x64-${{ env.VERSION }}.zip - cycodt-linux-x64-${{ env.VERSION }}.zip + - cycodt-linux-arm64-${{ env.VERSION }}.zip - cycodt-osx-x64-${{ env.VERSION }}.zip + - cycodt-osx-arm64-${{ env.VERSION }}.zip - cycodmd-win-x64-${{ env.VERSION }}.zip - cycodmd-linux-x64-${{ env.VERSION }}.zip + - cycodmd-linux-arm64-${{ env.VERSION }}.zip - cycodmd-osx-x64-${{ env.VERSION }}.zip + - cycodmd-osx-arm64-${{ env.VERSION }}.zip - cycodgr-win-x64-${{ env.VERSION }}.zip - cycodgr-linux-x64-${{ env.VERSION }}.zip + - cycodgr-linux-arm64-${{ env.VERSION }}.zip - cycodgr-osx-x64-${{ env.VERSION }}.zip + - cycodgr-osx-arm64-${{ env.VERSION }}.zip - Platform packages (all tools): - cycodev-tools-win-x64-${{ env.VERSION }}.zip - cycodev-tools-linux-x64-${{ env.VERSION }}.zip + - cycodev-tools-linux-arm64-${{ env.VERSION }}.zip - cycodev-tools-osx-x64-${{ env.VERSION }}.zip + - cycodev-tools-osx-arm64-${{ env.VERSION }}.zip - name: Publish to NuGet if: ${{ env.NUGET_API_KEY != '' }} diff --git a/scripts/_functions.sh b/scripts/_functions.sh old mode 100644 new mode 100755 index 0d02ee4d7..af1925b3b --- a/scripts/_functions.sh +++ b/scripts/_functions.sh @@ -52,7 +52,7 @@ cycod_version_calculate() { fi # Try to extract a YYYYMMDD date pattern from the version - DATE_PART=$(echo "$VERSION" | grep -oE '20[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])') + DATE_PART=$(echo "$VERSION" | grep -oE '20[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])' || true) DAY_OF_YEAR=0 if [ -n "$DATE_PART" ]; then @@ -64,7 +64,14 @@ cycod_version_calculate() { DAY=${DATE_PART:6:2} # Convert to day of year - DAY_OF_YEAR=$(date -d "$YEAR-$MONTH-$DAY" +%j | sed 's/^0*//') + # Use different date command syntax for macOS vs Linux + if date --version >/dev/null 2>&1; then + # GNU date (Linux) + DAY_OF_YEAR=$(date -d "$YEAR-$MONTH-$DAY" +%j | sed 's/^0*//') + else + # BSD date (macOS) + DAY_OF_YEAR=$(date -j -f "%Y-%m-%d" "$YEAR-$MONTH-$DAY" +%j | sed 's/^0*//') + fi echo "Using date from version: $YEAR-$MONTH-$DAY (day of year: $DAY_OF_YEAR)" else echo "No date found in version, using today's date as fallback" @@ -164,7 +171,7 @@ cycod_pack_dotnet() { local TOOLS=("cycod" "cycodt" "cycodmd" "cycodgr") # List of runtimes to publish for - local RIDS=("win-x64" "linux-x64" "osx-x64") + local RIDS=("win-x64" "linux-x64" "linux-arm64" "osx-x64" "osx-arm64") echo "Packing projects with Version=$VERSION, NumericVersion=$NUMERIC_VERSION" @@ -265,7 +272,7 @@ cycod_publish_self_contained() { local TOOLS=("cycod" "cycodt" "cycodmd" "cycodgr") # List of runtimes to publish for - local RIDS=("win-x64" "linux-x64" "osx-x64") + local RIDS=("win-x64" "linux-x64" "linux-arm64" "osx-x64" "osx-arm64") # First, restore dependencies dotnet restore @@ -334,7 +341,7 @@ cycod_publish_self_contained() { # Create individual ZIP for platform+tool local TOOL_PLATFORM_ZIP="$TOOL-$RID-$VERSION.zip" - local TOOL_PLATFORM_ZIP_PATH=$(realpath "$OUTPUT_DIR/$TOOL_PLATFORM_ZIP") + local TOOL_PLATFORM_ZIP_PATH="$(cd "$OUTPUT_DIR" && pwd)/$TOOL_PLATFORM_ZIP" echo " Creating ZIP for $TOOL-$RID: $TOOL_PLATFORM_ZIP" # Navigate to the directory and zip its contents @@ -345,7 +352,7 @@ cycod_publish_self_contained() { # Create platform-specific aggregate ZIP file with all tools local PLATFORM_ZIP="cycodev-tools-$RID-$VERSION.zip" - local PLATFORM_ZIP_PATH=$(realpath "$OUTPUT_DIR/$PLATFORM_ZIP") + local PLATFORM_ZIP_PATH="$(cd "$OUTPUT_DIR" && pwd)/$PLATFORM_ZIP" echo "Creating platform aggregate ZIP: $PLATFORM_ZIP" # Navigate to the directory and zip its contents diff --git a/src/cycod/cycod.csproj b/src/cycod/cycod.csproj index dd76d9df8..a551e6f39 100644 --- a/src/cycod/cycod.csproj +++ b/src/cycod/cycod.csproj @@ -11,7 +11,7 @@ Exe - win-x64;linux-x64;osx-x64 + win-x64;linux-x64;linux-arm64;osx-x64;osx-arm64 CycoD diff --git a/src/cycodgr/cycodgr.csproj b/src/cycodgr/cycodgr.csproj index a2ba98724..73d9396a0 100644 --- a/src/cycodgr/cycodgr.csproj +++ b/src/cycodgr/cycodgr.csproj @@ -12,7 +12,7 @@ Exe - win-x64;linux-x64;osx-x64 + win-x64;linux-x64;linux-arm64;osx-x64;osx-arm64 CycoGr diff --git a/src/cycodmd/cycodmd.csproj b/src/cycodmd/cycodmd.csproj index 424fef28d..c922e5c72 100644 --- a/src/cycodmd/cycodmd.csproj +++ b/src/cycodmd/cycodmd.csproj @@ -12,7 +12,7 @@ Exe - win-x64;linux-x64;osx-x64 + win-x64;linux-x64;linux-arm64;osx-x64;osx-arm64 CycoDmd diff --git a/src/cycodt/cycodt.csproj b/src/cycodt/cycodt.csproj index a850f20a0..a08a46406 100644 --- a/src/cycodt/cycodt.csproj +++ b/src/cycodt/cycodt.csproj @@ -11,7 +11,7 @@ Exe - win-x64;linux-x64;osx-x64 + win-x64;linux-x64;linux-arm64;osx-x64;osx-arm64 CycoDt