[OE-core] [WIP][PATCH 01/12] gstreamer: Add common .inc files for meson based recipes

Carlos Rafael Giani crg7475 at mailbox.org
Thu Dec 19 11:46:42 UTC 2019


First we should discuss the leftover TODOs I think. Since these may not 
be trivial issues, it would be better to take a look at them and then 
decide on a case-by-case basis whether to fix them now or later.

For convenience, I copy-paste these bits from an older RFC email:


========

Noteworthy changes:

- A lot of autotools/M4 related patches are just gone. Well, obviously 
But it is surprising just how much fewer patches there are now.

- gstreamer1.0-libav no longer builds its own FFmpeg copy. This was done 
in the past because there were no stable versioned FFmpeg releases. They 
do exist now, so in meson based builds, gst-libav just builds the actual 
plugin code, meaning that the build time is much shorter, most of the 
recipe code (and all of the patches) are gone (because they were FFmpeg 
specific), and the libgstlibav.so binary in /usr/lib/gstreamer-1.0/ is 
much smaller. This also means that FFmpeg specials do not have to be 
added both to the FFmpeg and to the gstreamer1.0-libav recipe anymore.

- gstreamer1.0-plugins.inc was replaced by 
gstreamer1.0-plugins-common.inc, and gst-plugins-package.inc by 
gstreamer1.0-plugins-packaging.inc . These names are clearer. 
gst-plugins-package.inc in particular was named that way because it used 
to be shared between GStreamer 0.10 and 1.0 recipes. Since the former 
are gone by now, there's no point in keeping that name.

- gstreamer1.0 ptest is now done differently. Originally, make was 
installed on the target and the Makefile was run by the run-ptest 
script. Now, gstreamer is patched to allow for installable tests that 
are accompanied by individual shell scripts that set up the necessary 
environment variables, along with .test files so that the 
gnome-desktop-testing test runner can be used in run-ptest to run the 
unit tests. This also makes it possible to inherit from ptest-gnome in 
the gstreamer1.0 recipe. The patch against gstreamer is necessary 
because by default, one runs the test by executing "meson test". I don't 
think installing meson along with all of the necessary meson.build 
scripts is a practical approach.

- OpenGL packageconfigs now work quite differently in 
gstreamer1.0-plugins-base, since the meson options distinguish between 
OpenGL APIs, platforms, and windowing systems.

- zlib in gstreamer1.0-plugins-base and -good is now required. I don't 
think this is a big deal, since it is also a dependency of GLib itself, 
so zlib has to be present on the rootfs anyway.


There are some TODOs left that I want to bring up here for discussion:

- The aforementioned PTest approach needs some review. Also, initially, 
I thought I'd have to add PTest support to several GStreamer recipes, 
which is why I isolated the ptest code in gstreamer1.0-ptest.inc . But 
it turned out that only the gstreamer1.0 recipe needs it. I am unsure if 
I should just merge that .inc into that recipe, since there's no reason 
why the tests from other recipes shouldn't be "ptest-ified" in the 
future. And then that .inc would be useful to have. (Tests from the 
plugin sets may be partially tough to run, since some of them create X11 
windows etc.)

- The code in gstreamer1.0-ptest.inc sets up run-ptest in a rather 
uncommon way, since that file has to be autogenerated.

- gstreamer1.0_1.16.1.bb and gstreamer1.0-plugins-common.inc both 
contain a "gettext_oemeson" function to set up meson NLS options. 
Ideally, this functionality would be part of the gettext bbclass itself. 
However, my bitbake/OE knowledge does not suffice to do that, since with 
meson, you want to be able to configure what the enable/disable flags 
should be ("enabled"/"disabled", "true"/"false" etc.); that's why for 
example the gtk-doc bbclass defines GTKDOC_MESON_OPTION, 
GTKDOC_MESON_ENABLE_FLAG, GTKDOC_MESON_DISABLE_FLAG. I am not sure how 
to combine such variables with this kind of custom python code, and 
still allow for customized values in other recipes. In other words, if I 
first get a "NLS_MESON_DISABLE_FLAG" value with getValue() in a modified 
gettext_oemeson function, then I might not get the value I expect, since 
it will get the initial value (the one set with ?=), not necessarily the 
one that is redefined by a recipe.

