servo/shell.nix
Mukilan Thiyagarajan 88a35b3cc9
mach: adopt uv and avoid system python (#34632)
This allows us to use `uv` for:
1. Installing a pinned Python version
2. Installing the dependency packages using `uv`'s pip compatible interface.
4. Bootstrapping `mach` without a Python installion on the host, using `uv
   run`

This change also introduces a new 'composite' GitHub action to setup
python in the different CI workflows. There is no support for externally
managed python installations and virtual environments. These could be
added in the future.

Fixes #34095, #34547

Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
2024-12-16 09:20:37 +00:00

189 lines
6.8 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# This provides a shell with all the necesarry packages required to run mach and build servo
# NOTE: This does not work offline or for nix-build
{
buildAndroid ? false
}:
with import (builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/5d67ea6b4b63378b9c13be21e2ec9d1afc921713.tar.gz";
}) {
overlays = [
(import (builtins.fetchTarball {
# Bumped the channel in rust-toolchain.toml? Bump this commit too!
url = "https://github.com/oxalica/rust-overlay/archive/0be641045af6d8666c11c2c40e45ffc9667839b5.tar.gz";
}))
];
config = {
android_sdk.accept_license = buildAndroid;
allowUnfree = buildAndroid;
};
};
let
rustToolchain = rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
rustPlatform = makeRustPlatform {
cargo = rustToolchain;
rustc = rustToolchain;
};
pkgs_gnumake_4_3 = import (builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/6adf48f53d819a7b6e15672817fa1e78e5f4e84f.tar.gz";
}) {};
# We need clangStdenv with:
# - clang < 16 (#30587)
# - clang < 15 (#31059)
# - glibc 2.38 (#31054)
llvmPackages = llvmPackages_14;
stdenv = llvmPackages.stdenv;
buildToolsVersion = "34.0.0";
androidComposition = androidenv.composeAndroidPackages {
buildToolsVersions = [ buildToolsVersion ];
includeEmulator = true;
platformVersions = [ "33" ];
includeSources = false;
includeSystemImages = true;
systemImageTypes = [ "google_apis" ];
abiVersions = [ "x86" "armeabi-v7a" ];
includeNDK = true;
ndkVersion = "26.2.11394342";
useGoogleAPIs = false;
useGoogleTVAddOns = false;
includeExtras = [
"extras;google;gcm"
];
};
androidSdk = androidComposition.androidsdk;
# Required by ./mach build --android
androidEnvironment = lib.optionalAttrs buildAndroid rec {
ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk";
ANDROID_NDK_ROOT = "${ANDROID_SDK_ROOT}/ndk-bundle";
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/${buildToolsVersion}/aapt2";
};
in
stdenv.mkDerivation (androidEnvironment // {
name = "servo-env";
buildInputs = [
# Native dependencies
fontconfig freetype libunwind
xorg.libxcb
xorg.libX11
gst_all_1.gstreamer
gst_all_1.gst-plugins-base
gst_all_1.gst-plugins-good
gst_all_1.gst-plugins-bad
gst_all_1.gst-plugins-ugly
rustup
taplo
cargo-deny
llvmPackages.bintools # provides lld
udev # Needed by libudev-sys for GamePad API.
# 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
# This pins gnumake to 4.3 since 4.4 breaks jobserver
# functionality in mozjs and causes builds to be extremely
# slow as it behaves as if -j1 was passed.
# See https://github.com/servo/mozjs/issues/375
pkgs_gnumake_4_3.gnumake
(rustPlatform.buildRustPackage {
name = "crown";
src = ./support/crown;
doCheck = false;
cargoLock = {
# crown is not in our Cargo workspace, so this only pulls crown and crowns dependencies
# into the Nix store, not Servo and Servos dependencies.
lockFile = ./support/crown/Cargo.lock;
};
RUSTC_BOOTSTRAP = "crown";
})
] ++ (lib.optionals stdenv.isDarwin [
darwin.apple_sdk.frameworks.AppKit
]) ++ (lib.optionals buildAndroid [
# for android builds
openjdk17_headless
androidSdk
]);
LIBCLANG_PATH = lib.makeLibraryPath [ llvmPackages.clang-unwrapped.lib ];
# Allow cargo to download crates
SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
# Enable colored cargo and rustc output
TERMINFO = "${ncurses.out}/share/terminfo";
# Provide libraries that arent linked against but somehow required
LD_LIBRARY_PATH = lib.makeLibraryPath [
# Fixes missing library errors
xorg.libXcursor xorg.libXrandr xorg.libXi libxkbcommon
# [WARN script::dom::gpu] Could not get GPUAdapter ("NotFound")
# TLA Err: Error: Couldn't request WebGPU adapter.
vulkan-loader
];
shellHook = ''
# Fix invalid option errors during linking
# https://github.com/mozilla/nixpkgs-mozilla/commit/c72ff151a3e25f14182569679ed4cd22ef352328
unset AS
# Compiling programs under Nix sets the interpreter (ELF INTERP) and rpath (ELF DT_RUNPATH [1])
# to ensure that it can find the needed (ELF DT_NEEDED) libraries in the Nix store.
#
# This is good on NixOS, but bad everywhere else. Using the Nix interpreter makes the programs
# dependent on the Nix store, making them impossible to distribute and run on other machines
# without `nix bundle`. Even on the same machine, the program will crash in a variety of ways
# because of the OpenGL problem [2] and other mismatches in X11 and Wayland libraries. Worse
# still, it makes everyone else suffer the problems NixOS has, like needing $LD_LIBRARY_PATH
# (see above) and needing to disable rust-lld (servo#30123).
#
# We can make the programs independent of Nix by resetting $NIX_DYNAMIC_LINKER to the system
# interpreter, setting $NIX_DONT_SET_RPATH to prevent the clang and ld wrappers from adding
# -rpath options to $NIX_LDFLAGS [3][4], and removing any -rpath options that get added by
# clangStdenv despite $NIX_DONT_SET_RPATH.
#
# This is comparable to fixing target/*/servo after the fact with:
#
# patchelf --remove-rpath --set-interpreter $(patchelf --print-interpreter /usr/bin/env)
#
# [1] DT_RPATH breaks LD_LIBRARY_PATH and is no longer used
# https://medium.com/obscure-system/rpath-vs-runpath-883029b17c45
# [2] Using Nix on non-NixOS distros, its common to see GL application errors:
# https://github.com/nix-community/nixGL
# [3] https://ryantm.github.io/nixpkgs/stdenv/stdenv/#bintools-wrapper
# [4] https://matklad.github.io/2022/03/14/rpath-or-why-lld-doesnt-work-on-nixos.html
if ! [ -e /etc/NIXOS ]; then
set -- $NIX_LDFLAGS
for i; do
shift
if [ "$i" = -rpath ]; then
shift
else
set -- "$@" "$i"
fi
done
export NIX_DYNAMIC_LINKER=$(patchelf --print-interpreter /usr/bin/env)
export NIX_DONT_SET_RPATH=1
export NIX_LDFLAGS="$@"
# Dont pollute ~/.rustup with toolchains installed by nixpkgs rustup, because they
# get patched in a way that makes them dependent on the Nix store.
repo_root=$(git rev-parse --show-toplevel)
export RUSTUP_HOME=$repo_root/.rustup
fi
'';
})