mirror of https://github.com/astral-sh/uv
Create lib64 symlink for 64-bit, non-macOS, POSIX environments (#3584)
## Summary Closes https://github.com/astral-sh/uv/issues/3578#issuecomment-2110675382. ## Test Plan Verified that in the OpenSUSE test, we create both, and they're symlinks: ```text INFO: Creating virtual environment with `venv`... INFO: Installing into `venv` virtual environment... DEBUG Found a virtualenv named .venv at: /tmp/tmp4nape29h/.venv DEBUG Cached interpreter info for Python 3.10.14, skipping probing: .venv/bin/python DEBUG Using Python 3.10.14 environment at .venv/bin/python DEBUG Trying to lock if free: .venv/.lock purelib: "/tmp/tmp4nape29h/.venv/lib/python3.10/site-packages" platlib: "/tmp/tmp4nape29h/.venv/lib64/python3.10/site-packages" is_same_file(purelib, platlib): Ok(true) ```
This commit is contained in:
parent
e64c337cc5
commit
30a7475029
|
|
@ -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))
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -35,6 +36,7 @@ pub struct Interpreter {
|
|||
stdlib: PathBuf,
|
||||
tags: OnceCell<Tags>,
|
||||
target: Option<Target>,
|
||||
pointer_size: PointerSize,
|
||||
gil_disabled: bool,
|
||||
}
|
||||
|
||||
|
|
@ -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,
|
||||
|
|
@ -95,6 +98,7 @@ impl Interpreter {
|
|||
stdlib: PathBuf::from("/dev/null"),
|
||||
tags: OnceCell::new(),
|
||||
target: None,
|
||||
pointer_size: PointerSize::_64,
|
||||
gil_disabled: false,
|
||||
}
|
||||
}
|
||||
|
|
@ -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`.
|
||||
///
|
||||
|
|
@ -429,6 +438,7 @@ struct InterpreterInfo {
|
|||
sys_executable: PathBuf,
|
||||
sys_path: Vec<PathBuf>,
|
||||
stdlib: PathBuf,
|
||||
pointer_size: PointerSize,
|
||||
gil_disabled: bool,
|
||||
}
|
||||
|
||||
|
|
@ -662,6 +672,7 @@ mod tests {
|
|||
"purelib": "lib/python3.12/site-packages",
|
||||
"scripts": "bin"
|
||||
},
|
||||
"pointer_size": "64",
|
||||
"gil_disabled": true
|
||||
}
|
||||
"##};
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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")?;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue