On Tue, Mar 16, 2021 at 6:49 PM Haelwenn (lanodan) Monnier
<cont...@hacktivis.me> 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 <cont...@hacktivis.me>
> ---
>  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:
> +# gstrea...@gentoo.org
> +# @AUTHOR:
> +# Michał Górny <mgo...@gentoo.org>
> +# Gilles Dartiguelongue <e...@gentoo.org>
> +# Saleem Abdulrasool <compn...@gentoo.org>
> +# foser <fo...@gentoo.org>
> +# zaheerm <zahe...@gentoo.org>
> +# Steven Newbury
> +# Haelwenn (lanodan) Monnier <cont...@hacktivis.me>
> +# @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
>
>

Reply via email to