diff --git a/default.nix b/default.nix index b92b2e2..3b372e8 100644 --- a/default.nix +++ b/default.nix @@ -16,6 +16,7 @@ zju-connect = pkgs.callPackage ./pkgs/zju-connect { }; wpsoffice-cn = pkgs.libsForQt5.callPackage ./pkgs/wpsoffice-cn { }; + brave-browser-gtk4-12-5 = pkgs.callPackage ./pkgs/brave-browser { }; # some-qt5-package = pkgs.libsForQt5.callPackage ./pkgs/some-qt5-package { }; # ... } diff --git a/pkgs/brave-browser/default.nix b/pkgs/brave-browser/default.nix new file mode 100644 index 0000000..2f105db --- /dev/null +++ b/pkgs/brave-browser/default.nix @@ -0,0 +1,24 @@ +# Expression generated by update.sh; do not edit it by hand! +{ stdenv, callPackage, ... }@args: + +callPackage ./make-brave.nix (removeAttrs args [ "callPackage" ]) + ( + if stdenv.isAarch64 then + { + pname = "brave"; + version = "1.65.126"; + url = "https://github.com/brave/brave-browser/releases/download/v1.65.126/brave-browser_1.65.126_arm64.deb"; + hash = "sha256-v2PbixM9g+AhvR6tJ9QDbaXF7ERlBBrNMIsLofFbAfU="; + platform = "aarch64-linux"; + } + else if stdenv.isx86_64 then + { + pname = "brave"; + version = "1.65.126"; + url = "https://github.com/brave/brave-browser/releases/download/v1.65.126/brave-browser_1.65.126_amd64.deb"; + hash = "sha256-DbdwCu9LwCeoH46egVY4AsOxcJDWilD2MdpyNdyJizw="; + platform = "x86_64-linux"; + } + else + throw "Unsupported platform." + ) diff --git a/pkgs/brave-browser/make-brave.nix b/pkgs/brave-browser/make-brave.nix new file mode 100644 index 0000000..380dc30 --- /dev/null +++ b/pkgs/brave-browser/make-brave.nix @@ -0,0 +1,226 @@ +{ lib, stdenv, fetchurl, wrapGAppsHook4, makeWrapper +, alsa-lib +, at-spi2-atk +, at-spi2-core +, atk +, cairo +, cups +, dbus +, dpkg +, expat +, fontconfig +, freetype +, gdk-pixbuf +, glib +, gnome +, gsettings-desktop-schemas +, gtk3 +, gtk4 +, libX11 +, libXScrnSaver +, libXcomposite +, libXcursor +, libXdamage +, libXext +, libXfixes +, libXi +, libXrandr +, libXrender +, libXtst +, libdrm +, libkrb5 +, libuuid +, libxkbcommon +, libxshmfence +, mesa +, nspr +, nss +, pango +, pipewire +, snappy +, udev +, wayland +, xdg-utils +, coreutils +, xorg +, zlib + +# command line arguments which are always set e.g "--disable-gpu" +, commandLineArgs ? "" + +# Necessary for USB audio devices. +, pulseSupport ? stdenv.isLinux +, libpulseaudio + +# For GPU acceleration support on Wayland (without the lib it doesn't seem to work) +, libGL + +# For video acceleration via VA-API (--enable-features=VaapiVideoDecoder,VaapiVideoEncoder) +, libvaSupport ? stdenv.isLinux +, libva +, enableVideoAcceleration ? libvaSupport + +# For Vulkan support (--enable-features=Vulkan); disabled by default as it seems to break VA-API +, vulkanSupport ? false +, addOpenGLRunpath +, enableVulkan ? vulkanSupport +}: + +{ pname +, version +, hash +, url +, platform +}: + +let + inherit (lib) optional optionals makeLibraryPath makeSearchPathOutput makeBinPath + optionalString strings escapeShellArg; + + gtk-4-12-5 = gtk4.overrideAttrs (final: prev : rec { + version = "4.12.5"; + src = fetchurl { + url = "mirror://gnome/sources/gtk/${lib.versions.majorMinor final.version}/gtk-${final.version}.tar.xz"; + hash = "sha256-KLNW1ZDuaO9ibi75ggst0hRBSEqaBCpaPwxA6d/E9Pg="; + }; + }); + + deps = [ + alsa-lib at-spi2-atk at-spi2-core atk cairo cups dbus expat + fontconfig freetype gdk-pixbuf glib gtk3 gtk-4-12-5 libdrm libX11 libGL + libxkbcommon libXScrnSaver libXcomposite libXcursor libXdamage + libXext libXfixes libXi libXrandr libXrender libxshmfence + libXtst libuuid mesa nspr nss pango pipewire udev wayland + xorg.libxcb zlib snappy libkrb5 + ] + ++ optional pulseSupport libpulseaudio + ++ optional libvaSupport libva; + + rpath = makeLibraryPath deps + ":" + makeSearchPathOutput "lib" "lib64" deps; + binpath = makeBinPath deps; + + enableFeatures = optionals enableVideoAcceleration [ "VaapiVideoDecoder" "VaapiVideoEncoder" ] + ++ optional enableVulkan "Vulkan"; + + disableFeatures = [ "OutdatedBuildDetector" ] # disable automatic updates + # The feature disable is needed for VAAPI to work correctly: https://github.com/brave/brave-browser/issues/20935 + ++ optionals enableVideoAcceleration [ "UseChromeOSDirectVideoDecoder" ]; +in +stdenv.mkDerivation { + inherit pname version; + + src = fetchurl { + inherit url hash; + }; + + dontConfigure = true; + dontBuild = true; + dontPatchELF = true; + doInstallCheck = true; + + nativeBuildInputs = [ + dpkg + (wrapGAppsHook4.override { inherit makeWrapper; }) + ]; + + buildInputs = [ + # needed for GSETTINGS_SCHEMAS_PATH + glib gsettings-desktop-schemas gtk3 gtk-4-12-5 + + # needed for XDG_ICON_DIRS + gnome.adwaita-icon-theme + ]; + + unpackPhase = "dpkg-deb --fsys-tarfile $src | tar -x --no-same-permissions --no-same-owner"; + + installPhase = '' + runHook preInstall + + mkdir -p $out $out/bin + + cp -R usr/share $out + cp -R opt/ $out/opt + + export BINARYWRAPPER=$out/opt/brave.com/brave/brave-browser + + # Fix path to bash in $BINARYWRAPPER + substituteInPlace $BINARYWRAPPER \ + --replace /bin/bash ${stdenv.shell} + + ln -sf $BINARYWRAPPER $out/bin/brave + + for exe in $out/opt/brave.com/brave/{brave,chrome_crashpad_handler}; do + patchelf \ + --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \ + --set-rpath "${rpath}" $exe + done + + # Fix paths + substituteInPlace $out/share/applications/brave-browser.desktop \ + --replace /usr/bin/brave-browser-stable $out/bin/brave + substituteInPlace $out/share/gnome-control-center/default-apps/brave-browser.xml \ + --replace /opt/brave.com $out/opt/brave.com + substituteInPlace $out/share/menu/brave-browser.menu \ + --replace /opt/brave.com $out/opt/brave.com + substituteInPlace $out/opt/brave.com/brave/default-app-block \ + --replace /opt/brave.com $out/opt/brave.com + + # Correct icons location + icon_sizes=("16" "24" "32" "48" "64" "128" "256") + + for icon in ''${icon_sizes[*]} + do + mkdir -p $out/share/icons/hicolor/$icon\x$icon/apps + ln -s $out/opt/brave.com/brave/product_logo_$icon.png $out/share/icons/hicolor/$icon\x$icon/apps/brave-browser.png + done + + # Replace xdg-settings and xdg-mime + ln -sf ${xdg-utils}/bin/xdg-settings $out/opt/brave.com/brave/xdg-settings + ln -sf ${xdg-utils}/bin/xdg-mime $out/opt/brave.com/brave/xdg-mime + + runHook postInstall + ''; + + preFixup = '' + # Add command line args to wrapGApp. + gappsWrapperArgs+=( + --prefix LD_LIBRARY_PATH : ${rpath} + --prefix PATH : ${binpath} + --suffix PATH : ${lib.makeBinPath [ xdg-utils coreutils ]} + ${optionalString (enableFeatures != []) '' + --add-flags "--enable-features=${strings.concatStringsSep "," enableFeatures}\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+,WaylandWindowDecorations}}" + ''} + ${optionalString (disableFeatures != []) '' + --add-flags "--disable-features=${strings.concatStringsSep "," disableFeatures}" + ''} + --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto}}" + ${optionalString vulkanSupport '' + --prefix XDG_DATA_DIRS : "${addOpenGLRunpath.driverLink}/share" + ''} + --add-flags ${escapeShellArg commandLineArgs} + ) + ''; + + installCheckPhase = '' + # Bypass upstream wrapper which suppresses errors + $out/opt/brave.com/brave/brave --version + ''; + + passthru.updateScript = ./update.sh; + + meta = { + homepage = "https://brave.com/"; + description = "Privacy-oriented browser for Desktop and Laptop computers"; + changelog = "https://github.com/brave/brave-browser/blob/master/CHANGELOG_DESKTOP.md#" + lib.replaceStrings [ "." ] [ "" ] version; + longDescription = '' + Brave browser blocks the ads and trackers that slow you down, + chew up your bandwidth, and invade your privacy. Brave lets you + contribute to your favorite creators automatically. + ''; + sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; + license = lib.licenses.mpl20; + maintainers = with lib.maintainers; [ uskudnik rht jefflabonte nasirhm buckley310 ]; + platforms = [ "aarch64-linux" "x86_64-linux" ]; + mainProgram = "brave"; + }; +}