jdx/mise · error

unsupported architecture: {other}

Error message

unsupported architecture: {other}

What it means

While building the hex.pm precompiled URL on Linux, mise maps the platform arch to Bob's build names and only x64→amd64 and arm64→arm64 exist. Any other arch (riscv64, s390x, ppc64le, 32-bit arm/x86) bails here. As with the other precompiled guards it is fatal only when erlang.compile=false; otherwise it falls back to a kerl source build.

Source

Thrown at src/plugins/core/erlang.rs:173

    fn source_archive_url(version: &str) -> String {
        format!(
            "https://github.com/erlang/otp/archive/{}.tar.gz",
            Self::release_tag(version)
        )
    }

    fn source_cache_name(url: &str) -> String {
        format!("otp-source-{}.tar.gz", crate::hash::hash_sha256_to_str(url))
    }

    fn linux_precompiled_base_url(target: &PlatformTarget) -> Result<String> {
        if target.libc() == Some("musl") {
            bail!("precompiled erlang is not supported on musl linux");
        }
        let arch = match target.arch_name() {
            "x64" => "amd64",
            "arm64" => "arm64",
            other => bail!("unsupported architecture: {other}"),
        };
        let os_ver = Self::linux_precompiled_os_version()?;
        Ok(format!("https://builds.hex.pm/builds/otp/{arch}/{os_ver}"))
    }

    async fn linux_precompiled_lock_info(
        version: &str,
        target: &PlatformTarget,
    ) -> Result<PlatformInfo> {
        let base_url = Self::linux_precompiled_base_url(target)?;
        let release_tag = Self::release_tag(version);
        let builds = HTTP_FETCH
            .get_text_cached(format!("{base_url}/builds.txt"))
            .await?;
        let checksum = parse_hex_build_checksum(&builds, &release_tag)?;
        Ok(PlatformInfo {
            url: Some(format!("{base_url}/{release_tag}.tar.gz")),
            checksum: Some(checksum),

View on GitHub (pinned to 6f52dcdf99)

Solutions

  1. Set `mise settings set erlang.compile true` to build OTP from source on that architecture
  2. Check for a stale override: `mise settings get arch` — if it names an exotic arch, `mise settings unset arch`
  3. Run the install on x64/arm64 hardware or an emulation VM that presents as one of those

Example fix

# before
$ mise settings set arch riscv64   # then: mise install erlang@27.1 → unsupported architecture: riscv64

# after
$ mise settings unset arch
$ mise install erlang@27.1
Defensive patterns

Strategy: validation

Validate before calling

# guard exotic arches before install
ARCH=$(mise settings get arch 2>/dev/null || uname -m)
case "$ARCH" in
  x86_64|x64|aarch64|arm64) mise install erlang@27.1 ;;
  *) mise settings set erlang.compile true && mise install erlang@27.1 ;;
esac

Type guard

supported_erlang_arch() { case "${1:-$(uname -m)}" in x86_64|x64|aarch64|arm64) return 0 ;; *) return 1 ;; esac; }

Prevention

When it happens

Trigger: `mise install erlang` on exotic Linux hardware (RISC-V, s390x mainframe, POWER, 32-bit ARM boards), or with `mise settings arch` overridden to such a value; also during lock resolution for a cross-compile PlatformTarget with one of those arches.

Common situations: QEMU-emulated multi-arch CI building erlang for riscv64/armv7; a stray `mise settings set arch riscv64` left in a shared settings file; NixOS on non-x86 workstations.

Related errors


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/f85fc3515447bf37. Report an issue: GitHub.