config/packages/zen-browser-unwrapped/default.nix

434 lines
11 KiB
Nix
Raw Normal View History

2024-11-06 13:40:30 -05:00
# pname = "zen-browser-unwrapped";
# version = "715b6df2fb8171336adc8712668a5e8458f7749b";
#
# src = fetchFromGitHub {
# owner = "zen-browser";
# repo = "desktop";
# rev = "${version}";
# leaveDotGit = true;
# fetchSubmodules = true;
# hash = "sha256-0+x2XoZyMdzP1beJvUSeM/QnFyQ+FSuGIatHh1mtBaw=";
# };
#
# firefoxVersion = (lib.importJSON "${src}/surfer.json").version.version;
# firefoxSrc = fetchurl {
# url = "mirror://mozilla/firefox/releases/${firefoxVersion}/source/firefox-${firefoxVersion}.source.tar.xz";
# hash = "sha256-XAMbVywdpyZnfi/5e2rVp+OyM4em/DljORy1YvgKXkg=";
# };
2024-10-20 02:26:47 -04:00
{
buildNpmPackage,
buildPackages,
fetchFromGitHub,
fetchurl,
lib,
overrideCC,
stdenv,
# build time
autoconf,
cargo,
dump_syms,
git,
gnum4,
nodejs,
patchelf,
pkg-config,
pkgsBuildBuild,
pkgsCross,
python3,
runCommand,
rsync,
rustc,
rust-cbindgen,
rustPlatform,
unzip,
vips,
wrapGAppsHook3,
writeShellScript,
# runtime
alsa-lib,
atk,
cairo,
cups,
dbus,
dbus-glib,
ffmpeg,
fontconfig,
freetype,
gdk-pixbuf,
gtk3,
glib,
icu73,
jemalloc,
libGL,
libGLU,
libdrm,
libevent,
libffi,
libglvnd,
libjack2,
libjpeg,
libkrb5,
libnotify,
libpng,
libpulseaudio,
libstartup_notification,
libva,
libvpx,
libwebp,
libxkbcommon,
libxml2,
makeWrapper,
mesa,
nasm,
nspr,
nss_latest,
pango,
pciutils,
pipewire,
sndio,
udev,
xcb-util-cursor,
xorg,
zlib,
# Generic changes the compatibility mode of the final binaries.
#
# Enabling generic will make the browser compatible with more devices at the
# cost of disabling hardware-specific optimizations. It is highly recommended
# to leave `generic` disabled.
generic ? false,
debugBuild ? false,
# On 32bit platforms, we disable adding "-g" for easier linking.
enableDebugSymbols ? !stdenv.hostPlatform.is32bit,
alsaSupport ? stdenv.hostPlatform.isLinux,
ffmpegSupport ? true,
gssSupport ? true,
jackSupport ? stdenv.hostPlatform.isLinux,
jemallocSupport ? !stdenv.hostPlatform.isMusl,
pipewireSupport ? waylandSupport && webrtcSupport,
pulseaudioSupport ? stdenv.hostPlatform.isLinux,
sndioSupport ? stdenv.hostPlatform.isLinux,
waylandSupport ? true,
privacySupport ? false,
# WARNING: NEVER set any of the options below to `true` by default.
# Set to `!privacySupport` or `false`.
crashreporterSupport ? !privacySupport && !stdenv.hostPlatform.isRiscV && !stdenv.hostPlatform.isMusl,
geolocationSupport ? !privacySupport,
webrtcSupport ? !privacySupport,
}: let
surfer = buildNpmPackage {
pname = "surfer";
2024-11-06 13:40:30 -05:00
version = "1.5.0";
2024-10-20 02:26:47 -04:00
src = fetchFromGitHub {
owner = "zen-browser";
repo = "surfer";
2024-11-06 13:40:30 -05:00
rev = "50af7094ede6e9f0910f010c531f8447876a6464";
hash = "sha256-wmAWg6hoICNHfoXJifYFHmyFQS6H22u3GSuRW4alexw=";
2024-10-20 02:26:47 -04:00
};
patches = [./surfer-dont-check-update.patch];
npmDepsHash = "sha256-p0RVqn0Yfe0jxBcBa/hYj5g9XSVMFhnnZT+au+bMs18=";
makeCacheWritable = true;
SHARP_IGNORE_GLOBAL_LIBVIPS = false;
nativeBuildInputs = [pkg-config];
buildInputs = [vips];
};
llvmPackages0 = rustc.llvmPackages;
llvmPackagesBuildBuild0 = pkgsBuildBuild.rustc.llvmPackages;
llvmPackages = llvmPackages0.override {
bootBintoolsNoLibc = null;
bootBintools = null;
};
llvmPackagesBuildBuild = llvmPackagesBuildBuild0.override {
bootBintoolsNoLibc = null;
bootBintools = null;
};
buildStdenv = overrideCC llvmPackages.stdenv (
llvmPackages.stdenv.cc.override {bintools = buildPackages.rustc.llvmPackages.bintools;}
);
2024-11-06 13:40:30 -05:00
inherit (pkgsCross) wasi32;
2024-10-20 02:26:47 -04:00
wasiSysRoot = runCommand "wasi-sysroot" {} ''
mkdir -p "$out"/lib/wasm32-wasi
2024-11-06 13:40:30 -05:00
for lib in ${wasi32.llvmPackages.libcxx}/lib/*; do
2024-10-20 02:26:47 -04:00
ln -s "$lib" "$out"/lib/wasm32-wasi
done
'';
firefox-l10n = fetchFromGitHub {
owner = "mozilla-l10n";
repo = "firefox-l10n";
2024-11-06 13:40:30 -05:00
rev = "9d639cd79d6b73081fadb3474dd7d73b89732e7b";
hash = "sha256-+2JCaPp+c2BRM60xFCeY0pixIyo2a3rpTPaSt1kTfDw=";
2024-10-20 02:26:47 -04:00
};
in
2024-11-06 13:40:30 -05:00
buildStdenv.mkDerivation (finalAttrs: {
2024-10-20 02:26:47 -04:00
pname = "zen-browser-unwrapped";
2024-11-24 13:44:32 -05:00
version = "1.0.1-t.20";
2024-10-20 02:26:47 -04:00
src = fetchFromGitHub {
owner = "zen-browser";
repo = "desktop";
2024-11-24 13:44:32 -05:00
rev = "113a349b56e039a9a98e53a29f38b70c3a6a3ff6";
hash = "sha256-XBncRNX28hiq953yr7j6seD/HLluzmqbtTncE6fDa30=";
2024-10-20 02:26:47 -04:00
fetchSubmodules = true;
};
2024-11-06 13:40:30 -05:00
# DO NOT UPDATE THE FIREFOX VERSION MANUALLY!
#
# Both `firefoxVersion` and `firefoxSrc` are managed by the `update.sh` script.
# The Firefox version is specified by `zen-browser` in the `surfer.json` file.
#
# We need to manually set the version here to avoid IFD.
2024-11-24 13:44:32 -05:00
firefoxVersion = "132.0.2";
2024-10-20 02:26:47 -04:00
firefoxSrc = fetchurl {
2024-11-06 13:40:30 -05:00
url = "mirror://mozilla/firefox/releases/${finalAttrs.firefoxVersion}/source/firefox-${finalAttrs.firefoxVersion}.source.tar.xz";
2024-11-24 13:44:32 -05:00
hash = "sha256-Mp4XZPS04T8R3PH9ezxtj4DlEui37Vv2X75EdJwmEOk=";
2024-10-20 02:26:47 -04:00
};
SURFER_COMPAT = generic;
nativeBuildInputs =
[
autoconf
cargo
git
gnum4
llvmPackagesBuildBuild.bintools
makeWrapper
nasm
nodejs
pkg-config
python3
rsync
rust-cbindgen
rustPlatform.bindgenHook
rustc
surfer
unzip
wrapGAppsHook3
2024-11-06 13:40:30 -05:00
xorg.xvfb
2024-10-20 02:26:47 -04:00
]
++ lib.optionals crashreporterSupport [
dump_syms
patchelf
];
buildInputs =
[
atk
cairo
cups
dbus
dbus-glib
ffmpeg
fontconfig
freetype
gdk-pixbuf
gtk3
glib
icu73
libGL
libGLU
libevent
libffi
libglvnd
libjpeg
libnotify
libpng
libstartup_notification
libva
libvpx
libwebp
libxml2
mesa
nspr
nss_latest
pango
pciutils
pipewire
udev
xcb-util-cursor
xorg.libX11
xorg.libXcursor
xorg.libXdamage
xorg.libXext
xorg.libXft
xorg.libXi
xorg.libXrender
xorg.libXt
xorg.libXtst
xorg.pixman
xorg.xorgproto
xorg.libxcb
xorg.libXrandr
xorg.libXcomposite
xorg.libXfixes
xorg.libXScrnSaver
zlib
]
++ lib.optional alsaSupport alsa-lib
++ lib.optional jackSupport libjack2
++ lib.optional pulseaudioSupport libpulseaudio
++ lib.optional sndioSupport sndio
++ lib.optional gssSupport libkrb5
++ lib.optional jemallocSupport jemalloc
++ lib.optionals waylandSupport [
libdrm
libxkbcommon
];
configureFlags =
[
"--disable-bootstrap"
"--disable-updater"
"--enable-default-toolkit=cairo-gtk3${lib.optionalString waylandSupport "-wayland"}"
"--enable-system-pixman"
"--with-distribution-id=org.nixos"
"--with-libclang-path=${llvmPackagesBuildBuild.libclang.lib}/lib"
"--with-system-ffi"
"--with-system-icu"
"--with-system-jpeg"
"--with-system-libevent"
"--with-system-libvpx"
"--with-system-nspr"
"--with-system-nss"
"--with-system-png" # needs APNG support
"--with-system-webp"
"--with-system-zlib"
"--with-wasi-sysroot=${wasiSysRoot}"
"--host=${buildStdenv.buildPlatform.config}"
"--target=${buildStdenv.hostPlatform.config}"
]
++ [
(lib.enableFeature alsaSupport "alsa")
(lib.enableFeature ffmpegSupport "ffmpeg")
(lib.enableFeature geolocationSupport "necko-wifi")
(lib.enableFeature gssSupport "negotiateauth")
(lib.enableFeature jackSupport "jack")
(lib.enableFeature jemallocSupport "jemalloc")
(lib.enableFeature pulseaudioSupport "pulseaudio")
(lib.enableFeature sndioSupport "sndio")
(lib.enableFeature webrtcSupport "webrtc")
# --enable-release adds -ffunction-sections & LTO that require a big amount
# of RAM, and the 32-bit memory space cannot handle that linking
(lib.enableFeature (!debugBuild && !stdenv.hostPlatform.is32bit) "release")
(lib.enableFeature enableDebugSymbols "debug-symbols")
];
2024-11-06 13:40:30 -05:00
configureScript = writeShellScript "configureMozconfig" ''
for flag in $@; do
echo "ac_add_options $flag" >> mozconfig
done
'';
# To the person reading this wondering what is going on here, this is what
# happens when a build process relies on Git. Normally you would use `fetchgit`
# with `leaveDotGit = true`, however that leads to reproducibility issues, so
# instead we create our own Git repo with a single commit.
#
# `surfer` (the build tool made for zen-browser) uses git to read the latest
# HEAD commit, `git apply`, and likely a few other operations.
2024-10-20 02:26:47 -04:00
preConfigure = ''
export HOME="$TMPDIR"
git config --global user.email "nixbld@localhost"
git config --global user.name "nixbld"
2024-11-06 13:40:30 -05:00
# Initialize git repo and handle submodules properly
git init
git config --global init.defaultBranch main
# Force add all files including submodules
git add -A -f
# Initialize and update submodules if they exist
if [ -f .gitmodules ]; then
git submodule init
git submodule update --init --recursive
fi
# Commit all changes including submodule state
git commit -m 'nixpkgs' -a --allow-empty
export LLVM_PROFDATA=llvm-profdata
export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system
export WASM_CC=${wasi32.stdenv.cc}/bin/${wasi32.stdenv.cc.targetPrefix}cc
export WASM_CXX=${wasi32.stdenv.cc}/bin/${wasi32.stdenv.cc.targetPrefix}c++
export ZEN_RELEASE=1
surfer ci --brand alpha --display-version ${finalAttrs.version}
install -D ${finalAttrs.firefoxSrc} .surfer/engine/firefox-${finalAttrs.firefoxVersion}.source.tar.xz
2024-10-20 02:26:47 -04:00
surfer download
surfer import
patchShebangs engine/mach engine/build engine/tools
'';
preBuild = ''
cp -r ${firefox-l10n} l10n/firefox-l10n
2024-11-06 13:40:30 -05:00
2024-10-20 02:26:47 -04:00
for lang in $(cat ./l10n/supported-languages); do
rsync -av --progress l10n/firefox-l10n/"$lang"/ l10n/"$lang" --exclude .git
done
2024-11-06 13:40:30 -05:00
2024-10-20 02:26:47 -04:00
sh scripts/copy-language-pack.sh en-US
2024-11-06 13:40:30 -05:00
2024-10-20 02:26:47 -04:00
for lang in $(cat ./l10n/supported-languages); do
sh scripts/copy-language-pack.sh "$lang"
done
2024-11-06 13:40:30 -05:00
2024-10-20 02:26:47 -04:00
Xvfb :2 -screen 0 1024x768x24 &
export DISPLAY=:2
'';
buildPhase = ''
runHook preBuild
2024-11-06 13:40:30 -05:00
2024-10-20 02:26:47 -04:00
surfer build
2024-11-06 13:40:30 -05:00
2024-10-20 02:26:47 -04:00
runHook postBuild
'';
preInstall = ''
cd engine/obj-*
'';
meta = {
mainProgram = "zen";
description = "Firefox based browser with a focus on privacy and customization";
homepage = "https://www.zen-browser.app/";
license = lib.licenses.mpl20;
2024-11-06 13:40:30 -05:00
maintainers = with lib.maintainers; [
matthewpi
titaniumtown
];
platforms = ["x86_64-linux"];
2024-10-20 02:26:47 -04:00
};
enableParallelBuilding = true;
requiredSystemFeatures = ["big-parallel"];
passthru = {
2024-11-06 13:40:30 -05:00
updateScript = ./update.sh;
# These values are used by `wrapFirefox`.
# ref; `pkgs/applications/networking/browsers/firefox/wrapper.nix'
binaryName = finalAttrs.meta.mainProgram;
2024-10-20 02:26:47 -04:00
inherit alsaSupport;
inherit jackSupport;
inherit pipewireSupport;
inherit sndioSupport;
inherit nspr;
inherit ffmpegSupport;
inherit gssSupport;
inherit gtk3;
inherit wasiSysRoot;
};
2024-11-06 13:40:30 -05:00
})