Skip to content

Commit

Permalink
Add help page for build failures (#8286)
Browse files Browse the repository at this point in the history
  • Loading branch information
konstin authored Oct 22, 2024
1 parent 0dd4d01 commit 614013e
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
62 changes: 62 additions & 0 deletions docs/reference/build_failures.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Build failures

This page lists common reasons why resolution and installation fails with a build error and how to
fix them.

### Why does uv build a package?

When generating the cross-platform lockfile, uv needs to determine the dependencies of all packages,
even those only installed on other platforms. uv tries to avoid package builds during resolution. It
uses any wheel if exist for that version, then tries to find static metadata in the source
distribution (mainly pyproject.toml with static `project.version`, `project.dependencies` and
`project.optional-dependencies` or METADATA of at least version 2.2). Only if all of that fails, it
builds the package.

When installing, uv needs to have a wheel for the current platform for each package. If no matching
wheel exists in the index, uv tries to build the source distribution.

You can check which wheels exist for a PyPI project under “Download Files”, e.g.
https://pypi.org/project/numpy/2.1.1/#files. Wheels with `...-py3-none-any.whl` filenames work
everywhere, others have the operating system and platform in the filename. For the linked numpy
version, you can see that Python 3.10 to 3.13 on MacOS, Linux and Windows are supported.

### Fixes and Workarounds

- If the build error mentions a missing header or library, there is often a matching package in your
system package manager.

Example: When `uv pip install mysqlclient==2.2.4` fails on Ubuntu, you need to run
`sudo apt install default-libmysqlclient-dev build-essential pkg-config` to install the MySQL
headers ([https://pypi.org/project/mysqlclient/2.2.4/](https://pypi.org/project/mysqlclient/2.2.4/#Linux))

- If the build error mentions a failing import, consider
[deactivating build isolation](https://docs.astral.sh/uv/concepts/projects/#build-isolation).
- If a package fails to build during resolution and the version that failed to build is older than
the version you want to use, try adding a
[constraint](https://docs.astral.sh/uv/reference/settings/#constraint-dependencies) with a lower
bound (e.g. `numpy>=1.17`). Sometimes, due to algorithmic limitations, the uv resolver tries to
find a fitting version using unreasonably old packages, which can be prevented by using lower
bounds.
- Consider using a different Python version for locking and/or installation (`-p`). If you are using
an older Python version, you may need to use an older version of certain packages with native code
too, especially for scientific code. Example: torch 1.12.0 support Python 3.7 to 3.10
(https://pypi.org/project/torch/1.12.0/#files), while numpy 2.1.0 supports Python 3.10 to 3.13
(https://numpy.org/doc/stable/release/2.1.0-notes.html#numpy-2-1-0-release-notes), so both
together mean you need Python 3.10 (or upgrade torch).
- If locking fails due to building a package from a platform you do not support, consider
[declaring resolver environments](https://docs.astral.sh/uv/reference/settings/#environments) with
your supported platforms.
- If you support a large range of Python versions, consider using markers to use older versions for
older Python versions and newer versions for newer Python version. In the example, numpy tends to
support four Python minor version at a time, so to support Python 3.8 to 3.13, the versions need
to be split:

```
numpy>=1.23; python_version >= "3.10"
numpy<1.23; python_version < "3.10"
```

- If locking fails due to building a package from a different platform, as an escape hatch you can
[provide dependency metadata manually](https://docs.astral.sh/uv/reference/settings/#dependency-metadata).
As uv can not verify this information, it is important to specify correct metadata in this
override.
1 change: 1 addition & 0 deletions mkdocs.template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ nav:
- reference/index.md
- Commands: reference/cli.md
- Settings: reference/settings.md
- Build Failures: reference/build_failures.md
- Resolver: reference/resolver-internals.md
- Benchmarks: reference/benchmarks.md
- Versioning: reference/versioning.md
Expand Down

0 comments on commit 614013e

Please sign in to comment.