Commit 40eea21c authored by Ihar Hrachyshka's avatar Ihar Hrachyshka
Browse files

buildMozillaMach: use llvmPackages_20 on aarch64-darwin

There's a bug in llvm 21 that makes Firefox crash on loading a PNG
favicon that is being investigated in Mozilla bug tracker:

https://bugzilla.mozilla.org/show_bug.cgi?id=1995582

While this is being fixed, switch to llvmPackages_20 for aarch64-darwin.
(x86_64-darwin is not affected.)

Note: this change will also affect Thunderbird. Though strictly speaking
not a required change because we are not aware of a specific issue with
Thunderbird (yet), I feel we may want to stick to the same LLVM for both
types of Mozilla apps while this is being investigated. It also
simplifies the code somewhat.

Fixes #453372
parent 7231e23e
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -58,9 +58,7 @@ in
  pkgsCross, # wasm32 rlbox
  python3,
  runCommand,
  rustc,
  rust-cbindgen,
  rustPlatform,
  unzip,
  which,
  wrapGAppsHook3,
@@ -201,9 +199,25 @@ assert elfhackSupport -> isElfhackPlatform stdenv;
let
  inherit (lib) enableFeature;

  rustPackages =
    pkgs:
    (pkgs.rust.override (
      # aarch64-darwin firefox crashes on loading favicons due to a llvm 21 bug:
      # https://github.com/NixOS/nixpkgs/issues/453372
      # https://bugzilla.mozilla.org/show_bug.cgi?id=1995582#c16
      lib.optionalAttrs (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64) {
        llvmPackages = pkgs.llvmPackages_20;
      }
    )).packages.stable;

  toRustC = pkgs: (rustPackages pkgs).rustc;

  rustc = toRustC pkgs;
  inherit (rustPackages pkgs) rustPlatform;

  # Target the LLVM version that rustc is built with for LTO.
  llvmPackages0 = rustc.llvmPackages;
  llvmPackagesBuildBuild0 = pkgsBuildBuild.rustc.llvmPackages;
  llvmPackagesBuildBuild0 = (toRustC pkgsBuildBuild).llvmPackages;

  # Force the use of lld and other llvm tools for LTO
  llvmPackages = llvmPackages0.override {
@@ -218,7 +232,7 @@ let
  # LTO requires LLVM bintools including ld.lld and llvm-ar.
  buildStdenv = overrideCC llvmPackages.stdenv (
    llvmPackages.stdenv.cc.override {
      bintools = if ltoSupport then buildPackages.rustc.llvmPackages.bintools else stdenv.cc.bintools;
      bintools = if ltoSupport then (toRustC buildPackages).llvmPackages.bintools else stdenv.cc.bintools;
    }
  );