# Maintainer: Caleb Maclennana # Contributor: Caesar Woo # Contributor: Martin Rodriguez Reboredo # Contributor: Monarc # Contributor: Joan Figueras # Contributor: Jacek Szafarkiewicz # Contributor: Maxim Baz <$pkgname at maximbaz dot com> ## General Brave build info ## https://github.com/brave/brave-browser/blob/master/README.md#clone-and-initialize-the-repo ## The following variables can be customized at build time. Use env or export to change at your wish ## ## Example use: `USE_SCCACHE=1 COMPONENT=1 makepkg -sc` ## ## USE_SCCACHE variable ## sccache for faster builds - https://github.com/brave/brave-browser/wiki/sccache-for-faster-builds ## Valid numbers between: 0 and 1 ## Default is: 0 => not use sccache : "${USE_SCCACHE:=0}" ## ## COMPONENT variable ## 0 -> build normal (with debug symbols) ## 1 -> release (default) ## 2 -> static ## 3 -> debug ## 4 -> release with custom cflags and system libs : "${COMPONENT:=4}" pkgname=brave pkgver=1.52.129 pkgrel=1 pkgdesc='Web browser that blocks ads and trackers by default' arch=(x86_64) url='https://www.brave.com/download' license=(BSD MPL custom:chromium) depends=('gtk3' 'nss' 'alsa-lib' 'xdg-utils' 'libxss' 'libcups' 'libgcrypt' 'ttf-liberation' 'systemd' 'dbus' 'libpulse' 'pciutils' 'libva' 'libffi' 'desktop-file-utils' 'hicolor-icon-theme') makedepends=('python' 'gn' 'ninja' 'clang' 'lld' 'gperf' 'nodejs' 'pipewire' 'qt5-base' 'java-runtime-headless' 'git' 'cargo-audit' 'cbindgen' 'cxxbridge' 'jq' 'llvm' 'npm') optdepends=('pipewire: WebRTC desktop sharing under Wayland' 'kdialog: support for native dialogs in Plasma' 'qt5-base: enable Qt5 with --enable-features=AllowQt' 'org.freedesktop.secrets: password storage backend on GNOME / Xfce' 'kwallet: support for storing passwords in KWallet on Plasma') options=('!lto') # Chromium adds its own flags for ThinLTO _chromium_ver=114.0.5735.198 _launcher_ver=8 source=("brave-browser::git+https://github.com/brave/brave-browser.git#tag=v$pkgver" "brave::git+https://github.com/brave/brave-core.git#tag=v$pkgver" "chromium-mirror::git+https://github.com/chromium/chromium.git#tag=$_chromium_ver" 'depot_tools::git+https://chromium.googlesource.com/chromium/tools/depot_tools.git' "https://github.com/foutrelis/chromium-launcher/archive/refs/tags/v$_launcher_ver/chromium-launcher-$_launcher_ver.tar.gz" chromium-launcher-electron-app.patch chromium-launcher-vendor.patch system-rust-utils.patch 0001-Fix-Rust-linking-on-component-and-debug-Windows-builds.patch 0002-Remove-the-prebuilt-toolchain-from-the-Android-team.patch brave-1.19-BUILD.gn.patch brave-1.43-bitcoin-core_remove-serialize.h.patch brave-1.43-debounce-debounce_navigation_throttle_fix.patch brave-1.43-ntp_background_images-std-size_t.patch brave-1.48-partitioned_host_state_map-cstring.patch brave-1.52-bat-native-ads-fix-cmath.patch brave-1.52-bitints-libstdcxx-bypass.patch brave-1.52-missing-includes.patch brave-1.52-playlist-user-agent-only-constructor.patch) _arch_revision=fa08adba87b6222bdf9ba31aaa41579e634ec444 _patches=(add-some-typename-s-that-are-required-in-C-17.patch REVERT-disable-autoupgrading-debug-info.patch download-bubble-typename.patch webauthn-variant.patch random-fixes-for-gcc13.patch disable-GlobalMediaControlsCastStartStop.patch use-oauth2-client-switches-as-default.patch) for _patch in "${_patches[@]}"; do source+=("https://gitlab.archlinux.org/archlinux/packaging/packages/chromium/-/raw/$_arch_revision/$_patch") done sha256sums=('SKIP' 'SKIP' 'SKIP' 'SKIP' '213e50f48b67feb4441078d50b0fd431df34323be15be97c55302d3fdac4483a' '9235485adc4acbfaf303605f4428a6995a7b0b3b5a95181b185afbcb9f1f6ae5' '404bf09df39310a1e374c5e7eb9c7311239798adf4e8cd85b7ff04fc79647f88' 'dcaf12a8b2ba15cefafd6e3c053b2ec490b1b8e1c89a3309e41133c0cd183ed3' 'dfb5ca39abe7dd449729d3af3724fe27208d8cda76ecc4916cc57a4ad9c8e1b1' '01a809e8bf7eeed6e263bc7118d6e40395dca7ac8463dbe230303e13d17d673e' '12a3d37ffca4c0fa25f89f02efdf79d24f6412ee29ec35e8a00f9086dba4e822' '984bb0257ed6fe4af543c3fb803ed81bddc97ff367ccd93620404be60cb78eb3' '30a6a9ca2a6dd965cb2d9f02639079130948bf45d483f0c629f2cf8394a1c22f' 'ea0cd714ccaa839baf7c71e9077264016aa19415600f16b77d5398fd49f5a70b' '3864fcb12aaec849fd0e5423c9c5dfb1fdd7805e298a52125776bb24abe71e3c' '9a0c3d05aaa20812da8ee1fcb10c55a3df92f0c8248c3d2cbe4906d94dd48e49' 'f781d6315e4147b775350d7a36481c3ce43b582eee5ee228768e42c30d9dd9ca' '1654fa922d10a591d5c28159a6d22d1183bcbd3448f175d7f3e2e11879588ddd' '7cf8569ff905666889842c36e82d51c08d482745cd2f71e48fa1296824f09839' '621ed210d75d0e846192c1571bb30db988721224a41572c27769c0288d361c11' '1b782b0f6d4f645e4e0daa8a4852d63f0c972aa0473319216ff04613a0592a69' 'd464eed4be4e9bf6187b4c40a759c523b7befefa25ba34ad6401b2a07649ca2a' '590fabbb26270947cb477378b53a9dcd17855739076b4af9983e1e54dfcab6d7' 'ba4dd0a25a4fc3267ed19ccb39f28b28176ca3f97f53a4e9f5e9215280040ea0' '7f3b1b22d6a271431c1f9fc92b6eb49c6d80b8b3f868bdee07a6a1a16630a302' 'e393174d7695d0bafed69e868c5fbfecf07aa6969f3b64596d0bae8b067e1711') # Possible replacements are listed in build/linux/unbundle/replace_gn_files.py # Keys are the names in the above script; values are the dependencies in Arch declare -gA _system_libs=( [brotli]=brotli [dav1d]=dav1d [ffmpeg]=ffmpeg [flac]=flac [fontconfig]=fontconfig [freetype]=freetype2 [harfbuzz-ng]=harfbuzz [icu]=icu [jsoncpp]=jsoncpp #[libaom]=aom # https://aomedia.googlesource.com/aom/+/706ee36dcc82 #[libavif]=libavif # https://github.com/AOMediaCodec/libavif/commit/4d2776a3 [libdrm]= [libjpeg]=libjpeg [libpng]=libpng #[libvpx]=libvpx [libwebp]=libwebp [libxml]=libxml2 [libxslt]=libxslt [opus]=opus [re2]=re2 [snappy]=snappy [woff2]=woff2 [zlib]=minizip ) _unwanted_bundled_libs=( "$(printf "%s\n" ${!_system_libs[@]} | sed 's/^libjpeg$/&_turbo/')" ) depends+=(${_system_libs[@]}) prepare() { cd chromium-launcher-$_launcher_ver patch -Np1 -i ../chromium-launcher-electron-app.patch patch -Np1 -i ../chromium-launcher-vendor.patch cd ../depot_tools echo > python3_bin_reldir.txt ln -sf /usr/bin/python3 python3 cd ../brave-browser export DEPOT_TOOLS_UPDATE=0 export PATH="${PATH}:${srcdir:?}/depot_tools" echo "Prepare the environment..." npm install cp -r ../brave src cp -r ../depot_tools src/brave/vendor cd src/brave || exit if [ "$COMPONENT" = "4" ]; then patch -Np1 -i "${srcdir}/system-rust-utils.patch" fi jq ".config.projects.chrome.repository.url = \"file://${srcdir}/chromium-mirror@${_chromium_ver}\"" package.json > tmp.json mv {tmp,package}.json npm install cd ../.. echo "Running \"npm run\"" if [ -d src/out/Release ]; then npm run sync -- --force --nohooks else npm run init -- --nohooks fi echo "Running hooks..." # python "${srcdir}/depot_tools/gclient.py" runhooks src/build/landmines.py src/build/util/lastchange.py -o src/build/util/LASTCHANGE src/build/util/lastchange.py -m GPU_LISTS_VERSION \ --revision-id-only --header src/gpu/config/gpu_lists_version.h src/build/util/lastchange.py -m SKIA_COMMIT_HASH \ -s src/third_party/skia --header src/skia/ext/skia_commit_hash.h src/build/util/lastchange.py -s src/third_party/dawn \ --revision src/gpu/webgpu/DAWN_VERSION # Create sysmlink to system clang-format ln -sf /usr/bin/clang-format src/buildtools/linux64 # Create sysmlink to system Node.js mkdir -p src/third_party/node/linux/node-linux-x64/bin ln -sf /usr/bin/node src/third_party/node/linux/node-linux-x64/bin src/third_party/depot_tools/download_from_google_storage.py \ --no_resume --extract --no_auth --bucket chromium-nodejs \ -s src/third_party/node/node_modules.tar.gz.sha1 python src/tools/download_optimization_profile.py \ --newest_state=src/chrome/android/profiles/newest.txt \ --local_state=src/chrome/android/profiles/local.txt \ --output_name=src/chrome/android/profiles/afdo.prof \ --gs_url_base=chromeos-prebuilt/afdo-job/llvm mkdir -p src/third_party/jdk/current/bin ln -sf /usr/bin/java src/third_party/jdk/current/bin # Brave specific hooks cd src/brave # python script/bootstrap.py npm install --no-save --yes python script/web_discovery_project.py --install python script/generate_licenses.py cd ../.. echo "Apply Chromium patches..." cd src # https://crbug.com/893950 sed -i -e 's/\/malloc/' -e 's/\/free/' \ third_party/blink/renderer/core/xml/*.cc \ third_party/blink/renderer/core/xml/parser/xml_document_parser.cc \ third_party/libxml/chromium/*.cc \ third_party/maldoca/src/maldoca/ole/oss_utils.h # Use the --oauth2-client-id= and --oauth2-client-secret= switches for # setting GOOGLE_DEFAULT_CLIENT_ID and GOOGLE_DEFAULT_CLIENT_SECRET at # runtime -- this allows signing into Chromium without baked-in values patch -Np1 -i "${srcdir}/use-oauth2-client-switches-as-default.patch" # Upstream fixes patch -Np1 -i "${srcdir}/add-some-typename-s-that-are-required-in-C-17.patch" # Revert addition of compiler flag that needs newer clang patch -Rp1 -i "${srcdir}/REVERT-disable-autoupgrading-debug-info.patch" # Disable kGlobalMediaControlsCastStartStop by default # https://crbug.com/1314342 patch -Np1 -i "${srcdir}/disable-GlobalMediaControlsCastStartStop.patch" # Build fixes patch -Np1 -i "${srcdir}/download-bubble-typename.patch" patch -Np1 -i "${srcdir}/webauthn-variant.patch" patch -Np1 -i "${srcdir}/random-fixes-for-gcc13.patch" # Rust fixes patch -Np1 -i "${srcdir}/0001-Fix-Rust-linking-on-component-and-debug-Windows-builds.patch" patch -Np1 -i "${srcdir}/0002-Remove-the-prebuilt-toolchain-from-the-Android-team.patch" # Hacky patching sed -e 's/\(enable_distro_version_check =\) true/\1 false/g' -i chrome/installer/linux/BUILD.gn # Allow building against system libraries in official builds if [ "$COMPONENT" = "4" ]; then sed -i 's/OFFICIAL_BUILD/GOOGLE_CHROME_BUILD/' \ tools/generate_shim_headers/generate_shim_headers.py echo "Add patches for Brave custom build" for _patch in "$srcdir/brave"*.patch; do patch -Np1 -i "$_patch" done # Remove bundled libraries for which we will use the system copies; this # *should* do what the remove_bundled_libraries.py script does, with the # added benefit of not having to list all the remaining libraries and # preserving their git directories local _lib for _lib in ${_unwanted_bundled_libs[@]}; do find "third_party/$_lib" -type f \ \! -path "third_party/$_lib/chromium/*" \ \! -path "third_party/$_lib/google/*" \ \! -path "third_party/harfbuzz-ng/utils/hb_scoped.h" \ \! -regex '.*\.\(git.*\|gn\|gni\|isolate\)' \ -delete done ./build/linux/unbundle/replace_gn_files.py \ --system-libraries "${!_system_libs[@]}" fi } build() { make CHROMIUM_APP=Brave CHROMIUM_NAME=brave -C chromium-launcher-$_launcher_ver cd "brave-browser" if check_buildoption ccache y; then # Avoid falling back to preprocessor mode when sources contain time macros export CCACHE_SLOPPINESS=time_macros fi export PATH="${PATH}:${srcdir:?}/brave-browser/src/brave/vendor/depot_tools" export CC=clang export CXX=clang++ export AR=llvm-ar export NM=llvm-nm if [ "$USE_SCCACHE" -eq "1" ]; then echo "sccache = /usr/bin/sccache" >> .npmrc fi # TODO: Upstream re-distribute permissions, see https://community.brave.com/t/does-brave-allow-the-distribution-of-self-compiled-or-distro-compiled-binaries echo "brave_services_key = qjVKcxtUybh8WpKNoQ7EbgbkJTMu7omjDHKk=VrPApb8PwJyPE9eqchxedTsMEWg" > .npmrc echo "brave_variations_server_url = https://variations.brave.com/seed" >> .npmrc echo "brave_stats_updater_url = https://laptop-updates.brave.com" >> .npmrc echo "brave_stats_api_key = fe033168-0ff8-4af6-9a7f-95e2cbfc9f4f" >> .npmrc echo "brave_sync_endpoint = https://sync-v2.brave.com/v2" >> .npmrc echo "updater_dev_endpoint = https://go-updater-dev.bravesoftware.com/extensions" >> .npmrc echo "updater_prod_endpoint = https://go-updater.brave.com/extensions" >> .npmrc echo "rewards_grant_dev_endpoint = https://grant.rewards.brave.com" >> .npmrc echo "rewards_grant_staging_endpoint = https://grant.rewards.brave.com" >> .npmrc echo "rewards_grant_prod_endpoint = https://grant.rewards.brave.com" >> .npmrc echo "uphold_client_id = 6d8d9473ed20be627f71ed46e207f40c004c5b1a" >> .npmrc echo "uphold_client_secret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" >> .npmrc echo "uphold_staging_client_id = 4c2b665ca060d912fec5c735c734859a06118cc8" >> .npmrc echo "uphold_staging_client_secret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" >> .npmrc echo "gemini_api_url = https://api.gemini.com/v1" >> .npmrc echo "gemini_oauth_url = https://api.gemini.com/v1/oauth" >> .npmrc echo "gemini_wallet_client_id = 6d8d9473ed20be627f71ed46e207f40c004c5b1a" >> .npmrc echo "gemini_wallet_client_secret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" >> .npmrc echo "sardine_client_id = 7ca8433c-7e61-4e25-b76e-25aa2da68df1" >> .npmrc echo "sardine_client_secret = 7ca8433c-7e61-4e25-b76e-25aa2da68df1" >> .npmrc echo "brave_zero_ex_api_key = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" >> .npmrc echo "p3a_json_upload_url = https://example.com" >> .npmrc echo "p3a_creative_upload_url = https://example.com" >> .npmrc echo "p3a_constellation_upload_url = https://example.com" >> .npmrc echo "p2a_json_upload_url = https://example.com" >> .npmrc echo "star_randomness_host = https://example.com" >> .npmrc npm_args=() if [ "$COMPONENT" = "4" ]; then local _rustc_version="$(rustc -V)" local _flags=( 'custom_toolchain="//build/toolchain/linux/unbundle:default"' 'host_toolchain="//build/toolchain/linux/unbundle:default"' 'clang_base_path="/usr"' 'clang_use_chrome_plugins=false' 'rust_sysroot_absolute="/usr"' 'rustup_home="/usr"' 'symbol_level=0' # sufficient for backtraces on x86(_64) 'chrome_pgo_phase=0' # needs newer clang to read the bundled PGO profile 'treat_warnings_as_errors=false' 'disable_fieldtrial_testing_config=true' 'blink_enable_generated_code_formatting=false' 'ffmpeg_branding="Chrome"' 'proprietary_codecs=true' 'rtc_use_pipewire=true' 'link_pulseaudio=true' 'use_gnome_keyring=false' 'use_sysroot=false' 'use_system_libffi=true' 'use_custom_libcxx=false' 'enable_hangout_services_extension=true' 'enable_widevine=true' 'enable_nacl=false' ) if [[ -n ${_system_libs[icu]+set} ]]; then _flags+=('icu_use_data_file=false') fi # This specific tool requires to be built outside of an official build printf "%s\n" "${_flags[@]}" "rustc_version=\"$_rustc_version\"" >> src/brave/tools/redirect_cc/args.gni _flags+=('is_official_build=true') # implies is_cfi=true on x86_64 # Facilitate deterministic builds (taken from build/config/compiler/BUILD.gn) CFLAGS+=' -Wno-builtin-macro-redefined' CXXFLAGS+=' -Wno-builtin-macro-redefined' CPPFLAGS+=' -D__DATE__= -D__TIME__= -D__TIMESTAMP__=' # Do not warn about unknown warning options CFLAGS+=' -Wno-unknown-warning-option' CXXFLAGS+=' -Wno-unknown-warning-option' npm_args+=( "--gn=rustc_version:\"$_rustc_version\"" $(printf "%s\n" "${_flags[@]}" | sed -e 's/=/:/' -e 's/^/--gn=/') ) fi # Let Chromium set its own symbol level CFLAGS=${CFLAGS/-g } CXXFLAGS=${CXXFLAGS/-g } # https://github.com/ungoogled-software/ungoogled-chromium-archlinux/issues/123 CFLAGS=${CFLAGS/-fexceptions} CFLAGS=${CFLAGS/-fcf-protection} CXXFLAGS=${CXXFLAGS/-fexceptions} CXXFLAGS=${CXXFLAGS/-fcf-protection} # This appears to cause random segfaults when combined with ThinLTO # https://bugs.archlinux.org/task/73518 CFLAGS=${CFLAGS/-fstack-clash-protection} CXXFLAGS=${CXXFLAGS/-fstack-clash-protection} # https://crbug.com/957519#c122 CXXFLAGS=${CXXFLAGS/-Wp,-D_GLIBCXX_ASSERTIONS} ## See explanation on top to select your build local _build_type case $COMPONENT in 0) echo "Normal build (with debug)" ;; 2) echo "Static build" _build_type=Static ;; 3) echo "Debug build" _build_type=Debug ;; 4) echo "Release custom build" _build_type=Release ;; 1|*) echo "Release build" _build_type=Release ;; esac npm run build ${_build_type} -- "${npm_args[@]}" npm run build ${_build_type} -- --target chrome_sandbox "${npm_args[@]}" npm run build ${_build_type} -- --target chromedriver.unstripped "${npm_args[@]}" } package() { cd chromium-launcher-$_launcher_ver make PREFIX=/usr DESTDIR="$pkgdir" CHROMIUM_NAME=brave install install -Dm644 LICENSE \ "$pkgdir/usr/share/licenses/$pkgname/LICENSE.launcher" install -dm755 "$pkgdir/usr/lib/$pkgname/"{,locales,resources} # Copy necessary release files cd ../brave-browser/src install -Dm755 out/Release/$pkgname "$pkgdir/usr/lib/$pkgname/$pkgname" install -Dm755 out/Release/chromedriver.unstripped "$pkgdir/usr/bin/bravedriver" install -Dm4755 out/Release/chrome_sandbox "$pkgdir/usr/lib/$pkgname/chrome-sandbox" ln -s $pkgname "$pkgdir/usr/bin/$pkgname-browser" ln -s $pkgname "$pkgdir/usr/lib/$pkgname/$pkgname-browser" install -Dm644 chrome/installer/linux/common/desktop.template \ "$pkgdir/usr/share/applications/$pkgname-browser.desktop" sed -i \ -e 's/@@MENUNAME@@/Brave/g' \ -e 's/@@PACKAGE@@/brave/g' \ -e 's/@@USR_BIN_SYMLINK_NAME@@/brave/g' \ "$pkgdir/usr/share/applications/$pkgname-browser.desktop" install -Dm644 chrome/installer/linux/common/chromium-browser/chromium-browser.appdata.xml \ "$pkgdir/usr/share/metainfo/$pkgname-browser.appdata.xml" sed -ni \ -e 's/chromium-browser\.desktop/brave-browser.desktop/' \ -e '//d' \ -e '/

/N;/

\n.*\(We invite\|Chromium supports Vorbis\)/,/<\/p>/d' \ -e '/^