mirror of https://github.com/astral-sh/uv
113 lines
4.6 KiB
Rust
113 lines
4.6 KiB
Rust
use std::env;
|
|
use std::io::Write;
|
|
use std::path::PathBuf;
|
|
|
|
use anyhow::{Context, Result, bail};
|
|
use tracing_subscriber::filter::LevelFilter;
|
|
use tracing_subscriber::layer::SubscriberExt;
|
|
use tracing_subscriber::util::SubscriberInitExt;
|
|
use tracing_subscriber::{EnvFilter, Layer};
|
|
|
|
use uv_logging::UvFormat;
|
|
|
|
/// Entrypoint for the `uv-build` Python package.
|
|
fn main() -> Result<()> {
|
|
// Support configuring the log level with `RUST_LOG` (shows only the error level by default) and
|
|
// color.
|
|
//
|
|
// This configuration is a simplified version of the uv logging configuration. When using
|
|
// uv_build through uv proper, the uv logging configuration applies.
|
|
let filter = EnvFilter::builder()
|
|
.with_default_directive(LevelFilter::OFF.into())
|
|
.from_env()
|
|
.context("Invalid RUST_LOG directives")?;
|
|
let stderr_layer = tracing_subscriber::fmt::layer()
|
|
.event_format(UvFormat::default())
|
|
.with_writer(std::sync::Mutex::new(anstream::stderr()))
|
|
.with_filter(filter);
|
|
tracing_subscriber::registry().with(stderr_layer).init();
|
|
|
|
// Handrolled to avoid the large clap dependency
|
|
let mut args = env::args_os();
|
|
// Skip the name of the binary
|
|
args.next();
|
|
let command = args
|
|
.next()
|
|
.context("Missing command")?
|
|
.to_str()
|
|
.context("Invalid non-UTF8 command")?
|
|
.to_string();
|
|
match command.as_str() {
|
|
"build-sdist" => {
|
|
let sdist_directory = PathBuf::from(args.next().context("Missing sdist directory")?);
|
|
let filename = uv_build_backend::build_source_dist(
|
|
&env::current_dir()?,
|
|
&sdist_directory,
|
|
uv_version::version(),
|
|
)?;
|
|
// Tell the build frontend about the name of the artifact we built
|
|
writeln!(&mut std::io::stdout(), "{filename}").context("stdout is closed")?;
|
|
}
|
|
"build-wheel" => {
|
|
let wheel_directory = PathBuf::from(args.next().context("Missing wheel directory")?);
|
|
let metadata_directory = args.next().map(PathBuf::from);
|
|
let filename = uv_build_backend::build_wheel(
|
|
&env::current_dir()?,
|
|
&wheel_directory,
|
|
metadata_directory.as_deref(),
|
|
uv_version::version(),
|
|
)?;
|
|
// Tell the build frontend about the name of the artifact we built
|
|
writeln!(&mut std::io::stdout(), "{filename}").context("stdout is closed")?;
|
|
}
|
|
"build-editable" => {
|
|
let wheel_directory = PathBuf::from(args.next().context("Missing wheel directory")?);
|
|
let metadata_directory = args.next().map(PathBuf::from);
|
|
let filename = uv_build_backend::build_editable(
|
|
&env::current_dir()?,
|
|
&wheel_directory,
|
|
metadata_directory.as_deref(),
|
|
uv_version::version(),
|
|
)?;
|
|
// Tell the build frontend about the name of the artifact we built
|
|
writeln!(&mut std::io::stdout(), "{filename}").context("stdout is closed")?;
|
|
}
|
|
"prepare-metadata-for-build-wheel" => {
|
|
let wheel_directory = PathBuf::from(args.next().context("Missing wheel directory")?);
|
|
let filename = uv_build_backend::metadata(
|
|
&env::current_dir()?,
|
|
&wheel_directory,
|
|
uv_version::version(),
|
|
)?;
|
|
// Tell the build frontend about the name of the artifact we built
|
|
writeln!(&mut std::io::stdout(), "{filename}").context("stdout is closed")?;
|
|
}
|
|
"prepare-metadata-for-build-editable" => {
|
|
let wheel_directory = PathBuf::from(args.next().context("Missing wheel directory")?);
|
|
let filename = uv_build_backend::metadata(
|
|
&env::current_dir()?,
|
|
&wheel_directory,
|
|
uv_version::version(),
|
|
)?;
|
|
// Tell the build frontend about the name of the artifact we built
|
|
writeln!(&mut std::io::stdout(), "{filename}").context("stdout is closed")?;
|
|
}
|
|
"--help" => {
|
|
// This works both as redirect to use the proper uv package and as smoke test.
|
|
writeln!(
|
|
&mut std::io::stderr(),
|
|
"uv_build contains only the PEP 517 build backend for uv and can't be used on the CLI. \
|
|
Use `uv build` or another build frontend instead."
|
|
).context("stdout is closed")?;
|
|
}
|
|
unknown => {
|
|
bail!(
|
|
"Unknown subcommand: {} (cli: {:?})",
|
|
unknown,
|
|
env::args_os()
|
|
);
|
|
}
|
|
}
|
|
Ok(())
|
|
}
|