How to Fix: Compiler error: failed to run custom build command for `ittapi-sys v0.4.0`
Fixing failed to run custom build command for ittapi-sys v0.4.0 when compiling wasi-webgpu-runtime
This error usually means the Rust build is not failing in your application code at all—it is failing inside a native dependency build script. In this case, wasmtime 21.0.1 pulls in ittapi-sys, and that crate may try to compile or configure Intel ITT API support on a system where the required native toolchain, headers, platform assumptions, or feature expectations do not line up.
Table of Contents
Understanding the Root Cause
The key detail is that ittapi-sys is a -sys crate. In Rust, sys crates are thin bindings around native C or C++ libraries and often include a build.rs script. That build script runs before compilation and is responsible for tasks such as:
- Detecting the target platform
- Invoking cmake, clang, gcc, or another native compiler
- Generating bindings or compiling bundled C/C++ source
- Linking platform-specific native libraries
When you build wasi-webgpu-runtime, the dependency graph includes wasmtime. In some environments, the version 21.0.1 enables dependency paths that include ittapi-sys v0.4.0. The failure generally happens for one of these technical reasons:
- Your system is missing a required C/C++ build toolchain
- The build script expects tools like cmake or pkg-config that are not installed
- You are building on a platform or target triple that ittapi-sys does not handle cleanly
- A transitive dependency enables profiling/tracing support that is optional but not actually needed for your runtime
- The crate versions in the lockfile pull in a combination that is known to be fragile on your OS
In practical terms, the fastest fix is usually one of these:
- Install the missing native build tools
- Disable the feature chain that pulls in ittapi-sys
- Pin or update the relevant crate versions so Cargo resolves a safer dependency set
Step-by-Step Solution
Use the following workflow to identify exactly why the build script fails and then remove the cause.
1. Inspect the full build failure
Start by rerunning the build with verbose output:
cargo clean
cargo build -vv
Also inspect the dependency tree to confirm where ittapi-sys is coming from:
cargo tree -i ittapi-sys
cargo tree -i wasmtime
If the tree shows that ittapi-sys is pulled in by a profiling or tracing-related dependency path, you may be able to disable that feature entirely.
2. Install the required native toolchain
On Linux, make sure the basic native toolchain is present. Typical requirements include clang, gcc, g++, make, cmake, and pkg-config.
Ubuntu/Debian:
sudo apt update
sudo apt install -y build-essential clang cmake pkg-config perl git
Fedora:
sudo dnf groupinstall -y "Development Tools"
sudo dnf install -y clang cmake pkgconf-pkg-config perl git
Arch Linux:
sudo pacman -S --needed base-devel clang cmake pkgconf perl git
macOS with Homebrew:
xcode-select --install
brew install cmake pkg-config llvm
Windows with MSVC toolchain:
rustup default stable-x86_64-pc-windows-msvc
rustup toolchain install stable
cargo build -vv
If you are on Windows, ensure you are building from a shell with Visual Studio Build Tools available.
3. Verify Rust target/toolchain compatibility
Make sure your Rust installation is healthy and matches the project requirements:
rustup update
rustup show
rustc --version
cargo --version
If the project expects a specific toolchain, use it explicitly:
rustup override set stable
Or, if the repository includes a pinned toolchain file, sync to that version before retrying the build.
4. Try disabling unnecessary wasmtime features
If your project does not need Intel tracing support, the cleanest fix is often to avoid enabling the dependency path that drags in ittapi-sys. Check your Cargo.toml for broad feature usage such as default features on wasmtime.
For example, replace a broad dependency declaration like this:
[dependencies]
wasmtime = "21.0.1"
With a more explicit feature set:
[dependencies]
wasmtime = { version = "21.0.1", default-features = false, features = ["cranelift", "runtime", "component-model"] }
The exact features depend on what wasi-webgpu-runtime needs, but the idea is the same: disable default features and re-enable only the minimum required ones.
After changing features, update and rebuild:
cargo update
cargo clean
cargo build -vv
5. Pin or update the dependency graph
If the issue is caused by a bad crate combination in the lockfile, try updating only the affected packages:
cargo update -p wasmtime
cargo update -p ittapi-sys
If the repository is meant to work with a specific revision, reset to the maintainer-approved lockfile:
git checkout -- Cargo.lock
cargo build -vv
If you maintain the project yourself, you can also pin a known-good version in Cargo.toml or by using a workspace-level patch.
6. Test whether the build works without the problematic transitive dependency
Use Cargo tree output to identify which feature path introduces ittapi-sys. Then remove or narrow that dependency temporarily to confirm the diagnosis.
cargo tree -e features | grep -i ittapi
cargo tree -e features | grep -i wasmtime
If removing a feature makes the build succeed, you have confirmed this is a feature-resolution problem, not a general compiler problem.
7. Rebuild in a clean environment
Sometimes the issue comes from stale target artifacts or mixed toolchains. Rebuild from scratch:
rm -rf target
cargo clean
cargo build -vv
If you use containers or CI, test in a minimal reproducible environment to avoid local machine drift.
8. If needed, patch the dependency temporarily
When a transitive crate is the blocker and upstream has already fixed it, you can temporarily patch to a working Git revision or newer release.
[patch.crates-io]
ittapi-sys = { git = "https://github.com/rust-lang/ittapi-rs", rev = "<known-good-commit>" }
Use this only if you have verified the fix and understand the dependency impact. For most users, feature reduction or toolchain installation is safer.
9. Recommended practical fix for this issue
For this specific error pattern with wasmtime 21.0.1, the most reliable approach is:
- Install the full native build toolchain
- Inspect whether wasmtime is being built with unnecessary default features
- Disable default features and enable only what the runtime requires
- Refresh the dependency graph and rebuild
A minimal example:
[dependencies]
wasmtime = { version = "21.0.1", default-features = false, features = ["runtime", "cranelift", "component-model"] }
cargo clean
cargo update
cargo build -vv
Common Edge Cases
Cross-compiling to WASI or non-host targets
If you are building for a WASI target or another non-native target, remember that build scripts run on the host, not the final target. That means you need a working host C/C++ toolchain even if the Rust target is WebAssembly-related.
Using the wrong linker or CC/CXX environment variables
Custom environment variables can break native crate builds:
echo $CC
echo $CXX
echo $AR
echo $CFLAGS
echo $CXXFLAGS
If these point to incompatible tools, unset them and retry:
unset CC CXX AR CFLAGS CXXFLAGS
cargo clean
cargo build -vv
Old CMake or LLVM versions
Some native crates assume newer build tooling. If your machine has an outdated cmake or clang, the build script may fail even though the tools exist.
CI images missing development packages
It may work locally but fail in GitHub Actions, Docker, or another CI system because the image lacks build-essential, clang, or pkg-config. Always compare the local and CI environments.
Feature unification in Cargo workspaces
In a workspace, another crate may enable broader wasmtime features than you expect. Cargo unifies features across the dependency graph, so a seemingly unrelated crate can trigger ittapi-sys.
FAQ
Why does a Rust project fail in a C/C++ build script?
Because many Rust crates, especially sys crates, wrap native libraries. Their build.rs scripts compile or link native code before Rust compilation proceeds.
Is ittapi-sys required for wasi-webgpu-runtime?
Usually not directly. It is often a transitive dependency introduced by wasmtime features or profiling-related internals. If your runtime does not need that functionality, disabling unnecessary features is often the best fix.
Should I update wasmtime or pin it?
If the repository is known to work with a specific Cargo.lock, pinning is safer. If the lockfile is already broken on your platform, updating the affected packages may help. Prefer the smallest change first: inspect features, verify toolchains, then update or patch only if necessary.
If you still hit the same error after these steps, capture the exact build.rs stderr output from cargo build -vv. That output usually reveals whether the real problem is a missing compiler, unsupported platform branch, broken feature resolution, or an upstream crate bug.