File pipewire.spec of Package pipewire

%define realname pipewire
%define realver  1.0.0
%define srcext   tar.gz

%define media_session_ver 0.4.2
%define wireplumber_ver   0.4.16

%define pw_gen   0_3
%define spa_gen  0_2
%define so_gen   -%{pw_gen}-
%define so_ver   0

%define wp_gen    %(echo %wireplumber_ver | awk -F. '{printf "%%d_%%d", $1, $2}')
%define wp_so_ver %(echo %wireplumber_ver | awk -F. '{printf "%%d", $1}')

# turn off the generation of debuginfo rpm  (RH9) ??
%global debug_package %{nil}

# Common info
Name:          %{realname}
Version:       %{realver}
Release:       wiz%{?extraver:0.}1%{?dist}
License:       MIT
Group:         Productivity/Multimedia/Other
URL:           https://pipewire.org/
Summary:       Multimedia processing graphs

# Install-time parameters
Requires:      pipewire-session-manager
Requires:      pipewire-modules = %{version}-%{release}
Provides:      pipewire-tools = %{version}-%{release}
Provides:      pipewire-pulseaudio = %{version}-%{release}
Obsoletes:     pipewire-tools < %{version}-%{release}
Obsoletes:     pipewire-pulseaudio < %{version}-%{release}

# Build-time parameters
BuildRequires: gcc-c++
BuildRequires: pkg-config
BuildRequires: meson >= 0.54.0
BuildRequires: ninja
BuildRequires: pkgconfig(dbus-1)
BuildRequires: pkgconfig(sdl2)
BuildRequires: readline-devel
BuildRequires: pkgconfig(ncursesw)
BuildRequires: pkgconfig(sndfile) >= 1.0.20
BuildRequires: pkgconfig(libpulse)
BuildRequires: pkgconfig(avahi-client)
BuildRequires: pkgconfig(xfixes)
BuildRequires: pkgconfig(libcanberra)
BuildRequires: pkgconfig(libusb-1.0)
BuildRequires: pkgconfig(libcap)
BuildRequires: pkgconfig(glib-2.0) >= 2.32.0
BuildRequires: pkgconfig(gobject-2.0) pkgconfig(gmodule-2.0)
BuildRequires: pkgconfig(gio-2.0)     pkgconfig(gio-unix-2.0)
BuildRequires: pkgconfig(gstreamer-1.0) >= 1.10.0  pkgconfig(gstreamer-plugins-base-1.0)
BuildRequires: pkgconfig(gstreamer-video-1.0)      pkgconfig(gstreamer-audio-1.0)
BuildRequires: pkgconfig(gstreamer-allocators-1.0)
BuildRequires: pkgconfig(webrtc-audio-processing)
BuildRequires: pkgconfig(alsa) >= 1.1.7
BuildRequires: pkgconfig(openssl)
# spa
BuildRequires: pkgconfig(bluez) >= 4.101
BuildRequires: pkgconfig(sbc)
BuildRequires: pkgconfig(ldacBT-enc) pkgconfig(ldacBT-abr)
BuildRequires: pkgconfig(libfreeaptx)
BuildRequires: pkgconfig(fdk-aac)
BuildRequires: pkgconfig(opus)
BuildRequires: pkgconfig(libavcodec) pkgconfig(libavformat)
BuildRequires: pkgconfig(ModemManager) >= 1.10.0
BuildRequires: pkgconfig(jack) >= 1.9.10
BuildRequires: pkgconfig(vulkan) >= 1.1.69
BuildRequires: pkgconfig(libcamera)
BuildRequires: pkgconfig(libudev)
BuildRequires: pkgconfig(libdrm)
BuildRequires: pkgconfig(systemd) pkgconfig(libsystemd)
# wireplumber
%if 0%{?suse_version}
BuildRequires: pkgconfig(lua5.3)
%endif
# docs
BuildRequires: doxygen graphviz
BuildRequires: python3-docutils
BuildRoot:     %{_tmppath}/%{name}-root
Source0:       https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/%{version}%{?extraver}/%{realname}-%{version}%{?extraver}.%{srcext}
Source1:       https://gitlab.freedesktop.org/pipewire/media-session/-/archive/%{media_session_ver}/media-session-%{media_session_ver}.%{srcext}
Source2:       https://gitlab.freedesktop.org/pipewire/wireplumber/-/archive/%{wireplumber_ver}/wireplumber-%{wireplumber_ver}.%{srcext}

%description
PipeWire is a server and user space API to deal with multimedia pipelines.
This includes:

  * Making available sources of video (such as from a capture devices or
    application provided streams) and multiplexing this with clients.
  * Accessing sources of video for consumption.
  * Generating graphs for audio and video processing.

Nodes in the graph can be implemented as separate processes, communicating with
sockets and exchanging multimedia content using fd passing.

%package -n libpipewire%{?so_gen}%{?so_ver}
Group:         System/Libraries
Summary:       Multimedia processing graphs library

%description -n libpipewire%{?so_gen}%{?so_ver}
PipeWire is a server and user space API to deal with multimedia pipelines.

