jdx/mise · error

precompiled erlang is not supported on {os}

Error message

precompiled erlang is not supported on {os}

What it means

During lock resolution (mise lock / locked installs), if the target OS is neither linux, macos, nor windows — e.g. freebsd/openbsd — and erlang.compile=false is set, mise bails: no precompiled source exists for that OS and compilation is disallowed. With compile unset, the same case records source-build lock info instead, so this only fires under an explicit compile=false policy.

Source

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

                    Err(err) if compile == Some(false) => Err(err),
                    Err(_) => self.resolve_source_lock_info(&tv.version).await,
                }
            }
            "windows" => {
                let info = match Self::windows_asset_name(&tv.version, target) {
                    Ok(asset_name) => {
                        Self::github_asset_lock_info("erlang/otp", &release_tag, &asset_name).await
                    }
                    Err(err) => Err(err),
                };
                match info {
                    Ok(info) => Ok(info),
                    Err(err) if compile == Some(false) => Err(err),
                    Err(_) => self.resolve_source_lock_info(&tv.version).await,
                }
            }
            os if compile == Some(false) => {
                bail!("precompiled erlang is not supported on {os}")
            }
            _ => self.resolve_source_lock_info(&tv.version).await,
        }
    }
}

fn source_build_kerl_env(
    install_env: IndexMap<String, crate::config::env_directive::EnvValue>,
    kerl_base_dir: &Path,
) -> IndexMap<String, Option<OsString>> {
    let mut env = install_env
        .into_iter()
        .map(|(key, value)| (key, value.into_string().map(OsString::from)))
        .collect::<IndexMap<_, _>>();
    // Source lock metadata resolves a GitHub archive and stages it here. Keep
    // kerl from selecting another backend or download directory and silently
    // building a different archive instead.
    env.insert(

View on GitHub (pinned to 6f52dcdf99)

Solutions

  1. Allow source builds on BSD: `mise settings set erlang.compile true` (kerl supports building on FreeBSD)
  2. Scope the compile=false setting to platforms that actually have precompiled builds instead of setting it globally
  3. Manage Erlang via the BSD ports/packages on those hosts

Example fix

# before (~/.config/mise/settings.toml)
[erlang]
compile = false   # on FreeBSD → precompiled erlang is not supported on freebsd

# after
[erlang]
compile = true
Defensive patterns

Strategy: validation

Validate before calling

# don't apply a global compile=false on OSes that have no precompiled OTP
UNAME=$(uname -s)
if [ "$UNAME" != "Linux" ] && [ "$UNAME" != "Darwin" ]; then
  mise settings set erlang.compile true   # BSD etc: source builds only
fi
mise install erlang@27.1

Prevention

When it happens

Trigger: `mise lock` or `mise install --locked` (or settings.locked=true) on a FreeBSD/OpenBSD host with `mise settings get erlang.compile` == false; generating a cross-platform lock entry whose PlatformTarget OS is freebsd.

Common situations: FreeBSD CI jails with reproducibility-oriented settings copied from Linux; lock matrices that enumerate BSD targets.

Related errors


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