diff options
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/pipewire')
10 files changed, 561 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0.2.nix b/nixpkgs/pkgs/development/libraries/pipewire/0.2.nix new file mode 100644 index 000000000000..cf2448bddfcb --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/0.2.nix @@ -0,0 +1,54 @@ +{ lib, stdenv, fetchFromGitHub, meson, ninja, pkg-config, doxygen, graphviz +, glib, dbus, gst_all_1, alsa-lib, ffmpeg_4, libjack2, udev, libva, xorg +, sbc, SDL2, makeFontsConf +}: + +let + fontsConf = makeFontsConf { + fontDirectories = [ ]; + }; +in stdenv.mkDerivation rec { + pname = "pipewire"; + version = "0.2.7"; + + src = fetchFromGitHub { + owner = "PipeWire"; + repo = "pipewire"; + rev = version; + sha256 = "1q5wrqnhhs6r49p8yvkw1pl0cnsd4rndxy4h5lvdydwgf1civcwc"; + }; + + outputs = [ "out" "lib" "dev" "doc" ]; + + nativeBuildInputs = [ + meson ninja pkg-config doxygen graphviz + ]; + buildInputs = [ + glib dbus gst_all_1.gst-plugins-base gst_all_1.gstreamer + alsa-lib ffmpeg_4 libjack2 udev libva xorg.libX11 sbc SDL2 + ]; + + # Workaround build on gcc-10+ and clang11+: + # spa/plugins/bluez5/libspa-bluez5.so.p/bluez5-monitor.c.o:(.bss+0x0): + # multiple definition of `spa_a2dp_sink_factory' + env.NIX_CFLAGS_COMPILE = toString [ "-fcommon" ]; + + mesonFlags = [ + "-Ddocs=true" + "-Dgstreamer=enabled" + ]; + + PKG_CONFIG_SYSTEMD_SYSTEMDUSERUNITDIR = "${placeholder "out"}/lib/systemd/user"; + + FONTCONFIG_FILE = fontsConf; # Fontconfig error: Cannot load default config file + + doCheck = true; + + meta = with lib; { + description = "Server and user space API to deal with multimedia pipelines"; + homepage = "https://pipewire.org/"; + license = licenses.lgpl21; + platforms = platforms.linux; + maintainers = with maintainers; [ ]; + }; +} diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch b/nixpkgs/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch new file mode 100644 index 000000000000..fab89c4ffd93 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch @@ -0,0 +1,13 @@ +diff --git a/meson.build b/meson.build +index 99a4b2d1..d4a4cda7 100644 +--- a/meson.build ++++ b/meson.build +@@ -55,7 +55,7 @@ endif + + spa_plugindir = pipewire_libdir / spa_name + +-alsadatadir = pipewire_datadir / 'alsa-card-profile' / 'mixer' ++alsadatadir = pipewire_libdir / '..' / 'share' / 'alsa-card-profile' / 'mixer' + + pipewire_headers_dir = pipewire_name / 'pipewire' + diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch b/nixpkgs/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch new file mode 100644 index 000000000000..230f1b30394a --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch @@ -0,0 +1,27 @@ +diff --git a/meson_options.txt b/meson_options.txt +index 961ae2a76..692b84dfd 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -179,6 +179,9 @@ option('udev', + option('udevrulesdir', + type : 'string', + description : 'Directory for udev rules (defaults to /lib/udev/rules.d)') ++option('pipewire_pulse_prefix', ++ type : 'string', ++ description: 'Install directory for the pipewire-pulse daemon') + option('systemd-system-unit-dir', + type : 'string', + description : 'Directory for system systemd units (defaults to /usr/lib/systemd/system)') +diff --git a/src/daemon/systemd/user/meson.build b/src/daemon/systemd/user/meson.build +index d17f3794f..34afe4f1a 100644 +--- a/src/daemon/systemd/user/meson.build ++++ b/src/daemon/systemd/user/meson.build +@@ -9,7 +9,7 @@ install_data( + + systemd_config = configuration_data() + systemd_config.set('PW_BINARY', pipewire_bindir / 'pipewire') +-systemd_config.set('PW_PULSE_BINARY', pipewire_bindir / 'pipewire-pulse') ++systemd_config.set('PW_PULSE_BINARY', get_option('pipewire_pulse_prefix') / 'bin/pipewire-pulse') + + configure_file(input : 'pipewire.service.in', + output : 'pipewire.service', diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0060-libjack-path.patch b/nixpkgs/pkgs/development/libraries/pipewire/0060-libjack-path.patch new file mode 100644 index 000000000000..7fde3dbb8faa --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/0060-libjack-path.patch @@ -0,0 +1,26 @@ +diff --git a/src/modules/meson.build b/src/modules/meson.build +index 5d2dc9984..35f5773aa 100644 +--- a/src/modules/meson.build ++++ b/src/modules/meson.build +@@ -169,6 +169,7 @@ if build_module_jack_tunnel + install_dir : modules_install_dir, + install_rpath: modules_install_dir, + dependencies : [mathlib, dl_lib, pipewire_dep], ++ c_args: '-DNIXPKGS_LIBJACK_PATH="@0@"'.format(jack_dep.get_variable('libdir')) + ) + build_module_jackdbus_detect = dbus_dep.found() + if build_module_jackdbus_detect +diff --git a/src/modules/module-jack-tunnel/weakjack.h b/src/modules/module-jack-tunnel/weakjack.h +index 42580f798..e7aadd3cc 100644 +--- a/src/modules/module-jack-tunnel/weakjack.h ++++ b/src/modules/module-jack-tunnel/weakjack.h +@@ -164,8 +164,7 @@ static inline int weakjack_load(struct weakjack *jack, const char *lib) + + search_dirs = getenv("LIBJACK_PATH"); + if (!search_dirs) +- search_dirs = PREFIX "/lib64/:" PREFIX "/lib/:" +- "/usr/lib64/:/usr/lib/:" LIBDIR; ++ search_dirs = NIXPKGS_LIBJACK_PATH; + + while ((p = pw_split_walk(search_dirs, ":", &len, &state))) { + int pathlen; diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch b/nixpkgs/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch new file mode 100644 index 000000000000..b2bcb421befb --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch @@ -0,0 +1,29 @@ +diff --git a/meson.build b/meson.build +index 2107c19ec..20ccdfd9f 100644 +--- a/meson.build ++++ b/meson.build +@@ -380,8 +380,8 @@ lilv_lib = dependency('lilv-0', required: get_option('lv2')) + summary({'lilv (for lv2 plugins)': lilv_lib.found()}, bool_yn: true) + cdata.set('HAVE_LILV', lilv_lib.found()) + +-installed_tests_metadir = pipewire_datadir / 'installed-tests' / pipewire_name +-installed_tests_execdir = pipewire_libexecdir / 'installed-tests' / pipewire_name ++installed_tests_metadir = get_option('installed_test_prefix') / 'share' / 'installed-tests' / pipewire_name ++installed_tests_execdir = get_option('installed_test_prefix') / 'libexec' / 'installed-tests' / pipewire_name + installed_tests_enabled = get_option('installed_tests').allowed() + installed_tests_template = files('template.test.in') + +diff --git a/meson_options.txt b/meson_options.txt +index 961ae2a76..a36e9e45f 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -22,6 +22,9 @@ option('installed_tests', + description: 'Install manual and automated test executables', + type: 'feature', + value: 'disabled') ++option('installed_test_prefix', ++ description: 'Prefix for installed tests', ++ type: 'string') + option('gstreamer', + description: 'Build GStreamer plugins', + type: 'feature', diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch b/nixpkgs/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch new file mode 100644 index 000000000000..b8d8fcb0f905 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch @@ -0,0 +1,30 @@ +diff --git a/meson.build b/meson.build +index b6b4553b..f21c29d8 100644 +--- a/meson.build ++++ b/meson.build +@@ -37,7 +37,10 @@ pipewire_localedir = prefix / get_option('localedir') + pipewire_sysconfdir = prefix / get_option('sysconfdir') + + pipewire_configdir = pipewire_sysconfdir / 'pipewire' +-pipewire_confdatadir = pipewire_datadir / 'pipewire' ++pipewire_confdatadir = get_option('pipewire_confdata_dir') ++if pipewire_confdatadir == '' ++ pipewire_confdatadir = pipewire_datadir / 'pipewire' ++endif + modules_install_dir = pipewire_libdir / pipewire_name + + if host_machine.system() == 'linux' +diff --git a/meson_options.txt b/meson_options.txt +index 9bc33fcd..e4bd2dc1 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -61,6 +61,9 @@ option('jack-devel', + option('libjack-path', + description: 'Where to install the libjack.so library', + type: 'string') ++option('pipewire_confdata_dir', ++ type: 'string', ++ description: 'Directory for pipewire default configuration (defaults to /usr/share/pipewire)') + option('spa-plugins', + description: 'Enable spa plugins integration', + type: 'feature', diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch b/nixpkgs/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch new file mode 100644 index 000000000000..ca7d351257bf --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch @@ -0,0 +1,50 @@ +diff --git a/src/daemon/minimal.conf.in b/src/daemon/minimal.conf.in +index 9c885a38f..c474eb45d 100644 +--- a/src/daemon/minimal.conf.in ++++ b/src/daemon/minimal.conf.in +@@ -111,7 +111,7 @@ context.modules = [ + # access.allowed to list an array of paths of allowed + # apps. + #access.allowed = [ +- # @session_manager_path@ ++ # <session_manager_path> + #] + + # An array of rejected paths. +@@ -359,5 +359,5 @@ context.exec = [ + # It can be interesting to start another daemon here that listens + # on another address with the -a option (eg. -a tcp:4713). + # +- #@pulse_comment@{ path = "@pipewire_path@" args = "-c pipewire-pulse.conf" } ++ #@pulse_comment@{ path = "<pipewire_path>" args = "-c pipewire-pulse.conf" } + ] +diff --git a/src/daemon/pipewire.conf.in b/src/daemon/pipewire.conf.in +index 697bf094d..3a7b54ddd 100644 +--- a/src/daemon/pipewire.conf.in ++++ b/src/daemon/pipewire.conf.in +@@ -142,7 +142,7 @@ context.modules = [ + # access.allowed to list an array of paths of allowed + # apps. + #access.allowed = [ +- # @session_manager_path@ ++ # <session_manager_path> + #] + + # An array of rejected paths. +@@ -294,7 +294,7 @@ context.exec = [ + # but it is better to start it as a systemd service. + # Run the session manager with -h for options. + # +- @sm_comment@{ path = "@session_manager_path@" args = "@session_manager_args@" ++ @sm_comment@{ path = "<session_manager_path>" args = "@session_manager_args@" + @sm_comment@ condition = [ { exec.session-manager = null } { exec.session-manager = true } ] } + # + # You can optionally start the pulseaudio-server here as well +@@ -302,6 +302,6 @@ context.exec = [ + # It can be interesting to start another daemon here that listens + # on another address with the -a option (eg. -a tcp:4713). + # +- @pulse_comment@{ path = "@pipewire_path@" args = "-c pipewire-pulse.conf" ++ @pulse_comment@{ path = "<pipewire_path>" args = "-c pipewire-pulse.conf" + @pulse_comment@ condition = [ { exec.pipewire-pulse = null } { exec.pipewire-pulse = true } ] } + ] diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0095-spa-data-dir.patch b/nixpkgs/pkgs/development/libraries/pipewire/0095-spa-data-dir.patch new file mode 100644 index 000000000000..d8241a809f65 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/0095-spa-data-dir.patch @@ -0,0 +1,12 @@ +diff --git a/meson.build b/meson.build +index 56599ebd1..3bed2d3e3 100644 +--- a/meson.build ++++ b/meson.build +@@ -54,7 +54,7 @@ else + endif + + spa_plugindir = pipewire_libdir / spa_name +-spa_datadir = pipewire_datadir / spa_name ++spa_datadir = pipewire_libdir / spa_name + + alsadatadir = pipewire_datadir / 'alsa-card-profile' / 'mixer' diff --git a/nixpkgs/pkgs/development/libraries/pipewire/default.nix b/nixpkgs/pkgs/development/libraries/pipewire/default.nix new file mode 100644 index 000000000000..fdc514c286b7 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/default.nix @@ -0,0 +1,237 @@ +{ stdenv +, lib +, buildPackages +, fetchFromGitLab +, fetchpatch +, python3 +, meson +, ninja +, eudev +, systemd +, enableSystemd ? true +, pkg-config +, docutils +, doxygen +, graphviz +, glib +, dbus +, alsa-lib +, libjack2 +, libusb1 +, udev +, libsndfile +, vulkan-headers +, vulkan-loader +, webrtc-audio-processing +, ncurses +, readline # meson can't find <7 as those versions don't have a .pc file +, lilv +, makeFontsConf +, callPackage +, nixosTests +, withValgrind ? lib.meta.availableOn stdenv.hostPlatform valgrind +, valgrind +, libcameraSupport ? true +, libcamera +, libdrm +, gstreamerSupport ? true +, gst_all_1 +, ffmpegSupport ? true +, ffmpeg +, bluezSupport ? true +, bluez +, sbc +, libfreeaptx +, ldacbt +, liblc3 +, fdk_aac +, libopus +, nativeHspSupport ? true +, nativeHfpSupport ? true +, nativeModemManagerSupport ? true +, modemmanager +, ofonoSupport ? true +, hsphfpdSupport ? true +, pulseTunnelSupport ? true +, libpulseaudio +, zeroconfSupport ? true +, avahi +, raopSupport ? true +, openssl +, rocSupport ? true +, roc-toolkit +, x11Support ? true +, libcanberra +, xorg +, mysofaSupport ? true +, libmysofa +, tinycompress +, ffadoSupport ? stdenv.buildPlatform.canExecute stdenv.hostPlatform +, ffado +}: + +let + mesonEnableFeature = b: if b then "enabled" else "disabled"; + + self = stdenv.mkDerivation rec { + pname = "pipewire"; + version = "0.3.79"; + + outputs = [ + "out" + "lib" + "pulse" + "jack" + "dev" + "doc" + "man" + "installedTests" + ]; + + src = fetchFromGitLab { + domain = "gitlab.freedesktop.org"; + owner = "pipewire"; + repo = "pipewire"; + rev = version; + sha256 = "sha256-pqs991pMqz3IQE+NUk0VNzZS4ExwfoZqBQDWBSGdWcs="; + }; + + patches = [ + # Break up a dependency cycle between outputs. + ./0040-alsa-profiles-use-libdir.patch + # Change the path of the pipewire-pulse binary in the service definition. + ./0050-pipewire-pulse-path.patch + # Load libjack from a known location + ./0060-libjack-path.patch + # Move installed tests into their own output. + ./0070-installed-tests-path.patch + # Add option for changing the config install directory + ./0080-pipewire-config-dir.patch + # Remove output paths from the comments in the config templates to break dependency cycles + ./0090-pipewire-config-template-paths.patch + # Place SPA data files in lib output to avoid dependency cycles + ./0095-spa-data-dir.patch + ]; + + strictDeps = true; + nativeBuildInputs = [ + docutils + doxygen + graphviz + meson + ninja + pkg-config + python3 + glib + ]; + + buildInputs = [ + alsa-lib + dbus + glib + libjack2 + libusb1 + libsndfile + lilv + ncurses + readline + udev + vulkan-headers + vulkan-loader + webrtc-audio-processing + tinycompress + ] ++ (if enableSystemd then [ systemd ] else [ eudev ]) + ++ lib.optionals gstreamerSupport [ gst_all_1.gst-plugins-base gst_all_1.gstreamer ] + ++ lib.optionals libcameraSupport [ libcamera libdrm ] + ++ lib.optional ffmpegSupport ffmpeg + ++ lib.optionals bluezSupport [ bluez libfreeaptx ldacbt liblc3 sbc fdk_aac libopus ] + ++ lib.optional nativeModemManagerSupport modemmanager + ++ lib.optional pulseTunnelSupport libpulseaudio + ++ lib.optional zeroconfSupport avahi + ++ lib.optional raopSupport openssl + ++ lib.optional rocSupport roc-toolkit + ++ lib.optionals x11Support [ libcanberra xorg.libX11 xorg.libXfixes ] + ++ lib.optional mysofaSupport libmysofa + ++ lib.optional ffadoSupport ffado; + + # Valgrind binary is required for running one optional test. + nativeCheckInputs = lib.optional withValgrind valgrind; + + mesonFlags = [ + "-Ddocs=enabled" + "-Dudevrulesdir=lib/udev/rules.d" + "-Dinstalled_tests=enabled" + "-Dinstalled_test_prefix=${placeholder "installedTests"}" + "-Dpipewire_pulse_prefix=${placeholder "pulse"}" + "-Dlibjack-path=${placeholder "jack"}/lib" + "-Dlibv4l2-path=${placeholder "out"}/lib" + "-Dlibcamera=${mesonEnableFeature libcameraSupport}" + "-Dlibffado=${mesonEnableFeature ffadoSupport}" + "-Droc=${mesonEnableFeature rocSupport}" + "-Dlibpulse=${mesonEnableFeature pulseTunnelSupport}" + "-Davahi=${mesonEnableFeature zeroconfSupport}" + "-Dgstreamer=${mesonEnableFeature gstreamerSupport}" + "-Dsystemd-system-service=${mesonEnableFeature enableSystemd}" + "-Dudev=${mesonEnableFeature (!enableSystemd)}" + "-Dudevrulesdir=${placeholder "out"}/lib/udev/rules.d" + "-Dffmpeg=${mesonEnableFeature ffmpegSupport}" + "-Dbluez5=${mesonEnableFeature bluezSupport}" + "-Dbluez5-backend-hsp-native=${mesonEnableFeature nativeHspSupport}" + "-Dbluez5-backend-hfp-native=${mesonEnableFeature nativeHfpSupport}" + "-Dbluez5-backend-native-mm=${mesonEnableFeature nativeModemManagerSupport}" + "-Dbluez5-backend-ofono=${mesonEnableFeature ofonoSupport}" + "-Dbluez5-backend-hsphfpd=${mesonEnableFeature hsphfpdSupport}" + # source code is not easily obtainable + "-Dbluez5-codec-lc3plus=disabled" + "-Dbluez5-codec-lc3=${mesonEnableFeature bluezSupport}" + "-Dsysconfdir=/etc" + "-Dpipewire_confdata_dir=${placeholder "lib"}/share/pipewire" + "-Draop=${mesonEnableFeature raopSupport}" + "-Dsession-managers=" + "-Dvulkan=enabled" + "-Dx11=${mesonEnableFeature x11Support}" + "-Dx11-xfixes=${mesonEnableFeature x11Support}" + "-Dlibcanberra=${mesonEnableFeature x11Support}" + "-Dlibmysofa=${mesonEnableFeature mysofaSupport}" + "-Dsdl2=disabled" # required only to build examples, causes dependency loop + "-Drlimits-install=false" # installs to /etc, we won't use this anyway + "-Dcompress-offload=enabled" + ]; + + # Fontconfig error: Cannot load default config file + FONTCONFIG_FILE = makeFontsConf { fontDirectories = [ ]; }; + + doCheck = true; + + postUnpack = '' + patchShebangs source/doc/input-filter.sh + patchShebangs source/doc/input-filter-h.sh + ''; + + postInstall = '' + ${lib.optionalString enableSystemd '' + moveToOutput "share/systemd/user/pipewire-pulse.*" "$pulse" + moveToOutput "lib/systemd/user/pipewire-pulse.*" "$pulse" + ''} + + rm $out/bin/pipewire-pulse + mkdir -p $pulse/bin + ln -sf $out/bin/pipewire $pulse/bin/pipewire-pulse + + moveToOutput "bin/pw-jack" "$jack" + ''; + + passthru.tests.installed-tests = nixosTests.installed-tests.pipewire; + + meta = with lib; { + description = "Server and user space API to deal with multimedia pipelines"; + changelog = "https://gitlab.freedesktop.org/pipewire/pipewire/-/releases/${version}"; + homepage = "https://pipewire.org/"; + license = licenses.mit; + platforms = platforms.linux; + maintainers = with maintainers; [ kranzes k900 ]; + }; + }; + +in +self diff --git a/nixpkgs/pkgs/development/libraries/pipewire/wireplumber.nix b/nixpkgs/pkgs/development/libraries/pipewire/wireplumber.nix new file mode 100644 index 000000000000..4e249459d7ae --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/wireplumber.nix @@ -0,0 +1,83 @@ +{ lib +, stdenv +, fetchFromGitLab +, nix-update-script +, # base build deps + meson +, pkg-config +, ninja +, # docs build deps + python3 +, doxygen +, graphviz +, # GI build deps + gobject-introspection +, # runtime deps + glib +, systemd +, lua5_4 +, pipewire +, # options + enableDocs ? true +, enableGI ? true +}: +let + mesonEnableFeature = b: if b then "enabled" else "disabled"; +in +stdenv.mkDerivation rec { + pname = "wireplumber"; + version = "0.4.14"; + + outputs = [ "out" "dev" ] ++ lib.optional enableDocs "doc"; + + src = fetchFromGitLab { + domain = "gitlab.freedesktop.org"; + owner = "pipewire"; + repo = "wireplumber"; + rev = version; + sha256 = "sha256-PKS+WErdZuSU4jrFHQcRbnZIHlnlv06R6ZxIAIBptko="; + }; + + nativeBuildInputs = [ + meson + pkg-config + ninja + ] ++ lib.optionals enableDocs [ + graphviz + ] ++ lib.optionals enableGI [ + gobject-introspection + ] ++ lib.optionals (enableDocs || enableGI) [ + doxygen + (python3.pythonForBuild.withPackages (ps: with ps; + lib.optionals enableDocs [ sphinx sphinx-rtd-theme breathe ] ++ + lib.optionals enableGI [ lxml ] + )) + ]; + + buildInputs = [ + glib + systemd + lua5_4 + pipewire + ]; + + mesonFlags = [ + "-Dsystem-lua=true" + "-Delogind=disabled" + "-Ddoc=${mesonEnableFeature enableDocs}" + "-Dintrospection=${mesonEnableFeature enableGI}" + "-Dsystemd-system-service=true" + "-Dsystemd-system-unit-dir=${placeholder "out"}/lib/systemd/system" + "-Dsysconfdir=/etc" + ]; + + passthru.updateScript = nix-update-script { }; + + meta = with lib; { + description = "A modular session / policy manager for PipeWire"; + homepage = "https://pipewire.org"; + license = licenses.mit; + platforms = platforms.linux; + maintainers = with maintainers; [ k900 ]; + }; +} |