This package provides shared libraries providing Multimedia processing graphs.

%package modules-%{pw_gen}
Group:         System/Libraries
Summary:       Modules For PipeWire, Multimedia processing graphs

Provides:      %{name}-modules = %{version}-%{release}

%description modules-%{pw_gen}
PipeWire is a server and user space API to deal with multimedia pipelines.

This package provides modules for PipeWire.

%package spa-plugins-%{spa_gen}
Group:         System/Libraries
Summary:       Plugins For PipeWire SPA (Simple Plugin API)

Provides:      %{name}-spa-plugins = %{version}-%{release}

%description spa-plugins-%{spa_gen}
PipeWire is a server and user space API to deal with multimedia pipelines.

PipeWire uses the SPA plugin API for the nodes in the graph. SPA is
a plugin API designed for low-latency and efficient processing of
any multimedia format.

This package provides plugins For PipeWire using Simple Plugin API.

%package spa-tools
Group:         Productivity/Multimedia/Other
Summary:       The PipeWire SPA Tools

%description spa-tools
This package provides tools for PipeWire SPA plugins.

%package devel
Group:         Development/Languages/C and C++
Summary:       Files needed for development using %{name}
Requires:      libpipewire%{?so_gen}%{?so_ver} = %{version}-%{release}
Provides:      libpipewire%{?so_gen}%{?so_ver}-devel = %{version}-%{release}
Provides:      libpipewire-devel = %{version}-%{release}

%description devel
PipeWire is a server and user space API to deal with multimedia pipelines.

This package provides files required to develop software using Pipewire.

%package -n alsa-plugins-pipewire
Group:         System/Libraries
License:       LGPL-2.1
Summary:       ALSA plugin for pipewire

Provides:      pipewire-alsa = %{version}-%{release}
Obsoletes:     pipewire-alsa < %{version}-%{release}

%description -n alsa-plugins-pipewire
PipeWire is a server and user space API to deal with multimedia pipelines.

This package provides the ALSA plugin.

%package -n gstreamer-plugin-pipewire
Group:         System/Libraries
Summary:       Gstreamer Plugin for PipeWire

%description -n gstreamer-plugin-pipewire
PipeWire is a server and user space API to deal with multimedia pipelines.

This package provides the gstreamer plugin that uses PipeWire to handle
media streams.

%package lang
Group:         Productivity/Multimedia/Other
Summary:       Pipewire localizations
BuildArch:     noarch

%description lang
Localizations for the Pipewire package

%package media-session
Version:       %{media_session_ver}
Group:         Productivity/Multimedia/Other
Summary:       Example session manager for PipeWire

Provides:      pipewire-session-manager
Conflicts:     wireplumber

%description media-session
PipeWire Media Session is an example session manager for PipeWire.

%package -n wireplumber
Version:       %{wireplumber_ver}
Group:         Productivity/Multimedia/Other
Summary:       Modular session / policy manager for PipeWire

Provides:      pipewire-session-manager
Provides:      pipewire-wireplumber = %{version}-%{release}
Provides:      wireplumber-audio = %{version}-%{release}
Provides:      libwireplumber-%{wp_gen}-%{wp_so_ver} = %{version}-%{release}
Obsoletes:     wireplumber-audio < %{version}-%{release}
Obsoletes:     libwireplumber-%{wp_gen}-%{wp_so_ver} < %{version}-%{release}
Conflicts:     pipewire-media-session

%description -n wireplumber
WirePlumber is a modular session / policy manager for PipeWire and
a GObject-based high-level library that wraps PipeWire's API, providing
convenience for writing the daemon's modules as well as external tools for
managing PipeWire.

The WirePlumber daemon implements the session & policy management service.
It follows a modular design, having plugins that implement the actual
management functionality.

