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:        5.5
Summary:        Container-based approach to boot a full Android system on GNU/Linux
License:        GPL-3.0-only
Version:        1.5.4
URL:            %{forgeurl}
Source:         %{name}-%{version}.tar.gz
Source1:        waydroid.te
Source4:        dev-binderfs.mount
Source6:        waydroid.fc
Patch0:         setup-firewalld.patch
Patch1:         mount-secontext.patch

BuildArch:      noarch

BuildRequires:  make
BuildRequires:  selinux-policy-devel
BuildRequires:  container-selinux
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)

Requires:       android-tools
Requires:       anbox-modules-dkms
Requires:       python3-gbinder
Requires:       libgbinder1
Requires:       libglibutil1
Requires:       python3-gobject
Requires:       lxc
Requires:       nftables
Requires:       iproute
Requires:       iptables
Requires:       dnsmasq
Suggests:       kernel-longterm
Suggests:       kernel-longterm-devel
Suggests:       scrcpy
Suggests:       waydroid-image
Suggests:       waydroid-image-lineage18
Suggests:       waydroid-image-gapps
Suggests:       waydroid-image-gapps-lineage18
Requires:       (python3-dbus-python or python3dist(dbus-python))
Requires:       (%{name}-selinux = %{version}-%{release} if selinux-policy-%{selinuxtype})

%description
Waydroid exemplifies a container-based approach to executing a complete Android system on a standard GNU/Linux operating systems.
Waydroid utilizes Linux namespaces (user, pid, uts, net, mount, ipc) to operate a comprehensive Android system within a container and to facilitate the availability of Android applications on any GNU/Linux-based platform.
Conversely, the Android system within the container has direct access to the necessary hardware components.
The Android runtime environment is distributed with a minimal, customized Android system image based on the LineageOS.

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

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

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

%build
# Remove link for ROM files
sed -i -e '/"system_channel":/ s/: ".*"/: ""/' tools/config/__init__.py
sed -i -e '/"vendor_channel":/ s/: ".*"/: ""/' tools/config/__init__.py
# Compile sepolicy
cd SELinux
%{__make} NAME=%{selinuxtype} -f /usr/share/selinux/devel/Makefile

%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} -d %{buildroot}%{_datadir}/selinux/%{selinuxtype}
%{__install} -p -m 644 %{S:4} %{buildroot}%{_unitdir}/
%{__install} -p -m 644 SELinux/%{name}.pp %{buildroot}%{_datadir}/selinux/%{selinuxtype}/%{name}.pp
sed -i '/^\[Unit\]/a Wants=dev-binderfs.mount' %{buildroot}%{_unitdir}/waydroid-container.service
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

%pre selinux
%selinux_relabel_pre -s %{selinuxtype}

%post selinux
%selinux_modules_install -s %{selinuxtype} %{_datadir}/selinux/%{selinuxtype}/%{name}.pp
%selinux_relabel_post -s %{selinuxtype}

if [ "$1" -le "1" ]; then # First install
  # the daemon needs to be restarted for the custom label to be applied
  %systemd_postun_with_restart waydroid-container.service
fi

%postun selinux
if [ $1 -eq 0 ]; then
  %selinux_modules_uninstall -s %{selinuxtype} %{name}
  %selinux_relabel_post -s %{selinuxtype}
fi

%post
waydroid upgrade -o > /dev/null || :
%systemd_post waydroid-container.service
if [ $1 -eq 1 ]; then
  if systemctl -q is-enabled waydroid-container.service > /dev/null 2>&1 ; then
    systemctl start waydroid-container.service > /dev/null 2>&1 || :
  fi
fi

%preun
%systemd_preun waydroid-container.service

%postun
%systemd_postun_with_restart waydroid-container.service

%files
%license LICENSE
%doc README.md
%{_prefix}/lib/waydroid
%{_datadir}/applications/Waydroid.desktop
%{_datadir}/applications/waydroid.market.desktop
%{_datadir}/applications/waydroid.app.install.desktop
%dir %{_metainfodir}/
%{_metainfodir}/id.waydro.waydroid.metainfo.xml
%dir %{_iconsdir}/hicolor/
%dir %{_iconsdir}/hicolor/512x512/
%dir %{_iconsdir}/hicolor/512x512/apps/
%{_iconsdir}/hicolor/512x512/apps/waydroid.png
%{_bindir}/waydroid
%{_unitdir}/waydroid-container.service
%{_unitdir}/dev-binderfs.mount
%{_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
%dir %{_datadir}/desktop-directories/
%{_datadir}/desktop-directories/waydroid.directory
%dir %{_sysconfdir}/xdg/
%dir %{_sysconfdir}/xdg/menus/
%dir %{_sysconfdir}/xdg/menus/applications-merged/
%{_sysconfdir}/xdg/menus/applications-merged/waydroid.menu

%files selinux
%doc SELinux/%{name}.te
%{_datadir}/selinux/%{selinuxtype}/%{name}.pp

%changelog
* Mon Jul 01 2025 James Ed Randson <jimedrand@disroot.org> - 1.5.4
- Maintain an package %{name} and %{name}-selinux

* Mon Jun 23 2025 James Ed Randson <jimedrand@disroot.org> - 1.5.3
- Maintain an package %{name} and %{name}-selinux

* Thu Jun 19 2025 James Ed Randson <jimedrand@disroot.org> - 1.5.1
- Maintain an package %{name} and %{name}-selinux
openSUSE Build Service is sponsored by