diff options
-rw-r--r-- | .github/actions/setup-python/action.yml | 20 | ||||
-rw-r--r-- | .github/workflows/android.yml | 4 | ||||
-rw-r--r-- | .github/workflows/docs.yml | 3 | ||||
-rw-r--r-- | .github/workflows/lint.yml | 9 | ||||
-rw-r--r-- | .github/workflows/linux-wpt.yml | 3 | ||||
-rw-r--r-- | .github/workflows/linux.yml | 9 | ||||
-rw-r--r-- | .github/workflows/mac-wpt.yml | 8 | ||||
-rw-r--r-- | .github/workflows/mac.yml | 8 | ||||
-rw-r--r-- | .github/workflows/main.yml | 7 | ||||
-rw-r--r-- | .github/workflows/ohos.yml | 4 | ||||
-rw-r--r-- | .github/workflows/pull-request-wpt-export.yml | 10 | ||||
-rw-r--r-- | .github/workflows/scheduled-wpt-import.yml | 3 | ||||
-rw-r--r-- | .github/workflows/try-label.yml | 7 | ||||
-rw-r--r-- | .github/workflows/try.yml | 7 | ||||
-rw-r--r-- | .github/workflows/windows.yml | 6 | ||||
-rw-r--r-- | .python-version | 1 | ||||
-rw-r--r-- | README.md | 16 | ||||
-rwxr-xr-x | mach | 7 | ||||
-rw-r--r-- | python/mach_bootstrap.py | 34 | ||||
-rw-r--r-- | python/servo/build_commands.py | 5 | ||||
-rw-r--r-- | servo-tidy.toml | 1 | ||||
-rw-r--r-- | shell.nix | 8 |
22 files changed, 80 insertions, 100 deletions
diff --git a/.github/actions/setup-python/action.yml b/.github/actions/setup-python/action.yml deleted file mode 100644 index 9889c517e6b..00000000000 --- a/.github/actions/setup-python/action.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Setup Python and uv -inputs: - skip-python-setup: - required: false - description: "Whether to skip installing python using Github's `setup-python` action" - default: false -runs: - using: "composite" - steps: - # Use the setup-python action to take advantage of the cache. uv will - # symlink to this version. - - name: Setup system python - if: ${{ inputs.skip-python-setup != 'true' }} - uses: actions/setup-python@v5 - with: - python-version-file: '.python-version' - - name: Install uv - uses: astral-sh/setup-uv@v4 - with: - version: "0.5.6" diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 5ce7fad25ec..6077daeedcf 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -59,8 +59,8 @@ jobs: uses: mozilla-actions/sccache-action@v0.0.6 - name: Install crown run: cargo install --path support/crown - - name: Setup Python - uses: ./.github/actions/setup-python + - name: Bootstrap Python + run: python3 -m pip install --upgrade pip virtualenv - name: Bootstrap dependencies run: sudo apt update && python3 ./mach bootstrap --skip-lints - name: Set up JDK 17 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 74530c40e1f..f546469f962 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -13,10 +13,9 @@ jobs: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - - name: Setup Python - uses: ./.github/actions/setup-python - name: Bootstrap run: | + python3 -m pip install --upgrade pip sudo apt update python3 ./mach bootstrap --skip-lints - name: Set LIBCLANG_PATH # This is needed for bindgen in mozangle. diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4527200526a..1d900e1c7bb 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -31,8 +31,9 @@ jobs: uses: mozilla-actions/sccache-action@v0.0.6 - name: Set LIBCLANG_PATH env # needed for bindgen in mozangle run: echo "LIBCLANG_PATH=/usr/lib/llvm-14/lib" >> $GITHUB_ENV - - name: Setup Python - uses: ./.github/actions/setup-python + - uses: actions/setup-python@v5 + with: + python-version: '3.10' - name: Install taplo uses: baptiste0928/cargo-install@v3 with: @@ -45,6 +46,8 @@ jobs: locked: true # 0.16.2 requires Rust 1.81 or newer. version: '0.16.1' + - name: Bootstrap Python + run: python3 -m pip install --upgrade pip - name: Bootstrap dependencies run: | sudo apt update @@ -54,4 +57,4 @@ jobs: run: | python3 ./mach clippy --use-crown --locked -- -- --deny warnings - name: Tidy - run: python3 ./mach test-tidy --no-progress --all + run: python3 ./mach test-tidy --no-progress --all
\ No newline at end of file diff --git a/.github/workflows/linux-wpt.yml b/.github/workflows/linux-wpt.yml index f710518b462..34857bdc9d0 100644 --- a/.github/workflows/linux-wpt.yml +++ b/.github/workflows/linux-wpt.yml @@ -52,10 +52,9 @@ jobs: path: ${{ inputs.profile }}-binary-linux - name: unPackage binary run: tar -xzf ${{ inputs.profile }}-binary-linux/target.tar.gz - - name: Setup Python - uses: ./.github/actions/setup-python - name: Bootstrap dependencies run: | + python3 -m pip install --upgrade pip sudo apt update sudo apt install -qy --no-install-recommends mesa-vulkan-drivers python3 ./mach bootstrap --skip-lints diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index c2db7cfd17a..cfced0395c5 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -139,10 +139,13 @@ jobs: - name: Set LIBCLANG_PATH env # needed for bindgen in mozangle if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) && !inputs.upload }} # not needed on ubuntu 20.04 used for nightly run: echo "LIBCLANG_PATH=/usr/lib/llvm-14/lib" >> $GITHUB_ENV - - name: Setup Python - uses: ./.github/actions/setup-python + - uses: actions/setup-python@v5 + if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) }} with: - skip-python-setup: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) }} + python-version: '3.10' + - name: Bootstrap Python + if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) }} + run: python3 -m pip install --upgrade pip - name: Bootstrap dependencies if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) }} run: | diff --git a/.github/workflows/mac-wpt.yml b/.github/workflows/mac-wpt.yml index 610da047a5f..74a1e1439fe 100644 --- a/.github/workflows/mac-wpt.yml +++ b/.github/workflows/mac-wpt.yml @@ -41,11 +41,15 @@ jobs: - uses: actions/download-artifact@v4 with: name: ${{ inputs.profile }}-binary-macos - - name: Setup Python - uses: ./.github/actions/setup-python + # Python 3.13 breaks wptrunner, so pin the version until + # web-platform-tests/wpt#48585 is fixed. + - uses: actions/setup-python@v5 + with: + python-version: '3.12' - name: Prep test environment run: | gtar -xzf target.tar.gz + python3 -m pip install --upgrade pip python3 ./mach bootstrap --skip-lints - name: Smoketest run: python3 ./mach smoketest --${{ inputs.profile }} diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml index f0edacb9fb8..4467b564426 100644 --- a/.github/workflows/mac.yml +++ b/.github/workflows/mac.yml @@ -77,14 +77,18 @@ jobs: if: github.event_name == 'pull_request_target' with: ref: ${{ github.event.pull_request.head.sha }} - - name: Setup Python - uses: ./.github/actions/setup-python + # Python 3.13 breaks wptrunner, so pin the version until + # web-platform-tests/wpt#48585 is fixed. + - uses: actions/setup-python@v5 + with: + python-version: '3.12' - name: Run sccache-cache uses: mozilla-actions/sccache-action@v0.0.6 - name: Install crown run: cargo install --path support/crown - name: Bootstrap run: | + python3 -m pip install --upgrade pip python3 ./mach bootstrap --skip-lints brew install gnu-tar - name: Build (${{ inputs.profile }}) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2d043312f0a..83e09cd3977 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,16 +20,15 @@ jobs: outputs: configuration: ${{ steps.configuration.outputs.result }} steps: + - uses: actions/setup-python@v5 + with: + python-version: '3.10' - uses: actions/checkout@v4 with: fetch-depth: 1 sparse-checkout: | python/servo/try_parser.py - .github/actions/setup-python - .python-version sparse-checkout-cone-mode: false - - name: Setup Python - uses: ./.github/actions/setup-python - name: Get Configuration id: configuration run: | diff --git a/.github/workflows/ohos.yml b/.github/workflows/ohos.yml index 2690ea100b8..b60f7f3f121 100644 --- a/.github/workflows/ohos.yml +++ b/.github/workflows/ohos.yml @@ -53,8 +53,8 @@ jobs: uses: mozilla-actions/sccache-action@v0.0.6 - name: Install crown run: cargo install --path support/crown - - name: Setup Python - uses: ./.github/actions/setup-python + - name: Bootstrap Python + run: python3 -m pip install --upgrade pip virtualenv - name: Bootstrap dependencies run: sudo apt update && python3 ./mach bootstrap --skip-lints - name: Setup OpenHarmony SDK diff --git a/.github/workflows/pull-request-wpt-export.yml b/.github/workflows/pull-request-wpt-export.yml index 1c3ee1a6cf0..2942fe9f2cd 100644 --- a/.github/workflows/pull-request-wpt-export.yml +++ b/.github/workflows/pull-request-wpt-export.yml @@ -28,16 +28,10 @@ jobs: # using the token specified here. # See https://github.com/actions/checkout/issues/162. token: ${{ secrets.WPT_SYNC_TOKEN }} - - name: Setup Python - uses: ./.github/actions/setup-python - name: Install requirements - run: | - uv venv - uv pip install -r servo/python/requirements.txt + run: pip install -r servo/python/requirements.txt - name: Process pull request - run: | - source .venv/bin/activate - servo/python/wpt/export.py + run: servo/python/wpt/export.py env: GITHUB_CONTEXT: ${{ toJson(github) }} WPT_SYNC_TOKEN: ${{ secrets.WPT_SYNC_TOKEN }} diff --git a/.github/workflows/scheduled-wpt-import.yml b/.github/workflows/scheduled-wpt-import.yml index 145133b817c..1ed65b12c32 100644 --- a/.github/workflows/scheduled-wpt-import.yml +++ b/.github/workflows/scheduled-wpt-import.yml @@ -35,10 +35,9 @@ jobs: - uses: actions/download-artifact@v4 with: name: wpt-full-logs-linux-layout-2020 - - name: Setup Python - uses: ./.github/actions/setup-python - name: Prep environment run: | + python3 -m pip install --upgrade pip sudo apt update python3 ./mach bootstrap - name: Add upstream remote diff --git a/.github/workflows/try-label.yml b/.github/workflows/try-label.yml index 1a95432cd7d..610aeb883c9 100644 --- a/.github/workflows/try-label.yml +++ b/.github/workflows/try-label.yml @@ -77,15 +77,14 @@ jobs: } return try_string; + - uses: actions/setup-python@v5 + with: + python-version: '3.10' - uses: actions/checkout@v4 with: sparse-checkout: | python/servo/try_parser.py - .github/actions/setup-python - .python-version sparse-checkout-cone-mode: false - - name: Setup Python - uses: ./.github/actions/setup-python - name: Parse Labels if: ${{ steps.try_string.outputs.result }} id: configuration diff --git a/.github/workflows/try.yml b/.github/workflows/try.yml index d81715fe92d..ca81a8f91cd 100644 --- a/.github/workflows/try.yml +++ b/.github/workflows/try.yml @@ -32,16 +32,15 @@ jobs: outputs: configuration: ${{ steps.configuration.outputs.result }} steps: + - uses: actions/setup-python@v5 + with: + python-version: '3.10' - uses: actions/checkout@v4 with: fetch-depth: 1 sparse-checkout: | python/servo/try_parser.py - .github/actions/setup-python - .python-version sparse-checkout-cone-mode: false - - name: Setup Python - uses: ./.github/actions/setup-python - name: Get Full Configuration id: full_config run: | diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index a9c0805c80c..a59c23dc919 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -114,13 +114,13 @@ jobs: choco install wixtoolset echo "C:\\Program Files (x86)\\WiX Toolset v3.11\\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - uses: actions/setup-python@v5 - - name: Setup Python - uses: ./.github/actions/setup-python + if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) }} with: - skip-python-setup: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) }} + python-version: "3.10" - name: Bootstrap if: ${{ ! fromJSON(needs.runner-select.outputs.is-self-hosted) }} run: | + python -m pip install --upgrade pip python mach fetch python mach bootstrap-gstreamer # For some reason WiX isn't currently on the GitHub runner path. This is a diff --git a/.python-version b/.python-version deleted file mode 100644 index e4fba218358..00000000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.12 diff --git a/README.md b/README.md index e9ea754bd6a..0c83a837d29 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,7 @@ For more detailed build instructions, see the Servo book under [Setting up your ### macOS -- Download and install [`python`](https://www.python.org/downloads/macos/), [Xcode](https://developer.apple.com/xcode/), and [`brew`](https://brew.sh/). -- Install `uv`: `curl -LsSf https://astral.sh/uv/install.sh | sh` +- Download and install [`python`](https://www.python.org/downloads/macos/) (version 3.10 to 3.12), [Xcode](https://developer.apple.com/xcode/), and [`brew`](https://brew.sh/). - Install `rustup`: `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh` - Restart your shell to make sure `cargo` is available - Install the other dependencies: `./mach bootstrap` @@ -26,12 +25,11 @@ For more detailed build instructions, see the Servo book under [Setting up your ### Linux -- Install `curl` and `python`: - - Arch: `sudo pacman -S --needed curl python` - - Debian, Ubuntu: `sudo apt install curl` - - Fedora: `sudo dnf install curl python3` - - Gentoo: `sudo emerge net-misc/curl` -- Install `uv`: `curl -LsSf https://astral.sh/uv/install.sh | sh` +- Install `curl` and `python` (version 3.10 to 3.12): + - Arch: `sudo pacman -S --needed curl python python-pip` + - Debian, Ubuntu: `sudo apt install curl python3-pip python3-venv python3-setuptools` + - Fedora: `sudo dnf install curl python3 python3-pip python3-devel` + - Gentoo: `sudo emerge net-misc/curl dev-python/pip` - Install `rustup`: `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh` - Restart your shell to make sure `cargo` is available - Install the other dependencies: `./mach bootstrap` @@ -39,7 +37,7 @@ For more detailed build instructions, see the Servo book under [Setting up your ### Windows -- Download and install [`python`](https://www.python.org/downloads/windows/), [`uv`](https://docs.astral.sh/uv/getting-started/installation/#standalone-installer), [`choco`](https://chocolatey.org/install#individual), and [`rustup`](https://win.rustup.rs/) +- Download and install [`python`](https://www.python.org/downloads/windows/) (version 3.10 to 3.12), [`choco`](https://chocolatey.org/install#individual), and [`rustup`](https://win.rustup.rs/) - Be sure to select *Quick install via the Visual Studio Community installer* - In the Visual Studio Installer, ensure the following components are installed: - **Windows 10 SDK (10.0.19041.0)** (`Microsoft.VisualStudio.Component.Windows10SDK.19041`) @@ -9,9 +9,10 @@ import sys # Destructure because version_info > max_ver is true when running the same version. ver = (sys.version_info[0], sys.version_info[1]) min_ver = (3, 10) -if ver < min_ver: - print("mach requires at least version 3.{0} of Python. The version of Python installed in this system is {1}.{2}" \ - .format(min_ver[1], ver[0], ver[1])) +max_ver = (3, 12) # WPT does not support Python 3.13. See issue #34095. +if ver < min_ver or ver > max_ver: + print("mach does not support python {0}.{1}, please install 3.{2} <= python <= 3.{3}" \ + .format(ver[0], ver[1], min_ver[1], max_ver[1])) sys.exit(1) def main(args): diff --git a/python/mach_bootstrap.py b/python/mach_bootstrap.py index fc6e916ff80..43690c3d951 100644 --- a/python/mach_bootstrap.py +++ b/python/mach_bootstrap.py @@ -4,6 +4,7 @@ import hashlib import os +import platform import site import subprocess import sys @@ -92,13 +93,11 @@ def _get_virtualenv_script_dir(): def _get_virtualenv_lib_dir(): if os.name == "nt" and os.sep != "/": return os.path.join("Lib", "site-packages") - with open(".python-version", "r") as python_version_file: - python_version = python_version_file.read().strip() - return os.path.join( - "lib", - f"python{python_version}", - "site-packages" - ) + return os.path.join( + "lib", + f"python{sys.version_info[0]}.{sys.version_info[1]}", + "site-packages" + ) def _process_exec(args): @@ -132,8 +131,11 @@ def install_virtual_env_requirements(project_path: str, python: str, virtualenv_ requirements_hash = requirements_hasher.hexdigest() if marker_hash != requirements_hash: + print(" * Upgrading pip...") + _process_exec([python, "-m", "pip", "install", "--upgrade", "pip"]) + print(" * Installing Python requirements...") - _process_exec(["uv", "pip", "install", + _process_exec([python, "-m", "pip", "install", "-I", "-r", requirements_paths[0], "-r", requirements_paths[1], "-r", requirements_paths[2]]) @@ -142,14 +144,14 @@ def install_virtual_env_requirements(project_path: str, python: str, virtualenv_ def _activate_virtualenv(topdir): - virtualenv_path = os.path.join(topdir, ".venv") + virtualenv_path = os.path.join(topdir, "python", "_venv%d.%d" % (sys.version_info[0], sys.version_info[1])) python = sys.executable if os.environ.get("VIRTUAL_ENV") != virtualenv_path: venv_script_path = os.path.join(virtualenv_path, _get_virtualenv_script_dir()) if not os.path.exists(virtualenv_path): print(" * Setting up virtual environment...") - _process_exec(["uv", "venv"]) + _process_exec([python, "-m", "venv", "--system-site-packages", virtualenv_path]) # This general approach is taken from virtualenv's `activate_this.py`. os.environ["PATH"] = os.pathsep.join([venv_script_path, *os.environ.get("PATH", "").split(os.pathsep)]) @@ -169,11 +171,6 @@ def _activate_virtualenv(topdir): install_virtual_env_requirements(topdir, python, virtualenv_path) - # Turn off warnings about deprecated syntax in our indirect dependencies. - # TODO: Find a better approach for doing this. - import warnings - warnings.filterwarnings('ignore', category=SyntaxWarning, module=r'.*.venv') - def _ensure_case_insensitive_if_windows(): # The folder is called 'python'. By deliberately checking for it with the wrong case, we determine if the file @@ -224,6 +221,13 @@ def bootstrap(topdir): print('Current path:', topdir) sys.exit(1) + # Ensure we are running Python 3.10+. We put this check here so we generate a + # user-friendly error message rather than a cryptic stack trace on module import. + if sys.version_info < (3, 10): + print('Python3 (>=3.10) is required to run mach.') + print('You are running Python', platform.python_version()) + sys.exit(1) + _activate_virtualenv(topdir) def populate_context(context, key=None): diff --git a/python/servo/build_commands.py b/python/servo/build_commands.py index b21f89980c0..c48999f99f9 100644 --- a/python/servo/build_commands.py +++ b/python/servo/build_commands.py @@ -175,7 +175,7 @@ class MachCommands(CommandBase): return status @Command('clean', - description='Clean the target/ and Python virtual environment directories', + description='Clean the target/ and python/_venv[version]/ directories', category='build') @CommandArgument('--manifest-path', default=None, @@ -188,7 +188,8 @@ class MachCommands(CommandBase): def clean(self, manifest_path=None, params=[], verbose=False): self.ensure_bootstrapped() - virtualenv_path = path.join(self.get_top_dir(), '.venv') + virtualenv_fname = '_venv%d.%d' % (sys.version_info[0], sys.version_info[1]) + virtualenv_path = path.join(self.get_top_dir(), 'python', virtualenv_fname) if path.exists(virtualenv_path): print('Removing virtualenv directory: %s' % virtualenv_path) shutil.rmtree(virtualenv_path) diff --git a/servo-tidy.toml b/servo-tidy.toml index 7460f4092ce..64d33117a6a 100644 --- a/servo-tidy.toml +++ b/servo-tidy.toml @@ -117,6 +117,7 @@ directories = [ "./tests/wpt/mozilla/tests/mozilla/referrer-policy", "./tests/wpt/mozilla/tests/webgl", "./python/tidy/tests", + "./python/_v*", "./python/mach", # Generated and upstream code combined with our own. Could use cleanup "./target", diff --git a/shell.nix b/shell.nix index fd110442cd6..2576e0e454f 100644 --- a/shell.nix +++ b/shell.nix @@ -84,13 +84,7 @@ stdenv.mkDerivation (androidEnvironment // { # Build utilities cmake dbus gcc git pkg-config which llvm perl yasm m4 - - # Ensure the Python version is same as the one in `.python-version` file so - # that `uv` will just symlink to the one in nix store. Otherwise `uv` will - # download a pre-built binary that won't work on nix. - # FIXME: dbus python module needs to be installed into the virtual environment. - python312 - uv + (python3.withPackages (ps: with ps; [virtualenv pip dbus])) # This pins gnumake to 4.3 since 4.4 breaks jobserver # functionality in mozjs and causes builds to be extremely |