The WirePlumber Library provides API that allows you to extend the WirePlumber
daemon, to write management or status tools for PipeWire
(apps that don't do actual media streaming) and to write custom session managers
for embedded devices.

# Preparation step (unpackung and patching if necessary)
%prep
%setup -q -n %{realname}-%{realver}%{?extraver} -a1 -a2
rm -f subprojects/*.wrap
%{__mv} media-session-%{media_session_ver} subprojects/media-session
%{__mv} wireplumber-%{wireplumber_ver}     subprojects/wireplumber

%build
_CFLAGS='%{optflags}'
_LDFLAGS='-Wl,--strip-all -Wl,-z,noexecstack -Wl,-z,now -Wl,-z,relro'
meson setup build \
 --buildtype=release \
 --strip \
 \
 --prefix=%{_prefix} \
 --libexecdir=%{_libexecdir} \
 --default-library=shared \
 \
 -Ddocs=enabled \
 -Dman=enabled \
 -Dtests=disabled \
 -Dbluez5-backend-native-mm=enabled \
 -Dffmpeg=enabled \
 -Dvulkan=enabled \
 -Dpw-cat-ffmpeg=enabled \
 -Dudevrulesdir=%{_udevrulesdir} \
 -Dsession-managers='["wireplumber", "media-session"]' \
 \
 -Dmedia-session:tests=disabled \
 -Dmedia-session:with-module-sets='["alsa", "jack", "pulseaudio"]' \
 \
 -Dwireplumber:system-lua=%{?suse_version:true}%{!?suse_version:false} \
 -Dwireplumber:tests=false \
 \
 -Db_lto=true \
 -Db_ndebug=if-release \
 -Dc_args="$_CFLAGS" \
 -Dc_link_args="$_LDFLAGS" \
 -Dcpp_args="$_CFLAGS" \
 -Dcpp_link_args="$_LDFLAGS"
ninja -v -C build %{?_smp_mflags}

%install
DESTDIR=%{buildroot} ninja -C build install
%find_lang %{name}
%find_lang media-session
%find_lang wireplumber

%clean
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}

%files
%defattr(-,root,root)
%license COPYING LICENSE
%doc NEWS README.md
%{_sysconfdir}/security/limits.d/25-pw-rlimits.conf
%{_bindir}/pw-*
%{_bindir}/pipewire
%{_bindir}/pipewire-aes67
%{_bindir}/pipewire-avb
%{_bindir}/pipewire-pulse
%{_bindir}/pipewire-vulkan
%{_datadir}/alsa-card-profile/
%{_datadir}/pipewire/
%{_udevrulesdir}/90-pipewire-alsa.rules
%{_userunitdir}/filter-chain.*
%{_userunitdir}/pipewire-pulse.*
%{_userunitdir}/pipewire.*
%doc %{_mandir}/man1/*
%doc %{_mandir}/man5/*
%doc %{_mandir}/man7/*
%exclude %{_datadir}/pipewire/media-session.d/

%files media-session -f media-session.lang
%defattr(-,root,root)
%license subprojects/media-session/COPYING subprojects/media-session/LICENSE
%doc subprojects/media-session/NEWS subprojects/media-session/README.md
%{_bindir}/pipewire-media-session
%{_datadir}/pipewire/media-session.d/
%{_userunitdir}/pipewire-media-session.service

%files -n wireplumber -f wireplumber.lang
%defattr(-,root,root)
%license subprojects/wireplumber/LICENSE
%doc subprojects/wireplumber/NEWS.rst subprojects/wireplumber/README.rst
%{_bindir}/wireplumber
%{_bindir}/wp*
%{_libdir}/libwireplumber-*
%{_libdir}/wireplumber-*
%{_datadir}/wireplumber/
%{_userunitdir}/wireplumber*
%dir %{_datadir}/zsh/site-functions
%dir %{_datadir}/zsh
%{_datadir}/zsh/site-functions/_wpctl

%files -n libpipewire%{?so_gen}%{?so_ver}
%defattr(-,root,root)
%license COPYING LICENSE
%doc NEWS README.md
%{_libdir}/libpipewire-*.so.%{?so_ver}*

%files modules-%{pw_gen}
%defattr(-,root,root)
%license COPYING LICENSE
%doc NEWS README.md
%{_libdir}/pipewire-*

%files spa-plugins-%{spa_gen}
%defattr(-,root,root)
%license COPYING LICENSE
%doc NEWS README.md
%{_libdir}/spa-*
%dir %{_datadir}/spa-0.2/bluez5
%dir %{_datadir}/spa-0.2
%{_datadir}/spa-0.2/bluez5/bluez-hardware.conf

%files spa-tools
%defattr(-,root,root)
%{_bindir}/spa-*

%files -n alsa-plugins-pipewire
%defattr(-,root,root)
%dir %{_libdir}/alsa-lib
%{_libdir}/alsa-lib/libasound_module_ctl_pipewire.so
%{_libdir}/alsa-lib/libasound_module_pcm_pipewire.so
%dir %{_datadir}/alsa/alsa.conf.d
%dir %{_datadir}/alsa
%{_datadir}/alsa/alsa.conf.d/*.conf

%files -n gstreamer-plugin-pipewire
%defattr(-,root,root)
%license COPYING LICENSE
%doc NEWS README.md
%dir %{_libdir}/gstreamer-1.0
%{_libdir}/gstreamer-1.0/libgstpipewire.so

%files devel
%defattr(-,root,root)
%license COPYING LICENSE
%doc NEWS README.md
%{_libdir}/pkgconfig/*.pc
%{_includedir}/pipewire-*
%{_includedir}/spa-*
%{_includedir}/wireplumber-*
%{_libdir}/*.so
%dir %{_datadir}/doc/pipewire/html
%dir %{_datadir}/doc/pipewire
%docdir %{_datadir}/doc/pipewire/html
%doc %{_datadir}/doc/pipewire/html/*

%files lang -f %{name}.lang
%defattr(-,root,root)

%post   -n libpipewire%{?so_gen}%{?so_ver} -p /sbin/ldconfig
%postun -n libpipewire%{?so_gen}%{?so_ver} -p /sbin/ldconfig

%post   -n wireplumber -p /sbin/ldconfig
%postun -n wireplumber -p /sbin/ldconfig

%changelog
openSUSE Build Service is sponsored by