about summary refs log tree commit diff
path: root/pkgs/by-name/fi/firefoxpwa/package.nix
blob: 13ca4fbcd6c13739b1c1bd80674bfba1b126c3c5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
{
  extraLibs ? [ ],

  lib,
  fetchFromGitHub,
  installShellFiles,
  makeWrapper,
  rustPlatform,

  cups,
  ffmpeg,
  firefox-unwrapped,
  libcanberra-gtk3,
  libglvnd,
  libnotify,
  libpulseaudio,
  libva,
  mesa,
  nixosTests,
  openssl,
  pciutils,
  pipewire,
  pkg-config,
  stdenv,
  udev,
  xorg,
}:

rustPlatform.buildRustPackage rec {
  pname = "firefoxpwa";
  version = "2.12.4";

  src = fetchFromGitHub {
    owner = "filips123";
    repo = "PWAsForFirefox";
    rev = "v${version}";
    hash = "sha256-VNCQUF/Xep/PkrNd9Mzbm3NWPToqXpJM6SzDoqBXbNY=";
  };

  sourceRoot = "${src.name}/native";
  buildFeatures = [ "immutable-runtime" ];

  cargoLock = {
    lockFile = ./Cargo.lock;
    outputHashes = {
      "mime-0.4.0-a.0" = "sha256-LjM7LH6rL3moCKxVsA+RUL9lfnvY31IrqHa9pDIAZNE=";
      "web_app_manifest-0.0.0" = "sha256-G+kRN8AEmAY1TxykhLmgoX8TG8y2lrv7SCRJlNy0QzA=";
    };
  };

  preConfigure = ''
    sed -i 's;version = "0.0.0";version = "${version}";' Cargo.toml
    sed -zi 's;name = "firefoxpwa"\nversion = "0.0.0";name = "firefoxpwa"\nversion = "${version}";' Cargo.lock
    sed -i $'s;DISTRIBUTION_VERSION = \'0.0.0\';DISTRIBUTION_VERSION = \'${version}\';' userchrome/profile/chrome/pwa/chrome.jsm
  '';

  nativeBuildInputs = [
    installShellFiles
    makeWrapper
    pkg-config
  ];
  buildInputs = [ openssl ];

  FFPWA_EXECUTABLES = ""; # .desktop entries generated without any store path references
  FFPWA_SYSDATA = "${placeholder "out"}/share/firefoxpwa";
  completions = "target/${stdenv.targetPlatform.config}/release/completions";

  gtk_modules = map (x: x + x.gtkModule) [ libcanberra-gtk3 ];
  libs =
    let
      libs =
        lib.optionals stdenv.hostPlatform.isLinux [
          cups
          ffmpeg
          libglvnd
          libnotify
          libpulseaudio
          libva
          mesa
          pciutils
          pipewire
          udev
          xorg.libXScrnSaver
        ]
        ++ gtk_modules
        ++ extraLibs;
    in
    lib.makeLibraryPath libs + ":" + lib.makeSearchPathOutput "lib" "lib64" libs;

  postInstall = ''
    # Runtime
    mkdir -p $out/share/firefoxpwa
    cp -Lr ${firefox-unwrapped}/lib/firefox $out/share/firefoxpwa/runtime
    chmod -R +w $out/share/firefoxpwa

    # UserChrome
    cp -r userchrome $out/share/firefoxpwa

    # Runtime patching
    FFPWA_USERDATA=$out/share/firefoxpwa $out/bin/firefoxpwa runtime patch

    # Manifest
    sed -i "s!/usr/libexec!$out/bin!" manifests/linux.json
    install -Dm644 manifests/linux.json $out/lib/mozilla/native-messaging-hosts/firefoxpwa.json

    installShellCompletion --cmd firefoxpwa \
      --bash $completions/firefoxpwa.bash \
      --fish $completions/firefoxpwa.fish \
      --zsh $completions/_firefoxpwa

    # AppStream Metadata
    install -Dm644 packages/appstream/si.filips.FirefoxPWA.metainfo.xml $out/share/metainfo/si.filips.FirefoxPWA.metainfo.xml
    install -Dm644 packages/appstream/si.filips.FirefoxPWA.svg $out/share/icons/hicolor/scalable/apps/si.filips.FirefoxPWA.svg

    wrapProgram $out/bin/firefoxpwa \
      --prefix FFPWA_SYSDATA : "$out/share/firefoxpwa" \
      --prefix LD_LIBRARY_PATH : "$libs" \
      --suffix-each GTK_PATH : "$gtk_modules"

    wrapProgram $out/bin/firefoxpwa-connector \
      --prefix FFPWA_SYSDATA : "$out/share/firefoxpwa" \
      --prefix LD_LIBRARY_PATH : "$libs" \
      --suffix-each GTK_PATH : "$gtk_modules"
  '';

  passthru.tests.firefoxpwa = nixosTests.firefoxpwa;

  meta = {
    description = "Tool to install, manage and use Progressive Web Apps (PWAs) in Mozilla Firefox (native component)";
    longDescription = ''
      Progressive Web Apps (PWAs) are web apps that use web APIs and features along
      with progressive enhancement strategy to bring a native app-like user experience
      to cross-platform web applications. Although Firefox supports many of Progressive
      Web App APIs, it does not support functionality to install them as a standalone
      system app with an app-like experience.

      This project creates a custom modified Firefox runtime to allow websites to be
      installed as standalone apps and provides a console tool and browser extension
      to install, manage and use them.

      This package contains only the native part of the PWAsForFirefox project. You
      should also install the browser extension if you haven't already. You can download
      it from the [Firefox Add-ons](https://addons.mozilla.org/firefox/addon/pwas-for-firefox/)
      website.

      To install the package on NixOS, you need to add the following options:

      ```
      programs.firefox.nativeMessagingHosts.packages = [ pkgs.firefoxpwa ];
      environment.systemPackages = [ pkgs.firefoxpwa ];
      ```

      As it needs to be both in the `PATH` and in the `nativeMessagingHosts` to make it
      possible for the extension to detect and use it.
    '';
    homepage = "https://pwasforfirefox.filips.si/";
    changelog = "https://github.com/filips123/PWAsForFirefox/releases/tag/v${version}";
    license = lib.licenses.mpl20;
    platforms = lib.platforms.unix;
    maintainers = with lib.maintainers; [
      adamcstephens
      camillemndn
      pasqui23
    ];
    mainProgram = "firefoxpwa";
  };
}