From b1232119c3e66692fd4d09cdb3c39c57edcc4ca3 Mon Sep 17 00:00:00 2001 From: "Matthew \"strager\" Glazar" Date: Fri, 3 Feb 2023 15:32:43 -0800 Subject: [PATCH] zig: fix impurities for Zig compiler and Zig outputs By default, Zig will use the generate code for the native CPU. This is impure and leads to illegal instruction crashes for users which have different CPUs than the build bots. Change Zig's default to -mcpu=baseline. To test, I built on my new AMD Zen 3 machine used qemu to emulate an old Intel Sandy Bridge machine, and observed no crashes with this patch: $ nix-shell -I ~/Projects/ -p ncdu \ --run 'qemu-x86_64-static -cpu SandyBridge $(which ncdu)' --- pkgs/applications/misc/mepo/default.nix | 2 +- pkgs/applications/misc/rivercarro/default.nix | 2 +- pkgs/applications/misc/waylock/default.nix | 2 +- .../window-managers/river/default.nix | 2 +- pkgs/development/compilers/zig/0.10.nix | 5 +++++ pkgs/development/compilers/zig/0.9.1.nix | 2 ++ .../compilers/zig/cpu-purity.patch | 20 +++++++++++++++++++ pkgs/development/tools/zls/default.nix | 2 +- pkgs/games/blackshades/default.nix | 2 +- pkgs/tools/misc/clipbuzz/default.nix | 2 +- pkgs/tools/misc/findup/default.nix | 2 +- pkgs/tools/misc/ncdu/default.nix | 3 +-- 12 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 pkgs/development/compilers/zig/cpu-purity.patch diff --git a/pkgs/applications/misc/mepo/default.nix b/pkgs/applications/misc/mepo/default.nix index 5a7640c2414f6..75081473a01d1 100644 --- a/pkgs/applications/misc/mepo/default.nix +++ b/pkgs/applications/misc/mepo/default.nix @@ -53,7 +53,7 @@ stdenv.mkDerivation rec { installPhase = '' runHook preInstall - zig build -Drelease-safe=true -Dcpu=baseline --prefix $out install + zig build -Drelease-safe=true --prefix $out install install -d $out/share/man/man1 $out/bin/mepo -docman > $out/share/man/man1/mepo.1 diff --git a/pkgs/applications/misc/rivercarro/default.nix b/pkgs/applications/misc/rivercarro/default.nix index 0074a923f4179..122b20b3d701f 100644 --- a/pkgs/applications/misc/rivercarro/default.nix +++ b/pkgs/applications/misc/rivercarro/default.nix @@ -34,7 +34,7 @@ stdenv.mkDerivation rec { installPhase = '' runHook preInstall - zig build -Drelease-safe -Dcpu=baseline --prefix $out install + zig build -Drelease-safe --prefix $out install runHook postInstall ''; diff --git a/pkgs/applications/misc/waylock/default.nix b/pkgs/applications/misc/waylock/default.nix index 9ae1b348e3d47..4af3c134d5f65 100644 --- a/pkgs/applications/misc/waylock/default.nix +++ b/pkgs/applications/misc/waylock/default.nix @@ -37,7 +37,7 @@ stdenv.mkDerivation rec { installPhase = '' runHook preInstall - zig build -Drelease-safe -Dman-pages -Dcpu=baseline --prefix $out install + zig build -Drelease-safe -Dman-pages --prefix $out install runHook postInstall ''; diff --git a/pkgs/applications/window-managers/river/default.nix b/pkgs/applications/window-managers/river/default.nix index e86af9dad5731..c905447aea5b3 100644 --- a/pkgs/applications/window-managers/river/default.nix +++ b/pkgs/applications/window-managers/river/default.nix @@ -51,7 +51,7 @@ stdenv.mkDerivation rec { installPhase = '' runHook preInstall - zig build -Drelease-safe -Dcpu=baseline ${lib.optionalString xwaylandSupport "-Dxwayland"} -Dman-pages --prefix $out install + zig build -Drelease-safe ${lib.optionalString xwaylandSupport "-Dxwayland"} -Dman-pages --prefix $out install install contrib/river.desktop -Dt $out/share/wayland-sessions runHook postInstall ''; diff --git a/pkgs/development/compilers/zig/0.10.nix b/pkgs/development/compilers/zig/0.10.nix index 89f23b9ca25d5..84f8b5c0ac4b0 100644 --- a/pkgs/development/compilers/zig/0.10.nix +++ b/pkgs/development/compilers/zig/0.10.nix @@ -19,6 +19,11 @@ stdenv.mkDerivation rec { hash = "sha256-69QIkkKzApOGfrBdgtmxFMDytRkSh+0YiaJQPbXsBeo="; }; + patches = [ + # Fix impurities. + ./cpu-purity.patch + ]; + nativeBuildInputs = [ cmake llvmPackages.llvm.dev diff --git a/pkgs/development/compilers/zig/0.9.1.nix b/pkgs/development/compilers/zig/0.9.1.nix index e7c62a4cf938c..8ca2bdd51574a 100644 --- a/pkgs/development/compilers/zig/0.9.1.nix +++ b/pkgs/development/compilers/zig/0.9.1.nix @@ -27,6 +27,8 @@ stdenv.mkDerivation rec { }; patches = [ + # Fix impurities. + ./cpu-purity.patch # Fix index out of bounds reading RPATH (cherry-picked from 0.10-dev) ./rpath.patch # Fix build on macOS 13 (cherry-picked from 0.10-dev) diff --git a/pkgs/development/compilers/zig/cpu-purity.patch b/pkgs/development/compilers/zig/cpu-purity.patch new file mode 100644 index 0000000000000..92e8140f51f6c --- /dev/null +++ b/pkgs/development/compilers/zig/cpu-purity.patch @@ -0,0 +1,20 @@ +By default, Zig will use the generate code for the native CPU. This is impure. +Change the default to -mcpu=baseline. + +https://github.com/NixOS/nixpkgs/issues/169461 +https://github.com/NixOS/nixpkgs/issues/214356 +https://github.com/NixOS/nixpkgs/issues/185665 + +diff --git a/lib/std/zig/CrossTarget.zig b/lib/std/zig/CrossTarget.zig +index 6c59a4a3a..d45e9ab5a 100644 +--- a/lib/std/zig/CrossTarget.zig ++++ b/lib/std/zig/CrossTarget.zig +@@ -12,7 +12,7 @@ const mem = std.mem; + /// `null` means native. + cpu_arch: ?Target.Cpu.Arch = null, + +-cpu_model: CpuModel = CpuModel.determined_by_cpu_arch, ++cpu_model: CpuModel = CpuModel.baseline, + + /// Sparse set of CPU features to add to the set from `cpu_model`. + cpu_features_add: Target.Cpu.Feature.Set = Target.Cpu.Feature.Set.empty, diff --git a/pkgs/development/tools/zls/default.nix b/pkgs/development/tools/zls/default.nix index 8cb041b90b2e8..e176f838407a8 100644 --- a/pkgs/development/tools/zls/default.nix +++ b/pkgs/development/tools/zls/default.nix @@ -19,7 +19,7 @@ stdenv.mkDerivation rec { ''; installPhase = '' - zig build -Drelease-safe -Dcpu=baseline --prefix $out install + zig build -Drelease-safe --prefix $out install ''; meta = with lib; { diff --git a/pkgs/games/blackshades/default.nix b/pkgs/games/blackshades/default.nix index bd21fc0807038..236fba2894aaf 100644 --- a/pkgs/games/blackshades/default.nix +++ b/pkgs/games/blackshades/default.nix @@ -21,7 +21,7 @@ stdenv.mkDerivation rec { ''; installPhase = '' - zig build -Drelease-fast -Dcpu=baseline --prefix $out install + zig build -Drelease-fast --prefix $out install ''; meta = { diff --git a/pkgs/tools/misc/clipbuzz/default.nix b/pkgs/tools/misc/clipbuzz/default.nix index aaa37ad7c18f8..98831cf0552f0 100644 --- a/pkgs/tools/misc/clipbuzz/default.nix +++ b/pkgs/tools/misc/clipbuzz/default.nix @@ -19,7 +19,7 @@ stdenv.mkDerivation rec { ''; installPhase = '' - zig build -Drelease-safe -Dcpu=baseline --prefix $out install + zig build -Drelease-safe --prefix $out install ''; meta = with lib; { diff --git a/pkgs/tools/misc/findup/default.nix b/pkgs/tools/misc/findup/default.nix index 0b7d687922f45..6b1b22ed6149f 100644 --- a/pkgs/tools/misc/findup/default.nix +++ b/pkgs/tools/misc/findup/default.nix @@ -24,7 +24,7 @@ stdenv.mkDerivation rec { installPhase = '' runHook preInstall - zig build -Drelease-safe -Dcpu=baseline --prefix $out + zig build -Drelease-safe --prefix $out runHook postInstall ''; diff --git a/pkgs/tools/misc/ncdu/default.nix b/pkgs/tools/misc/ncdu/default.nix index d535061cde644..e9b32f6e7dbcb 100644 --- a/pkgs/tools/misc/ncdu/default.nix +++ b/pkgs/tools/misc/ncdu/default.nix @@ -19,8 +19,7 @@ stdenv.mkDerivation rec { PREFIX = placeholder "out"; - # Avoid CPU feature impurity, see https://github.com/NixOS/nixpkgs/issues/169461 - ZIG_FLAGS = "-Drelease-safe -Dcpu=baseline"; + ZIG_FLAGS = "-Drelease-safe"; meta = with lib; { description = "Disk usage analyzer with an ncurses interface";