- The OpenGL packageconfigs are handled by a get_opengl_cmdline_list 
function in gstreamer1.0-plugins-base_1.16.1.bb . I did this so that a 
comma-separated list can be generated out of the packageconfigs that are 
(a) part of PACKAGECONFIG and (b) part of the newly added 
OPENGL_APIS/OPENGL_PLATFORMS/OPENGL_WINSYS lists. I do not know if 
there's a better approach for this. The intent is that other layers 
(most notably BSP layers) can add custom packageconfig names to these 
lists. One example would be OPENGL_WINSYS += "viv-fb" in meta-freescale. 
Another would be OPENGL_WINSYS += "dispmanx" in meta-raspberrypi.

- gstreamer1.0-python_1.16.1.bb currently has a problem in that the 
gst-python code tries to load /usr/lib/libpython3.7m.so. But, in a 
regular installation, only /usr/lib/libpython3.7m.so.1.0 would be 
availale. It is possible to adjust the libpython path & name during the 
build. But - what would it be adjusted to? How would the recipe know 
that "/usr/lib/libpython3.7m.so.1.0" is the correct choice? Or perhaps 
would it make sense to add the /usr/lib/libpython3.7m.so symlink to the 
regular (as in: non-dev) Python package?

========



On 18.12.19 22:14, Alexander Kanavin wrote:
> Thanks :) Will there be a more refined version, or should these be 
> merged already, with followup fixing as needed?
>
> Alex
>
> On Sun, 15 Dec 2019 at 13:55, Carlos Rafael Giani <crg7475 at mailbox.org 
> <mailto:crg7475 at mailbox.org>> wrote:
>
>     * gstreamer1.0-plugins-common.inc
>       The old gstreamer1.0-plugins.inc file, adapted for meson
>     * gstreamer1.0-plugins-packaging.inc
>       The old gst-plugins-package.inc file, adapted for meson
>     * gstreamer1.0-ptest.inc
>       Common code for meson based PTest support; autogenerates the
>     run-ptest
>       file and is designed to use the gnome-desktop-testing suite runner
>       (which is why the .inc files inherits from ptest-gnome)
>
>     Signed-off-by: Carlos Rafael Giani <crg7475 at mailbox.org
>     <mailto:crg7475 at mailbox.org>>
>     ---
>      .../gstreamer/gstreamer1.0-plugins-common.inc | 47 +++++++++++++
>      .../gstreamer1.0-plugins-packaging.inc        | 70
>     +++++++++++++++++++
>      .../gstreamer/gstreamer1.0-ptest.inc          | 21 ++++++
>      3 files changed, 138 insertions(+)
>      create mode 100644
>     meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc
>      create mode 100644
>     meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-packaging.inc
>      create mode 100644
>     meta/recipes-multimedia/gstreamer/gstreamer1.0-ptest.inc
>
>     diff --git
>     a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc
>     b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc
>     new file mode 100644
>     index 0000000000..ccf55500a9
>     --- /dev/null
>     +++
>     b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc
>     @@ -0,0 +1,47 @@
>     +# This .inc file contains the common setup for the
>     gstreamer1.0-plugins-*
>     +# plugin set recipes.
>     +
>     +# SUMMARY is set in the actual .bb recipes
>     +HOMEPAGE = "https://gstreamer.freedesktop.org/"
>     +BUGTRACKER =
>     "https://bugzilla.gnome.org/enter_bug.cgi?product=Gstreamer"
>     +SECTION = "multimedia"
>     +
>     +DEPENDS = "gstreamer1.0 glib-2.0-native"
>     +
>     +inherit gettext meson pkgconfig upstream-version-is-even
>     +
>     +require gstreamer1.0-plugins-packaging.inc
>     +
>     +# Orc enables runtime JIT compilation of data processing routines
>     from Orc
>     +# bytecode to SIMD instructions for various architectures
>     (currently SSE, MMX,
>     +# MIPS, Altivec and NEON are supported).
>     +# This value is used in the PACKAGECONFIG values for each plugin
>     set recipe.
>     +# By modifying it, Orc can be enabled/disabled in all of these
>     recipes at once.
>     +GSTREAMER_ORC ?= "orc"
>     +
>     +PACKAGECONFIG[orc] = "-Dorc=enabled,-Dorc=disabled,orc orc-native"
>     +
>     +# TODO: put this in a gettext.bbclass patch (with variables to
>     allow for
>     +# configuring the option name and the enabled/disabled values).
>     +def gettext_oemeson(d):
>     +    if d.getVar('USE_NLS') == 'no':
>     +        return '-Dnls=disabled'
>     +    # Remove the NLS bits if USE_NLS is no or
>     INHIBIT_DEFAULT_DEPS is set
>     +    if d.getVar('INHIBIT_DEFAULT_DEPS') and not
>     oe.utils.inherits(d, 'cross-canadian'):
>     +        return '-Dnls=disabled'
>     +    return '-Dnls=enabled'
>     +
>     +# Not all plugin sets contain examples, so the -Dexamples
>     +# option needs to be added conditionally.
>     +GST_PLUGIN_SET_HAS_EXAMPLES ?= "1"
>     +
>     +EXTRA_OEMESON += " \
>     +    ${@bb.utils.contains('GST_PLUGIN_SET_HAS_EXAMPLES', '1',
>     '-Dexamples=disabled', '', d)} \
>     +    ${@gettext_oemeson(d)} \
>     +"
>     +
>     +GIR_MESON_ENABLE_FLAG = "enabled"
>     +GIR_MESON_DISABLE_FLAG = "disabled"
>     +
>     +# Dynamically generate packages for all enabled plugins
>     +PACKAGES_DYNAMIC = "^${PN}-.*"
>     diff --git
>     a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-packaging.inc
>     b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-packaging.inc
>     new file mode 100644
>     index 0000000000..9a7a1b6afe
>     --- /dev/null
>     +++
>     b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-packaging.inc
>     @@ -0,0 +1,70 @@
>     +# This .inc file contains functionality for automatically splitting
>     +# built plugins into individual packages for each plugin. A -meta
>     +# package is also set up that has no files of its own, but contains
>     +# the names of all plugin packages in its RDEPENDS list.
>     +#
>     +# This is mainly used by the gstreamer1.0-plugins-* plugin set
>     recipes,
>     +# but can be used in any recipe that produces GStreamer plugins.
>     +
>     +PACKAGESPLITFUNCS_prepend = " split_gstreamer10_packages "
>     +PACKAGESPLITFUNCS_append = " set_gstreamer10_metapkg_rdepends "
>     +
>     +python split_gstreamer10_packages () {
>     +    gst_libdir = d.expand('${libdir}/gstreamer-1.0')
>     +    postinst = d.getVar('plugin_postinst')
>     +    glibdir = d.getVar('libdir')
>     +
>     +    # GStreamer libraries
>     +    do_split_packages(d, glibdir, r'^lib(.*)\.so\.*', 'lib%s',
>     'GStreamer 1.0 %s library', extra_depends='', allow_links=True)
>     +    # GStreamer plugin shared objects
>     +    do_split_packages(d, gst_libdir, r'libgst(.*)\.so$',
>     d.expand('${PN}-%s'), 'GStreamer 1.0 plugin for %s',
>     postinst=postinst, extra_depends='')
>     +    # GObject introspection files for GStreamer plugins
>     +    do_split_packages(d, glibdir+'/girepository-1.0',
>     r'Gst(.*)-1.0\.typelib$', d.expand('${PN}-%s-typelib'), 'GStreamer
>     1.0 typelib file for %s', postinst=postinst, extra_depends='')
>     +    # Static GStreamer libraries for development
>     +    do_split_packages(d, gst_libdir, r'libgst(.*)\.a$',
>     d.expand('${PN}-%s-staticdev'), 'GStreamer 1.0 plugin for %s
>     (static development files)', extra_depends='${PN}-staticdev')
>     +}
>     +
>     +python set_gstreamer10_metapkg_rdepends () {
>     +    import os
>     +    import oe.utils
>     +
>     +    # Go through all generated packages (excluding the main
>     package and
>     +    # the -meta package itself) and add them to the -meta package
>     as RDEPENDS.
>     +
>     +    pn = d.getVar('PN')
>     +    metapkg =  pn + '-meta'
>     +    d.setVar('ALLOW_EMPTY_' + metapkg, "1")
>     +    d.setVar('FILES_' + metapkg, "")
>     +    blacklist = [ pn, pn + '-meta' ]
>     +    metapkg_rdepends = []
>     +    pkgdest = d.getVar('PKGDEST')
>     +    for pkg in oe.utils.packages_filter_out_system(d):
>     +        if pkg not in blacklist and pkg not in metapkg_rdepends:
>     +            # See if the package is empty by looking at the
>     contents of its PKGDEST subdirectory.
>     +            # If this subdirectory is empty, then the package is.
>     +            # Empty packages do not get added to the meta
>     package's RDEPENDS
>     +            pkgdir = os.path.join(pkgdest, pkg)
>     +            if os.path.exists(pkgdir):
>     +                dir_contents = os.listdir(pkgdir) or []
>     +            else:
>     +                dir_contents = []
>     +            is_empty = len(dir_contents) == 0
>     +            if not is_empty:
>     +                metapkg_rdepends.append(pkg)
>     +    d.setVar('RDEPENDS_' + metapkg, ' '.join(metapkg_rdepends))
>     +    d.setVar('DESCRIPTION_' + metapkg, pn + ' meta package')
>     +}
>     +
>     +# each plugin-dev depends on PN-dev, plugin-staticdev on PN-staticdev
>     +# so we need them even when empty (like in gst-plugins-good case)
>     +ALLOW_EMPTY_${PN} = "1"
>     +ALLOW_EMPTY_${PN}-dev = "1"
>     +ALLOW_EMPTY_${PN}-staticdev = "1"
>     +
>     +PACKAGES += "${PN}-apps ${PN}-meta ${PN}-glib"
>     +
>     +FILES_${PN} = ""
>     +FILES_${PN}-apps = "${bindir}"
>     +FILES_${PN}-glib = "${datadir}/glib-2.0"
>     +
>     +RRECOMMENDS_${PN} += "${PN}-meta"
>     diff --git
>     a/meta/recipes-multimedia/gstreamer/gstreamer1.0-ptest.inc
>     b/meta/recipes-multimedia/gstreamer/gstreamer1.0-ptest.inc
>     new file mode 100644
>     index 0000000000..74368c4cd8
>     --- /dev/null
>     +++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-ptest.inc
>     @@ -0,0 +1,21 @@
>     +inherit ptest-gnome
>     +
>     +TEST_FILES_PATH =
>     "${datadir}/installed-tests/gstreamer-1.0/test-files"
>     +RUN_PTEST_FILE = "${D}${PTEST_PATH}/run-ptest"
>     +
>     +EXTRA_OEMESON += "-Dtest-files-path=${TEST_FILES_PATH}"
>     +
>     +# Using do_install_ptest_base instead of do_install_ptest, since
>     +# the default do_install_ptest_base is hardcoded to expect Makefiles.
>     +do_install_ptest_base() {
>     +    # Generate run-ptest file
>     +    echo "#!/usr/bin/env sh" > "${RUN_PTEST_FILE}"
>     +    echo "gnome-desktop-testing-runner ${GST_TEST_SUITE_NAME}" >>
>     "${RUN_PTEST_FILE}"
>     +    chmod 0755 "${RUN_PTEST_FILE}"
>     +
>     +    # Install additional files required by tests
>     +    if [ -d "${S}/tests/files" ] ; then
>     +        install -d "${D}/${TEST_FILES_PATH}"
>     +        install -m 0644 "${S}/tests/files"/*
>     "${D}/${TEST_FILES_PATH}"
>     +    fi
>     +}
>     -- 
>     2.17.1
>
>     -- 
>     _______________________________________________
>     Openembedded-core mailing list
>     Openembedded-core at lists.openembedded.org
>     <mailto:Openembedded-core at lists.openembedded.org>
>     http://lists.openembedded.org/mailman/listinfo/openembedded-core
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20191219/28dd39bf/attachment-0001.html>


More information about the Openembedded-core mailing list