Configuring Your Crate's Docs.rs Build Targets: A Step-by-Step Guide

From Stripgay, the free encyclopedia of technology

Introduction

Starting on May 1, 2026, docs.rs will change its default build behavior. Instead of building documentation for five targets automatically, it will build only for the default target (x86_64-unknown-linux-gnu) unless you explicitly specify additional targets in your Cargo.toml. This change reduces build times and saves resources on docs.rs, as most crates compile the same code across different targets. This guide will walk you through understanding the change, checking your current setup, and configuring your crate to ensure your documentation builds correctly for all the targets you need. This change affects only new releases and rebuilds of old releases after the cutoff date.

Configuring Your Crate's Docs.rs Build Targets: A Step-by-Step Guide
Source: blog.rust-lang.org

What You Need

  • A Rust crate with a Cargo.toml file
  • Familiarity with docs.rs metadata ([package.metadata.docs.rs])
  • Basic understanding of Rust target triples (e.g., x86_64-unknown-linux-gnu)
  • Access to your crate's repository to edit Cargo.toml

Step-by-Step Guide

Step 1: Check If Your Crate Currently Uses Multiple Targets

Before the May 2026 change, if your Cargo.toml does not include a targets list in the docs.rs metadata, docs.rs builds documentation for a default set of five targets. These are common desktop platforms, such as x86_64-pc-windows-msvc and i686-unknown-linux-gnu. After the change, only the default target will be built unless you explicitly define a list. To see if your crate currently relies on the old default behavior, look at your [package.metadata.docs.rs] section in Cargo.toml. If there is no targets key, you are using the old default. If there is a targets list, your crate already specifies exactly which platforms to build for.

Step 2: Determine Your Default Target

If you do not set a default-target in your docs.rs metadata, docs.rs uses the target of its build servers: x86_64-unknown-linux-gnu. You can change this default to any target you prefer by adding the following to your Cargo.toml:

[package.metadata.docs.rs]
default-target = "x86_64-apple-darwin"

This overrides the server default. If you only need documentation for one target, setting default-target is sufficient and you do not need to define a targets list.

Step 3: Explicitly List All Targets If You Need More Than One

If your crate requires documentation for multiple platforms, you must now list every target explicitly using the targets key. For example:

[package.metadata.docs.rs]
targets = [
    "x86_64-unknown-linux-gnu",
    "x86_64-apple-darwin",
    "x86_64-pc-windows-msvc",
    "i686-unknown-linux-gnu",
    "i686-pc-windows-msvc"
]

When you set targets, docs.rs builds documentation only for those targets—it no longer adds any extra ones. Make sure you include the default target if you still want it. You can include any target that the Rust toolchain supports; only the default behavior is changing.

Step 4: Verify Your Configuration

After updating your Cargo.toml, commit and push the changes to your repository. The next time you publish a new release or trigger a rebuild of an existing release, docs.rs will use your new settings. You can monitor the build status on the docs.rs page for your crate. If you set both default-target and targets, the targets list takes precedence for which platforms are built, but default-target may still be used as a fallback for certain features (like the default link target). It's best to keep them consistent.

Step 5: Plan for Future Releases

Remember that this change only applies to new releases and rebuilds of old releases after May 1, 2026. Existing documentation for releases before that date remains unchanged. For all future releases, ensure your [package.metadata.docs.rs] section is correctly configured. If you are unsure which targets you actually need, review your crate's code for conditional compilation (cfg attributes) that target specific platforms. Most crates do not need multiple targets, so sticking with a single default target is the simplest approach.

Tips and Best Practices

  • Check if you really need multiple targets. Many crates compile identical code across platforms. If your crate does not use cfg(target_os) or similar attributes, you likely only need the default target.
  • Use default-target to customize the single platform. If you only need documentation for, say, macOS, set default-target = "x86_64-apple-darwin". This avoids the overhead of listing many targets.
  • Keep your targets list minimal. Each extra target increases build time and resource usage. Only include platforms your crate actually supports.
  • Remember that any Rust target is available. You can use aarch64-unknown-linux-gnu, wasm32-unknown-unknown, etc. as long as the Rust toolchain includes them.
  • Test your configuration. You can simulate the build locally with cargo doc --target <triple> to ensure your crate compiles for each listed target before publishing.
  • Refer to the official docs.rs documentation for advanced metadata options like features and rustc-args.

By following these steps, you'll ensure your crate's documentation builds smoothly after the May 2026 change, with exactly the targets you need—no more, no less.