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