File waydroid.spec of Package waydroid

%global forgeurl https://github.com/waydroid/waydroid
%global selinuxtype targeted
%global forgemeta #forge
%global tag %{version}

%{!?_metainfodir:%define _metainfodir %{_datadir}/metainfo}
%{!?_iconsdir:%define _iconsdir %{_datadir}/icons}

%forgemeta
Name:           waydroid
Release:        0
Summary:        Container-based approach to boot a full Android system on GNU/Linux
License:        GPL-3.0-only
Version:        1%{?dist}
URL:            %{forgeurl}
Source:         %{name}-%{version}.tar.gz
Source1:        waydroid.te
Source3:        waydroid.conf
Source4:        dev-binderfs.mount
Source6:        waydroid.fc
Patch0:         setup-firewalld.patch
Patch1:         mount-secontext.patch

BuildArch:      noarch

BuildRequires:  make
BuildRequires:  systemd
BuildRequires:  python3-devel
BuildRequires:  (dbus-1-devel or dbus-devel)
BuildRequires:  polkit-devel
BuildRequires:  python3-gbinder
BuildRequires:  (python3-dbus-python or python3dist(dbus-python))
BuildRequires:  python3-gobject
BuildRequires:  systemd-rpm-macros
BuildRequires:  desktop-file-utils
BuildRequires:  (appstream-glib or libappstream-glib)

# SELinux deps only if not building on openSUSE
%if !0%{?suse_version}
BuildRequires:  selinux-policy-devel
BuildRequires:  container-selinux
%endif

Requires:       python3-gbinder
Requires:       python3-gobject
Requires:       python3-pyclip
Requires:       gtk3
Requires:       wl-clipboard
Requires:       lxc
Requires:       nftables
Requires:       iproute
Requires:       iptables
Requires:       dnsmasq
Requires:       python3-dbus-python

%if !0%{?suse_version}
Requires:       (%{name}-selinux = %{version}-%{release} if selinux-policy-%{selinuxtype})
%endif

Suggests:       scrcpy
Suggests:       waydroid-image
Suggests:       android-tools
Suggests:       anbox-modules

%description
Waydroid exemplifies a container-based approach to executing a complete Android system on GNU/Linux…

%if !0%{?suse_version}
%package selinux
Summary:            SELinux policy module for waydroid
Requires:           %{name} = %{version}-%{release}
Requires:           container-selinux

%description selinux
This package contains the SELinux policy module necessary to run Waydroid.
%endif

%prep
%autosetup -p1
mkdir SELinux
cp %{S:1} SELinux/
cp %{S:6} SELinux/

%build
sed -i -e '/"system_channel":/ s/: ".*"/: ""/' tools/config/__init__.py
sed -i -e '/"vendor_channel":/ s/: ".*"/: ""/' tools/config/__init__.py

%if !0%{?suse_version}
cd SELinux
%{__make} NAME=%{selinuxtype} -f /usr/share/selinux/devel/Makefile
%else
echo "Skipping SELinux policy build on openSUSE"
%endif

%install
%make_install LIBDIR=%{_libdir} DESTDIR=%{buildroot} USE_SYSTEMD=1 USE_DBUS_ACTIVATION=1 USE_NFTABLES=1
%{?py_byte_compile:py_byte_compile %{python3} %{buildroot}%{_prefix}/lib/waydroid}

%{__install} -d %{buildroot}%{_unitdir}
%{__install} -p -m 644 %{S:4} %{buildroot}%{_unitdir}/

