nixpkgs/pkgs/desktops/gnome/extensions/buildGnomeExtension.nix
piegames 2c063fe250 gnomeExtensions: add patch framework
It's like Haskell's overlay system, but way more primitive. We simply pre-define some
package overrides that are required for an automatically packaged extension to work.
Ideally, all (or almost all) currently manually pacakged extensions will work this way.

Since these are mostly just a few lines each, there is no need to split this up into a
lot of small files.
2021-09-08 22:54:31 +02:00

60 lines
2 KiB
Nix

{ pkgs, lib, stdenv, fetchzip }:
let
buildGnomeExtension = {
# Every gnome extension has a UUID. It's the name of the extension folder once unpacked
# and can always be found in the metadata.json of every extension.
uuid,
name,
pname,
description,
# extensions.gnome.org extension URL
link,
# Extension version numbers are integers
version,
sha256,
# Hex-encoded string of JSON bytes
metadata,
}:
stdenv.mkDerivation {
pname = "gnome-shell-extension-${pname}";
version = builtins.toString version;
src = fetchzip {
url = "https://extensions.gnome.org/extension-data/${
builtins.replaceStrings [ "@" ] [ "" ] uuid
}.v${builtins.toString version}.shell-extension.zip";
inherit sha256;
stripRoot = false;
# The download URL may change content over time. This is because the
# metadata.json is automatically generated, and parts of it can be changed
# without making a new release. We simply substitute the possibly changed fields
# with their content from when we last updated, and thus get a deterministic output
# hash.
extraPostFetch = ''
echo "${metadata}" | base64 --decode > $out/metadata.json
'';
};
dontBuild = true;
installPhase = ''
runHook preInstall
mkdir -p $out/share/gnome-shell/extensions/
cp -r -T . $out/share/gnome-shell/extensions/${uuid}
runHook postInstall
'';
meta = {
description = builtins.head (lib.splitString "\n" description);
longDescription = description;
homepage = link;
license = lib.licenses.gpl2Plus; # https://wiki.gnome.org/Projects/GnomeShell/Extensions/Review#Licensing
maintainers = with lib.maintainers; [ piegames ];
};
passthru = {
extensionPortalSlug = pname;
# Store the extension's UUID, because we might need it at some places
extensionUuid = uuid;
};
};
in
lib.makeOverridable buildGnomeExtension