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
openSUSE Build Service is sponsored by