%if !0%{?suse_version}
%{__install} -d %{buildroot}%{_datadir}/selinux/%{selinuxtype}
%{__install} -p -m 644 SELinux/%{name}.pp %{buildroot}%{_datadir}/selinux/%{selinuxtype}/%{name}.pp
%endif
# Install systemd drop-in override for openSUSE
install -d -m 755 %{buildroot}%{_unitdir}/waydroid-container.service.d
install -p -m 644 %{S:3} %{buildroot}%{_unitdir}/waydroid-container.service.d/10-opensuse.conf
# Add Wants= for binderfs (this is still needed as it's in the [Unit] section)
sed -i '/^\[Unit\]/a Wants=dev-binderfs.mount' %{buildroot}%{_unitdir}/waydroid-container.service
# Add ExecStartPre= for symlinks (this can also stay)
sed -i '/^\[Service\]/a ExecStartPre=/usr/bin/ln -sf /dev/binderfs/binder /dev/binderfs/vndbinder /dev/binderfs/hwbinder /dev/' %{buildroot}%{_unitdir}/waydroid-container.service

%check
desktop-file-validate %{buildroot}/%{_datadir}/applications/Waydroid.desktop
desktop-file-validate %{buildroot}/%{_datadir}/applications/waydroid.market.desktop
desktop-file-validate %{buildroot}/%{_datadir}/applications/waydroid.app.install.desktop
appstream-util validate --nonet %{buildroot}%{_metainfodir}/id.waydro.waydroid.metainfo.xml

%if !0%{?suse_version}
%pre selinux
%selinux_relabel_pre -s %{selinuxtype}

%post selinux
%selinux_modules_install -s %{selinuxtype} %{_datadir}/selinux/%{selinuxtype}/%{name}.pp
%selinux_relabel_post -s %{selinuxtype}
%systemd_postun_with_restart waydroid-container.service

%postun selinux
%selinux_modules_uninstall -s %{selinuxtype} %{name}
%selinux_relabel_post -s %{selinuxtype}
%endif

%post
waydroid upgrade -o > /dev/null || :
%systemd_post waydroid-container.service

%preun
%systemd_preun waydroid-container.service

%postun
%systemd_postun_with_restart waydroid-container.service

%files
%license LICENSE
%doc README.md
%dir %{_sysconfdir}/xdg/menus
%dir %{_sysconfdir}/xdg/menus/applications-merged
%dir %{_datadir}/desktop-directories
%dir %{_datadir}/icons/hicolor
%dir %{_datadir}/icons/hicolor/512x512
%dir %{_iconsdir}/hicolor/512x512/apps
%dir %{_metainfodir}
%dir %{_unitdir}/waydroid-container.service.d
%{_prefix}/lib/waydroid
%{_datadir}/applications/Waydroid.desktop
%{_datadir}/applications/waydroid.market.desktop
%{_datadir}/applications/waydroid.app.install.desktop
%{_metainfodir}/id.waydro.waydroid.metainfo.xml
%{_iconsdir}/hicolor/512x512/apps/waydroid.png
%{_bindir}/waydroid
%{_unitdir}/waydroid-container.service
%{_unitdir}/dev-binderfs.mount
%{_unitdir}/waydroid-container.service.d/10-opensuse.conf
%{_datadir}/dbus-1/system-services/id.waydro.Container.service
%{_datadir}/dbus-1/system.d/id.waydro.Container.conf
%{_datadir}/polkit-1/actions/id.waydro.Container.policy
%{_datadir}/desktop-directories/waydroid.directory
%{_sysconfdir}/xdg/menus/applications-merged/waydroid.menu

%if !0%{?suse_version}
%files selinux
%doc SELinux/%{name}.te
%{_datadir}/selinux/%{selinuxtype}/%{name}.pp
%endif

%changelog

* Sun Nov 02 2025 itachi <xanbenson99@gmail.com> - 1.5.4.git<date>-<release>
- Refactor systemd service:
  * Use a drop-in override file (10-opensuse.conf) for openSUSE-specific changes.
  * Stop patching the main waydroid-container.service file with sed.
- Add new systemd drop-in directory and file to %files to fix "unpackaged file(s)" error.

* Tue Aug 19 2025 itachi <xanbenson99@gmail.com> - 1.5.4
- Cleaned spec for openSUSE: wrapped SELinux in conditionals
openSUSE Build Service is sponsored by