From 9f7fd2e1f43b948234f069b0d25e9bc62d937842 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Mon, 28 Oct 2024 10:56:53 -0500 Subject: [PATCH 1/8] Add a trampoline variant that executes `python` --- crates/uv-install-wheel/src/wheel.rs | 21 +++++++- crates/uv-trampoline/src/bounce.rs | 79 +++++++++++++++++++++------- 2 files changed, 79 insertions(+), 21 deletions(-) diff --git a/crates/uv-install-wheel/src/wheel.rs b/crates/uv-install-wheel/src/wheel.rs index 559237e16769..3caaa5303e22 100644 --- a/crates/uv-install-wheel/src/wheel.rs +++ b/crates/uv-install-wheel/src/wheel.rs @@ -21,7 +21,24 @@ use walkdir::WalkDir; use zip::write::FileOptions; use zip::ZipWriter; -const LAUNCHER_MAGIC_NUMBER: [u8; 4] = [b'U', b'V', b'U', b'V']; +/// The kind of trampoline. +/// +/// See [`uv-trampoline::bounce::TrampolineKind`]. +enum LauncherKind { + /// The trampoline should execute itself, it's a zipped Python script. + Script, + /// The trampoline should just execute Python, it's a proxy Python executable. + Python, +} + +impl LauncherKind { + const fn magic_number(&self) -> &'static [u8; 4] { + match self { + Self::Script => &[b'U', b'V', b'S', b'C'], + Self::Python => &[b'U', b'V', b'P', b'Y'], + } + } +} #[cfg(all(windows, target_arch = "x86"))] const LAUNCHER_I686_GUI: &[u8] = @@ -234,7 +251,7 @@ pub(crate) fn windows_script_launcher( .expect("File Path to be smaller than 4GB") .to_le_bytes(), ); - launcher.extend_from_slice(&LAUNCHER_MAGIC_NUMBER); + launcher.extend_from_slice(&LauncherKind::Script.magic_number()); Ok(launcher) } diff --git a/crates/uv-trampoline/src/bounce.rs b/crates/uv-trampoline/src/bounce.rs index 22c59340a0bf..d0a2d4b8f4f5 100644 --- a/crates/uv-trampoline/src/bounce.rs +++ b/crates/uv-trampoline/src/bounce.rs @@ -33,27 +33,60 @@ use windows::Win32::{ use crate::{eprintln, format}; -const MAGIC_NUMBER: [u8; 4] = [b'U', b'V', b'U', b'V']; const PATH_LEN_SIZE: usize = size_of::(); const MAX_PATH_LEN: u32 = 32 * 1024; -/// Transform ` ` to `python `. +/// The kind of trampoline. +enum TrampolineKind { + /// The trampoline should execute itself, it's a zipped Python script. + Script, + /// The trampoline should just execute Python, it's a proxy Python executable. + Python, +} + +impl TrampolineKind { + const fn magic_number(&self) -> &'static [u8; 4] { + match self { + Self::Script => &[b'U', b'V', b'S', b'C'], + Self::Python => &[b'U', b'V', b'P', b'Y'], + } + } + + fn from_buffer(buffer: &[u8]) -> Option { + if buffer.ends_with(Self::Script.magic_number()) { + Some(Self::Script) + } else if buffer.ends_with(Self::Python.magic_number()) { + Some(Self::Python) + } else { + None + } + } +} + +/// Transform ` ` to `python ` or `python ` +/// depending on the [`TrampolineKind`]. fn make_child_cmdline() -> CString { let executable_name = std::env::current_exe().unwrap_or_else(|_| { eprintln!("Failed to get executable name"); exit_with_status(1); }); - let python_exe = find_python_exe(executable_name.as_ref()); + let (kind, python_exe) = read_trampoline_metadata(executable_name.as_ref()); let mut child_cmdline = Vec::::new(); push_quoted_path(python_exe.as_ref(), &mut child_cmdline); child_cmdline.push(b' '); - // Use the full executable name because CMD only passes the name of the executable (but not the path) - // when e.g. invoking `black` instead of `/Scripts/black` and Python then fails - // to find the file. Unfortunately, this complicates things because we now need to split the executable - // from the arguments string... - push_quoted_path(executable_name.as_ref(), &mut child_cmdline); + // Only execute the trampoline again if it's a script, otherwise, just invoke Python. + match kind { + TrampolineKind::Python => {} + TrampolineKind::Script => { + // Use the full executable name because CMD only passes the name of the executable (but not the path) + // when e.g. invoking `black` instead of `/Scripts/black` and Python then fails + // to find the file. Unfortunately, this complicates things because we now need to split the executable + // from the arguments string... + push_quoted_path(executable_name.as_ref(), &mut child_cmdline); + } + } push_arguments(&mut child_cmdline); @@ -86,17 +119,21 @@ fn push_quoted_path(path: &Path, command: &mut Vec) { command.extend(br#"""#); } -/// Reads the executable binary from the back to find the path to the Python executable that is written -/// after the ZIP file content. +/// Reads the executable binary from the back to find: +/// +/// * The path to the Python executable +/// * The kind of trampoline we are executing /// /// The executable is expected to have the following format: -/// * The file must end with the magic number 'UVUV'. +/// +/// * The file must end with the magic number 'UVPY' or 'UVSC' (identifying the trampoline kind) /// * The last 4 bytes (little endian) are the length of the path to the Python executable. /// * The path encoded as UTF-8 comes right before the length /// /// # Panics +/// /// If there's any IO error, or the file does not conform to the specified format. -fn find_python_exe(executable_name: &Path) -> PathBuf { +fn read_trampoline_metadata(executable_name: &Path) -> (TrampolineKind, PathBuf) { let mut file_handle = File::open(executable_name).unwrap_or_else(|_| { print_last_error_and_exit(&format!( "Failed to open executable '{}'", @@ -117,6 +154,7 @@ fn find_python_exe(executable_name: &Path) -> PathBuf { let mut buffer: Vec = Vec::new(); let mut bytes_to_read = 1024.min(u32::try_from(file_size).unwrap_or(u32::MAX)); + let mut kind; let path: String = loop { // SAFETY: Casting to usize is safe because we only support 64bit systems where usize is guaranteed to be larger than u32. buffer.resize(bytes_to_read as usize, 0); @@ -135,13 +173,14 @@ fn find_python_exe(executable_name: &Path) -> PathBuf { // Truncate the buffer to the actual number of bytes read. buffer.truncate(read_bytes); - if !buffer.ends_with(&MAGIC_NUMBER) { - eprintln!("Magic number 'UVUV' not found at the end of the file. Did you append the magic number, the length and the path to the python executable at the end of the file?"); + let Some(inner_kind) = TrampolineKind::from_buffer(&buffer) else { + eprintln!("Magic number 'UVSC' or 'UVPY' not found at the end of the file. Did you append the magic number, the length and the path to the python executable at the end of the file?"); exit_with_status(1); - } + }; + kind = inner_kind; // Remove the magic number - buffer.truncate(buffer.len() - MAGIC_NUMBER.len()); + buffer.truncate(buffer.len() - kind.magic_number().len()); let path_len = match buffer.get(buffer.len() - PATH_LEN_SIZE..) { Some(path_len) => { @@ -177,7 +216,7 @@ fn find_python_exe(executable_name: &Path) -> PathBuf { } else { // SAFETY: Casting to u32 is safe because `path_len` is guaranteed to be less than 32KBs, // MAGIC_NUMBER is 4 bytes and PATH_LEN_SIZE is 4 bytes. - bytes_to_read = (path_len + MAGIC_NUMBER.len() + PATH_LEN_SIZE) as u32; + bytes_to_read = (path_len + kind.magic_number().len() + PATH_LEN_SIZE) as u32; if u64::from(bytes_to_read) > file_size { eprintln!("The length of the python executable path exceeds the file size. Verify that the path length is appended to the end of the launcher script as a u32 in little endian"); @@ -201,10 +240,12 @@ fn find_python_exe(executable_name: &Path) -> PathBuf { }; // NOTICE: dunce adds 5kb~ - dunce::canonicalize(path.as_path()).unwrap_or_else(|_| { + let path = dunce::canonicalize(path.as_path()).unwrap_or_else(|_| { eprintln!("Failed to canonicalize script path"); exit_with_status(1); - }) + }); + + (kind, path) } fn push_arguments(output: &mut Vec) { From 7909dcc9ed1482cc6669885be9b7b0d7b653e92f Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Mon, 28 Oct 2024 12:50:57 -0500 Subject: [PATCH 2/8] Bump rust toolchain version --- crates/uv-trampoline/rust-toolchain.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/uv-trampoline/rust-toolchain.toml b/crates/uv-trampoline/rust-toolchain.toml index a0c8420807eb..fce0096acafe 100644 --- a/crates/uv-trampoline/rust-toolchain.toml +++ b/crates/uv-trampoline/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "nightly-2024-06-08" +channel = "nightly-2024-10-27" From 357431b49a803995cc6d43fb367e1ab51dcd9f89 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Mon, 28 Oct 2024 11:35:37 -0500 Subject: [PATCH 3/8] Add `uv-trampoline-builder` crate for shared trampoline launcher construction utilities --- Cargo.lock | 10 ++ Cargo.toml | 1 + crates/uv-install-wheel/Cargo.toml | 1 + crates/uv-install-wheel/src/lib.rs | 2 + crates/uv-install-wheel/src/wheel.rs | 139 ++---------------- crates/uv-trampoline-builder/Cargo.toml | 23 +++ crates/uv-trampoline-builder/src/lib.rs | 180 ++++++++++++++++++++++++ 7 files changed, 225 insertions(+), 131 deletions(-) create mode 100644 crates/uv-trampoline-builder/Cargo.toml create mode 100644 crates/uv-trampoline-builder/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 4ebbcfc9aab0..2ea28ea8f78a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4770,6 +4770,7 @@ dependencies = [ "uv-pep440", "uv-platform-tags", "uv-pypi-types", + "uv-trampoline-builder", "uv-warnings", "walkdir", "zip", @@ -5268,6 +5269,15 @@ dependencies = [ "uv-virtualenv", ] +[[package]] +name = "uv-trampoline-builder" +version = "0.0.1" +dependencies = [ + "thiserror", + "uv-fs", + "zip", +] + [[package]] name = "uv-types" version = "0.0.1" diff --git a/Cargo.toml b/Cargo.toml index a2358c19f266..3f4a71dca1c6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,6 +61,7 @@ uv-settings = { path = "crates/uv-settings" } uv-shell = { path = "crates/uv-shell" } uv-state = { path = "crates/uv-state" } uv-static = { path = "crates/uv-static" } +uv-trampoline-builder = { path = "crates/uv-trampoline-builder" } uv-tool = { path = "crates/uv-tool" } uv-types = { path = "crates/uv-types" } uv-version = { path = "crates/uv-version" } diff --git a/crates/uv-install-wheel/Cargo.toml b/crates/uv-install-wheel/Cargo.toml index 97f5cf57a909..d7dcd8fd1db7 100644 --- a/crates/uv-install-wheel/Cargo.toml +++ b/crates/uv-install-wheel/Cargo.toml @@ -28,6 +28,7 @@ uv-normalize = { workspace = true } uv-pep440 = { workspace = true } uv-platform-tags = { workspace = true } uv-pypi-types = { workspace = true } +uv-trampoline-builder = { workspace = true } uv-warnings = { workspace = true } clap = { workspace = true, optional = true, features = ["derive"] } diff --git a/crates/uv-install-wheel/src/lib.rs b/crates/uv-install-wheel/src/lib.rs index 83300d42da76..69249229aab6 100644 --- a/crates/uv-install-wheel/src/lib.rs +++ b/crates/uv-install-wheel/src/lib.rs @@ -97,4 +97,6 @@ pub enum Error { MismatchedVersion(Version, Version), #[error("Invalid egg-link")] InvalidEggLink(PathBuf), + #[error(transparent)] + LauncherError(#[from] uv_trampoline_builder::Error), } diff --git a/crates/uv-install-wheel/src/wheel.rs b/crates/uv-install-wheel/src/wheel.rs index 3caaa5303e22..a8d5a47f2460 100644 --- a/crates/uv-install-wheel/src/wheel.rs +++ b/crates/uv-install-wheel/src/wheel.rs @@ -1,11 +1,8 @@ use std::collections::HashMap; -use std::io::{BufReader, Cursor, Read, Seek, Write}; +use std::io; +use std::io::{BufReader, Read, Seek, Write}; use std::path::{Path, PathBuf}; -use std::{env, io}; -use crate::record::RecordEntry; -use crate::script::Script; -use crate::{Error, Layout}; use data_encoding::BASE64URL_NOPAD; use fs_err as fs; use fs_err::{DirEntry, File}; @@ -13,56 +10,17 @@ use mailparse::parse_headers; use rustc_hash::FxHashMap; use sha2::{Digest, Sha256}; use tracing::{instrument, warn}; +use walkdir::WalkDir; + use uv_cache_info::CacheInfo; use uv_fs::{relative_to, Simplified}; use uv_normalize::PackageName; use uv_pypi_types::DirectUrl; -use walkdir::WalkDir; -use zip::write::FileOptions; -use zip::ZipWriter; +use uv_trampoline_builder::windows_script_launcher; -/// The kind of trampoline. -/// -/// See [`uv-trampoline::bounce::TrampolineKind`]. -enum LauncherKind { - /// The trampoline should execute itself, it's a zipped Python script. - Script, - /// The trampoline should just execute Python, it's a proxy Python executable. - Python, -} - -impl LauncherKind { - const fn magic_number(&self) -> &'static [u8; 4] { - match self { - Self::Script => &[b'U', b'V', b'S', b'C'], - Self::Python => &[b'U', b'V', b'P', b'Y'], - } - } -} - -#[cfg(all(windows, target_arch = "x86"))] -const LAUNCHER_I686_GUI: &[u8] = - include_bytes!("../../uv-trampoline/trampolines/uv-trampoline-i686-gui.exe"); - -#[cfg(all(windows, target_arch = "x86"))] -const LAUNCHER_I686_CONSOLE: &[u8] = - include_bytes!("../../uv-trampoline/trampolines/uv-trampoline-i686-console.exe"); - -#[cfg(all(windows, target_arch = "x86_64"))] -const LAUNCHER_X86_64_GUI: &[u8] = - include_bytes!("../../uv-trampoline/trampolines/uv-trampoline-x86_64-gui.exe"); - -#[cfg(all(windows, target_arch = "x86_64"))] -const LAUNCHER_X86_64_CONSOLE: &[u8] = - include_bytes!("../../uv-trampoline/trampolines/uv-trampoline-x86_64-console.exe"); - -#[cfg(all(windows, target_arch = "aarch64"))] -const LAUNCHER_AARCH64_GUI: &[u8] = - include_bytes!("../../uv-trampoline/trampolines/uv-trampoline-aarch64-gui.exe"); - -#[cfg(all(windows, target_arch = "aarch64"))] -const LAUNCHER_AARCH64_CONSOLE: &[u8] = - include_bytes!("../../uv-trampoline/trampolines/uv-trampoline-aarch64-console.exe"); +use crate::record::RecordEntry; +use crate::script::Script; +use crate::{Error, Layout}; /// Wrapper script template function /// @@ -175,87 +133,6 @@ fn format_shebang(executable: impl AsRef, os_name: &str, relocatable: bool format!("#!{executable}") } -/// A Windows script is a minimal .exe launcher binary with the python entrypoint script appended as -/// stored zip file. -/// -/// -#[allow(unused_variables)] -pub(crate) fn windows_script_launcher( - launcher_python_script: &str, - is_gui: bool, - python_executable: impl AsRef, -) -> Result, Error> { - // This method should only be called on Windows, but we avoid `#[cfg(windows)]` to retain - // compilation on all platforms. - if cfg!(not(windows)) { - return Err(Error::NotWindows); - } - - let launcher_bin: &[u8] = match env::consts::ARCH { - #[cfg(all(windows, target_arch = "x86"))] - "x86" => { - if is_gui { - LAUNCHER_I686_GUI - } else { - LAUNCHER_I686_CONSOLE - } - } - #[cfg(all(windows, target_arch = "x86_64"))] - "x86_64" => { - if is_gui { - LAUNCHER_X86_64_GUI - } else { - LAUNCHER_X86_64_CONSOLE - } - } - #[cfg(all(windows, target_arch = "aarch64"))] - "aarch64" => { - if is_gui { - LAUNCHER_AARCH64_GUI - } else { - LAUNCHER_AARCH64_CONSOLE - } - } - #[cfg(windows)] - arch => { - return Err(Error::UnsupportedWindowsArch(arch)); - } - #[cfg(not(windows))] - arch => &[], - }; - - let mut payload: Vec = Vec::new(); - { - // We're using the zip writer, but with stored compression - // https://github.com/njsmith/posy/blob/04927e657ca97a5e35bb2252d168125de9a3a025/src/trampolines/mod.rs#L75-L82 - // https://github.com/pypa/distlib/blob/8ed03aab48add854f377ce392efffb79bb4d6091/PC/launcher.c#L259-L271 - let stored = FileOptions::default().compression_method(zip::CompressionMethod::Stored); - let mut archive = ZipWriter::new(Cursor::new(&mut payload)); - let error_msg = "Writing to Vec should never fail"; - archive.start_file("__main__.py", stored).expect(error_msg); - archive - .write_all(launcher_python_script.as_bytes()) - .expect(error_msg); - archive.finish().expect(error_msg); - } - - let python = python_executable.as_ref(); - let python_path = python.simplified_display().to_string(); - - let mut launcher: Vec = Vec::with_capacity(launcher_bin.len() + payload.len()); - launcher.extend_from_slice(launcher_bin); - launcher.extend_from_slice(&payload); - launcher.extend_from_slice(python_path.as_bytes()); - launcher.extend_from_slice( - &u32::try_from(python_path.as_bytes().len()) - .expect("File Path to be smaller than 4GB") - .to_le_bytes(), - ); - launcher.extend_from_slice(&LauncherKind::Script.magic_number()); - - Ok(launcher) -} - /// Returns a [`PathBuf`] to `python[w].exe` for script execution. /// /// diff --git a/crates/uv-trampoline-builder/Cargo.toml b/crates/uv-trampoline-builder/Cargo.toml new file mode 100644 index 000000000000..86b32d8eba11 --- /dev/null +++ b/crates/uv-trampoline-builder/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "uv-trampoline-builder" +version = "0.0.1" +publish = false +description = "Builds launchers for `uv-trampoline`" + +edition = { workspace = true } +rust-version = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } +repository = { workspace = true } +authors = { workspace = true } +license = { workspace = true } + +[lints] +workspace = true + +[dependencies] +uv-fs = { workspace = true } +thiserror = { workspace = true } +zip = { workspace = true } + +[dev-dependencies] diff --git a/crates/uv-trampoline-builder/src/lib.rs b/crates/uv-trampoline-builder/src/lib.rs new file mode 100644 index 000000000000..f54cb83283d5 --- /dev/null +++ b/crates/uv-trampoline-builder/src/lib.rs @@ -0,0 +1,180 @@ +use std::io::{Cursor, Write}; +use std::path::Path; + +use thiserror::Error; +use uv_fs::Simplified; +use zip::write::FileOptions; +use zip::ZipWriter; + +#[cfg(all(windows, target_arch = "x86"))] +const LAUNCHER_I686_GUI: &[u8] = + include_bytes!("../../uv-trampoline/trampolines/uv-trampoline-i686-gui.exe"); + +#[cfg(all(windows, target_arch = "x86"))] +const LAUNCHER_I686_CONSOLE: &[u8] = + include_bytes!("../../uv-trampoline/trampolines/uv-trampoline-i686-console.exe"); + +#[cfg(all(windows, target_arch = "x86_64"))] +const LAUNCHER_X86_64_GUI: &[u8] = + include_bytes!("../../uv-trampoline/trampolines/uv-trampoline-x86_64-gui.exe"); + +#[cfg(all(windows, target_arch = "x86_64"))] +const LAUNCHER_X86_64_CONSOLE: &[u8] = + include_bytes!("../../uv-trampoline/trampolines/uv-trampoline-x86_64-console.exe"); + +#[cfg(all(windows, target_arch = "aarch64"))] +const LAUNCHER_AARCH64_GUI: &[u8] = + include_bytes!("../../uv-trampoline/trampolines/uv-trampoline-aarch64-gui.exe"); + +#[cfg(all(windows, target_arch = "aarch64"))] +const LAUNCHER_AARCH64_CONSOLE: &[u8] = + include_bytes!("../../uv-trampoline/trampolines/uv-trampoline-aarch64-console.exe"); + +/// The kind of trampoline launcher to create. +/// +/// See [`uv-trampoline::bounce::TrampolineKind`]. +enum LauncherKind { + /// The trampoline should execute itself, it's a zipped Python script. + Script, + /// The trampoline should just execute Python, it's a proxy Python executable. + Python, +} + +impl LauncherKind { + const fn magic_number(&self) -> &'static [u8; 4] { + match self { + Self::Script => b"UVSC", + Self::Python => b"UVPY", + } + } +} + +/// Note: The caller is responsible for adding the path of the wheel we're installing. +#[derive(Error, Debug)] +pub enum Error { + #[error( + "Unable to create Windows launcher for: {0} (only x86_64, x86, and arm64 are supported)" + )] + UnsupportedWindowsArch(&'static str), + #[error("Unable to create Windows launcher on non-Windows platform")] + NotWindows, +} + +#[allow(clippy::unnecessary_wraps, unused_variables)] +fn get_launcher_bin(gui: bool) -> Result<&'static [u8], Error> { + Ok(match std::env::consts::ARCH { + #[cfg(all(windows, target_arch = "x86"))] + "x86" => { + if gui { + LAUNCHER_I686_GUI + } else { + LAUNCHER_I686_CONSOLE + } + } + #[cfg(all(windows, target_arch = "x86_64"))] + "x86_64" => { + if gui { + LAUNCHER_X86_64_GUI + } else { + LAUNCHER_X86_64_CONSOLE + } + } + #[cfg(all(windows, target_arch = "aarch64"))] + "aarch64" => { + if gui { + LAUNCHER_AARCH64_GUI + } else { + LAUNCHER_AARCH64_CONSOLE + } + } + #[cfg(windows)] + arch => { + return Err(Error::UnsupportedWindowsArch(arch)); + } + #[cfg(not(windows))] + _ => &[], + }) +} + +/// A Windows script is a minimal .exe launcher binary with the python entrypoint script appended as +/// stored zip file. +/// +/// +#[allow(unused_variables)] +pub fn windows_script_launcher( + launcher_python_script: &str, + is_gui: bool, + python_executable: impl AsRef, +) -> Result, Error> { + // This method should only be called on Windows, but we avoid `#[cfg(windows)]` to retain + // compilation on all platforms. + if cfg!(not(windows)) { + return Err(Error::NotWindows); + } + + let launcher_bin: &[u8] = get_launcher_bin(is_gui)?; + + let mut payload: Vec = Vec::new(); + { + // We're using the zip writer, but with stored compression + // https://github.com/njsmith/posy/blob/04927e657ca97a5e35bb2252d168125de9a3a025/src/trampolines/mod.rs#L75-L82 + // https://github.com/pypa/distlib/blob/8ed03aab48add854f377ce392efffb79bb4d6091/PC/launcher.c#L259-L271 + let stored = FileOptions::default().compression_method(zip::CompressionMethod::Stored); + let mut archive = ZipWriter::new(Cursor::new(&mut payload)); + let error_msg = "Writing to Vec should never fail"; + archive.start_file("__main__.py", stored).expect(error_msg); + archive + .write_all(launcher_python_script.as_bytes()) + .expect(error_msg); + archive.finish().expect(error_msg); + } + + let python = python_executable.as_ref(); + let python_path = python.simplified_display().to_string(); + + let mut launcher: Vec = Vec::with_capacity(launcher_bin.len() + payload.len()); + launcher.extend_from_slice(launcher_bin); + launcher.extend_from_slice(&payload); + launcher.extend_from_slice(python_path.as_bytes()); + launcher.extend_from_slice( + &u32::try_from(python_path.as_bytes().len()) + .expect("file path should be smaller than 4GB") + .to_le_bytes(), + ); + launcher.extend_from_slice(LauncherKind::Script.magic_number()); + + Ok(launcher) +} + +/// A minimal .exe launcher binary for Python. +/// +/// Sort of equivalent to a `python` symlink on Unix. +#[allow(unused_variables)] +pub fn windows_python_launcher( + launcher_python_script: &str, + is_gui: bool, + python_executable: impl AsRef, +) -> Result, Error> { + // This method should only be called on Windows, but we avoid `#[cfg(windows)]` to retain + // compilation on all platforms. + if cfg!(not(windows)) { + return Err(Error::NotWindows); + } + + let launcher_bin: &[u8] = get_launcher_bin(is_gui)?; + + let python = python_executable.as_ref(); + let python_path = python.simplified_display().to_string(); + + let mut launcher: Vec = Vec::with_capacity(launcher_bin.len()); + launcher.extend_from_slice(launcher_bin); + launcher.extend_from_slice(python_path.as_bytes()); + launcher.extend_from_slice( + &u32::try_from(python_path.as_bytes().len()) + .expect("file path should be smaller than 4GB") + .to_le_bytes(), + ); + launcher.extend_from_slice(LauncherKind::Python.magic_number()); + + Ok(launcher) +} From c7fdb95419c2742d88ae1df35d655ab188455832 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Mon, 28 Oct 2024 11:51:34 -0500 Subject: [PATCH 4/8] Update build instructions --- crates/uv-trampoline/README.md | 36 ++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/crates/uv-trampoline/README.md b/crates/uv-trampoline/README.md index 8ff40aa82a5d..3a4de1933aef 100644 --- a/crates/uv-trampoline/README.md +++ b/crates/uv-trampoline/README.md @@ -12,17 +12,20 @@ LLD and add the `rustup` targets: ```shell sudo apt install llvm clang lld -rustup target add i686-pc-windows-msvc -rustup target add x86_64-pc-windows-msvc -rustup target add aarch64-pc-windows-msvc +cargo install cargo-xwin +rustup toolchain install nightly-2024-10-27 +rustup component add rust-src --toolchain nightly-2024-10-27-x86_64-unknown-linux-gnu +rustup target add --toolchain nightly-2024-10-27 i686-pc-windows-msvc +rustup target add --toolchain nightly-2024-10-27 x86_64-pc-windows-msvc +rustup target add --toolchain nightly-2024-10-27 aarch64-pc-windows-msvc ``` -Then, build the trampolines for both supported architectures: +Then, build the trampolines for all supported architectures: ```shell -cargo +nightly-2024-06-08 xwin build --xwin-arch x86 --release --target i686-pc-windows-msvc -cargo +nightly-2024-06-08 xwin build --release --target x86_64-pc-windows-msvc -cargo +nightly-2024-06-08 xwin build --release --target aarch64-pc-windows-msvc +cargo +nightly-2024-10-27 xwin build --xwin-arch x86 --release --target i686-pc-windows-msvc +cargo +nightly-2024-10-27 xwin build --release --target x86_64-pc-windows-msvc +cargo +nightly-2024-10-27 xwin build --release --target aarch64-pc-windows-msvc ``` ### Cross-compiling from macOS @@ -32,22 +35,25 @@ LLVM and add the `rustup` targets: ```shell brew install llvm -rustup target add i686-pc-windows-msvc -rustup target add x86_64-pc-windows-msvc -rustup target add aarch64-pc-windows-msvc +cargo install cargo-xwin +rustup toolchain install nightly-2024-10-27 +rustup component add rust-src --toolchain nightly-2024-10-27-aarch64-apple-darwin +rustup target add --toolchain nightly-2024-10-27 i686-pc-windows-msvc +rustup target add --toolchain nightly-2024-10-27 x86_64-pc-windows-msvc +rustup target add --toolchain nightly-2024-10-27 aarch64-pc-windows-msvc ``` -Then, build the trampolines for both supported architectures: +Then, build the trampolines for all supported architectures: ```shell -cargo +nightly-2024-06-08 xwin build --release --target i686-pc-windows-msvc -cargo +nightly-2024-06-08 xwin build --release --target x86_64-pc-windows-msvc -cargo +nightly-2024-06-08 xwin build --release --target aarch64-pc-windows-msvc +cargo +nightly-2024-10-27 xwin build --release --target i686-pc-windows-msvc +cargo +nightly-2024-10-27 xwin build --release --target x86_64-pc-windows-msvc +cargo +nightly-2024-10-27 xwin build --release --target aarch64-pc-windows-msvc ``` ### Updating the prebuilt executables -After building the trampolines for both supported architectures: +After building the trampolines for all supported architectures: ```shell cp target/aarch64-pc-windows-msvc/release/uv-trampoline-console.exe trampolines/uv-trampoline-aarch64-console.exe From f446582901940120646a4aa8d112ff8105b725b4 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Mon, 28 Oct 2024 12:34:58 -0500 Subject: [PATCH 5/8] Move tests to new crate --- .github/workflows/ci.yml | 6 +- Cargo.lock | 5 + crates/uv-install-wheel/src/wheel.rs | 48 ----- crates/uv-trampoline-builder/Cargo.toml | 5 + crates/uv-trampoline-builder/src/lib.rs | 230 +++++++++++++++++++- crates/uv-trampoline/Cargo.lock | 10 +- crates/uv-trampoline/src/bounce.rs | 4 +- crates/uv-trampoline/tests/harness.rs | 269 ------------------------ 8 files changed, 249 insertions(+), 328 deletions(-) delete mode 100644 crates/uv-trampoline/tests/harness.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f8777503aeb..0f2781c59231 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -403,8 +403,10 @@ jobs: cp target/${{ matrix.target-arch }}-pc-windows-msvc/debug/uv-trampoline-console.exe trampolines/uv-trampoline-${{ matrix.target-arch }}-console.exe cp target/${{ matrix.target-arch }}-pc-windows-msvc/debug/uv-trampoline-gui.exe trampolines/uv-trampoline-${{ matrix.target-arch }}-gui.exe - name: "Test" - working-directory: ${{ github.workspace }}/crates/uv-trampoline - run: cargo test --target ${{ matrix.target-arch }}-pc-windows-msvc --test * + working-directory: ${{ github.workspace }} + run: | + rustup target add ${{ matrix.target-arch }}-pc-windows-msvc + cargo test -p uv-trampoline-builder --target ${{ matrix.target-arch }}-pc-windows-msvc typos: runs-on: ubuntu-latest diff --git a/Cargo.lock b/Cargo.lock index 2ea28ea8f78a..66411d51456c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5273,8 +5273,13 @@ dependencies = [ name = "uv-trampoline-builder" version = "0.0.1" dependencies = [ + "anyhow", + "assert_cmd", + "assert_fs", + "fs-err", "thiserror", "uv-fs", + "which", "zip", ] diff --git a/crates/uv-install-wheel/src/wheel.rs b/crates/uv-install-wheel/src/wheel.rs index a8d5a47f2460..cf640348e7fc 100644 --- a/crates/uv-install-wheel/src/wheel.rs +++ b/crates/uv-install-wheel/src/wheel.rs @@ -969,54 +969,6 @@ mod test { Ok(()) } - #[test] - #[cfg(all(windows, target_arch = "x86"))] - fn test_launchers_are_small() { - // At time of writing, they are 45kb~ bytes. - assert!( - super::LAUNCHER_I686_GUI.len() < 45 * 1024, - "GUI launcher: {}", - super::LAUNCHER_I686_GUI.len() - ); - assert!( - super::LAUNCHER_I686_CONSOLE.len() < 45 * 1024, - "CLI launcher: {}", - super::LAUNCHER_I686_CONSOLE.len() - ); - } - - #[test] - #[cfg(all(windows, target_arch = "x86_64"))] - fn test_launchers_are_small() { - // At time of writing, they are 45kb~ bytes. - assert!( - super::LAUNCHER_X86_64_GUI.len() < 45 * 1024, - "GUI launcher: {}", - super::LAUNCHER_X86_64_GUI.len() - ); - assert!( - super::LAUNCHER_X86_64_CONSOLE.len() < 45 * 1024, - "CLI launcher: {}", - super::LAUNCHER_X86_64_CONSOLE.len() - ); - } - - #[test] - #[cfg(all(windows, target_arch = "aarch64"))] - fn test_launchers_are_small() { - // At time of writing, they are 45kb~ bytes. - assert!( - super::LAUNCHER_AARCH64_GUI.len() < 45 * 1024, - "GUI launcher: {}", - super::LAUNCHER_AARCH64_GUI.len() - ); - assert!( - super::LAUNCHER_AARCH64_CONSOLE.len() < 45 * 1024, - "CLI launcher: {}", - super::LAUNCHER_AARCH64_CONSOLE.len() - ); - } - #[test] fn test_script_executable() -> Result<()> { // Test with adjacent pythonw.exe diff --git a/crates/uv-trampoline-builder/Cargo.toml b/crates/uv-trampoline-builder/Cargo.toml index 86b32d8eba11..17bcc4024e9c 100644 --- a/crates/uv-trampoline-builder/Cargo.toml +++ b/crates/uv-trampoline-builder/Cargo.toml @@ -21,3 +21,8 @@ thiserror = { workspace = true } zip = { workspace = true } [dev-dependencies] +assert_cmd = { version = "2.0.16" } +assert_fs = { version = "1.1.2" } +anyhow = { version = "1.0.89" } +fs-err = { workspace = true } +which = { workspace = true } diff --git a/crates/uv-trampoline-builder/src/lib.rs b/crates/uv-trampoline-builder/src/lib.rs index f54cb83283d5..22aadbf563f9 100644 --- a/crates/uv-trampoline-builder/src/lib.rs +++ b/crates/uv-trampoline-builder/src/lib.rs @@ -151,9 +151,8 @@ pub fn windows_script_launcher( /// Sort of equivalent to a `python` symlink on Unix. #[allow(unused_variables)] pub fn windows_python_launcher( - launcher_python_script: &str, - is_gui: bool, python_executable: impl AsRef, + is_gui: bool, ) -> Result, Error> { // This method should only be called on Windows, but we avoid `#[cfg(windows)]` to retain // compilation on all platforms. @@ -178,3 +177,230 @@ pub fn windows_python_launcher( Ok(launcher) } + +#[cfg(all(test, windows))] +#[allow(clippy::print_stdout)] +mod test { + use std::io::Write; + use std::path::Path; + use std::process::Command; + + use anyhow::Result; + use assert_cmd::prelude::OutputAssertExt; + use assert_fs::prelude::PathChild; + use fs_err::File; + + use which::which; + + use super::{windows_python_launcher, windows_script_launcher}; + + #[test] + #[cfg(all(windows, target_arch = "x86"))] + fn test_launchers_are_small() { + // At time of writing, they are 45kb~ bytes. + assert!( + super::LAUNCHER_I686_GUI.len() < 45 * 1024, + "GUI launcher: {}", + super::LAUNCHER_I686_GUI.len() + ); + assert!( + super::LAUNCHER_I686_CONSOLE.len() < 45 * 1024, + "CLI launcher: {}", + super::LAUNCHER_I686_CONSOLE.len() + ); + } + + #[test] + #[cfg(all(windows, target_arch = "x86_64"))] + fn test_launchers_are_small() { + // At time of writing, they are 45kb~ bytes. + assert!( + super::LAUNCHER_X86_64_GUI.len() < 45 * 1024, + "GUI launcher: {}", + super::LAUNCHER_X86_64_GUI.len() + ); + assert!( + super::LAUNCHER_X86_64_CONSOLE.len() < 45 * 1024, + "CLI launcher: {}", + super::LAUNCHER_X86_64_CONSOLE.len() + ); + } + + #[test] + #[cfg(all(windows, target_arch = "aarch64"))] + fn test_launchers_are_small() { + // At time of writing, they are 45kb~ bytes. + assert!( + super::LAUNCHER_AARCH64_GUI.len() < 45 * 1024, + "GUI launcher: {}", + super::LAUNCHER_AARCH64_GUI.len() + ); + assert!( + super::LAUNCHER_AARCH64_CONSOLE.len() < 45 * 1024, + "CLI launcher: {}", + super::LAUNCHER_AARCH64_CONSOLE.len() + ); + } + + /// Utility script for the test. + fn get_script_launcher(shebang: &str, is_gui: bool) -> String { + if is_gui { + format!( + r##"{shebang} +# -*- coding: utf-8 -*- +import re +import sys + +def make_gui() -> None: + from tkinter import Tk, ttk + root = Tk() + root.title("uv Test App") + frm = ttk.Frame(root, padding=10) + frm.grid() + ttk.Label(frm, text="Hello from uv-trampoline-gui.exe").grid(column=0, row=0) + root.mainloop() + +if __name__ == "__main__": + sys.argv[0] = re.sub(r"(-script\.pyw|\.exe)?$", "", sys.argv[0]) + sys.exit(make_gui()) +"## + ) + } else { + format!( + r##"{shebang} +# -*- coding: utf-8 -*- +import re +import sys + +def main_console() -> None: + print("Hello from uv-trampoline-console.exe", file=sys.stdout) + print("Hello from uv-trampoline-console.exe", file=sys.stderr) + for arg in sys.argv[1:]: + print(arg, file=sys.stderr) + +if __name__ == "__main__": + sys.argv[0] = re.sub(r"(-script\.pyw|\.exe)?$", "", sys.argv[0]) + sys.exit(main_console()) +"## + ) + } + } + + /// See [`uv-install-wheel::wheel::format_shebang`]. + fn format_shebang(executable: impl AsRef) -> String { + // Convert the executable to a simplified path. + let executable = executable.as_ref().display().to_string(); + format!("#!{executable}") + } + + #[test] + fn console_script_launcher() -> Result<()> { + // Create Temp Dirs + let temp_dir = assert_fs::TempDir::new()?; + let console_bin_path = temp_dir.child("launcher.console.exe"); + + // Locate an arbitrary python installation from PATH + let python_executable_path = which("python")?; + + // Generate Launcher Script + let launcher_console_script = + get_script_launcher(&format_shebang(&python_executable_path), false); + + // Generate Launcher Payload + let console_launcher = + windows_script_launcher(&launcher_console_script, false, &python_executable_path)?; + + // Create Launcher + File::create(console_bin_path.path())?.write_all(console_launcher.as_ref())?; + + println!( + "Wrote Console Launcher in {}", + console_bin_path.path().display() + ); + + let stdout_predicate = "Hello from uv-trampoline-console.exe\r\n"; + let stderr_predicate = "Hello from uv-trampoline-console.exe\r\n"; + + // Test Console Launcher + #[cfg(windows)] + Command::new(console_bin_path.path()) + .assert() + .success() + .stdout(stdout_predicate) + .stderr(stderr_predicate); + + let args_to_test = vec!["foo", "bar", "foo bar", "foo \"bar\"", "foo 'bar'"]; + let stderr_predicate = format!("{}{}\r\n", stderr_predicate, args_to_test.join("\r\n")); + + // Test Console Launcher (with args) + Command::new(console_bin_path.path()) + .args(args_to_test) + .assert() + .success() + .stdout(stdout_predicate) + .stderr(stderr_predicate); + + Ok(()) + } + + #[test] + fn console_python_launcher() -> Result<()> { + // Create Temp Dirs + let temp_dir = assert_fs::TempDir::new()?; + let console_bin_path = temp_dir.child("launcher.console.exe"); + + // Locate an arbitrary python installation from PATH + let python_executable_path = which("python")?; + + // Generate Launcher Payload + let console_launcher = windows_python_launcher(&python_executable_path, false)?; + + // Create Launcher + File::create(console_bin_path.path())?.write_all(console_launcher.as_ref())?; + + println!( + "Wrote Python Launcher in {}", + console_bin_path.path().display() + ); + + // Test Console Launcher + Command::new(console_bin_path.path()) + .arg("-c") + .arg("print('Hello from Python Launcher')") + .assert() + .success() + .stdout("Hello from Python Launcher\r\n"); + + Ok(()) + } + + #[test] + #[ignore] + fn gui_launcher() -> Result<()> { + // Create Temp Dirs + let temp_dir = assert_fs::TempDir::new()?; + let gui_bin_path = temp_dir.child("launcher.gui.exe"); + + // Locate an arbitrary pythonw installation from PATH + let pythonw_executable_path = which("pythonw")?; + + // Generate Launcher Script + let launcher_gui_script = + get_script_launcher(&format_shebang(&pythonw_executable_path), true); + + // Generate Launcher Payload + let gui_launcher = + windows_script_launcher(&launcher_gui_script, true, &pythonw_executable_path)?; + + // Create Launcher + File::create(gui_bin_path.path())?.write_all(gui_launcher.as_ref())?; + + println!("Wrote GUI Launcher in {}", gui_bin_path.path().display()); + + // Test GUI Launcher + // NOTICE: This will spawn a GUI and will wait until you close the window. + Command::new(gui_bin_path.path()).assert().success(); + + Ok(()) + } +} diff --git a/crates/uv-trampoline/Cargo.lock b/crates/uv-trampoline/Cargo.lock index 0611026d7986..5ae4861c14e5 100644 --- a/crates/uv-trampoline/Cargo.lock +++ b/crates/uv-trampoline/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "adler" @@ -245,9 +245,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.155" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "linux-raw-sys" @@ -346,9 +346,9 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" dependencies = [ "bitflags", "errno", diff --git a/crates/uv-trampoline/src/bounce.rs b/crates/uv-trampoline/src/bounce.rs index d0a2d4b8f4f5..a1cdd176d077 100644 --- a/crates/uv-trampoline/src/bounce.rs +++ b/crates/uv-trampoline/src/bounce.rs @@ -47,8 +47,8 @@ enum TrampolineKind { impl TrampolineKind { const fn magic_number(&self) -> &'static [u8; 4] { match self { - Self::Script => &[b'U', b'V', b'S', b'C'], - Self::Python => &[b'U', b'V', b'P', b'Y'], + Self::Script => b"UVSC", + Self::Python => b"UVPY", } } diff --git a/crates/uv-trampoline/tests/harness.rs b/crates/uv-trampoline/tests/harness.rs deleted file mode 100644 index 0af6bdc04515..000000000000 --- a/crates/uv-trampoline/tests/harness.rs +++ /dev/null @@ -1,269 +0,0 @@ -use std::io::{Cursor, Write}; -use std::path::Path; -use std::process::Command; -use std::{env, io}; - -use anyhow::Result; -use assert_cmd::prelude::OutputAssertExt; -use assert_fs::prelude::PathChild; -use fs_err::File; -use thiserror::Error; -use which::which; -use zip::write::FileOptions; -use zip::ZipWriter; - -const LAUNCHER_MAGIC_NUMBER: [u8; 4] = [b'U', b'V', b'U', b'V']; - -#[cfg(all(windows, target_arch = "x86"))] -const LAUNCHER_I686_GUI: &[u8] = include_bytes!("../trampolines/uv-trampoline-i686-gui.exe"); - -#[cfg(all(windows, target_arch = "x86"))] -const LAUNCHER_I686_CONSOLE: &[u8] = - include_bytes!("../trampolines/uv-trampoline-i686-console.exe"); - -#[cfg(all(windows, target_arch = "x86_64"))] -const LAUNCHER_X86_64_GUI: &[u8] = include_bytes!("../trampolines/uv-trampoline-x86_64-gui.exe"); - -#[cfg(all(windows, target_arch = "x86_64"))] -const LAUNCHER_X86_64_CONSOLE: &[u8] = - include_bytes!("../trampolines/uv-trampoline-x86_64-console.exe"); - -#[cfg(all(windows, target_arch = "aarch64"))] -const LAUNCHER_AARCH64_GUI: &[u8] = include_bytes!("../trampolines/uv-trampoline-aarch64-gui.exe"); - -#[cfg(all(windows, target_arch = "aarch64"))] -const LAUNCHER_AARCH64_CONSOLE: &[u8] = - include_bytes!("../trampolines/uv-trampoline-aarch64-console.exe"); - -/// Note: The caller is responsible for adding the path of the wheel we're installing. -#[derive(Error, Debug)] -pub enum Error { - #[error(transparent)] - Io(#[from] io::Error), - #[error( - "Unable to create Windows launcher for: {0} (only x86_64, x86, and arm64 are supported)" - )] - UnsupportedWindowsArch(&'static str), - #[error("Unable to create Windows launcher on non-Windows platform")] - NotWindows, -} - -/// Wrapper script template function -/// -/// -fn get_script_launcher(shebang: &str, is_gui: bool) -> String { - if is_gui { - format!( - r##"{shebang} -# -*- coding: utf-8 -*- -import re -import sys - -def make_gui() -> None: - from tkinter import Tk, ttk - root = Tk() - root.title("uv Test App") - frm = ttk.Frame(root, padding=10) - frm.grid() - ttk.Label(frm, text="Hello from uv-trampoline-gui.exe").grid(column=0, row=0) - root.mainloop() - -if __name__ == "__main__": - sys.argv[0] = re.sub(r"(-script\.pyw|\.exe)?$", "", sys.argv[0]) - sys.exit(make_gui()) -"## - ) - } else { - format!( - r##"{shebang} -# -*- coding: utf-8 -*- -import re -import sys - -def main_console() -> None: - print("Hello from uv-trampoline-console.exe", file=sys.stdout) - print("Hello from uv-trampoline-console.exe", file=sys.stderr) - for arg in sys.argv[1:]: - print(arg, file=sys.stderr) - -if __name__ == "__main__": - sys.argv[0] = re.sub(r"(-script\.pyw|\.exe)?$", "", sys.argv[0]) - sys.exit(main_console()) -"## - ) - } -} - -/// Format the shebang for a given Python executable. -/// -/// Like pip, if a shebang is non-simple (too long or contains spaces), we use `/bin/sh` as the -/// executable. -/// -/// See: -fn format_shebang(executable: impl AsRef) -> String { - // Convert the executable to a simplified path. - let executable = executable.as_ref().display().to_string(); - format!("#!{executable}") -} - -/// A Windows script is a minimal .exe launcher binary with the python entrypoint script appended as -/// stored zip file. -/// -/// -#[allow(unused_variables)] -fn windows_script_launcher( - launcher_python_script: &str, - is_gui: bool, - python_executable: impl AsRef, -) -> Result, Error> { - // This method should only be called on Windows, but we avoid `#[cfg(windows)]` to retain - // compilation on all platforms. - if cfg!(not(windows)) { - return Err(Error::NotWindows); - } - - let launcher_bin: &[u8] = match env::consts::ARCH { - #[cfg(all(windows, target_arch = "x86"))] - "x86" => { - if is_gui { - LAUNCHER_I686_GUI - } else { - LAUNCHER_I686_CONSOLE - } - } - #[cfg(all(windows, target_arch = "x86_64"))] - "x86_64" => { - if is_gui { - LAUNCHER_X86_64_GUI - } else { - LAUNCHER_X86_64_CONSOLE - } - } - #[cfg(all(windows, target_arch = "aarch64"))] - "aarch64" => { - if is_gui { - LAUNCHER_AARCH64_GUI - } else { - LAUNCHER_AARCH64_CONSOLE - } - } - #[cfg(windows)] - arch => { - return Err(Error::UnsupportedWindowsArch(arch)); - } - #[cfg(not(windows))] - arch => &[], - }; - - let mut payload: Vec = Vec::new(); - { - // We're using the zip writer, but with stored compression - // https://github.com/njsmith/posy/blob/04927e657ca97a5e35bb2252d168125de9a3a025/src/trampolines/mod.rs#L75-L82 - // https://github.com/pypa/distlib/blob/8ed03aab48add854f377ce392efffb79bb4d6091/PC/launcher.c#L259-L271 - let stored = FileOptions::default().compression_method(zip::CompressionMethod::Stored); - let mut archive = ZipWriter::new(Cursor::new(&mut payload)); - let error_msg = "Writing to Vec should never fail"; - archive.start_file("__main__.py", stored).expect(error_msg); - archive - .write_all(launcher_python_script.as_bytes()) - .expect(error_msg); - archive.finish().expect(error_msg); - } - - let python = python_executable.as_ref(); - let python_path = python.display().to_string(); - - let mut launcher: Vec = Vec::with_capacity(launcher_bin.len() + payload.len()); - launcher.extend_from_slice(launcher_bin); - launcher.extend_from_slice(&payload); - launcher.extend_from_slice(python_path.as_bytes()); - launcher.extend_from_slice( - &u32::try_from(python_path.as_bytes().len()) - .expect("File Path to be smaller than 4GB") - .to_le_bytes(), - ); - launcher.extend_from_slice(&LAUNCHER_MAGIC_NUMBER); - - Ok(launcher) -} - -#[test] -fn generate_console_launcher() -> Result<()> { - // Create Temp Dirs - let temp_dir = assert_fs::TempDir::new()?; - let console_bin_path = temp_dir.child("launcher.console.exe"); - - // Locate an arbitrary python installation from PATH - let python_executable_path = which("python")?; - - // Generate Launcher Script - let launcher_console_script = - get_script_launcher(&format_shebang(&python_executable_path), false); - - // Generate Launcher Payload - let console_launcher = - windows_script_launcher(&launcher_console_script, false, &python_executable_path)?; - - // Create Launcher - File::create(console_bin_path.path())?.write_all(console_launcher.as_ref())?; - - println!( - "Wrote Console Launcher in {}", - console_bin_path.path().display() - ); - - let stdout_predicate = "Hello from uv-trampoline-console.exe\r\n"; - let stderr_predicate = "Hello from uv-trampoline-console.exe\r\n"; - - // Test Console Launcher - #[cfg(windows)] - Command::new(console_bin_path.path()) - .assert() - .success() - .stdout(stdout_predicate) - .stderr(stderr_predicate); - - let args_to_test = vec!["foo", "bar", "foo bar", "foo \"bar\"", "foo 'bar'"]; - let stderr_predicate = format!("{}{}\r\n", stderr_predicate, args_to_test.join("\r\n")); - - // Test Console Launcher (with args) - #[cfg(windows)] - Command::new(console_bin_path.path()) - .args(args_to_test) - .assert() - .success() - .stdout(stdout_predicate) - .stderr(stderr_predicate); - - Ok(()) -} - -#[test] -#[ignore] -fn generate_gui_launcher() -> Result<()> { - // Create Temp Dirs - let temp_dir = assert_fs::TempDir::new()?; - let gui_bin_path = temp_dir.child("launcher.gui.exe"); - - // Locate an arbitrary pythonw installation from PATH - let pythonw_executable_path = which("pythonw")?; - - // Generate Launcher Script - let launcher_gui_script = get_script_launcher(&format_shebang(&pythonw_executable_path), true); - - // Generate Launcher Payload - let gui_launcher = - windows_script_launcher(&launcher_gui_script, true, &pythonw_executable_path)?; - - // Create Launcher - File::create(gui_bin_path.path())?.write_all(gui_launcher.as_ref())?; - - println!("Wrote GUI Launcher in {}", gui_bin_path.path().display()); - - // Test GUI Launcher - // NOTICE: This will spawn a GUI and will wait until you close the window. - #[cfg(windows)] - Command::new(gui_bin_path.path()).assert().success(); - - Ok(()) -} From c29b9d9015b5b3850d2b0fe55604218791b25ca1 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Mon, 28 Oct 2024 14:23:02 -0500 Subject: [PATCH 6/8] Bump allowed launcher size --- crates/uv-trampoline-builder/src/lib.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/uv-trampoline-builder/src/lib.rs b/crates/uv-trampoline-builder/src/lib.rs index 22aadbf563f9..6e93f382586e 100644 --- a/crates/uv-trampoline-builder/src/lib.rs +++ b/crates/uv-trampoline-builder/src/lib.rs @@ -197,14 +197,14 @@ mod test { #[test] #[cfg(all(windows, target_arch = "x86"))] fn test_launchers_are_small() { - // At time of writing, they are 45kb~ bytes. + // At time of writing, they are ~80kb. assert!( - super::LAUNCHER_I686_GUI.len() < 45 * 1024, + super::LAUNCHER_I686_GUI.len() < 80 * 1024, "GUI launcher: {}", super::LAUNCHER_I686_GUI.len() ); assert!( - super::LAUNCHER_I686_CONSOLE.len() < 45 * 1024, + super::LAUNCHER_I686_CONSOLE.len() < 80 * 1024, "CLI launcher: {}", super::LAUNCHER_I686_CONSOLE.len() ); @@ -213,14 +213,14 @@ mod test { #[test] #[cfg(all(windows, target_arch = "x86_64"))] fn test_launchers_are_small() { - // At time of writing, they are 45kb~ bytes. + // At time of writing, they are ~80kb. assert!( - super::LAUNCHER_X86_64_GUI.len() < 45 * 1024, + super::LAUNCHER_X86_64_GUI.len() < 80 * 1024, "GUI launcher: {}", super::LAUNCHER_X86_64_GUI.len() ); assert!( - super::LAUNCHER_X86_64_CONSOLE.len() < 45 * 1024, + super::LAUNCHER_X86_64_CONSOLE.len() < 80 * 1024, "CLI launcher: {}", super::LAUNCHER_X86_64_CONSOLE.len() ); @@ -229,14 +229,14 @@ mod test { #[test] #[cfg(all(windows, target_arch = "aarch64"))] fn test_launchers_are_small() { - // At time of writing, they are 45kb~ bytes. + // At time of writing, they are ~80kb. assert!( - super::LAUNCHER_AARCH64_GUI.len() < 45 * 1024, + super::LAUNCHER_AARCH64_GUI.len() < 80 * 1024, "GUI launcher: {}", super::LAUNCHER_AARCH64_GUI.len() ); assert!( - super::LAUNCHER_AARCH64_CONSOLE.len() < 45 * 1024, + super::LAUNCHER_AARCH64_CONSOLE.len() < 80 * 1024, "CLI launcher: {}", super::LAUNCHER_AARCH64_CONSOLE.len() ); From b420b40931131be7d9e3e1e50290a6f98b297186 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Mon, 28 Oct 2024 15:40:04 -0500 Subject: [PATCH 7/8] Rebuild bundled trampolines --- .../uv-trampoline-aarch64-console.exe | Bin 40960 -> 39424 bytes .../trampolines/uv-trampoline-aarch64-gui.exe | Bin 41984 -> 39936 bytes .../uv-trampoline-i686-console.exe | Bin 36352 -> 34816 bytes .../trampolines/uv-trampoline-i686-gui.exe | Bin 36864 -> 35328 bytes .../uv-trampoline-x86_64-console.exe | Bin 42496 -> 40960 bytes .../trampolines/uv-trampoline-x86_64-gui.exe | Bin 43520 -> 41984 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/crates/uv-trampoline/trampolines/uv-trampoline-aarch64-console.exe b/crates/uv-trampoline/trampolines/uv-trampoline-aarch64-console.exe index 5b6ea9cab831cebd6ac79e57e2aeffbb87828e7f..773c2f9ba5acd1d4a27ea34e511b44ff70417aad 100755 GIT binary patch delta 19257 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 J3MWsE{BJnyNw)w1 delta 20913 zcmc(Hdwf*Ywg2AdOp-GRA+O1UBrubNM>0qtkU)aOoSA41U=>1q6dy^9)`XxkfGvnP z6R;Wxwj53>inb)+)yycpSV#-EwFIcWu~^GPv9*s(0_udI63AA9b3ygh)$E|7}Paa>3*4Ze{P#7!Zp(czSZ$@u5Ze5z{;?nGo>hUHP zzvcKDzG+2I7RIV_S3Xj`x|*@q(ox~UZvuWR)Zg(bYJm`++>yH?@Ls0_^yoOYs$+%J z*(oTo4*UfCFzD!iGGlV?>gB7b&PM+`jvuvqNqtC|lJhcEee+MI)+--f{$x#Hf(#SY zTmO9DFNAw|#b07r^Q9Q`$n^;3FS(WVZ(ywAdW7u16k!{QiD4$jc+(}3d&Z!hm$Ch| z;p~LO+2&e7Iwmoxi8Yu35#0QG}ON^;pcSd25B}dw5HkX$C&ONw}yDy1? zX8;2?2;hQ2_77qX;Kcq~%%c;7Re`W>F~Rearfnw(i725I#IiP>f^dO%0cJYEd0 zE)P%VZ>vgpnzIVcs0w0WBAPRRZ>gpwe?vRy2CV~VbC{3(+6N|eg9(XX6w&wz&{pBS z4@_RYfw{*3PY!TU+4%-@ODGTESpuVp=BGfjB)G~~FUuYQ?P2A$AY5H!G^yEAx)Ycx zHZ7|y%n4)pQW#UNfRe@uOp*H6ZmzutdUlX62v)RL~n-}mX zPvv2Lkr1@onKA$(s)fX3E_8Ss$Y-&{Cem@OvfK3KGpCZjl(+2^z*J17O-N`G!h&Q>vAa2! z{n-IBl1`(+9F}#sjRqmQR)JZv`f+59z$dA5qb8)%hAm-Y9|tBMmZBRQp$A)jRkHf? zsHJ%ev8uhZHtn!7c40wxxKfY(JZ6k5{>ungJnd`f;ELQ@U*Ru=kvUIrXvWgh=)6mb3=jpXy7j_*M9WJ!%Iw3k*4QTfs&wD(KRosCw(AKFp?vbeR zlZ9OkqN4@Ky4poYwZJNNHcYSggtH2$SJPM^?jnLBsO?vUS{ToJ5%1>W-B-r6_^t-Q zAp`MjDj()?U5A+?3pi$?e0)8Ni=DvY%`=%J6T}<>-t&M{nUk45EM{>Zj%V>*m{Bh6 zHKLO9yypLoNpH!oXwDW^8nzUO;__plA#TD`Wa_oH@Shps3@ciF`et zC4_MP5#z$|mhz%UFCS~YL)`Y~B_!Y7$WKr6$k)nV_x%t~BWfc8B z415>}=j)1{Hk9NkfpX8erX`atRo9rxS)l9_^o^Je(oNw5!~0) z)DM$VopymW|1>PeZ*ud63gQex9H6mO}ZbnoU$DQF&0{V9d9`KUbeO=XX28+RA~ zT2;oS#7+#pLZ6Lj|9kb|xI?^MU7LE8FIJ1wev|ZDY}RJGrHN)k-VJT9lRPT=r>7NAX#sxcu50bRKtfvu{B9x) zwctDTBv(r0>{wMMQ&ux$(?{x_^h$We(c@oGKS=x!15AjZK9zL)O{Cd0k)I&{81`6K zEwzv{U!PpmTPhbpnK~@S+n)Aff2f_~EqtlkJN{n2QMFAt<^*F;kWM2m{@EXpT#2)G z-xQm!LTe{8x6b^adr#WJ@~us4gcC#?HIf^TRdU|f10!SQ{H=!pjnI`Ly-AzY3U7NM zbY>-VW<|r6;u}iy9F(RFN)vh=@q+B{g$wS(PAvl)MsLzu5ZRk0yWMD~J`yqUR+@e` z+z9C%yY3=U2iCw4T-Zj4TDV{Pg%NUDxyOcgA6(Irsa{6CC-|&>U>+|NiE5v@T$nGa zC6@6S(O8n4t5v6>wF63(But(Y9v;O_kbU$=a5YargUn-K!@rs0s^A%!Cj6 z4m{_IS!m~hI-pfqf&SfCYI3(8$1_MdN$(G{j*E3DYqQuvnnw3g_`I*En={g4V_1b- zkc+HgsqvLuaB#IfV@hlNSHr}S zIb={fu$Q{R<$j56DEF2!<;cuN-D4ImW65D<$_#9O58Bzo*#1hE)Ypblyr6`gZuG#DZu@zG%*K|29cROp9hf@VVR&%KZMw(?k1b=)#kzU=yHkerETQOw-sX>7?Xp(IdC4SZ%$pUTA3AQGD6|N zxh^91s2F1dCazktQYM4yX75$4{gA->yce|!5@HO#mj>@aBg|y4)T(aInjHQNnx<*$ zud*_QxH$FGtX2FU>YWpJ8PKFz9hms|&BjvySu6o9xeHns3_eI932EL}vGHiR$;l5% zU=<{dr0=_zLCcm&7U9hi^%s+p#;Isa{WL5{s4YW~_@ercNm=|kl~2BzbG3MKiF4Hm zg=OysOu;%K7*=x6AV!)4!iRfOlvM~ZtGFvZqzlhr>3)I{hA^^Mry$9556aLpv%O-H z=L%Nh5+?ow2<<8%sjmhC+bjgs?hvS=HpA=e7}J(`!yXNZ$)3yTMBG!KGv_;}jcD8T z=r_3A=mqUatYvd1cyKhx2ii`$qAF!4LQ1Lx)c8cXs5=4z3nk@+3K-1`i3wJ!r{EW{ zL_PUcm5ezIDe}{dZz9jdd72bY8EtV4K--$i#`Tq*h$H)r*CIQy{|c&MjSdxwABWn6 zau*3`TMJjojJAi-rfRdzjflJGVc;VH`U6d!p0HK7& zsUa;n^h`vlmMPB&>#wRmpE4e<)o-VySZC43gKA;dB4$$*K&};)H(u2$W}pmt(XHAK zud3IlJj^52>gsOm| zCONCdDLpl$)y!632`eJ%5|N|22!4jxg)mxYRpV$@9R{8Zxu_AF9kSw(L9rccaT|o3 z+7WAstz@!w)}p;JgB6W_NA-&n#)0fG*3Q5u9^oqAg5ARq?vp{8j~{6~$->-3yisEQ zs5~I1i8OGf4(qgw)(OI0$)ogyh*AC1O=-?8aL?@kf14B&NF)#S z9qd6>VE)=?D?1?xO5L-8Ez`zEeoc}+n(?$qq~k$h(eCRvSmyMT_fZBlL}F%!NY#$w ziOvty!4+-~)kiYdw$Wl}iY7562ZH%`B1e+}{uaV+hT7j~8^EK`KBgclATdtakEGDn zEy@&yM8`_rsQCj3n7N}ai*raJmyCFOqm}Irvd|k=zkF_@OiIPZB}RzeN(vG zSHl%=7KEh~NrG9dNQ+_zHBE3+#P$iCz#kx5@S<&%lil(Wv8H4UBm-K+hREpKnua*@ z?`GpOe8ZI+vjpLk@97-9$>1!G-WOI(DjO475GOTN$QiP`1T!Lg^aVtD^gu>P8ZAL2 zkd`&b?)mGvyK+5qcaqA)&ZWpOq^ZWh%7mV`O`D|dF(%K`)hXAV$Rc+f%h#}NESL;( z(~5L8u(e#6bm+M?3i+NAxk!R%u1ZnqP7+@j>I;#HvVZDN<%4%%uQaW#AE^gX^{q@H zQ6}9>?W8>UAmk*E@;H=C(6d7)m@*Y?zT;Y@^g#qGSh#+S^fq*Q4senBxxp3SGA1%T zD++~r;q(y*cqwu=odP?!6dSb@PNgrBwd(_QGlhiE*dP~?(7g}D1Z%QpgquF?V3#(9% z=hkrfU;;JXAQvsf;IPAvNOqt+itR05#y6*8*E=?4!gdIIS7yX*P9?;l32@d{P9CZI zvXFXK~;*4~Jnsb|F`tHh(MpF>>2?lvO10EM_d zupSiASX5hHQf0ng9gMZie-|7!$hj6l8;|Yn$%0n+(hj`INLEq&idYONL*j^O z57Gi+2prp(%JDpmr4GHj=d$`?-h|BWpqkK;drPRKwE-$Z&AxM49XoT1^Jv@&I#1EV zgqk?TWNBdx6$Sw5AQhskTl;JMx?uRR9h^}1+z?Q%TV$H{A_0xs1n6XmrZU}fsZ$!nVc zsjhxJ8sHfo)`hxgY_lGjK^cESxY@lLnKv@9Ett)U$L}px5vHralV`MaImM#^xOQr`Vqj1$SsHTiQ<{Y-6~**4)b+HZZ6$ zQeI2q-zcE&UFK*(tYvm^M-|{7v6_b>S%2@SKCSeOKGYVQS#Qg!PVJwS;QTN2sHPHO zBP`ScEy)<@qoU4|6sYqivWg+d7{w)*@x!JoPm^8c>C6?cB@6!HG{LW#1-~;w>feR_ zgIMEk_Q2` zO4kBX7buhPrdXvtc0VcnGa!Nl8;5b$7HA7<6G}jIh^)X|TGVI5z^ly0zjCE}S~;c3BgqUQ;e>D^moVj*bV zX?B04z6>43KIC?*1Xpn_^1Rx00l9$2*%O5mSJYq3o|pJvH`2WRdeMC)i}|lzF{s0{ zZO$mD0P-i`GVG_Vz84x}1Y+kGxs~<;e3Y&0veJ~wQkAzbC9;Q!d)`yU7)n+j4XiOY!w!`%C|+bW|Dr&XOTck$~Tsz${5@k zFRF73@4TfpSIT)Fkr2(U0Cs!|P-#!{fJLc^Ql$SNi(>L*K;%Le#R~=O`Z$x_ajH_y*m&=BRRigXpLBZb-7_XDR+9*%=Tn>b`jG%-@ScI8%Z8i%jmsV23e zD8+dvI`m_Mn5DoOG9_&;UkaoPDa<5ixE3A@eANC{QdiHh5nL~5_F>ae^2%5R$CqK# z!gL2Di|#lC(vZ^YvO5x9{CUynxdS-*#4(;b>XsMo#1>eN`f5#cR%Gy~V=%!@V-Wih zAq=jb56~#fMRh<*c9Xm+8jyh)id8s*BBPBJQGF<}0h4Goz`KKew{j3j#OtbP(+!n& zoLnraAaD(V+)1yf-ZD30%yGNF3ci~chSaSto_qg|JOareHvHC%=L(g~MNA>Hd-a00 zy%E`NJqLm)Boha;!>H5SeN>2rPw-?)Ou0zy;BQclp8ZHhAiDfx=ai+W)Doa)+((x1wyBP>;5Ogtr=B00eo!% zd@H|&?}>lGXZcrzkA*0f!R;2N)Lc+=iziP&6t(wV&F)Y6wcW2paQ{FQ_fsTAQC87D zb!G8PK^#`!D4so@i6y7u16rYC3oLkM0xRgU&(UuVSX6)UEFo%G&AlaQtP`q%1d7%v za#$_DC3D=9SPE~%o$g;6k=(5jmEGa2nKG|WsW09#$CwGHrUhw-A(fXTJaic<*>^L- zfH}->HnRQ(oR1BcknARV-o?hJ{E>J8Nk7s=dX6+okCw>Xi-wl+bEML1Y<^M>F!>d} zh&zhPCdAJ6MU)L@RuI5`FrYZe(%vhuyrp;q~xdi!7VAyhyP83*)#{> zCExhxc<+7TcK1{$&w)=2?ty!8fIU4B)b12w9Y&X{T+51aH(swgMS346GycspH>J+P zwHo;J{p-?7{WwPRq#|xzdL~sVLza|$q-2zbf0dE1B(MW3heXNx7a^t32d!*`()S(} zG0_xH``562Z{6i4&6UF=o1$P;ojgS?ku#iwbC7SK0c*IwK}b5*BSJ0rlUmk&AuIVp zu4tD3+3vgCXEAeG>?jV1qZ!7=tout}0GfGvpV#av4u|WbiOgSx1*fx$ZZMSaQy&h3 zrO;W%Dx`*4g8Dbvc(dha$k4KpIY=+~k)<_JdntJKKx#e(#|~c5MRQpLJM0q|7EMK) z`f5=%+e)1&o=g2yYxWFol>LWb^5~>_5NGE;u<<}V>o0}*96~yYM4|y0H{#cct3N^< zJFyR&Kt|MVj$!>HXzxbbwoG>7@Uq$iB^KFH27k#c25^o9aY`cZvqQ|Xp~iO_FrZ!S zw7Q5f0HmFZPn+QybVI|q` zGnCeFSNRK&dcEI9^m`Tkvf|w?>i0sq``6SD^0g+1aY`KIGM=dTL=cKE0DIQHlZf+`H>zg9Ehv4f}6|nZfQ=%Jb zx2+>E6Iv=wZyOj zXX(6vVk5anJYYMnRn+Rvs;N%^(tm&nJz~1mDGGh1aB>d`LSNROwF+;R1i4Q2T!nw? z1tHxagiaKTdm?Ug)62WT5u&ym&p)F;S6onJ&cOjZTy1F_TWrLoAqnSka9vK6;2M*x*TEiUx~7*U*B3RTz*o`y)D!E8~8f>2SrtzxMtHC=u(!u=Z@iR12$gX@}!D_>$_PLb)i>q2f;PtV3X5(xCd)ZK=*=EN?*jq}<3g3}Y%Jj^rB4 zW>zs01-%{vk)>U0Gk`G_#RWs z8y8J3@5PZy!R>uP+#_(?o}P^c=N@mCQRxPQItfA6e4Rm64xFB2<)lQmxFm7HN{R1G zm9UC*0D)azVWvxL<3QMS$mLYXrD*6s3TAjACbTD#fy;bV?C(tZrY;P1ataQ&@FVxB z7v6)9tC6=yIg?q%!cA#bCj;v2&^JMfN72~>nFMS8sw?DxOjeD6`bl6B;3Ww1rD1J<*f6%6roM7} znv;Tic-4AjLFg_)^B@`TABMKkYNCoBf>}oZ6wvjvn13nCS5Ur;2|?T;ZE5;GB!f#vVUTwTZ4d$XGp_ECFKPP`)%ZEzzT;P4YjN8LKhNM zxokpdN}m@|%Q+~a`PV87&p`{;u|nXB^rV5-KGZM!va+xb^@kd)^^arQokv~MKPn5) z>vdD>r>X9;k_<2G1ZAHpGgyBI7~NFA?7)IJvb4r}!~hkasK)te_QPSUnJ$KO!m#_0 z;3)YXTA$M@HYXUHvauAs!0k&A{0rgyJCT&;=sBOu$ZMr|`rt@Jg{jNt+ns;IMxgk3 zQ2_v@Y(UuQE=ubJ+N5Pg=0sc}!LxZB zG)k*h@inGAQi-$SCAZy(9|P$Qx~vhdXvfGJr8wOSu{Pcp?nBHB#eo;GxMbG7vDCf& z%g~NPWEjlub>of!9p(36BaklD?uu~3&-Pyw0~U!x(Of;RZ4bPsd`u$dsz;eyrJn`@ z8*+yS!Mn(g=TCkqI?WzhcnVc_39QMAs}|?c=|u$gUy4zlJ|viDU?w|pQ?moh@?$Xe zON3?T#j&0}IP*BPi8->NhMvg$(~d44dCr1G-DF_1zXVQ-yuLzP>(d#IEQbCPa99|Y?e_J20Q zDKk&%YsJpjw;8tBC2Y4rY_}n7wJm5z?9}fMz#$@?Vnv;IN+9_@h44_0pkB}YZlys- zXz4bJd*FHC7dCN^^j=_He809A;ZDhHZw-t))=WnD&S5|@mglQKSv+pG3PJ}SgI%k) z;f@y>UXv$Jml+z^xu%kYw@_u z`hU~cII3^gd39O&6z7lZesW$(;3k6YBX==3IlPYmBTvA=4hUa{XA7Rmqy@Z`B##e~ z#&XmLObhkL(l!JbA`$nIMkt%aD(VclzFNQv=$vK>XC|^vAy0>*V&^~>^CPP`C!kyd z{?$uRuDY$kmh6U*4#OVZhg&@Qc7=gQc(2=^kZB?NGiYXhvOCOZ+v9CA?D_nwZ_G_A zHh_c#3%N=m*XVJ`ns$ac5zLS=4Gi25@8Z&u`}K6QH%s=9oWYG1@Np2!Gyv5zOTUmB z@XN?|dkBPfNNhH3Z<+wB%DiOoL`+A3Hw2nI;*hnDYyPlG&qL_eQ;4pLk$*xHxO{0ngn zw^tkQUKJgAtao=r(IzhcQtQJKz>E(d+no@}_78zKe|x^P&^Z;J1x)Uyc=^C)oP#}` z#vDKWr|foZI6SX+p>WXIi?x2O$L_Y~84mQ4F+&uS&85gr20c?6p@f)AjGYI@)+V#X zmB|xU!nwat-zqBPQ0Z-ugd*3N+8Ob2*0Qy22Ppm>fWowJq{4uUmYJd&E4kJSk#@|I z)E|B~+6lMGQO4OpA0~N4j4GO+#}1GJC0~U#G|apDL+&40$Neqj&7w_=E-K(2=%t7V zvZkvQ%EH?*zD|z}fxwv27>hOmCBH|{hd!eSCptv4)4HmMomeuYwfm9-nLMxlrG~3K z8=MxRjmNr4asCY&8@q2uAD&;hbB`{8X6(inqW2iEVu3RQ3Y?L;jdzuk!PTOKgAy2} z2m0N1|5-5mMh+HjNdKh?^nDkU7Ea-;xww|xuD-a$?4)jzKcMEupf=RPjOV+fSpmH# zRMJz(k7F|sDk0boIWB7=o(E!CK@N9qE5rP80D8fFz3bwtKO!$5g{U)z`|;hvg*5m^ zuZgApL6By`hH3tM8XelllqaEZdZ<8g)*vGuqt2~Jopu#CT{ya;U3_hMW;Q9zzqXT$%IcTj$bcLVlxd%!- z6amuJfvI42516a3=+@c56Q$?JCVmThILK7?qx#csUXrBw!L#JjMDT z0b87a0sf2ublqT@s8oX;*YRF2znld^UFDZUWlNTF808_9!T#g8==kuRxz3YN%?@(? zKyOv>7R&H%yL$vD73MfY|NBsK0kxgtc?l}s9Bb(BY}0PkJ%>6Lg-{!AAPE(@ge6e_ zIth)Fl?P`s&@qLR7!{>D_akSdbeTz?LvppxF!m zHBh!g1>xHYGfzdJydxMWr&u)v$P_5=M8KS73kAwao-I&?BxGc@k}*XneLb9`%!0QB z2dGgtTrUoUbJ{F}b8Q=Zr@;u=K1f&!I-BRQl^i!{NdmRUM8B_I^lMLwe&mdBYQ#L5 zvDn4P?HnG^Dv<0n4e2H=FyIwDTX0&G!sUaM@Vpr~62bQNnR65gac-)EDL)vCFLIED zv!lPf4mUg{W!M8=nz64u= zkRwXjfk^ohI#FcoBvzh>G>CS$uO5jSAfhJE&eW;7{5>Bmd0m7mBQXquV=%s{Wl76u2!t52W5t(6q!_sM=_pwsli$#+B#@eQ1 zFiO{T;wTtbBq1r`OcmPEfIcLZApMN!4AeJbTvBj!u<$CLPl0alQTxHaVIX}Q+%!cw z6UdevXTC|wK5P%kAR}ESdCvB#N#CKf^E7P!kq zwopgjAS5@@0CRz)4-2Q^3y@mfXfY-5F0pAA-g%MOr3>SsgG@49Bn+!hGk2|^MlQ`Y zyxNPS%}176qQXLidNS0XEFHgK49X(f6YoZR_>2PASN9{`qp#WPbddq4MRdpmB10d+ zXg=IY(~sT|EMRfSNK1q2(9*d)LCw2Aov&5zygxJgS7=5DU^Zx(v#N4`rTi)eAcPzq zV(9SWCA6{t0ktHgh%Qfb>)VAX?-7@985thHg`9p7CoyJ|>V3fAe1JAQZYcMD@m#!- z8>32YV~+W_x+*tE8d>=rA*uoq#y`OJ%K$a@ZFUB}p z2tF07e=%wP(cCzPg(~*M1!nQrIEPHs7bg&PKoEq*CPxPia3aa^e$R$-$}p(e56#b< zZ%`sNEj9|S@DD-1j^ILD3Ue(8 z{<{D>DBB3w0?t!*!v*+Pg3x~WAUU}T?LP)&uy&^i!UUZF^rB4G(t>t>0_;G)V}LT? z`#5?{_Tu5cQBei>9yJ7_qtpQKFrW(q9|G(EqIant@Hc=hc#nIb$yF%-8jzt~JD>&S zeSluPe~0QZ@P7h!pu7jrh4*g(299jiKUBuW?p@GbsA#+OFQ@lP{1)|#%K52(|AOS$ zYz>_w2RFlU=^b@J)ky=*d0%?{pJYP z@1k|bF$fNPDx?T`8=a2?HST)zr=nV5yyK-8T|&xQaYg7VsOP=tCWmkNN77FCA!;B z>CgrW#-R1w=!383pnV?e)q|Gwzri#$eApYwX;F{uJZPAC8z!T9C3#gzNpGh}pHM zCr&}RAogMYws;vIG$BNR`tHqQ__+6}@5Qr(Yh{+hlm}#f)3u$F^h~8>x@wdl$_3_Yq62!cq6+5^ zG?7Pi&6enqplWfFqg-33{$f^Y5;-WL`vTaB$7$82!)orM$^5wbok!<6`3b6~;GhcE zTqS(x6uPx3QSt(mZosCk#`h6NkRwExl)oBO9=A*|X32;7CvxnP$w_NZ0Ehb0HOJb(W#Lk2 zit;#ftmIP1pWc<4p63Ng3sboMLCk{kG1u2)JfP0J5$tL%}8 zIVo69B-W2F#jI1X=Zp5?VqrQ?6kxGhATVv{^IzysLew^-<#&T4G){0ERmNW~j?iM^#gC!t@lAo8daIOIfqd;=!XP8A4oCQkz5Tax(4OqSrtR)7}Z3dDra-Qhu zTZ&Vk{eFrwFkOFrDL#4CzdgdINAI=$*HtJ~$SWzo$8ZfGbe%&Jg%e)<9RxxYx_(!N z*(K0X@W#La{0;;uzKymbQY;+WEMrljGVqw|AaRS@WZs1P{aN8|?PlhG79S-e>Z56! zJP$)tS7R`2U>#Y=p?(T&bVSeK@(Lk<2u_Kx?cR+?=5M6oBr}G zftvk6`1PT8(fR>ag8$$_F?`87`k(se71g*Fp696Kg{tC6wtc^Pb@g(~%BP-KUHAB- zmPc2vd~)Sn%VW!*d>FOW%kh_Js#ia`((-uqTFVnpuC_e2>QPI@9ZMn^Yk46s?rgQy zF^BuqzdCZQB@f(vXXyjE4`5&-;2U^1yOWiotYzZg-S^ym&%XSX8G-;uU<-a*@p}%xHTa1SG8Pw?%W`uwbLn4Z zT<(nAnPW<9Q}X5%=jGj;m&c0o^73-fRR5=rS+|;d)rNI{=CZo@nXHMSKSYH51e=N9 z+uQKlz*zZ`TbF#VIBr6A%Wr$tm!HYL=fdj1oEND9O!WV^U%?h=W~_Ep-JekBLtP7g zp?{yE&H{D0cU0YHsGISUl9B3Mgg5lBDhLB5#(oeiZwtbfApAuT9tpyag0LqDzY0RO zJ%A}b2qy;N+#tL!0G(`2u%bB#+k)^w5PlehJwZ4SgyAm-21p6Q>>w-*!druIQ4l^9 zgsX#as}7xvwFN6Wg7BX~crgeg!7KVVF$nX6@YWz)8iavXj4k_Cc}=kVd=NH|evk3l z|K<|V`2U+rppXB*xCH84*Cch7%Ndi$zfXtvcPi(j(;JBDcA6K6} zgUchaqzaM0WhW1R#Lu2Nb7m});q5X;?_-!HHdG&pdgu?mK8?Bb=Ml)6acAnUKe$Kip#`f=b*9i%r7wIQ&AyJ|4s>o&Lk;pJ$&v zV?=v=a;g)bglC!vN8cCGji;gMfADbO^r)l|P@HaVHeHM8pCm_y9jUzz15C4xn4M&-VOA zE^H~;Co~Fz^8&W01kFDJ*amnT%i`w&zsp|dg%E-%EU0B|kpm&39D3~-T&u?JZue;aTy%2xsLWuD<}tVsb(%Nh{jYY|pk(Fhf91HKIS`c(V?&jPxE zXbToN1C$>JtY#KIV;W{p?EpIfYiGbf0S@HRU!ZGYx6Y&iEgb#^E5^X^H`sZ+&!2@! z0sbCPdKHs)=F{r5u!(?q=sLuu@)-M9Q z73DU-DnR<6Z#iJ>&6pt|d>J+#_~Fa2ttgk_uiLZ$!lTjaop5Q`+o+gWLX>CnEr4}^ zOlItREK9f#Fo#bOT{gyki*~P<+*&fL_2? zfbaG12A1GFU>zp9A94!WaB{<40U>z=FdH2f)uS`u>gBY?uk!)G9L!+GXd4buM_ z-~+G0g}iLII+w}#qlWkHo6*?LxwNl)%OKx3cH2-GU!jJ*TohmU#)>!Ayz%lIEpKGM z+4$yP-b`sz?|XS7ze8RB^0XOkEqhxIv~;vIwzjlZ?W*0iV%M5ou3g?;;7be01R%&d N0?$&*zQaN;|3AY}4L<+? diff --git a/crates/uv-trampoline/trampolines/uv-trampoline-aarch64-gui.exe b/crates/uv-trampoline/trampolines/uv-trampoline-aarch64-gui.exe index 1f6524111b1eb892262623fd68804e2bd13ce58f..f0fe2a3bb16eed395614e11354f7ea8d46f60981 100755 GIT binary patch delta 19849 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 diff --git a/crates/uv-trampoline/trampolines/uv-trampoline-i686-console.exe b/crates/uv-trampoline/trampolines/uv-trampoline-i686-console.exe index 3f0bed6a18a40a1b5d6cacad7d27809701b2b198..ee1e70e7131301d5b66d536f7019fe32a48c4bea 100755 GIT binary patch delta 19122 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 delta 20621 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 MkP;`PLMop5UrZCe$p8QV diff --git a/crates/uv-trampoline/trampolines/uv-trampoline-i686-gui.exe b/crates/uv-trampoline/trampolines/uv-trampoline-i686-gui.exe index 936aedb5e00327296759d2bc2f2eeb8594d3d119..6edd2f5114788deee960cce512e5ae2fa0f57e41 100755 GIT binary patch delta 19241 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 Rnj$^MDYKt?9VA-(e*gzSPip`G delta 20833 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 diff --git a/crates/uv-trampoline/trampolines/uv-trampoline-x86_64-console.exe b/crates/uv-trampoline/trampolines/uv-trampoline-x86_64-console.exe index 8ba2f2b5acd060089171f9b85d4998cf4e1e3bc9..f437f03f0c57dcc62d02e707895133ac8647d0dd 100755 GIT binary patch delta 21993 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 literal 42496 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 HJ_0`h9=>^X7ZfYmnc6*tY)CvuS@HzQyGH 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 literal 43520 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 Date: Tue, 29 Oct 2024 09:13:08 -0500 Subject: [PATCH 8/8] Separate size tests --- .github/workflows/ci.yml | 11 ++++++++--- crates/uv-trampoline-builder/Cargo.toml | 6 ++++++ crates/uv-trampoline-builder/src/lib.rs | 24 ++++++++++++------------ 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0f2781c59231..bcd663f165fe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -395,6 +395,11 @@ jobs: - uses: Swatinem/rust-cache@v2 with: workspaces: ${{ github.workspace }}/crates/uv-trampoline + - name: "Test committed binaries" + working-directory: ${{ github.workspace }} + run: | + rustup target add ${{ matrix.target-arch }}-pc-windows-msvc + cargo test -p uv-trampoline-builder --target ${{ matrix.target-arch }}-pc-windows-msvc # Build and copy the new binaries - name: "Build" working-directory: ${{ github.workspace }}/crates/uv-trampoline @@ -402,11 +407,11 @@ jobs: cargo build --target ${{ matrix.target-arch }}-pc-windows-msvc cp target/${{ matrix.target-arch }}-pc-windows-msvc/debug/uv-trampoline-console.exe trampolines/uv-trampoline-${{ matrix.target-arch }}-console.exe cp target/${{ matrix.target-arch }}-pc-windows-msvc/debug/uv-trampoline-gui.exe trampolines/uv-trampoline-${{ matrix.target-arch }}-gui.exe - - name: "Test" + - name: "Test new binaries" working-directory: ${{ github.workspace }} run: | - rustup target add ${{ matrix.target-arch }}-pc-windows-msvc - cargo test -p uv-trampoline-builder --target ${{ matrix.target-arch }}-pc-windows-msvc + # We turn off the default "production" test feature since these are debug binaries + cargo test -p uv-trampoline-builder --target ${{ matrix.target-arch }}-pc-windows-msvc --no-default-features typos: runs-on: ubuntu-latest diff --git a/crates/uv-trampoline-builder/Cargo.toml b/crates/uv-trampoline-builder/Cargo.toml index 17bcc4024e9c..f4c54e15a7af 100644 --- a/crates/uv-trampoline-builder/Cargo.toml +++ b/crates/uv-trampoline-builder/Cargo.toml @@ -12,6 +12,12 @@ repository = { workspace = true } authors = { workspace = true } license = { workspace = true } +[features] +default = ["production"] + +# Expect tests to run against production builds of `uv-trampoline` binaries, rather than debug builds +production = [] + [lints] workspace = true diff --git a/crates/uv-trampoline-builder/src/lib.rs b/crates/uv-trampoline-builder/src/lib.rs index 6e93f382586e..3b1503f7c3c3 100644 --- a/crates/uv-trampoline-builder/src/lib.rs +++ b/crates/uv-trampoline-builder/src/lib.rs @@ -195,48 +195,48 @@ mod test { use super::{windows_python_launcher, windows_script_launcher}; #[test] - #[cfg(all(windows, target_arch = "x86"))] + #[cfg(all(windows, target_arch = "x86", feature = "production"))] fn test_launchers_are_small() { - // At time of writing, they are ~80kb. + // At time of writing, they are ~45kb. assert!( - super::LAUNCHER_I686_GUI.len() < 80 * 1024, + super::LAUNCHER_I686_GUI.len() < 45 * 1024, "GUI launcher: {}", super::LAUNCHER_I686_GUI.len() ); assert!( - super::LAUNCHER_I686_CONSOLE.len() < 80 * 1024, + super::LAUNCHER_I686_CONSOLE.len() < 45 * 1024, "CLI launcher: {}", super::LAUNCHER_I686_CONSOLE.len() ); } #[test] - #[cfg(all(windows, target_arch = "x86_64"))] + #[cfg(all(windows, target_arch = "x86_64", feature = "production"))] fn test_launchers_are_small() { - // At time of writing, they are ~80kb. + // At time of writing, they are ~45kb. assert!( - super::LAUNCHER_X86_64_GUI.len() < 80 * 1024, + super::LAUNCHER_X86_64_GUI.len() < 45 * 1024, "GUI launcher: {}", super::LAUNCHER_X86_64_GUI.len() ); assert!( - super::LAUNCHER_X86_64_CONSOLE.len() < 80 * 1024, + super::LAUNCHER_X86_64_CONSOLE.len() < 45 * 1024, "CLI launcher: {}", super::LAUNCHER_X86_64_CONSOLE.len() ); } #[test] - #[cfg(all(windows, target_arch = "aarch64"))] + #[cfg(all(windows, target_arch = "aarch64", feature = "production"))] fn test_launchers_are_small() { - // At time of writing, they are ~80kb. + // At time of writing, they are ~45kb. assert!( - super::LAUNCHER_AARCH64_GUI.len() < 80 * 1024, + super::LAUNCHER_AARCH64_GUI.len() < 45 * 1024, "GUI launcher: {}", super::LAUNCHER_AARCH64_GUI.len() ); assert!( - super::LAUNCHER_AARCH64_CONSOLE.len() < 80 * 1024, + super::LAUNCHER_AARCH64_CONSOLE.len() < 45 * 1024, "CLI launcher: {}", super::LAUNCHER_AARCH64_CONSOLE.len() );