Skip to content

Commit

Permalink
Create lib64 symlink for 64-bit, non-macOS, POSIX environments
Browse files Browse the repository at this point in the history
  • Loading branch information
charliermarsh committed May 14, 2024
1 parent 8ce9051 commit 5c0b32d
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 2 deletions.
5 changes: 4 additions & 1 deletion crates/uv-interpreter/python/get_interpreter_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -555,9 +555,12 @@ def main() -> None:
"scheme": get_scheme(),
"virtualenv": get_virtualenv(),
"platform": get_operating_system_and_architecture(),
# The `t` abiflag for freethreading python
# The `t` abiflag for freethreading Python.
# https://peps.python.org/pep-0703/#build-configuration-changes
"gil_disabled": bool(sysconfig.get_config_var("Py_GIL_DISABLED")),
# Determine if the interpreter is 32-bit or 64-bit.
# https://github.com/python/cpython/blob/b228655c227b2ca298a8ffac44d14ce3d22f6faa/Lib/venv/__init__.py#L136
"pointer_size": "64" if sys.maxsize > 2 ** 32 else "32",
}
print(json.dumps(interpreter_info))

Expand Down
10 changes: 10 additions & 0 deletions crates/uv-interpreter/src/interpreter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ use pypi_types::Scheme;
use uv_cache::{Cache, CacheBucket, CachedByTimestamp, Freshness, Timestamp};
use uv_fs::{write_atomic_sync, PythonExt, Simplified};

use crate::pointer_size::PointerSize;
use crate::{Error, PythonVersion, Target, VirtualEnvironment};

/// A Python executable and its associated platform markers.
Expand All @@ -35,6 +36,7 @@ pub struct Interpreter {
stdlib: PathBuf,
tags: OnceCell<Tags>,
target: Option<Target>,
pointer_size: PointerSize,
gil_disabled: bool,
}

Expand All @@ -56,6 +58,7 @@ impl Interpreter {
virtualenv: info.virtualenv,
prefix: info.prefix,
base_exec_prefix: info.base_exec_prefix,
pointer_size: info.pointer_size,
gil_disabled: info.gil_disabled,
base_prefix: info.base_prefix,
base_executable: info.base_executable,
Expand Down Expand Up @@ -95,6 +98,7 @@ impl Interpreter {
stdlib: PathBuf::from("/dev/null"),
tags: OnceCell::new(),
target: None,
pointer_size: PointerSize::_64,
gil_disabled: false,
}
}
Expand Down Expand Up @@ -326,6 +330,11 @@ impl Interpreter {
&self.virtualenv
}

/// Return the [`PointerSize`] of the Python interpreter (i.e., 32- vs. 64-bit).
pub fn pointer_size(&self) -> PointerSize {
self.pointer_size
}

/// Return whether this is a Python 3.13+ freethreading Python, as specified by the sysconfig var
/// `Py_GIL_DISABLED`.
///
Expand Down Expand Up @@ -429,6 +438,7 @@ struct InterpreterInfo {
sys_executable: PathBuf,
sys_path: Vec<PathBuf>,
stdlib: PathBuf,
pointer_size: PointerSize,
gil_disabled: bool,
}

Expand Down
2 changes: 2 additions & 0 deletions crates/uv-interpreter/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ pub use crate::environment::PythonEnvironment;
pub use crate::find_python::{find_best_python, find_default_python, find_requested_python};
pub use crate::interpreter::Interpreter;
use crate::interpreter::InterpreterInfoError;
pub use crate::pointer_size::PointerSize;
pub use crate::python_version::PythonVersion;
pub use crate::target::Target;
pub use crate::virtualenv::{PyVenvConfiguration, VirtualEnvironment};
Expand All @@ -30,6 +31,7 @@ mod implementation;
mod interpreter;
pub mod managed;
pub mod platform;
mod pointer_size;
mod py_launcher;
mod python_version;
mod target;
Expand Down
21 changes: 21 additions & 0 deletions crates/uv-interpreter/src/pointer_size.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
use serde::{Deserialize, Serialize};

#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
pub enum PointerSize {
/// 32-bit architecture.
#[serde(rename = "32")]
_32,
/// 64-bit architecture.
#[serde(rename = "64")]
_64,
}

impl PointerSize {
pub const fn is_32(self) -> bool {
matches!(self, Self::_32)
}

pub const fn is_64(self) -> bool {
matches!(self, Self::_64)
}
}
20 changes: 19 additions & 1 deletion crates/uv-virtualenv/src/bare.rs
Original file line number Diff line number Diff line change
Expand Up @@ -265,9 +265,27 @@ pub fn create_bare_venv(

// Construct the path to the `site-packages` directory.
let site_packages = location.join(&interpreter.virtualenv().purelib);
fs::create_dir_all(&site_packages)?;

// If necessary, create a symlink from `lib64` to `lib`.
// See: https://github.com/python/cpython/blob/b228655c227b2ca298a8ffac44d14ce3d22f6faa/Lib/venv/__init__.py#L135C11-L135C16
#[cfg(unix)]
if interpreter.pointer_size().is_64()
&& interpreter.markers().os_name() == "posix"
&& interpreter.markers().sys_platform() != "darwin"
{
let lib64 = location.join("lib64");
let lib = location.join("lib");
match std::os::unix::fs::symlink(lib, lib64) {
Ok(()) => {}
Err(err) if err.kind() == io::ErrorKind::AlreadyExists => {}
Err(err) => {
return Err(err.into());
}
}
}

// Populate `site-packages` with a `_virtualenv.py` file.
fs::create_dir_all(&site_packages)?;
fs::write(site_packages.join("_virtualenv.py"), VIRTUALENV_PATCH)?;
fs::write(site_packages.join("_virtualenv.pth"), "import _virtualenv")?;

Expand Down

0 comments on commit 5c0b32d

Please sign in to comment.