From a16f93f8dad4b38f57026365aa5f79d284dcdfda Mon Sep 17 00:00:00 2001 From: Rachala Raj Date: Fri, 24 Jul 2026 11:35:38 +0530 Subject: [PATCH] brave, brave-origin: extract shared builder, init at 1.92.144 Introduce brave-origin variant and extract a shared builder for Brave. - brave: 1.92.144 - brave-origin: new, 1.92.144 Brave Origin is a stripped-down build that drops non-privacy extras (rewards, wallet, AI, etc.) while keeping Shields and the Chromium engine. The shared builder lives outside pkgs/by-name/ because by-name forbids cross-directory file references. Layout follows the firefox pattern. Co-authored-by: buckley310 --- maintainers/maintainer-list.nix | 7 ++ .../networking/browsers/brave/default.nix | 37 ++++++ .../networking/browsers}/brave/make-brave.nix | 113 ++++++++++++------ .../browsers/brave/packages/brave-origin.nix | 21 ++++ .../browsers/brave/packages/brave.nix | 20 ++++ .../networking/browsers/brave/update.sh | 100 ++++++++++++++++ pkgs/by-name/br/brave/package.nix | 35 ------ pkgs/by-name/br/brave/update.sh | 48 -------- pkgs/top-level/all-packages.nix | 3 + 9 files changed, 262 insertions(+), 122 deletions(-) create mode 100644 pkgs/applications/networking/browsers/brave/default.nix rename pkgs/{by-name/br => applications/networking/browsers}/brave/make-brave.nix (64%) create mode 100644 pkgs/applications/networking/browsers/brave/packages/brave-origin.nix create mode 100644 pkgs/applications/networking/browsers/brave/packages/brave.nix create mode 100755 pkgs/applications/networking/browsers/brave/update.sh delete mode 100644 pkgs/by-name/br/brave/package.nix delete mode 100755 pkgs/by-name/br/brave/update.sh diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index 9c17a6897e42..8a40997a702c 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -23308,6 +23308,13 @@ github = "DaRacci"; githubId = 90304606; }; + rachalaraj = { + name = "Rachala Raj Kumar"; + email = "rachaalaraj@gmail.com"; + matrix = "@rachalaraj:matrix.org"; + github = "rachalaraj"; + githubId = 124191100; + }; RadxaYuntian = { # This is the work account for @MakiseKurisu name = "ZHANG Yuntian"; diff --git a/pkgs/applications/networking/browsers/brave/default.nix b/pkgs/applications/networking/browsers/brave/default.nix new file mode 100644 index 000000000000..88b7f01cdbad --- /dev/null +++ b/pkgs/applications/networking/browsers/brave/default.nix @@ -0,0 +1,37 @@ +{ callPackage }: + +let + flavorData = { + browser = { + optStem = "brave"; + fileStem = "brave-browser"; + appIdStem = "com.brave.Browser"; + darwinStem = "Brave Browser"; + changelogFile = "CHANGELOG_DESKTOP.md"; + homepage = "https://brave.com/"; + innerBinary = "brave"; + }; + origin = { + optStem = "brave-origin"; + fileStem = "brave-origin"; + appIdStem = "com.brave.Origin"; + darwinStem = "Brave Origin"; + changelogFile = "CHANGELOG_DESKTOP_ORIGIN.md"; + homepage = "https://brave.com/origin/"; + innerBinary = "brave"; + }; + }; + + mkBrave = + release: + let + pkg = import release; + fd = flavorData.${pkg.flavor or "browser"}; + in + callPackage ./make-brave.nix { } (pkg // fd); + +in +{ + brave = mkBrave ./packages/brave.nix; + brave-origin = mkBrave ./packages/brave-origin.nix; +} diff --git a/pkgs/by-name/br/brave/make-brave.nix b/pkgs/applications/networking/browsers/brave/make-brave.nix similarity index 64% rename from pkgs/by-name/br/brave/make-brave.nix rename to pkgs/applications/networking/browsers/brave/make-brave.nix index fd018d50a3d5..f9e452195066 100644 --- a/pkgs/by-name/br/brave/make-brave.nix +++ b/pkgs/applications/networking/browsers/brave/make-brave.nix @@ -49,26 +49,20 @@ coreutils, libxcb, zlib, - # Darwin dependencies unzip, makeWrapper, - # command line arguments which are always set e.g "--disable-gpu" commandLineArgs ? "", - # Necessary for USB audio devices. pulseSupport ? stdenv.hostPlatform.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=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoEncoder) libvaSupport ? stdenv.hostPlatform.isLinux, libva, enableVideoAcceleration ? libvaSupport, - # For Vulkan support (--enable-features=Vulkan); disabled by default as it seems to break VA-API vulkanSupport ? false, addDriverRunpath, @@ -78,8 +72,22 @@ { pname, version, - hash, - url, + # Map from Nix system strings ("x86_64-linux", "aarch64-darwin", ...) to + # the corresponding upstream `{ url, hash }` record. Encoding the per-system + # sources as data rather than positional arguments lets channel-specific + # package.nix files drop platforms that upstream hasn't published yet. + archives, + # Upstream product flavor: "browser" (the regular Brave) or "origin" (the + # stripped-down Brave Origin). + flavor ? "browser", + # Flavor-specific paths supplied by the caller (default.nix). + optStem, + fileStem, + appIdStem, + darwinStem, + changelogFile, + homepage, + innerBinary, }: let @@ -94,6 +102,19 @@ let escapeShellArg ; + # /opt/brave.com// + optName = optStem; + # Basename used for .desktop, gnome-control-center xml and icon files. + fileBase = fileStem; + # Secondary .desktop app-id. + appId = appIdStem; + # Upstream shell wrapper inside /opt. + innerWrapper = fileStem; + # macOS .app bundle name (inside the zip). + darwinApp = darwinStem; + # Upstream Exec= target in .desktop files (replaced with our wrapper). + upstreamBin = "brave-${flavor}-stable"; + deps = [ alsa-lib at-spi2-atk @@ -156,13 +177,19 @@ let ] # disable automatic updates # The feature disable is needed for VAAPI to work correctly: https://github.com/brave/brave-browser/issues/20935 ++ optionals enableVideoAcceleration [ "UseChromeOSDirectVideoDecoder" ]; + + archive = + assert lib.assertMsg (builtins.hasAttr stdenv.hostPlatform.system archives) + "${pname} is not available for ${stdenv.hostPlatform.system}"; + archives.${stdenv.hostPlatform.system}; in stdenv.mkDerivation { inherit pname version; - src = fetchurl { - inherit url hash; - }; + __structuredAttrs = true; + strictDeps = true; + + src = fetchurl { inherit (archive) url hash; }; dontConfigure = true; dontBuild = true; @@ -201,27 +228,27 @@ stdenv.mkDerivation { cp -R usr/share $out cp -R opt/ $out/opt - export BINARYWRAPPER=$out/opt/brave.com/brave/brave-browser + export BINARYWRAPPER=$out/opt/brave.com/${optName}/${innerWrapper} # Fix path to bash in $BINARYWRAPPER substituteInPlace $BINARYWRAPPER \ --replace-fail /bin/bash ${stdenv.shell} \ --replace-fail 'CHROME_WRAPPER' 'WRAPPER' - ln -sf $BINARYWRAPPER $out/bin/brave + ln -sf $BINARYWRAPPER $out/bin/${pname} - for exe in $out/opt/brave.com/brave/{brave,chrome_crashpad_handler}; do + for exe in $out/opt/brave.com/${optName}/{${innerBinary},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,com.brave.Browser}.desktop \ - --replace-fail /usr/bin/brave-browser-stable $out/bin/brave - substituteInPlace $out/share/gnome-control-center/default-apps/brave-browser.xml \ + substituteInPlace $out/share/applications/{${fileBase},${appId}}.desktop \ + --replace-fail /usr/bin/${upstreamBin} $out/bin/${pname} + substituteInPlace $out/share/gnome-control-center/default-apps/${fileBase}.xml \ --replace-fail /opt/brave.com $out/opt/brave.com - substituteInPlace $out/opt/brave.com/brave/default-app-block \ + substituteInPlace $out/opt/brave.com/${optName}/default-app-block \ --replace-fail /opt/brave.com $out/opt/brave.com # Correct icons location @@ -229,13 +256,13 @@ stdenv.mkDerivation { 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 + mkdir -p $out/share/icons/hicolor/''${icon}x''${icon}/apps + ln -s $out/opt/brave.com/${optName}/product_logo_''${icon}.png $out/share/icons/hicolor/''${icon}x''${icon}/apps/${fileBase}.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 + ln -sf ${xdg-utils}/bin/xdg-settings $out/opt/brave.com/${optName}/xdg-settings + ln -sf ${xdg-utils}/bin/xdg-mime $out/opt/brave.com/${optName}/xdg-mime runHook postInstall '' @@ -244,9 +271,9 @@ stdenv.mkDerivation { mkdir -p $out/{Applications,bin} - cp -r . "$out/Applications/Brave Browser.app" + cp -r . "$out/Applications/${darwinApp}.app" - makeWrapper "$out/Applications/Brave Browser.app/Contents/MacOS/Brave Browser" $out/bin/brave + makeWrapper "$out/Applications/${darwinApp}.app/Contents/MacOS/${darwinApp}" $out/bin/${pname} runHook postInstall ''; @@ -279,22 +306,33 @@ stdenv.mkDerivation { installCheckPhase = '' # Bypass upstream wrapper which suppresses errors - $out/opt/brave.com/brave/brave --version + $out/opt/brave.com/${optName}/brave --version ''; passthru.updateScript = ./update.sh; meta = { - homepage = "https://brave.com/"; - description = "Privacy-oriented browser for Desktop and Laptop computers"; + homepage = homepage; + description = + "Privacy-oriented browser for Desktop and Laptop computers" + + lib.optionalString (flavor == "origin") " (Origin variant)"; changelog = - "https://github.com/brave/brave-browser/blob/master/CHANGELOG_DESKTOP.md#" + "https://github.com/brave/brave-browser/blob/master/${changelogFile}#" + 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. - ''; + longDescription = + if flavor == "origin" then + '' + Brave Origin is a stripped-down variant of the Brave browser that + removes most non-privacy features (rewards, wallet, AI, etc.) while + keeping the core privacy, adblock and Chromium-based browsing + experience. + '' + else + '' + 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; [ @@ -302,12 +340,9 @@ stdenv.mkDerivation { jefflabonte nasirhm buckley310 + rachalaraj ]; - platforms = [ - "aarch64-linux" - "x86_64-linux" - "aarch64-darwin" - ]; - mainProgram = "brave"; + platforms = builtins.attrNames archives; + mainProgram = if flavor == "origin" then "brave-origin" else "brave"; }; } diff --git a/pkgs/applications/networking/browsers/brave/packages/brave-origin.nix b/pkgs/applications/networking/browsers/brave/packages/brave-origin.nix new file mode 100644 index 000000000000..8af08a9f7eeb --- /dev/null +++ b/pkgs/applications/networking/browsers/brave/packages/brave-origin.nix @@ -0,0 +1,21 @@ +# Expression generated by update.sh; do not edit it by hand! +rec { + pname = "brave-origin"; + version = "1.92.144"; + flavor = "origin"; + + archives = { + aarch64-linux = { + url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-origin_${version}_arm64.deb"; + hash = "sha256-zqjpiBMogYhtuEhIlPlK8J2j9hzfd1M8RYlT/c74Na8="; + }; + x86_64-linux = { + url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-origin_${version}_amd64.deb"; + hash = "sha256-KF5WXF7GJPLCcEQyASEVfNrYyFJRXBSyWVPPAZPCa/E="; + }; + aarch64-darwin = { + url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-origin-v${version}-darwin-arm64.zip"; + hash = "sha256-kkP8cBRnC34+SjC9EvkpKcDYP3cxW7sdJgni0+zXwbk="; + }; + }; +} diff --git a/pkgs/applications/networking/browsers/brave/packages/brave.nix b/pkgs/applications/networking/browsers/brave/packages/brave.nix new file mode 100644 index 000000000000..c50a2fc89fcc --- /dev/null +++ b/pkgs/applications/networking/browsers/brave/packages/brave.nix @@ -0,0 +1,20 @@ +# Expression generated by update.sh; do not edit it by hand! +rec { + pname = "brave"; + version = "1.92.144"; + + archives = { + aarch64-linux = { + url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser_${version}_arm64.deb"; + hash = "sha256-Z9uUJRaMx+P35oXtvAnjHyOQOXt8mW5oyyEtnD754x8="; + }; + x86_64-linux = { + url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser_${version}_amd64.deb"; + hash = "sha256-no/KD+3EB6CqvVWEmDB/8k2rv1wau469FBXMNWN7z6k="; + }; + aarch64-darwin = { + url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-v${version}-darwin-arm64.zip"; + hash = "sha256-YidWCVGP36wn1goAulSbVrKFoHI1NA/pLtfPjIXBO48="; + }; + }; +} diff --git a/pkgs/applications/networking/browsers/brave/update.sh b/pkgs/applications/networking/browsers/brave/update.sh new file mode 100755 index 000000000000..dabc718a7429 --- /dev/null +++ b/pkgs/applications/networking/browsers/brave/update.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p curl nix jq +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" +VERSIONS_URL="https://versions.brave.com/latest/brave-versions.json" + +sri_hash() { + nix-hash --to-sri --type sha256 "$(nix-prefetch-url --type sha256 "$1")" +} + +find_release_with_asset() { + local versionsJson="$1" channel="$2" template="$3" + local match + match="$( + jq -c --arg channel "$channel" --arg tmpl "$template" ' + [.[] + | select(.channel == $channel) + | . as $r + | select( + $r.github.assets + | map(.name) + | any(. == ($tmpl | gsub("\\$\\{version\\}"; $r.name))) + ) + ] + | sort_by(.published) + | last + ' <<<"$versionsJson" + )" + if [[ "$match" != "null" ]]; then + printf '%s' "$match" + return 0 + fi + echo "update.sh: no ${channel} release with asset matching '${template}' found" >&2 + return 1 +} + +emit_archive_entry() { + local releaseJson="$1" version="$2" template="$3" platform="$4" + local name="${template//\$\{version\}/$version}" + local url + url="$( + jq -r --arg n "$name" ' + .github.assets[] + | select(.name == $n) + | .download_url + ' <<<"$releaseJson" + )" + if [[ -z "$url" ]]; then + return 0 + fi + local hash + hash="$(sri_hash "$url")" + local nixUrl="${url//${version}/\$\{version\}}" + cat < ${pname}: ${version}" >&2 + local flavorLine="" + if [[ "$pname" == brave-origin || "$pname" == brave-origin-* ]]; then + flavorLine=' flavor = "origin";' + fi + local outFile="${SCRIPT_DIR}/packages/${pname}.nix" + { + echo '# Expression generated by update.sh; do not edit it by hand!' + echo 'rec {' + echo " pname = \"${pname}\";" + echo " version = \"${version}\";" + [[ -n "$flavorLine" ]] && echo "$flavorLine" + echo '' + echo ' archives = {' + emit_archive_entry "$releaseJson" "$version" "${debStem}_\${version}_arm64.deb" "aarch64-linux" + emit_archive_entry "$releaseJson" "$version" "${debStem}_\${version}_amd64.deb" "x86_64-linux" + emit_archive_entry "$releaseJson" "$version" "${darwinStem}-v\${version}-darwin-arm64.zip" "aarch64-darwin" + echo ' };' + echo '}' + } > "$outFile" +} + +versionsJson="$(curl --fail -s "$VERSIONS_URL")" + +entries=( + "brave brave-browser brave" + "brave-origin brave-origin brave-origin" +) + +for entry in "${entries[@]}"; do + read -r pname debStem darwinStem <<<"$entry" + releaseJson="$(find_release_with_asset "$versionsJson" "release" "${debStem}_\${version}_amd64.deb")" + write_package_nix "$pname" "$releaseJson" "$debStem" "$darwinStem" +done diff --git a/pkgs/by-name/br/brave/package.nix b/pkgs/by-name/br/brave/package.nix deleted file mode 100644 index 2ef60eda0800..000000000000 --- a/pkgs/by-name/br/brave/package.nix +++ /dev/null @@ -1,35 +0,0 @@ -# Expression generated by update.sh; do not edit it by hand! -{ stdenv, callPackage, ... }@args: - -let - pname = "brave"; - version = "1.92.143"; - - allArchives = { - aarch64-linux = { - url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser_${version}_arm64.deb"; - hash = "sha256-IHBJm9uow2d/X4Z9e117aGdP1Y+3R1ApWu40sPtdbr8="; - }; - x86_64-linux = { - url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser_${version}_amd64.deb"; - hash = "sha256-jaxNneurduBiw3jho5Fp7gXnBfSpLB5hlE06i/JK+ic="; - }; - aarch64-darwin = { - url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-v${version}-darwin-arm64.zip"; - hash = "sha256-EvfZgO8FAijof1Ml6gqSOyRndL8KYFdT0MNmVmuxAnU="; - }; - }; - - archive = - if builtins.hasAttr stdenv.system allArchives then - allArchives.${stdenv.system} - else - throw "Unsupported platform."; - -in -callPackage ./make-brave.nix (removeAttrs args [ "callPackage" ]) ( - archive - // { - inherit pname version; - } -) diff --git a/pkgs/by-name/br/brave/update.sh b/pkgs/by-name/br/brave/update.sh deleted file mode 100755 index ccb7c9b826b0..000000000000 --- a/pkgs/by-name/br/brave/update.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env nix-shell -#!nix-shell -i bash -p curl gnused nix jq - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" - -latestVersion="$(curl --fail -s ${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} "https://api.github.com/repos/brave/brave-browser/releases/latest" | jq -r '.tag_name' | sed 's/^v//')" - -hashAarch64="$(nix-hash --to-sri --type sha256 "$(nix-prefetch-url --type sha256 "https://github.com/brave/brave-browser/releases/download/v${latestVersion}/brave-browser_${latestVersion}_arm64.deb")")" -hashAmd64="$(nix-hash --to-sri --type sha256 "$(nix-prefetch-url --type sha256 "https://github.com/brave/brave-browser/releases/download/v${latestVersion}/brave-browser_${latestVersion}_amd64.deb")")" -hashAarch64Darwin="$(nix-hash --to-sri --type sha256 "$(nix-prefetch-url --type sha256 "https://github.com/brave/brave-browser/releases/download/v${latestVersion}/brave-v${latestVersion}-darwin-arm64.zip")")" - -cat > $SCRIPT_DIR/package.nix << EOF -# Expression generated by update.sh; do not edit it by hand! -{ stdenv, callPackage, ... }@args: - -let - pname = "brave"; - version = "${latestVersion}"; - - allArchives = { - aarch64-linux = { - url = "https://github.com/brave/brave-browser/releases/download/v\${version}/brave-browser_\${version}_arm64.deb"; - hash = "${hashAarch64}"; - }; - x86_64-linux = { - url = "https://github.com/brave/brave-browser/releases/download/v\${version}/brave-browser_\${version}_amd64.deb"; - hash = "${hashAmd64}"; - }; - aarch64-darwin = { - url = "https://github.com/brave/brave-browser/releases/download/v\${version}/brave-v\${version}-darwin-arm64.zip"; - hash = "${hashAarch64Darwin}"; - }; - }; - - archive = - if builtins.hasAttr stdenv.system allArchives then - allArchives.\${stdenv.system} - else - throw "Unsupported platform."; - -in -callPackage ./make-brave.nix (removeAttrs args [ "callPackage" ]) ( - archive - // { - inherit pname version; - } -) -EOF diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index fbec0e3db462..2df4931b1f0e 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -8436,6 +8436,9 @@ with pkgs; bitwig-studio = bitwig-studio6; + brave = (callPackage ../applications/networking/browsers/brave { }).brave; + brave-origin = (callPackage ../applications/networking/browsers/brave { }).brave-origin; + breezy = with python3Packages; toPythonApplication breezy; # calico-felix and calico-node have not been packaged due to libbpf, linking issues