On Tue, Mar 16, 2021 at 6:49 PM Haelwenn (lanodan) Monnier
<[email protected]> wrote:
>
> Gstreamer switched to meson in 1.16.0 and removed autotools support in 1.18.0,
> this eclass is an update of gstreamer.eclass.
>
> One significant change between autotools and meson is that in the latter we
> don't have easily extractable semantics in the buildsystem to get a list
> of plugins with extraneous dependencies that we currently split in other
> packages.
> Hence the rather ugly but currently required GST_PLUGINS_DISABLED block.
>
> Fixes: https://bugs.gentoo.org/690468
>
> Signed-off-by: Haelwenn (lanodan) Monnier <[email protected]>
> ---
> eclass/gstreamer-meson.eclass | 293 ++++++++++++++++++++++++++++++++++
> 1 file changed, 293 insertions(+)
> create mode 100644 eclass/gstreamer-meson.eclass
>
> diff --git a/eclass/gstreamer-meson.eclass b/eclass/gstreamer-meson.eclass
> new file mode 100644
> index 00000000000..263deeb08aa
> --- /dev/null
> +++ b/eclass/gstreamer-meson.eclass
> @@ -0,0 +1,293 @@
> +# Copyright 1999-2021 Gentoo Authors
> +# Distributed under the terms of the GNU General Public License v2
> +
> +# @ECLASS: gstreamer-meson.eclass
> +# @MAINTAINER:
> +# [email protected]
> +# @AUTHOR:
> +# Michał Górny <[email protected]>
> +# Gilles Dartiguelongue <[email protected]>
> +# Saleem Abdulrasool <[email protected]>
> +# foser <[email protected]>
> +# zaheerm <[email protected]>
> +# Steven Newbury
> +# Haelwenn (lanodan) Monnier <[email protected]>
> +# @SUPPORTED_EAPIS: 5 6
> +# @BLURB: Helps building core & split gstreamer plugins.
> +# @DESCRIPTION:
> +# Eclass to make external gst-plugins emergable on a per-plugin basis
> +# and to solve the problem with gst-plugins generating far too much
> +# unneeded dependencies.
> +#
> +# GStreamer consuming applications should depend on the specific plugins
> +# they need as defined in their source code. Usually you can find that
> +# out by grepping the source tree for 'factory_make'. If it uses playbin
> +# plugin, consider adding media-plugins/gst-plugins-meta dependency, but
> +# also list any packages that provide explicitly requested plugins.
> +
> +inherit eutils multilib meson multilib-minimal toolchain-funcs versionator
> xdg-utils
> +
> +case "${EAPI:-0}" in
> + 5|6)
> + ;;
> + 0|1|2|3|4)
> + die "EAPI=\"${EAPI:-0}\" is not supported anymore"
> + ;;
> + *)
> + die "EAPI=\"${EAPI}\" is not supported yet"
> + ;;
> +esac
> +
> +# @ECLASS-VARIABLE: GST_PLUGINS_ENABLED
> +# @DESCRIPTION:
> +# Defines the plugins to be built.
> +# May be set by an ebuild and contain more than one indentifier, space
> +# seperated (only src_configure can handle mutiple plugins at this time).
> +: ${GST_PLUGINS_ENABLED:=${PN/gst-plugins-/}}
> +
> +# @ECLASS-VARIABLE: GST_PLUGINS_DISABLED
> +# @DESCRIPTION:
> +# Defines the plugins to not be built, GST_PLUGINS_ENABLED overrides it.
> +# May be set by an ebuild and contain more than one indentifier, space
> +# seperated (only src_configure can handle mutiple plugins at this time).
> +case "${GST_ORG_MODULE}" in
> + # copied GST_PLUGINS_DISABLED from media-libs/${GST_ORG_MODULE} then
> added GST_PLUGINS_ENABLED
> + gst-plugins-bad)
> + # removed from list: shm ipcpipeline gl
> + GST_PLUGINS_DISABLED="aom avtp androidmedia applemedia
> assrender bluez bs2b bz2 chromaprint closedcaption colormanagement curl
> curl-ssh2 d3dvideosink d3d11 dash dc1394 decklink directfb directsound dtls
> dts dvb faac faad fbdev fdkaac flite fluidsynth gme gsm iqa kate kms ladspa
> libde265 libmms lv2 mediafoundation microdns modplug mpeg2enc mplex msdk
> musepack neon nvcodec ofa openal openexr openh264 openjpeg openmpt openni2
> opensles opus resindvd rsvg rtmp sbc sctp smoothstreaming sndfile soundtouch
> spandsp srt srtp svthevcenc teletext tinyalsa transcode ttml uvch264 va
> voaacenc voamrwbenc vulkan wasapi wasapi2 webp webrtc webrtcdsp wildmidi
> winks winscreencap x265 zbar zxing wpe magicleap v4l2codecs hls opencv"
> + GST_PLUGINS_DISABLED="${GST_PLUGINS_DISABLED} accurip
> adpcmdec adpcmenc aiff asfmux audiobuffersplit audiofxbad audiolatency
> audiomixmatrix audiovisualizers autoconvert bayer camerabin2 coloreffects deb
> ugutils dvbsubenc dvbsuboverlay dvdspu faceoverlay festival fieldanalysis
> freeverb frei0r gaudieffects gdp geometrictransform id3tag inter interlace
> ivfpars e ivtc jp2kdecimator jpegformat librfb midi mpegdemux mpegpsmux
> mpegtsdemux mpegtsmux mxf netsim onvif pcapparse pnm proxy rawparse
> removesilence rist rtmp2 rtp sdp segmentclip siren smooth speed subenc
> switchbin timecode videofilters videoframe_audiolevel videoparsers
> videosignal vmnc y4m"
> + ;;
> + gst-plugins-base)
> + GST_PLUGINS_DISABLED="cdparanoia libvisual opus tremor"
> + GST_PLUGINS_DISABLED="${GST_PLUGINS_DISABLED} adder app
> audioconvert audiomixer audiorate audioresample audiotestsrc compositor
> encoding gio gio-typefinder overlaycomposition pbtypes playback rawparse
> subparse tcp typefind videoconvert videorate videoscale videotestsrc volume"
> + ;;
> + gst-plugins-good)
> + GST_PLUGINS_DISABLED="aalib cairo directsound dv dv1394 flac
> gdk-pixbuf gtk3 jack jpeg lame libcaca mpg123 oss oss4 osxaudio osxvideo png
> pulse qt5 shout2 soup speex taglib twolame vpx waveform wavpack rpicamsrc
> ximagesrc v4l2"
> + GST_PLUGINS_DISABLED="${GST_PLUGINS_DISABLED} alpha apetag
> audiofx audioparsers auparse autodetect avi cutter debugutils deinterlace
> dtmf effectv equalizer flv flx goom goom2k1 icydemux id3demux imagefreeze
> interleave isomp4 law level matroska monoscope multifile multipart replaygain
> rtp rtpmanager rtsp shapewipe smpte spectrum udp videobox videocrop
> videofilter videomixer wavenc wavparse y4m"
> + ;;
> + gst-plugins-ugly)
> + GST_PLUGINS_DISABLED="a52dec amrnb amrwbdec cdio dvdread
> mpeg2dec sidplay x264"
> + GST_PLUGINS_DISABLED="${GST_PLUGINS_DISABLED} asfdemux
> dvdlpcmdec dvdsub realmedia xingmux"
> + ;;
> +esac
> +
> +# @ECLASS-VARIABLE: GST_PLUGINS_BUILD_DIR
> +# @DESCRIPTION:
> +# Actual build directory of the plugin.
> +# Most often the same as the configure switch name.
> +: ${GST_PLUGINS_BUILD_DIR:=${PN/gst-plugins-/}}
> +
> +# @ECLASS-VARIABLE: GST_TARBALL_SUFFIX
> +# @DESCRIPTION:
> +# Most projects hosted on gstreamer.freedesktop.org mirrors provide
> +# tarballs as tar.bz2 or tar.xz. This eclass defaults to xz. This is
> +# because the gstreamer mirrors are moving to only have xz tarballs for
> +# new releases.
> +: ${GST_TARBALL_SUFFIX:="xz"}
> +
> +# Even though xz-utils are in @system, they must still be added to DEPEND;
> see
> +#
> https://archives.gentoo.org/gentoo-dev/msg_a0d4833eb314d1be5d5802a3b710e0a4.xml
> +if [[ ${GST_TARBALL_SUFFIX} == "xz" ]]; then
> + DEPEND="${DEPEND} app-arch/xz-utils"
> +fi
> +
> +# @ECLASS-VARIABLE: GST_ORG_MODULE
> +# @DESCRIPTION:
> +# Name of the module as hosted on gstreamer.freedesktop.org mirrors.
> +# Leave unset if package name matches module name.
> +: ${GST_ORG_MODULE:=$PN}
> +
> +# @ECLASS-VARIABLE: GST_ORG_PVP
> +# @INTERNAL
> +# @DESCRIPTION:
> +# Major and minor numbers of the version number.
> +: ${GST_ORG_PVP:=$(get_version_component_range 1-2)}
> +
> +
> +DESCRIPTION="${BUILD_GST_PLUGINS} plugin for gstreamer"
> +HOMEPAGE="https://gstreamer.freedesktop.org/"
> +SRC_URI="https://gstreamer.freedesktop.org/src/${GST_ORG_MODULE}/${GST_ORG_MODULE}-${PV}.tar.${GST_TARBALL_SUFFIX}"
> +
> +LICENSE="GPL-2"
> +case ${GST_ORG_PVP} in
> + 1.*) SLOT="1.0"; GST_MIN_PV="1.2.4-r1" ;;
> + *) die "Unkown gstreamer release."
> +esac
> +
> +S="${WORKDIR}/${GST_ORG_MODULE}-${PV}"
> +
> +RDEPEND="
> + >=dev-libs/glib-2.38.2-r1:2[${MULTILIB_USEDEP}]
> + >=media-libs/gstreamer-${GST_MIN_PV}:${SLOT}[${MULTILIB_USEDEP}]
> +"
> +DEPEND="
> + >=sys-apps/sed-4
> + >=virtual/pkgconfig-0-r1[${MULTILIB_USEDEP}]
> +"
> +
> +# Export common multilib phases.
> +multilib_src_configure() { gstreamer_multilib_src_configure; }
> +
> +if [[ ${PN} != ${GST_ORG_MODULE} ]]; then
> + # Do not run test phase for invididual plugin ebuilds.
> + RESTRICT="test"
> + RDEPEND="${RDEPEND}
> +
> >=media-libs/${GST_ORG_MODULE}-${PV}:${SLOT}[${MULTILIB_USEDEP}]"
> +
> + # Export multilib phases used for split builds.
> + multilib_src_compile() { gstreamer_multilib_src_compile; }
> + multilib_src_install() { gstreamer_multilib_src_install; }
> + multilib_src_install_all() { gstreamer_multilib_src_install_all; }
> +else
> + IUSE="nls"
> + DEPEND="${DEPEND} nls? ( >=sys-devel/gettext-0.17 )"
> +
> + multilib_src_compile() { eninja; }
> + multilib_src_install() { DESTDIR="${D}" eninja install; }
> +fi
> +
> +DEPEND="${DEPEND} ${RDEPEND}"
> +
> +# @FUNCTION: gstreamer_environment_reset
> +# @INTERNAL
> +# @DESCRIPTION:
> +# Clean up environment for clean builds.
> +# >=dev-lang/orc-0.4.23 rely on environment variables to find a place to
> +# allocate files to mmap.
> +gstreamer_environment_reset() {
> + xdg_environment_reset
> +}
> +
> +# @FUNCTION: gstreamer_get_plugin_dir
> +# @USAGE: gstreamer_get_plugin_dir [<build_dir>]
> +# @INTERNAL
> +# @DESCRIPTION:
> +# Finds plugin build directory and output it.
> +# Defaults to ${GST_PLUGINS_BUILD_DIR} if argument is not provided
> +gstreamer_get_plugin_dir() {
> + local build_dir=${1:-${GST_PLUGINS_BUILD_DIR}}
> +
> + if [[ ! -d ${S}/ext/${build_dir} ]]; then
> + if [[ ! -d ${S}/sys/${build_dir} ]]; then
> + ewarn "No such plugin directory"
> + die
> + fi
> + einfo "Building system plugin in ${build_dir}..." >&2
> + echo sys/${build_dir}
> + else
> + einfo "Building external plugin in ${build_dir}..." >&2
> + echo ext/${build_dir}
> + fi
> +}
> +
> +# @FUNCTION: gstreamer_multilib_src_configure
> +# @DESCRIPTION:
> +# Handles logic common to configuring gstreamer plugins
> +gstreamer_multilib_src_configure() {
> + local plugin emesonargs=() EMESON_SOURCE=${EMESON_SOURCE:-${S}}
> +
> + gstreamer_environment_reset
> +
> + # app-editor/vis regex for meson_options.txt: :x/option\('([^']*)'.*/
> c/\1/
> + for plugin in ${GST_PLUGINS_DISABLED} ; do
> + emesonargs+=( -D${plugin}=disabled )
> + done
> +
> + for plugin in ${GST_PLUGINS_ENABLED} ; do
> + emesonargs+=( -D${plugin}=enabled )
> + done
> +
> + if grep -q "option(\'orc\'" "${EMESON_SOURCE}"/meson_options.txt ;
> then
> + if in_iuse orc ; then
> + emesonargs+=( -Dorc=$(usex orc enabled disabled) )
> + else
> + emesonargs+=( -Dorc=disabled )
> + fi
> + fi
> +
> + if grep -q "option(\'maintainer-mode\'"
> "${EMESON_SOURCE}"/meson_options.txt ; then
> + gst_conf+=( -Dmaintainer-mode=disabled )
> + fi
> +
> + if grep -q "option(\'schemas-compile\'"
> "${EMESON_SOURCE}"/meson_options.txt ; then
> + gst_conf+=( -Dschemas-compile=disabled )
> + fi
> +
> + if [[ ${PN} == ${GST_ORG_MODULE} ]]; then
> + emesonargs+=( $(meson_feature nls) )
> + fi
> +
> + einfo "Configuring to build ${GST_PLUGINS_ENABLED} plugin(s) ..."
> + emesonargs+=(
> + -Dexamples=disabled
> + -Dpackage-name="Gentoo GStreamer ebuild"
> + -Dpackage-origin="https://www.gentoo.org"
> + "${@}"
> + )
> + meson_src_configure
> +}
> +
> +read -d '' __MESON_EXTRACT_TARGET_FILENAME <<"EOF"
> +import json
> +import sys
> +
> +with open("meson-info/intro-targets.json", "r") as targets_file:
> + data = json.load(targets_file)
> +
> +for i in range(len(data)):
Not grokking this loop.
for target in data.values():
if target['installed']:
...
Is likely sufficient.
Also this short script has no error handling, so any malformed json
will crash it, as well any json objects missing these fields; I assume
that's OK because...those all go to stderr, right; and print() goes to
stdout by default, so it won't hurt _gstreamer_get_target_filename ?
> + target = data[i]
> + if target['installed']:
> + if sys.argv[1] in target['filename'][0]:
> + print(target['filename'][0] + ':' +
> target['install_filename'][0])
> +EOF
> +
> +# @FUNCTION: _gstreamer_get_target_filename
> +# @INTERNAL
> +# @DESCRIPTION:
> +# Extracts build and target filenames from meson-data for given submatch
> +_gstreamer_get_target_filename() {
> + python -c "${__MESON_EXTRACT_TARGET_FILENAME}" "$@"
> +}
> +
> +# @FUNCTION: gstreamer_multilib_src_compile
> +# @DESCRIPTION:
> +# Compiles requested gstreamer plugin.
> +gstreamer_multilib_src_compile() {
> + local plugin_dir plugin
> +
> + for plugin_dir in ${GST_PLUGINS_BUILD_DIR} ; do
> + plugin=$(_gstreamer_get_target_filename
> $(gstreamer_get_plugin_dir ${plugin_dir}))
> + plugin_path="${plugin%%:*}"
> + eninja "${plugin_path/"${BUILD_DIR}/"}"
> + done
> +}
> +
> +# @FUNCTION: gstreamer_multilib_src_install
> +# @DESCRIPTION:
> +# Installs requested gstreamer plugin.
> +gstreamer_multilib_src_install() {
> + local plugin_dir plugin
> +
> + for plugin_dir in ${GST_PLUGINS_BUILD_DIR} ; do
> + for plugin in $(_gstreamer_get_target_filename
> $(gstreamer_get_plugin_dir ${plugin_dir})); do
> + local install_filename="${plugin##*:}"
> + insinto "${install_filename%/*}"
> + doins "${plugin%%:*}"
> + done
> + done
> +}
> +
> +# @FUNCTION: gstreamer_multilib_src_install_all
> +# @DESCRIPTION:
> +# Installs documentation for requested gstreamer plugin, and removes .la
> +# files.
> +gstreamer_multilib_src_install_all() {
> + local plugin_dir
> +
> + for plugin_dir in ${GST_PLUGINS_BUILD_DIR} ; do
> + local dir=$(gstreamer_get_plugin_dir ${plugin_dir})
> + [[ -e ${dir}/README ]] && dodoc "${dir}"/README
> + done
> +
> + prune_libtool_files --modules
> +}
> --
> 2.26.2
>
>