File Vulpes.spec of Package Vulpes
#
# spec file for package Vulpes
#
# Copyright (c) 2024 SUSE LLC
# Copyright (c) 2006-2025 Wolfgang Rosenauer <wr@rosenauer.org>
# Copyright (c) 2021-2025 zzndb001 <zzndb001@gmail.com>
# Copyright (c) 2024, 2025 Boian Berberov
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
### BEGIN Conditional Build Options ###
%bcond_with ccache
%bcond_without clang_build
%bcond_with lto_cond
%global lto_parallelism 1
%bcond_with pgo_cond
### END Conditional Build Options ###
### BEGIN Build Configuration ###
%if 0%{?fedora}
# error: Empty %%files file ... debugsourcefiles.list
%global debug_package %{nil}
%endif
# Handle executables or shared libraries containing more than COUNT debugging
# information entries in their .debug_info section using a slower and more
# memory usage friendly mode and don’t attempt to optimize that object in
# multifile mode. The default is 10 million DIEs. There is a risk that for
# very large amounts of debugging information in a single shared library or
# executable there might not be enough memory (especially when dwz tool is
# 32‐bit binary, it might run out of available virtual address space even
# sooner). Specifying none as argument disables the limit.
# OBS Default: _dwz_low_mem_die_limit 10000000
# , ,
%global _dwz_low_mem_die_limit 40000000
# Don’t attempt to optimize executables or shared libraries containing more
# than COUNT DIEs at all. The default is 50 million DIEs. Specifying `none`
# as argument disables the limit.
# OBS Default: _dwz_max_die_limit 50000000
# , ,
%global _dwz_max_die_limit 200000000
# Firefox only supports i686 with SSE2
# i586 is for OBS
%ifarch %ix86
ExclusiveArch: i586 i686 pentium4
BuildArch: i686
%{expand:%%global optflags %(echo "%optflags" | sed -e s/i586/i686/) -march=i686 -mtune=generic -msse2 -mfpmath=sse}
%endif
# LTO FLAGS
%if 0%{with lto_cond}
%{expand:%%global optflags $(echo "%optflags" | sed -e s/-flto=[[:alnum:]]*//) -flto=%{lto_parallelism} }
%else
%{expand:%%global optflags $(echo "%optflags" | sed -e s/-flto=[[:alnum:]]*//) }
%endif
# Filter FLAGS
# 1. Firefox is not supposed to build with exceptions globally enabled
# "STL code can only be used with -fno-exceptions"
%{expand:%%global optflags $(echo "%optflags" | sed -e s/-fexceptions//) }
### END Build Configuration ###
### BEGIN General Build Definitions ###
%global up_name firefox
%global up_version 135.0
%global up_srcdir %{up_name}-%{up_version}
# https://github.com/mozilla-l10n/firefox-l10n
# https://product-details.mozilla.org/1.0/l10n/
%global up_l10n_rev fcd0300e8478d1ec4d1c097a073ddb8e1e0351e3
%global up_l10n_srcdir firefox-l10n-%{up_l10n_rev}
%global up_nspr_min_ver 4.36
%global up_nss_min_ver 3.107
# https://github.com/openSUSE/firefox-maintenance
# 130.0
%global openSUSE_rev e90c1984168bbbce9890cda8a0a6e018c218576d
%global openSUSE_srcdir firefox-maintenance-%{openSUSE_rev}
%global softname vulpes
%global softrel core
### END General Build Definitions ###
### BEGIN Package ###
Name: Vulpes
Version: %{up_version}
Release: 2%{?dist}
Group: Productivity/Networking/Web/Browsers
Summary: A fork of Firefox
License: MPL-2.0
URL: https://gitlab.com/clu-os/software/%{softname}
Source0: https://archive.mozilla.org/pub/%{up_name}/releases/%{up_version}/source/%{up_srcdir}.source.tar.xz
Source1: https://github.com/mozilla-l10n/firefox-l10n/archive/%{up_l10n_rev}.tar.gz
Source2: https://github.com/openSUSE/firefox-maintenance/archive/%{openSUSE_rev}.tar.gz
Source3: %{url}/-/archive/%{softrel}/%{softname}-%{softrel}.tar.gz
# Patch list and sequence
Source10: openSUSE-firefox-maintenance-patches.txt
Patch1: mozilla-silence-no-return-type.patch
# BEGIN BuildRequires: autoconf
%if 0%{?is_opensuse} || 0%{?fedora}
BuildRequires: autoconf213
%else
%if 0%{?mageia}
BuildRequires: autoconf2.1
%else
BuildRequires: autoconf213
%endif
%endif
# END BuildRequires: autoconf
%if 0%{with ccache}
BuildRequires: ccache
%endif
# BEGIN BuildRequires: envsubst
# from gettext
%if 0%{?is_opensuse}
%if 0%{?sle_version}
BuildRequires: envsubst
%else
BuildRequires: envsubst-mini
%endif
%else
%if 0%{?mageia}
BuildRequires: gettext
%else
%if 0%{?fedora} || 0%{?alma_linux} || 0%{?rhel_version} || 0%{?centos_version}
BuildRequires: gettext-envsubst
%else
BuildRequires: envsubst
%endif
%endif
%endif
# END BuildRequires: envsubst
BuildRequires: fdupes
BuildRequires: findutils
%if 0%{?is_opensuse}
BuildRequires: makeinfo
%else
BuildRequires: texinfo
%endif
# BEGIN BuildRequires: memory-constraints
%if 0%{?is_opensuse}
%if 0%{?sle_version}
BuildRequires: memory-constraints
%else
BuildRequires: rpm_macro(limit_build)
%endif
%endif
%if 0%{?fedora}
BuildRequires: rpm_macro(constrain_build)
%endif
%if 0%{?mageia}
%if 0%{?mageia} < 10
BuildRequires: rpm-mageia-setup-build
%else
BuildRequires: rpm_macro(constrain_build)
%endif
%endif
# END BuildRequires: memory-constraints
# Using ranged macros: https://en.opensuse.org/RPM_Boolean_Dependencies#Ranged_dependencies
# BuildRequires: rpm >= 4.13
BuildRequires: xz
BuildRequires: zip unzip
# BEGIN BuildRequires: Assemblers
BuildRequires: nasm >= 2.14
BuildRequires: yasm
# END BuildRequires: Assemblers
# BEGIN multibuild BuildRequires: GCC all
%if 0%{?is_opensuse}
%if 0%{?sle_version}
%if 0%{?sle_version} == 150600
BuildRequires: gcc13
BuildRequires: gcc13-c++
%global multi_gcc gcc-13
%global multi_gpp gcc-13 -E
%global multi_gxx g++-13
%else
%if 0%{?sle_version} == 150500
BuildRequires: gcc12
BuildRequires: gcc12-c++
%global multi_gcc gcc-12
%global multi_gpp gcc-12 -E
%global multi_gxx g++-12
%else
BuildRequires: gcc >= 10
BuildRequires: gcc-c++ >= 10
%global multi_gcc gcc
%global multi_gpp gcc -E
%global multi_gxx g++
%endif
%endif
%else
BuildRequires: gcc
BuildRequires: gcc-c++
%global multi_gcc gcc
%global multi_gpp gcc -E
%global multi_gxx g++
%endif
%else
BuildRequires: gcc
BuildRequires: gcc-c++
%global multi_gcc gcc
%global multi_gpp gcc -E
%global multi_gxx g++
%endif
# END multibuild BuildRequires: GCC all
# BEGIN BuildRequires: Clang
BuildRequires: llvm >= 5
BuildRequires: llvm-devel >= 5
BuildRequires: clang >= 5
BuildRequires: clang-devel >= 5
%if 0%{with clang_build}
BuildRequires: lld >= 5
%endif
# END BuildRequires: Clang
# BEGIN BuildRequires: Rust TODO
BuildRequires: cargo
BuildRequires: rust
%if 0%{?is_opensuse}
BuildRequires: rust-cbindgen >= 0.26
%else
BuildRequires: cbindgen >= 0.26
%endif
# END BuildRequires: Rust TODO
# BEGIN multibuild 3.8 <= Python <= 3.12
%if 0%{?is_opensuse}
%if 0%{?sle_version}
%if 0%{?sle_version} == 150600
%global multi_python python311
%global multi_python_bin python3.11
%else
%if 0%{?sle_version} == 150500
%global multi_python python311
%global multi_python_bin python3.11
%else
%global multi_python python38
%global multi_python_bin python3.8
%endif
%endif
%else
%global multi_python python3
%global multi_python_bin python3
%endif
%endif
%if 0%{?fedora}
%global multi_python python3.11
%global multi_python_bin python3.11
%endif
%if 0%{?alma_linux} || 0%{?rhel_version} || 0%{?centos_version}
%global multi_python python3.11
%global multi_python_bin python3.11
%endif
%if ! ( 0%{?is_opensuse} || 0%{?fedora} || 0%{?alma_linux} || 0%{?rhel_version} || 0%{?centos_version} )
%global multi_python python3
%global multi_python_bin python3
%endif
# END multibuild Python 3.8+
# Does not build with Python 3.12+, sed patch in %%prep
BuildRequires: %{multi_python} >= 3.8
BuildRequires: %{multi_python} < 3.12
%if 0%{?is_opensuse}
BuildRequires: %{multi_python}-curses >= 3.8
BuildRequires: %{multi_python}-curses < 3.12
%endif
BuildRequires: %{multi_python}-devel >= 3.8
BuildRequires: %{multi_python}-devel < 3.12
# TODO BUG Telemetry?!
# # BuildRequires: python3-glean == 60.4.0
# BuildRequires: python3-psutil >= 5.4.2
# # BuildRequires: python3-psutil <= 5.9.4
# BuildRequires: python3-zstandard >= 0.11.1
# BuildRequires: python3-zstandard <= 0.22.0
# BuildRequires: nodejs TODO
%if 150000 <= 0%{?sle_version} && 0%{?sle_version} <= 150600
BuildRequires: nodejs12 >= 12.22.12
%else
BuildRequires: nodejs >= 12.22.12
%endif
# BuildRequires: Headers
# TEST
# BuildRequires: libiw-devel
# BEGIN multibuild Mesa
%if 0%{?is_opensuse}
BuildRequires: Mesa-devel
%else
%if 0%{?mageia}
BuildRequires: mesa-common-devel
%else
%if 0%{?fedora}
# TODO Check and reduce
BuildRequires: mesa-libEGL-devel
BuildRequires: mesa-libGL-devel
BuildRequires: mesa-libOSMesa-devel
BuildRequires: mesa-libOpenCL-devel
BuildRequires: mesa-libd3d-devel
BuildRequires: mesa-libgbm-devel
BuildRequires: mesa-libxatracker-devel
%else
BuildRequires: Mesa-devel
%endif
%endif
%endif
# END multibuild Mesa
# BuildRequires: pkgconfig()
BuildRequires: pkgconfig(alsa)
BuildRequires: pkgconfig(dbus-glib-1)
%if 0%{?suse_version} < 1550
BuildRequires: pkgconfig(gconf-2.0) >= 1.2.1
%endif
BuildRequires: pkgconfig(glib-2.0) >= 2.22
BuildRequires: pkgconfig(gobject-2.0)
BuildRequires: pkgconfig(gtk+-3.0) >= 3.14.0
BuildRequires: pkgconfig(gtk+-unix-print-3.0)
# BuildRequires: pkgconfig(icu-i18n) >= 73.1 # Fails to build
BuildRequires: pkgconfig(libcurl)
BuildRequires: pkgconfig(libffi) > 3.0.9
BuildRequires: pkgconfig(libproxy-1.0)
BuildRequires: pkgconfig(libpulse)
BuildRequires: pkgconfig(nspr) >= %{up_nspr_min_ver}
BuildRequires: pkgconfig(nss) >= %{up_nss_min_ver}
BuildRequires: pkgconfig(xcomposite)
BuildRequires: pkgconfig(xt)
BuildRequires: pkgconfig(zlib) >= 1.2.3
# BuildRequires: Other
%if 0%{?is_opensuse}
BuildRequires: dejavu-fonts
%else
%if 0%{?mageia}
BuildRequires: fonts-ttf-dejavu
%else
%if 0%{?fedora}
BuildRequires: dejavu-fonts-all
%else
BuildRequires: dejavu-fonts
%endif
%endif
%endif
%if 0%{with pgo_cond}
BuildRequires: xvfb-run
%endif
# Requires: Libraries
Requires: libfreetype6 >= 2.13.2
%if 0%{?is_opensuse} || 0%{?mageia}
Requires: mozilla-nspr >= %{up_nspr_min_ver}
Requires: mozilla-nss >= %{up_nss_min_ver}
%else
Requires: nspr >= %{up_nspr_min_ver}
Requires: nss >= %{up_nss_min_ver}
%endif
Requires(post): shared-mime-info desktop-file-utils
Requires(postun): shared-mime-info desktop-file-utils
Provides: web_browser
%description
A fork of Firefox
### END Package ###
### BEGIN Build Steps ###
# BEGIN %%prep
%prep
%setup -q -c -a 1 -a 2 -a 3
cd %{_builddir}/%{name}-%{version}/%{up_srcdir}
# {{{ openSUSE patches
# read lines of .txt file into 'patches'
while read patch_filename
do
if [[ "${patch_filename:0:1}" == '#' ]]
then
continue
else
%__patch -p1 -i ../%{openSUSE_srcdir}/${patch_filename}
fi
done < %{SOURCE10}
%patch 1 -p1
# }}} openSUSE patches
# {{{ Vulpes configuration
cat ../%{softname}-%{softrel}/mozconfig >> mozconfig
cat ../%{softname}-%{softrel}/os/linux.mozconfig >> mozconfig
# OBS memory-constraints settings
%if 0%{?is_opensuse}
# NOTE: must be set before any use of %%{jobs}
%limit_build -m 8000
%else
# Fedora and Mageia
%constrain_build -m 8000
%endif
rpm --eval "$(<../%{softname}-%{softrel}/rpm.mozconfig)" >> mozconfig
cat << EOF >> mozconfig
# BUG https://bugzilla.redhat.com/show_bug.cgi?id=2239046
# BUG https://bugzilla.mozilla.org/show_bug.cgi?id=1853280
ac_add_options --with-libclang-path=`llvm-config --libdir`
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj
ac_add_options --disable-bootstrap
# Features
ac_add_options --enable-jxl # Experimental ???
ac_add_options --enable-libproxy
ac_add_options --enable-default-toolkit=cairo-gtk3-x11-only
# System libraries
ac_add_options --with-system-ffi
# ac_add_options --with-system-icu # NOTE Fails to build
# NOTE firefox-130.0.1/intl/lwbrk/LineBreaker.cpp:453:17:
# NOTE error: static assertion failed due to requirement 'U_LB_COUNT == mozilla::ArrayLength(sUnicodeLineBreakToClass)':
# NOTE Gecko vs ICU LineBreak class mismatch
ac_add_options --with-system-nspr
ac_add_options --with-system-nss
ac_add_options --with-system-zlib
# ac_add_options --with-system-webp
# ac_add_options --with-system-libvpx
# ac_add_options --with-system-jpeg
# ac_add_options --with-system-png
# ac_add_options --with-system-libevent
# at least temporary until the "wasi-sysroot" issue is solved
ac_add_options --without-wasm-sandboxed-libraries
# Architecture-specific
%ifarch x86_64 aarch64
ac_add_options --enable-rust-simd # x86_64 aarch64
%else
ac_add_options --disable-rust-simd # not x86_64 aarch64
%endif
%ifarch %arm
ac_add_options --with-fpu=vfpv3-d16 # %arm
ac_add_options --with-float-abi=hard # %arm
%ifarch armv6l armv6hl
ac_add_options --with-arch=armv6 # armv6l armv6hl
%endif
%ifarch armv7l armv7hl armv7hnl
ac_add_options --with-arch=armv7-a # armv7l armv7hl armv7hnl
%endif
%endif
# LTO
# LTO needs newer toolchain stack only (at least GCC 8.2.1 (r268506)
%if 0%{with lto}
ac_add_options --enable-lto
%else
ac_add_options --disable-lto
%endif
# PGO
%if 0%{with pgo_cond}
ac_add_options MOZ_PGO=1
%else
# ac_add_options MOZ_PGO=1
%endif
%if 0%{with clang_build}
ac_add_options --enable-linker=lld
%else
# --enable-linker={bfd, gold, ld64, lld, lld-*, mold}
%endif
EOF
# }}} Vulpes configuration
# Compatibility sed patch
%__sed -i -e '/^MAX_PYTHON_VERSION_TO_CONSIDER/s/3, 11/3, 12/' ./mach
%__sed -i -e '/^pypi-optional:psutil/s/5.9.4/5.9.8/' ./python/sites/mach.txt
# Use versioned Python 3 for mach
%if "%{multi_python_bin}" != "python3"
%__sed -i -e 's:#!/usr/bin/env python3:#!/usr/bin/env %{multi_python_bin}:' ./mach
%endif
# END %%prep
# BEGIN %%build
%build
cd %{_builddir}/%{name}-%{version}/%{up_srcdir}
%set_build_flags
# export MOZ_OPTIMIZE_FLAGS
#ifarch %%ix86
# Not enough memory on 32-bit systems, reduce debug info.
export CFLAGS="${CFLAGS} -g1"
export CXXFLAGS="${CXXFLAGS} -g1"
#endif
export LDFLAGS="${LDFLAGS} -fPIC -Wl,-z,relro,-z,now"
%if 0%{with clang_build}
export CC=clang
export CXX=clang++
export AR=llvm-ar
export NM=llvm-nm
export RANLIB=llvm-ranlib
%else
export CC=%{multi_gcc}
export CXX=%{multi_gxx}
# export AR=gcc-ar
# export NM=gcc-nm
# export RANLIB=gcc-ranlib
%endif
# Build environment
export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system
export MOZBUILD_STATE_PATH=%{_builddir}/%{name}-%{version}/mozbuild
export MOZ_NOSPAM=1
./mach configure
./mach build --verbose
# END %%build
# BEGIN %%install
%install
cd %{_builddir}/%{name}-%{version}/%{up_srcdir}
# Build environment
export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system
export MOZBUILD_STATE_PATH=%{_builddir}/%{name}-%{version}/mozbuild
export MOZ_NOSPAM=1
DESTDIR=%{buildroot} ./mach install
ls -l %{buildroot}%{_libdir}/%{softname}/removed-files
%__rm -f %{buildroot}%{_libdir}/%{softname}/removed-files
%__mkdir -p %{buildroot}%{_libdir}/%{softname}/browser/defaults/preferences
%__mkdir -p %{buildroot}%{_libdir}/%{softname}/browser/extensions
%__mkdir -p %{buildroot}%{_libdir}/%{softname}/distribution/extensions
# END %%install
# BEGIN %%post
%post
# update mime and desktop database
%mime_database_post
%desktop_database_post
%icon_theme_cache_post
exit 0
# END %%post
# BEGIN %%postun
%postun
# update mime and desktop database
%desktop_database_postun
%mime_database_postun
%icon_theme_cache_postun
exit 0
# END %%postun
# BEGIN %%files
%files
%license %{up_srcdir}/LICENSE
# %%doc add-docs-here
%dir %{_libdir}/%{softname}
%dir %{_libdir}/%{softname}/browser
%dir %{_libdir}/%{softname}/browser/chrome
%dir %{_libdir}/%{softname}/browser/defaults
%dir %{_libdir}/%{softname}/browser/defaults/preferences
%dir %{_libdir}/%{softname}/browser/features
%dir %{_libdir}/%{softname}/browser/extensions
%dir %{_libdir}/%{softname}/defaults
%dir %{_libdir}/%{softname}/defaults/pref
%dir %{_libdir}/%{softname}/distribution
%dir %{_libdir}/%{softname}/distribution/extensions
%dir %{_libdir}/%{softname}/fonts
# Binaries
%{_bindir}/%{softname}
%{_libdir}/%{softname}/glxtest
%{_libdir}/%{softname}/pingsender
%{_libdir}/%{softname}/vaapitest
%{_libdir}/%{softname}/%{softname}
%{_libdir}/%{softname}/%{softname}-bin
# Configs
%{_libdir}/%{softname}/application.ini
%{_libdir}/%{softname}/platform.ini
# %%{_libdir}/%%{softname}/%%{softname}.cfg
# TODO %%{_libdir}/%%{softname}/browser/defaults/preferences/firefox.js
%{_libdir}/%{softname}/defaults/pref/channel-prefs.js
# TODO %%{_libdir}/%%{softname}/defaults/pref/vendor.js
# %%{_libdir}/%%{softname}/distribution/policies.json
# TODO %%{_libdir}/%%{softname}/distribution/distribution.ini
# Libraries
%{_libdir}/%{softname}/*.so
# Theme
%{_libdir}/%{softname}/browser/chrome/*
# Built-in add-ons
%{_libdir}/%{softname}/browser/features/*
# 3rd-party add-ons and language packs
# %%{_libdir}/%%{softname}/browser/extensions/*
# Other
%{_libdir}/%{softname}/dependentlibs.list
%{_libdir}/%{softname}/fonts/TwemojiMozilla.ttf
%{_libdir}/%{softname}/gmp-clearkey/
# Review
%{_libdir}/%{softname}/browser/omni.ja
%{_libdir}/%{softname}/omni.ja
# END %%files
### END Build Steps ###
%changelog