zellij-org/zellij · warning

!!! cargo make has been deprecated by zellij !!! Our build

Error message

 !!! cargo make has been deprecated by zellij !!!

Our build system is now `cargo xtask`. Don't worry, you won't have to install
anything!

- To get an overview of the new build tasks, run `cargo xtask --help`
- Quick compatibility table:

| cargo make task                 | cargo xtask equivalent        |
| ------------------------------- | ----------------------------- |
| make                            | xtask                         |
| make format                     | xtask format                  |
| make build                      | xtask build                   |
| make test                       | xtask test                    |
| make run                        | xtask run                     |
| make run -l strider             | xtask run -- -l strider       |
| make install /path/to/binary    | xtask install /path/to/binary |
| make publish                    | xtask publish                 |


In order to disable xtask during the transitioning period: Delete/comment the
`[alias]` section in `.cargo/config.toml` and use `cargo make` as before.
If you're unhappy with `xtask` and decide to disable it, please tell us why so
we can discuss this before making it final for the next release. Thank you!

What it means

Not a failure but a migration notice: zellij replaced cargo-make with cargo xtask, and the deprecated entry point (XtaskCmd::Deprecated, reached via the old `cargo make` alias routing) deliberately returns an error containing a task-mapping table so old scripts stop working and get translated.

Source

Thrown at xtask/src/main.rs:179

    match env::var_os("CARGO_TARGET_DIR") {
        Some(dir) => PathBuf::from(dir),
        None => crate::project_root().join("target"),
    }
}

pub fn cargo() -> anyhow::Result<PathBuf> {
    std::env::var_os("CARGO")
        .map_or_else(|| which::which("cargo"), |exe| Ok(PathBuf::from(exe)))
        .context("Couldn't find 'cargo' executable")
}

// Set terminal title to 'msg'
pub fn status(msg: &str) {
    eprint!("\u{1b}]0;{}\u{07}", msg);
}

fn deprecation_notice() -> anyhow::Result<()> {
    Err(anyhow::anyhow!(
        " !!! cargo make has been deprecated by zellij !!!

Our build system is now `cargo xtask`. Don't worry, you won't have to install
anything!

- To get an overview of the new build tasks, run `cargo xtask --help`
- Quick compatibility table:

| cargo make task                 | cargo xtask equivalent        |
| ------------------------------- | ----------------------------- |
| make                            | xtask                         |
| make format                     | xtask format                  |
| make build                      | xtask build                   |
| make test                       | xtask test                    |
| make run                        | xtask run                     |
| make run -l strider             | xtask run -- -l strider       |
| make install /path/to/binary    | xtask install /path/to/binary |
| make publish                    | xtask publish                 |

View on GitHub (pinned to 98a0837077)

Solutions

  1. Translate the command using the printed table (make build -> `cargo xtask build`, make run -l strider -> `cargo xtask run -- -l strider`, etc.)
  2. Run `cargo xtask --help` to see all available tasks
  3. Update CI pipelines, docs and aliases to the xtask equivalents
  4. To keep cargo make during a transition, comment out the [alias] section in .cargo/config.toml as the notice instructs

Example fix

# before
cargo make build
# -> error: cargo make has been deprecated

# after
cargo xtask build
Defensive patterns

Strategy: fallback

Validate before calling

# translate legacy cargo make calls before they hit xtask
translate() {
  case "$1 $2" in
    'make build') echo 'xtask build';;
    'make test')  echo 'xtask test';;
    'make run')   echo 'xtask run';;
    *) echo "xtask${2:+ $2}";;
  esac
}

Type guard

fn translate_make(args: &[String]) -> Option<Vec<String>> {
    let task = args.first()?;
    let mapped = match task.as_str() {
        "build" => "build", "test" => "test", "format" => "format",
        "run" => "run", "publish" => "publish", _ => return None,
    };
    Some(std::iter::once(mapped.to_string()).chain(args[1..].iter().cloned()).collect())
}

Try / catch

let out = Command::new("cargo").arg("make").output()?;
if !out.status.success() && String::from_utf8_lossy(&out.stderr).contains("cargo make has been deprecated") {
    // fall back to the xtask equivalent parsed from the printed table
    run!("cargo xtask {task}")?;
}

Prevention

When it happens

Trigger: Invoking a deprecated command, e.g. `cargo make build` routed through xtask's compatibility alias, or `cargo xtask <deprecated-subcommand>`.

Common situations: CI pipelines, Makefile-adjacent scripts, or muscle memory still calling cargo make after updating to a newer zellij checkout.

Related errors


AI-assisted analysis of zellij-org/zellij@98a0837077 (2026-08-16). Data as JSON: /api/errors/55aa40aff9cae582. Report an issue: GitHub.