several nixgl things

This commit is contained in:
Thilo Billerbeck 2024-04-22 17:50:39 +02:00
parent 8346071197
commit b3b0098eb5
3 changed files with 56 additions and 18 deletions
home-manager

View file

@ -55,6 +55,15 @@ with lib; {
description = "Whether to enable noise suppression or not";
};
};
nixGLPrefix = lib.mkOption {
type = lib.types.str;
default = "";
description = ''
Will be prepended to commands which require working OpenGL.
This needs to be set to the right nixGL package on non-NixOS systems.
'';
};
};
config = {

View file

@ -1,17 +1,37 @@
{ pkgs, lib, ... }:
# Call once on import to load global context
{
pkgs,
config,
}:
# Wrap a single package
pkg:
if config.nixGLPrefix == ""
then pkg
else
# Wrap the package's binaries with nixGL, while preserving the rest of
# the outputs and derivation attributes.
(pkg.overrideAttrs (old: {
name = "nixGL-${pkg.name}";
buildCommand = ''
set -eo pipefail
let nixgl = import <nixgl> { };
in pkg:
pkgs.runCommand "${pkg.name}-nixgl-wrapper" { } ''
mkdir $out
ln -s ${pkg}/* $out
rm $out/bin
mkdir $out/bin
for bin in ${pkg}/bin/*; do
wrapped_bin=$out/bin/$(basename $bin)
echo -e "#!/bin/bash\nexec ${
lib.getExe nixgl.auto.nixGLDefault
} $bin \$@" > $wrapped_bin
chmod +x $wrapped_bin
done
''
${
# Heavily inspired by https://stackoverflow.com/a/68523368/6259505
pkgs.lib.concatStringsSep "\n" (map (outputName: ''
echo "Copying output ${outputName}"
set -x
cp -rs --no-preserve=mode "${pkg.${outputName}}" "''$${outputName}"
set +x
'') (old.outputs or ["out"]))
}
rm -rf $out/bin/*
shopt -s nullglob # Prevent loop from running if no files
for file in ${pkg.out}/bin/*; do
echo "#!${pkgs.bash}/bin/bash" > "$out/bin/$(basename $file)"
echo "exec -a \"\$0\" ${config.nixGLPrefix} $file \"\$@\"" >> "$out/bin/$(basename $file)"
chmod +x "$out/bin/$(basename $file)"
done
shopt -u nullglob # Revert nullglob back to its normal default state
'';
}))