This commit is contained in:
Dmitry Chermnykh
2025-04-02 20:18:24 +05:00
parent 9818e30327
commit ffb45b18bf
4 changed files with 251 additions and 153 deletions

27
flake.lock generated
View File

@@ -1,12 +1,32 @@
{
"nodes": {
"home-manager": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1743604125,
"narHash": "sha256-ZD61DNbsBt1mQbinAaaEqKaJk2RFo9R/j+eYWeGMx7A=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "180fd43eea296e62ae68e079fcf56aba268b9a1a",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "home-manager",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1742288794,
"narHash": "sha256-Txwa5uO+qpQXrNG4eumPSD+hHzzYi/CdaM80M9XRLCo=",
"lastModified": 1743448293,
"narHash": "sha256-bmEPmSjJakAp/JojZRrUvNcDX2R5/nuX6bm+seVaGhs=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "b6eaf97c6960d97350c584de1b6dcff03c9daf42",
"rev": "77b584d61ff80b4cef9245829a6f1dfad5afdfa3",
"type": "github"
},
"original": {
@@ -18,6 +38,7 @@
},
"root": {
"inputs": {
"home-manager": "home-manager",
"nixpkgs": "nixpkgs"
}
}

214
flake.nix
View File

@@ -2,161 +2,75 @@
description = "Zen Browser";
inputs.nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
inputs.home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
outputs = {
self,
nixpkgs,
}: let
mkZen = name: system: entry: let
pkgs = import nixpkgs {inherit system;};
variant = (builtins.fromJSON (builtins.readFile ./sources.json)).${entry}.${system};
outputs =
{
self,
nixpkgs,
home-manager,
}:
let
mkZen =
name: system: entry:
let
pkgs = nixpkgs.legacyPackages.${system};
variant = (builtins.fromJSON (builtins.readFile ./sources.json)).${entry}.${system};
runtimeLibs = with pkgs;
[
libGL
libGLU
libevent
libffi
libjpeg
libpng
libstartup_notification
libvpx
libwebp
stdenv.cc.cc
fontconfig
libxkbcommon
zlib
freetype
gtk3
libxml2
dbus
xcb-util-cursor
alsa-lib
libpulseaudio
pango
atk
cairo
gdk-pixbuf
glib
udev
libva
libgbm
vulkan-loader
mesa
libnotify
cups
pciutils
ffmpeg
libglvnd
pipewire
speechd
]
++ (with pkgs.xorg; [
libxcb
libX11
libXcursor
libXrandr
libXi
libXext
libXcomposite
libXdamage
libXfixes
libXScrnSaver
]);
policiesJson = pkgs.writeText "firefox-policies.json" (builtins.toJSON {
# https://mozilla.github.io/policy-templates/#disableappupdates
policies = {
DisableAppUpdate = true;
desktopFile = if name == "beta" then "zen.desktop" else "zen_${name}.desktop";
in
pkgs.callPackage ./package.nix {
inherit name desktopFile variant;
};
mkZenWrapped =
name: system: entry:
let
pkgs = nixpkgs.legacyPackages.${system};
in
pkgs.wrapFirefox entry {
icon = "zen-${name}";
wmClass = "zen";
hasMozSystemDirPatch = false;
};
supportedSystems = [
"x86_64-linux"
"aarch64-linux"
];
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
in
{
packages = forAllSystems (system: rec {
beta-unwrapped = mkZen "beta" system "beta";
twilight-unwrapped = mkZen "twilight" system "twilight";
twilight-official-unwrapped = mkZen "twilight" system "twilight-official";
beta = mkZenWrapped "beta" system beta-unwrapped;
twilight = mkZenWrapped "twilight" system twilight-unwrapped;
twilight-official = mkZenWrapped "twilight" system twilight-official-unwrapped;
default = beta;
});
desktopFile =
if name == "beta"
then "zen.desktop"
else "zen_${name}.desktop";
in
pkgs.stdenv.mkDerivation {
inherit (variant) version;
pname = "zen-browser";
src = builtins.fetchTarball {inherit (variant) url sha256;};
desktopSrc = ./.;
phases = ["installPhase" "fixupPhase"];
nativeBuildInputs = [pkgs.makeWrapper pkgs.copyDesktopItems pkgs.wrapGAppsHook];
installPhase = ''
mkdir -p $out/{bin,opt/zen,lib/zen-${variant.version}/distribution} && cp -r $src/* $out/opt/zen
ln -s $out/opt/zen/zen $out/bin/zen
ln -s ${policiesJson} "$out/lib/zen-${variant.version}/distribution/policies.json"
ln -s $out/bin/zen $out/bin/zen-${name}
install -D $desktopSrc/zen-${name}.desktop $out/share/applications/${desktopFile}
install -D $src/browser/chrome/icons/default/default16.png $out/share/icons/hicolor/16x16/apps/zen-${name}.png
install -D $src/browser/chrome/icons/default/default32.png $out/share/icons/hicolor/32x32/apps/zen-${name}.png
install -D $src/browser/chrome/icons/default/default48.png $out/share/icons/hicolor/48x48/apps/zen-${name}.png
install -D $src/browser/chrome/icons/default/default64.png $out/share/icons/hicolor/64x64/apps/zen-${name}.png
install -D $src/browser/chrome/icons/default/default128.png $out/share/icons/hicolor/128x128/apps/zen-${name}.png
'';
fixupPhase = ''
chmod 755 $out/bin/zen $out/opt/zen/*
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" $out/opt/zen/zen
wrapProgram $out/opt/zen/zen --set LD_LIBRARY_PATH "${
pkgs.lib.makeLibraryPath runtimeLibs
}" \
--set MOZ_LEGACY_PROFILES 1 --set MOZ_ALLOW_DOWNGRADE 1 --set MOZ_APP_LAUNCHER zen --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" $out/opt/zen/zen-bin
wrapProgram $out/opt/zen/zen-bin --set LD_LIBRARY_PATH "${
pkgs.lib.makeLibraryPath runtimeLibs
}" \
--set MOZ_LEGACY_PROFILES 1 --set MOZ_ALLOW_DOWNGRADE 1 --set MOZ_APP_LAUNCHER zen --prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" $out/opt/zen/glxtest
wrapProgram $out/opt/zen/glxtest --set LD_LIBRARY_PATH "${
pkgs.lib.makeLibraryPath runtimeLibs
}"
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" $out/opt/zen/updater
wrapProgram $out/opt/zen/updater --set LD_LIBRARY_PATH "${
pkgs.lib.makeLibraryPath runtimeLibs
}"
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" $out/opt/zen/vaapitest
wrapProgram $out/opt/zen/vaapitest --set LD_LIBRARY_PATH "${
pkgs.lib.makeLibraryPath runtimeLibs
}"
'';
meta = {
inherit desktopFile;
description = "Experience tranquillity while browsing the web without people tracking you!";
homepage = "https://zen-browser.app";
downloadPage = "https://zen-browser.app/download/";
changelog = "https://github.com/zen-browser/desktop/releases";
platforms = pkgs.lib.platforms.linux;
mainProgram = "zen";
homeModules = rec {
beta = import ./hm-module.nix {
inherit self home-manager;
name = "beta";
};
twilight = import ./hm-module.nix {
inherit self home-manager;
name = "twilight";
};
twilight-official = import ./hm-module.nix {
inherit self home-manager;
name = "twilight-official";
};
default = beta;
};
supportedSystems = [
"x86_64-linux"
"aarch64-linux"
];
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
in {
packages = forAllSystems (system: {
default = mkZen "beta" system "beta";
beta = mkZen "beta" system "beta";
twilight = mkZen "twilight" system "twilight";
twilight-official = mkZen "twilight" system "twilight-official";
});
};
};
}

50
hm-module.nix Normal file
View File

@@ -0,0 +1,50 @@
{
home-manager,
self,
name,
}:
{
pkgs,
config,
lib,
...
}:
let
applicationName = "Zen Browser";
modulePath = [
"programs"
"zen-browser"
];
mkFirefoxModule = import "${home-manager.outPath}/modules/programs/firefox/mkFirefoxModule.nix";
in
{
imports = [
(mkFirefoxModule {
inherit modulePath;
name = applicationName;
wrappedPackageName = "zen-${name}-unwrapped";
unwrappedPackageName = "zen-${name}";
visible = true;
platforms = {
linux = {
vendorPath = ".zen";
configPath = ".zen";
};
darwin = {
configPath = "Library/Application Support/Zen";
};
};
})
];
config = lib.mkIf config.programs.zen-browser.enable {
programs.zen-browser = {
package = self.packages.${pkgs.stdenv.system}.${name};
policies = {
DisableAppUpdate = true;
DisableTelemetry = true;
};
};
};
}

113
package.nix Normal file
View File

@@ -0,0 +1,113 @@
{
name,
variant,
desktopFile,
lib,
stdenv,
config,
wrapGAppsHook3,
autoPatchelfHook,
alsa-lib,
curl,
dbus-glib,
gtk3,
libXtst,
libva,
pciutils,
pipewire,
adwaita-icon-theme,
writeText,
patchelfUnstable, # have to use patchelfUnstable to support --no-clobber-old-sections
applicationName ? "Zen Browser",
}:
let
binaryName = "zen-${name}";
mozillaPlatforms = {
x86_64-linux = "linux-x86_64";
aarch64-linux = "linux-aarch64";
};
policies = {
DisableAppUpdate = true;
} // config.firefox.policies or { };
policiesJson = writeText "firefox-policies.json" (builtins.toJSON { inherit policies; });
pname = "zen-${name}-bin-unwrapped";
in
stdenv.mkDerivation {
inherit pname;
inherit (variant) version;
src = builtins.fetchTarball { inherit (variant) url sha256; };
desktopSrc = ./.;
nativeBuildInputs = [
wrapGAppsHook3
autoPatchelfHook
patchelfUnstable
];
buildInputs = [
gtk3
adwaita-icon-theme
alsa-lib
dbus-glib
libXtst
];
runtimeDependencies = [
curl
libva.out
pciutils
];
appendRunpaths = [
"${pipewire}/lib"
];
# Firefox uses "relrhack" to manually process relocations from a fixed offset
patchelfFlags = [ "--no-clobber-old-sections" ];
preFixup = ''
gappsWrapperArgs+=(
--set MOZ_ALLOW_DOWNGRADE 1
--set MOZ_APP_LAUNCHER zen
)
'';
installPhase = ''
mkdir -p $out/{bin,opt/zen,lib/zen-${variant.version}/distribution} && cp -r $src/* $out/opt/zen
ln -s $out/opt/zen/zen $out/bin/zen
ln -s ${policiesJson} "$out/lib/zen-${variant.version}/distribution/policies.json"
ln -s $out/bin/zen $out/bin/zen-${name}
install -D $desktopSrc/zen-${name}.desktop $out/share/applications/${desktopFile}
install -D $src/browser/chrome/icons/default/default16.png $out/share/icons/hicolor/16x16/apps/zen-${name}.png
install -D $src/browser/chrome/icons/default/default32.png $out/share/icons/hicolor/32x32/apps/zen-${name}.png
install -D $src/browser/chrome/icons/default/default48.png $out/share/icons/hicolor/48x48/apps/zen-${name}.png
install -D $src/browser/chrome/icons/default/default64.png $out/share/icons/hicolor/64x64/apps/zen-${name}.png
install -D $src/browser/chrome/icons/default/default128.png $out/share/icons/hicolor/128x128/apps/zen-${name}.png
'';
passthru = {
inherit applicationName binaryName;
libName = "zen-bin-${variant.version}";
ffmpegSupport = true;
gssSupport = true;
gtk3 = gtk3;
};
meta = {
inherit desktopFile;
description = "Experience tranquillity while browsing the web without people tracking you!";
homepage = "https://zen-browser.app";
downloadPage = "https://zen-browser.app/download/";
changelog = "https://github.com/zen-browser/desktop/releases";
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
platforms = builtins.attrNames mozillaPlatforms;
hydraPlatforms = [];
mainProgram = binaryName;
};
}