mirror of
https://github.com/astral-sh/uv.git
synced 2025-10-29 03:02:55 +00:00
The architecture of uv does not necessarily match that of the python
interpreter (#2326). In cross compiling/testing scenarios the operating
system can also mismatch. To solve this, we move arch and os detection
to python, vendoring the relevant pypa/packaging code, preventing
mismatches between what the python interpreter was compiled for and what
uv was compiled for.
To make the scripts more manageable, they are now a directory in a
tempdir and we run them with `python -m` . I've simplified the
pypa/packaging code since we're still building the tags in rust. A
`Platform` is now instantiated by querying the python interpreter for
its platform. The pypa/packaging files are copied verbatim for easier
updates except a `lru_cache()` python 3.7 backport.
Error handling is done by a `"result": "success|error"` field that allow
passing error details to rust:
```console
$ uv venv --no-cache
× Can't use Python at `/home/konsti/projects/uv/.venv/bin/python3`
╰─▶ Unknown operation system `linux`
```
I've used the [maturin sysconfig
collection](855f6d2cb1/sysconfig)
as reference. I'm unsure how to test these changes across the wide
variety of platforms.
Fixes #2326
35 lines
882 B
Rust
35 lines
882 B
Rust
use std::path::PathBuf;
|
|
|
|
use clap::Parser;
|
|
use tracing::info;
|
|
use uv_cache::{Cache, CacheArgs};
|
|
use uv_interpreter::PythonEnvironment;
|
|
|
|
#[derive(Parser)]
|
|
pub(crate) struct CompileArgs {
|
|
/// Compile all `.py` in this or any subdirectory to bytecode
|
|
root: PathBuf,
|
|
python: Option<PathBuf>,
|
|
#[command(flatten)]
|
|
cache_args: CacheArgs,
|
|
}
|
|
|
|
pub(crate) async fn compile(args: CompileArgs) -> anyhow::Result<()> {
|
|
let cache = Cache::try_from(args.cache_args)?;
|
|
|
|
let interpreter = if let Some(python) = args.python {
|
|
python
|
|
} else {
|
|
let venv = PythonEnvironment::from_virtualenv(&cache)?;
|
|
venv.python_executable().to_path_buf()
|
|
};
|
|
|
|
let files = uv_installer::compile_tree(
|
|
&fs_err::canonicalize(args.root)?,
|
|
&interpreter,
|
|
cache.root(),
|
|
)
|
|
.await?;
|
|
info!("Compiled {files} files");
|
|
Ok(())
|
|
}
|