prohibit sha-less nixgl

pull/5/head
pegasust 2023-01-12 13:01:11 -07:00
parent 4a5981d050
commit 8b1ba34164
3 changed files with 237 additions and 197 deletions

View File

@ -8,8 +8,9 @@
(flake-utils.lib.eachDefaultSystem (system: (flake-utils.lib.eachDefaultSystem (system:
let let
isIntelX86Platform = system == "x86_64-linux"; isIntelX86Platform = system == "x86_64-linux";
nix_pkgs = import nixpkgs {inherit system;};
pkgs = import ./default.nix { pkgs = import ./default.nix {
pkgs = nixpkgs.legacyPackages.${system}; pkgs = nix_pkgs;
enable32bits = isIntelX86Platform; enable32bits = isIntelX86Platform;
enableIntelX86Extensions = isIntelX86Platform; enableIntelX86Extensions = isIntelX86Platform;
}; };

View File

@ -1,22 +1,42 @@
{ # # Nvidia informations. {
# Version of the system kernel module. Let it to null to enable auto-detection. # # Nvidia informations.
nvidiaVersion ? null, # Version of the system kernel module. Let it to null to enable auto-detection.
# Hash of the Nvidia driver .run file. null is fine, but fixing a value here nvidiaVersion ? null
# will be more reproducible and more efficient. , # Hash of the Nvidia driver .run file. null is fine, but fixing a value here
nvidiaHash ? null, # will be more reproducible and more efficient.
# Alternatively, you can pass a path that points to a nvidia version file nvidiaHash ? null
# and let nixGL extract the version from it. That file must be a copy of , # Alternatively, you can pass a path that points to a nvidia version file
# /proc/driver/nvidia/version. Nix doesn't like zero-sized files (see # and let nixGL extract the version from it. That file must be a copy of
# https://github.com/NixOS/nix/issues/3539 ). # /proc/driver/nvidia/version. Nix doesn't like zero-sized files (see
nvidiaVersionFile ? null, # https://github.com/NixOS/nix/issues/3539 ).
# Enable 32 bits driver nvidiaVersionFile ? null
# This is one by default, you can switch it to off if you want to reduce a , # Enable 32 bits driver
# bit the size of nixGL closure. # This is one by default, you can switch it to off if you want to reduce a
enable32bits ? true # bit the size of nixGL closure.
, writeTextFile, shellcheck, pcre, runCommand, linuxPackages enable32bits ? true
, fetchurl, lib, runtimeShell, bumblebee, libglvnd, vulkan-validation-layers , writeTextFile
, mesa, libvdpau-va-gl, intel-media-driver, vaapiIntel, pkgsi686Linux, driversi686Linux , shellcheck
, zlib, libdrm, xorg, wayland, gcc }: , pcre
, runCommand
, linuxPackages
, fetchurl
, lib
, runtimeShell
, bumblebee
, libglvnd
, vulkan-validation-layers
, mesa
, libvdpau-va-gl
, intel-media-driver
, vaapiIntel
, pkgsi686Linux
, driversi686Linux
, zlib
, libdrm
, xorg
, wayland
, gcc
}:
let let
writeExecutable = { name, text }: writeExecutable = { name, text }:
@ -41,22 +61,24 @@ let
It contains the builder for different nvidia configuration, parametrized by It contains the builder for different nvidia configuration, parametrized by
the version of the driver and sha256 sum of the driver installer file. the version of the driver and sha256 sum of the driver installer file.
*/ */
nvidiaPackages = { version, sha256 ? null }: rec { nvidiaPackages = { version }:
let
nvidiaDrivers = (linuxPackages.nvidia_x11.override { }).overrideAttrs nvidiaDrivers = (linuxPackages.nvidia_x11.override { }).overrideAttrs
(oldAttrs: rec { (oldAttrs: {
pname = "nvidia"; pname = "nvidia";
name = "nvidia-x11-${version}-nixGL"; name = "nvidia-x11-${version}-nixGL";
inherit version; inherit version;
src = let src =
let
url = url =
"https://download.nvidia.com/XFree86/Linux-x86_64/${version}/NVIDIA-Linux-x86_64-${version}.run"; "https://download.nvidia.com/XFree86/Linux-x86_64/${version}/NVIDIA-Linux-x86_64-${version}.run";
in if sha256 != null then in
fetchurl { inherit url sha256; } fetchurl { inherit url sha256; };
else
builtins.fetchurl url;
useGLVND = true; useGLVND = true;
}); });
in
{
inherit nvidiaDrivers;
nvidiaLibsOnly = nvidiaDrivers.override { nvidiaLibsOnly = nvidiaDrivers.override {
libsOnly = true; libsOnly = true;
kernel = null; kernel = null;
@ -130,7 +152,8 @@ let
nixGLIntel = writeExecutable { nixGLIntel = writeExecutable {
name = "nixGLIntel"; name = "nixGLIntel";
# add the 32 bits drivers if needed # add the 32 bits drivers if needed
text = let text =
let
mesa-drivers = [ mesa.drivers ] mesa-drivers = [ mesa.drivers ]
++ lib.optional enable32bits pkgsi686Linux.mesa.drivers; ++ lib.optional enable32bits pkgsi686Linux.mesa.drivers;
intel-driver = [ intel-media-driver vaapiIntel ] intel-driver = [ intel-media-driver vaapiIntel ]
@ -138,11 +161,14 @@ let
++ lib.optionals enable32bits [ /* pkgsi686Linux.intel-media-driver */ driversi686Linux.vaapiIntel ]; ++ lib.optionals enable32bits [ /* pkgsi686Linux.intel-media-driver */ driversi686Linux.vaapiIntel ];
libvdpau = [ libvdpau-va-gl ] libvdpau = [ libvdpau-va-gl ]
++ lib.optional enable32bits pkgsi686Linux.libvdpau-va-gl; ++ lib.optional enable32bits pkgsi686Linux.libvdpau-va-gl;
glxindirect = runCommand "mesa_glxindirect" { } ('' glxindirect = runCommand "mesa_glxindirect" { } (
''
mkdir -p $out/lib mkdir -p $out/lib
ln -s ${mesa.drivers}/lib/libGLX_mesa.so.0 $out/lib/libGLX_indirect.so.0 ln -s ${mesa.drivers}/lib/libGLX_mesa.so.0 $out/lib/libGLX_indirect.so.0
''); ''
in '' );
in
''
#!${runtimeShell} #!${runtimeShell}
export LIBGL_DRIVERS_PATH=${lib.makeSearchPathOutput "lib" "lib/dri" mesa-drivers} export LIBGL_DRIVERS_PATH=${lib.makeSearchPathOutput "lib" "lib/dri" mesa-drivers}
export LIBVA_DRIVERS_PATH=${lib.makeSearchPathOutput "out" "lib/dri" intel-driver} export LIBVA_DRIVERS_PATH=${lib.makeSearchPathOutput "out" "lib/dri" intel-driver}
@ -158,7 +184,8 @@ let
nixVulkanIntel = writeExecutable { nixVulkanIntel = writeExecutable {
name = "nixVulkanIntel"; name = "nixVulkanIntel";
text = let text =
let
# generate a file with the listing of all the icd files # generate a file with the listing of all the icd files
icd = runCommand "mesa_icd" { } ( icd = runCommand "mesa_icd" { } (
# 64 bits icd # 64 bits icd
@ -170,8 +197,10 @@ let
ls ${pkgsi686Linux.mesa.drivers}/share/vulkan/icd.d/*.json >> f ls ${pkgsi686Linux.mesa.drivers}/share/vulkan/icd.d/*.json >> f
'' ''
# concat everything as a one line string with ":" as seperator # concat everything as a one line string with ":" as seperator
+ ''cat f | xargs | sed "s/ /:/g" > $out''); + ''cat f | xargs | sed "s/ /:/g" > $out''
in '' );
in
''
#!${runtimeShell} #!${runtimeShell}
if [ -n "$LD_LIBRARY_PATH" ]; then if [ -n "$LD_LIBRARY_PATH" ]; then
echo "Warning, nixVulkanIntel overwriting existing LD_LIBRARY_PATH" 1>&2 echo "Warning, nixVulkanIntel overwriting existing LD_LIBRARY_PATH" 1>&2
@ -201,8 +230,10 @@ let
cp ${nixGL}/bin/* "$out/bin/nixGL"; cp ${nixGL}/bin/* "$out/bin/nixGL";
''; '';
auto = let auto =
_nvidiaVersionFile = if nvidiaVersionFile != null then let
_nvidiaVersionFile =
if nvidiaVersionFile != null then
nvidiaVersionFile nvidiaVersionFile
else else
# HACK: Get the version from /proc. It turns out that /proc is mounted # HACK: Get the version from /proc. It turns out that /proc is mounted
@ -210,7 +241,8 @@ let
# #
# builtins.readFile is not able to read /proc files. See # builtins.readFile is not able to read /proc files. See
# https://github.com/NixOS/nix/issues/3539. # https://github.com/NixOS/nix/issues/3539.
runCommand "impure-nvidia-version-file" { runCommand "impure-nvidia-version-file"
{
# To avoid sharing the build result over time or between machine, # To avoid sharing the build result over time or between machine,
# Add an impure parameter to force the rebuild on each access. # Add an impure parameter to force the rebuild on each access.
# time = builtins.currentTime; # time = builtins.currentTime;
@ -220,27 +252,33 @@ let
# The nvidia version. Either fixed by the `nvidiaVersion` argument, or # The nvidia version. Either fixed by the `nvidiaVersion` argument, or
# auto-detected. Auto-detection is impure. # auto-detected. Auto-detection is impure.
nvidiaVersionAuto = if nvidiaVersion != null then nvidiaVersionAuto =
if nvidiaVersion != null then
nvidiaVersion nvidiaVersion
else else
# Get if from the nvidiaVersionFile # Get if from the nvidiaVersionFile
let let
data = builtins.readFile _nvidiaVersionFile; data = builtins.readFile _nvidiaVersionFile;
versionMatch = builtins.match ".*Module ([0-9.]+) .*" data; versionMatch = builtins.match ".*Module ([0-9.]+) .*" data;
in if versionMatch != null then builtins.head versionMatch else null; in
if versionMatch != null then builtins.head versionMatch else null;
autoNvidia = nvidiaPackages {version = nvidiaVersionAuto; }; autoNvidia = nvidiaPackages { version = nvidiaVersionAuto; };
in rec { in
rec {
# The output derivation contains nixGL which point either to # The output derivation contains nixGL which point either to
# nixGLNvidia or nixGLIntel using an heuristic. # nixGLNvidia or nixGLIntel using an heuristic.
nixGLDefault = if nvidiaVersionAuto != null then nixGLDefault =
if nvidiaVersionAuto != null then
nixGLCommon autoNvidia.nixGLNvidia nixGLCommon autoNvidia.nixGLNvidia
else else
nixGLCommon nixGLIntel; nixGLCommon nixGLIntel;
} // autoNvidia; } // autoNvidia;
}; };
in top // (if nvidiaVersion != null then in
top.nvidiaPackages { top // (if nvidiaVersion != null then
top.nvidiaPackages
{
version = nvidiaVersion; version = nvidiaVersion;
sha256 = nvidiaHash; sha256 = nvidiaHash;
} }

View File

@ -1,5 +1,6 @@
flake_input@{ kpcli-py, nixgl, rust-overlay, neovim-nightly-overlay, ... }: [ flake_input@{ kpcli-py, nixgl, rust-overlay, neovim-nightly-overlay, ... }: [
# TODO: this is quite harmful to add globally. nixGL is built not to be pure
nixgl.overlays.default nixgl.overlays.default
rust-overlay.overlays.default rust-overlay.overlays.default