From f0661b4ea421fa4508cd3725edc1dd8a10a59429 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Fri, 28 Aug 2026 22:49:58 -0600 Subject: [PATCH] feat: Support Linux ARM64 GNU --- .github/workflows/release.yaml | 5 ++++- scripts/install_coyote.ps1 | 27 +++++++++++---------------- scripts/install_coyote.sh | 24 ++++++++++-------------- src/config/update.rs | 2 +- 4 files changed, 26 insertions(+), 32 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index b53de66..771a71b 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -166,6 +166,9 @@ jobs: os: ubuntu-latest use-cross: true cargo-flags: '' + - target: aarch64-unknown-linux-gnu + os: ubuntu-24.04-arm + cargo-flags: '' - target: aarch64-apple-darwin os: macos-latest use-cross: true @@ -253,7 +256,7 @@ jobs: run: echo "BUILD_CMD=cross" >> $GITHUB_ENV - name: Install latest LLVM/Clang - if: matrix.os == 'ubuntu-latest' + if: startsWith(matrix.os, 'ubuntu') run: | wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh diff --git a/scripts/install_coyote.ps1 b/scripts/install_coyote.ps1 index b222bd6..5f8a27c 100644 --- a/scripts/install_coyote.ps1 +++ b/scripts/install_coyote.ps1 @@ -61,24 +61,19 @@ if ($os -eq 'windows') { if ($arch -eq 'x86_64') { $candidates += 'coyote-x86_64-apple-darwin.tar.gz' } else { $candidates += 'coyote-aarch64-apple-darwin.tar.gz' } } elseif ($os -eq 'linux') { - if ($arch -eq 'x86_64') { - # Mirror install_coyote.sh: only offer the gnu build when glibc is detected. - $libc = 'musl' - try { getconf GNU_LIBC_VERSION *> $null; if ($LASTEXITCODE -eq 0) { $libc = 'gnu' } } catch { } - try { if ((ldd --version 2>&1 | Out-String) -imatch 'glibc') { $libc = 'gnu' } } catch { } - if ($libc -eq 'gnu') { - $libssl3 = $false - try { if ((ldconfig -p 2>&1 | Out-String) -match 'libssl\.so\.3') { $libssl3 = $true } } catch { } - if ($libssl3) { - $candidates += 'coyote-x86_64-unknown-linux-gnu.tar.gz' - } else { - Write-Info "glibc detected but OpenSSL 3 (libssl.so.3) not found; using musl build" - } + $libc = 'musl' + try { getconf GNU_LIBC_VERSION *> $null; if ($LASTEXITCODE -eq 0) { $libc = 'gnu' } } catch { } + try { if ((ldd --version 2>&1 | Out-String) -imatch 'glibc') { $libc = 'gnu' } } catch { } + if ($libc -eq 'gnu') { + $libssl3 = $false + try { if ((ldconfig -p 2>&1 | Out-String) -match 'libssl\.so\.3') { $libssl3 = $true } } catch { } + if ($libssl3) { + $candidates += "coyote-$arch-unknown-linux-gnu.tar.gz" + } else { + Write-Info "glibc detected but OpenSSL 3 (libssl.so.3) not found; using musl build" } - $candidates += 'coyote-x86_64-unknown-linux-musl.tar.gz' - } else { - $candidates += 'coyote-aarch64-unknown-linux-musl.tar.gz' } + $candidates += "coyote-$arch-unknown-linux-musl.tar.gz" } else { Fail "Unsupported OS for this installer: $os" } diff --git a/scripts/install_coyote.sh b/scripts/install_coyote.sh index 18ace5f..b6c6e58 100755 --- a/scripts/install_coyote.sh +++ b/scripts/install_coyote.sh @@ -116,23 +116,19 @@ if [[ "$OS" == "darwin" ]]; then ASSET_CANDIDATES+=("coyote-aarch64-apple-darwin.tar.gz") fi elif [[ "$OS" == "linux" ]]; then - if [[ "$ARCH" == "x86_64" ]]; then - LIBC="musl" - if command -v getconf >/dev/null 2>&1 && getconf GNU_LIBC_VERSION >/dev/null 2>&1; then LIBC="gnu"; fi - if ldd --version 2>&1 | grep -qi glibc; then LIBC="gnu"; fi + LIBC="musl" + if command -v getconf >/dev/null 2>&1 && getconf GNU_LIBC_VERSION >/dev/null 2>&1; then LIBC="gnu"; fi + if ldd --version 2>&1 | grep -qi glibc; then LIBC="gnu"; fi - if [[ "$LIBC" == "gnu" ]]; then - if ldconfig -p 2>/dev/null | grep -q 'libssl\.so\.3'; then - ASSET_CANDIDATES+=("coyote-x86_64-unknown-linux-gnu.tar.gz") - else - log "glibc detected but OpenSSL 3 (libssl.so.3) not found; using musl build" - fi + if [[ "$LIBC" == "gnu" ]]; then + if ldconfig -p 2>/dev/null | grep -q 'libssl\.so\.3'; then + ASSET_CANDIDATES+=("coyote-${ARCH}-unknown-linux-gnu.tar.gz") + else + log "glibc detected but OpenSSL 3 (libssl.so.3) not found; using musl build" fi - - ASSET_CANDIDATES+=("coyote-x86_64-unknown-linux-musl.tar.gz") - else - ASSET_CANDIDATES+=("coyote-aarch64-unknown-linux-musl.tar.gz") fi + + ASSET_CANDIDATES+=("coyote-${ARCH}-unknown-linux-musl.tar.gz") else echo "Error: unsupported OS for this installer: $OS" >&2; exit 1 fi diff --git a/src/config/update.rs b/src/config/update.rs index 9e074a7..0901ab1 100644 --- a/src/config/update.rs +++ b/src/config/update.rs @@ -72,7 +72,7 @@ fn preferred_update_target() -> Option<&'static str> { match (env::consts::OS, env::consts::ARCH) { ("linux", "x86_64") if cfg!(target_env = "gnu") => Some("x86_64-unknown-linux-gnu"), ("linux", "x86_64") => Some("x86_64-unknown-linux-musl"), - // No aarch64 gnu asset is published; musl is the only option. + ("linux", "aarch64") if cfg!(target_env = "gnu") => Some("aarch64-unknown-linux-gnu"), ("linux", "aarch64") => Some("aarch64-unknown-linux-musl"), _ => None, }