diff options
Diffstat (limited to 'components/servo/build.rs')
-rw-r--r-- | components/servo/build.rs | 53 |
1 files changed, 13 insertions, 40 deletions
diff --git a/components/servo/build.rs b/components/servo/build.rs index 0b6b087547b..d610d1cfe36 100644 --- a/components/servo/build.rs +++ b/components/servo/build.rs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use std::path::{Path, PathBuf}; +use std::path::Path; use std::process::Command; use std::{env, fs}; @@ -10,7 +10,7 @@ fn main() { if cfg!(feature = "media-gstreamer") { println!("cargo:rerun-if-changed=../../python/servo/gstreamer.py"); - let output = Command::new(find_python()) + let output = find_python() .arg("../../python/servo/gstreamer.py") .arg(std::env::var_os("TARGET").unwrap()) .output() @@ -25,47 +25,20 @@ fn main() { } } -/// Tries to find a suitable python +/// Tries to find a suitable python, which in Servo is always `uv run python` unless we are running +/// as a descendant of `uv run python`. In that case, we can use either `uv run python` or `python` +/// (uv does not provide a `python3` on Windows). /// -/// Algorithm -/// 1. Trying to find python3/python in $VIRTUAL_ENV (this should be from servos venv) -/// 2. Checking PYTHON3 (set by mach) -/// 3. Falling back to the system installation. +/// More details: <https://book.servo.org/hacking/setting-up-your-environment.html#check-tools> /// /// Note: This function should be kept in sync with the version in `components/script/build.rs` -fn find_python() -> PathBuf { - let mut candidates = vec![]; - if let Some(venv) = env::var_os("VIRTUAL_ENV") { - // See: https://docs.python.org/3/library/venv.html#how-venvs-work - let bin_dir = if cfg!(windows) { "Scripts" } else { "bin" }; - let bin_directory = PathBuf::from(venv).join(bin_dir); - candidates.push(bin_directory.join("python3")); - candidates.push(bin_directory.join("python")); - } - if let Some(python3) = env::var_os("PYTHON3") { - candidates.push(PathBuf::from(python3)); - } - - let system_python = ["python3", "python"].map(PathBuf::from); - candidates.extend_from_slice(&system_python); +fn find_python() -> Command { + let mut command = Command::new("uv"); + command.args(["run", "python"]); - for name in &candidates { - // Command::new() allows us to omit the `.exe` suffix on windows - if Command::new(name) - .arg("--version") - .output() - .is_ok_and(|out| out.status.success()) - { - return name.to_owned(); - } + if command.output().is_ok_and(|out| out.status.success()) { + return command; } - let candidates = candidates - .into_iter() - .map(|c| c.into_os_string()) - .collect::<Vec<_>>(); - panic!( - "Can't find python (tried {:?})! Try enabling Servo's Python venv, \ - setting the PYTHON3 env var or adding python3 to PATH.", - candidates.join(", ".as_ref()) - ) + + panic!("Can't find python (tried `{command:?}`)! Is uv installed and in PATH?") } |