Skip to content

Commit

Permalink
init: workarounds.opengl option
Browse files Browse the repository at this point in the history
The option allows packages to be wrapped by nixgl in order to make GUI
applications work when installed with home-manager
  • Loading branch information
Michael Vogel committed Apr 25, 2024
1 parent bfa7c06 commit 2fc2d54
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 0 deletions.
6 changes: 6 additions & 0 deletions modules/lib/maintainers.nix
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,12 @@
github = "MForster";
githubId = 4067975;
};
michaelCTS = {
name = "michaelCTS";
email = "michael.vogel@cts.co";
github = "michaelCTS";
githubId = 132582212;
};
mifom = {
name = "mifom";
email = "mifom@users.noreply.github.com";
Expand Down
103 changes: 103 additions & 0 deletions modules/misc/nixgl.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
{ config, pkgs, lib, ... }:

let
cfg = config.workarounds.nixgl;

# Expects a PackageConfiguration hashset
# Adapted from https://nixos.wiki/wiki/Nix_Cookbook
wrapWithNixGL = { binary, pkg, ... }:
(let
bin = if binary == null then pkg.pname else binary;
nixGL = import cfg.src { inherit pkgs; };
wrapperPkg = lib.attrsets.getAttrFromPath cfg.wrapperPkgPath nixGL;
wrapperBinPath = "${wrapperPkg}/bin/${cfg.wrapperBinName}";
in pkgs.runCommand "nixgl-${pkg.pname}" {
buildInputs = [ pkgs.makeWrapper ];
} ''
mkdir $out
# Link every top-level folder from pkgs.hello to our new target
ln -s ${pkg}/* $out
# Except the bin folder
rm $out/bin
mkdir $out/bin
# We create the bin folder ourselves and link every binary in it
ln -s ${pkg}/bin/* $out/bin
# Except the target binary
rm $out/bin/${bin}
# Because we create this ourself, by creating a wrapper
makeWrapper ${wrapperBinPath} $out/bin/${bin} \
--add-flags ${pkg}/bin/${bin}
'');
PackageConfiguration = with lib;
types.submodule {
options = {
binary = mkOption {
type = types.nullOr types.str;
example = "alacritty";
default = null;
description = ''
Name of the binary in bin/ of the package.
By default this uses `package.pname`.
'';
};
pkg = mkOption {
type = types.package;
example = "pkgs.alacritty";
description = ''
The package to be wrapped.
It's expected to have a `pname` attribute.
'';
};
};
};
in {
meta.maintainers = with lib.maintainers; [ michaelCTS ];
options.workarounds.nixgl = {
src = lib.mkOption {
type = lib.types.package;
default = builtins.fetchTarball
"https://github.com/nix-community/nixGL/archive/main.tar.gz";
example = ''
pkgs.fetchFromGithub {
owner = "nix-community";
repo = "nixGL";
rev = "v1.3";
hash = "SOMEHASH-HERE";
}
'';
description = ''
Path to a downloaded source of nixGL.
You can download the nixGL version of your choice and point to it here.
'';
};
wrapperBinName = lib.mkOption {
type = lib.types.str;
example = "nixGL";
default = "nixGL";
description =
"Name of the nixGL binary to be called from within the wrapper package";
};
wrapperPkgPath = lib.mkOption {
type = lib.types.listOf lib.types.str;
example = ''["auto" "nixGLNvidia"]'';
default = [ "auto" "nixGLDefault" ];
description = "Attribute path within `src` attrset to the nixGL package";
};
packages = lib.mkOption {
type = lib.types.listOf PackageConfiguration;
default = [ ];
example = "[{ pkg = pkgs.alacritty; }]";
description = ''
List of packages that will be wrapped with nixGL in order to be able to use nixgl.
Without the wrapper, graphical applications cannot access nixgl and thus have no
graphical acceleration.
'';
};
};

config = {
home.packages =
builtins.map wrapWithNixGL config.workarounds.nixgl.packages;
};
}

0 comments on commit 2fc2d54

Please sign in to comment.