diff options
author | Michał Górny <mgorny@gentoo.org> | 2014-06-10 18:37:35 +0000 |
---|---|---|
committer | Michał Górny <mgorny@gentoo.org> | 2014-06-10 18:37:35 +0000 |
commit | 87ebc592fd3e09436c52fc8f86dd4fd9d2c2771f (patch) | |
tree | b9c39e2be026d5d28bc99d4a2a01de7a3a29414d /eclass | |
parent | Enable multilib support, bug #493176. (diff) | |
download | gentoo-2-87ebc592fd3e09436c52fc8f86dd4fd9d2c2771f.tar.gz gentoo-2-87ebc592fd3e09436c52fc8f86dd4fd9d2c2771f.tar.bz2 gentoo-2-87ebc592fd3e09436c52fc8f86dd4fd9d2c2771f.zip |
Add new, multilib-capable eclass for gstreamer plugins.
Diffstat (limited to 'eclass')
-rw-r--r-- | eclass/ChangeLog | 5 | ||||
-rw-r--r-- | eclass/gstreamer.eclass | 264 |
2 files changed, 268 insertions, 1 deletions
diff --git a/eclass/ChangeLog b/eclass/ChangeLog index 5be846970a8b..1756d96ce62f 100644 --- a/eclass/ChangeLog +++ b/eclass/ChangeLog @@ -1,6 +1,9 @@ # ChangeLog for eclass directory # Copyright 1999-2014 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/eclass/ChangeLog,v 1.1283 2014/06/08 13:57:02 mgorny Exp $ +# $Header: /var/cvsroot/gentoo-x86/eclass/ChangeLog,v 1.1284 2014/06/10 18:37:35 mgorny Exp $ + + 10 Jun 2014; Michał Górny <mgorny@gentoo.org> +gstreamer.eclass: + Add new, multilib-capable eclass for gstreamer plugins. 08 Jun 2014; Michał Górny <mgorny@gentoo.org> multilib-build.eclass: Work around lack of arch defines in swig, bug #509792. diff --git a/eclass/gstreamer.eclass b/eclass/gstreamer.eclass new file mode 100644 index 000000000000..d2dd2a72d315 --- /dev/null +++ b/eclass/gstreamer.eclass @@ -0,0 +1,264 @@ +# Copyright 1999-2014 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/eclass/gstreamer.eclass,v 1.1 2014/06/10 18:37:35 mgorny Exp $ + +# @ECLASS: gstreamer.eclass +# @MAINTAINER: +# gstreamer@gentoo.org +# @AUTHOR: +# Michał Górny <mgorny@gentoo.org> +# Gilles Dartiguelongue <eva@gentoo.org> +# Saleem Abdulrasool <compnerd@gentoo.org> +# foser <foser@gentoo.org> +# zaheerm <zaheerm@gentoo.org> +# @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 multilib-minimal toolchain-funcs versionator + +case "${EAPI:-0}" in + 5) + ;; + 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_BUILD +# @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_BUILD:=${PN/gst-plugins-/}} + +# @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 +# http://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="http://gstreamer.freedesktop.org/" +SRC_URI="http://gstreamer.freedesktop.org/src/${GST_ORG_MODULE}/${GST_ORG_MODULE}-${PV}.tar.${GST_TARBALL_SUFFIX}" + +LICENSE="GPL-2" +case ${GST_ORG_PVP} in + 0.10) SLOT="0.10" ;; + 1.*) SLOT="1.0" ;; + *) die "Unkown gstreamer release." +esac + +S="${WORKDIR}/${GST_ORG_MODULE}-${PV}" + +RDEPEND=" + dev-libs/glib:2[${MULTILIB_USEDEP}] + media-libs/gstreamer:${SLOT}[${MULTILIB_USEDEP}] +" +DEPEND=" + >=sys-apps/sed-4 + virtual/pkgconfig[${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 )" +fi + +if [[ ${SLOT} == "0.10" ]]; then + RDEPEND="${RDEPEND} + abi_x86_32? ( + !app-emulation/emul-linux-x86-gstplugins[-abi_x86_32(-)] + )" +fi + +DEPEND="${DEPEND} ${RDEPEND}" + +# @FUNCTION: gstreamer_get_plugins +# @INTERNAL +# @DESCRIPTION: +# Get the list of plugins requiring external dependencies. +gstreamer_get_plugins() { + # Must be called from src_prepare/src_configure + GST_PLUGINS_LIST=$(sed -rn 's/^AG_GST_CHECK_FEATURE\((\w+),.*/ \1 /p' \ + "${ECONF_SOURCE:-${S}}"/configure.* | LC_ALL='C' tr '[:upper:]' '[:lower:]') +} + +# @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_system_link +# @USAGE: gstreamer_system_link gst-libs/gst/audio:gstreamer-audio [...] +# @DESCRIPTION: +# Walks through makefiles in order to make sure build will link against system +# librairies. +# Takes a list of path fragments and corresponding pkgconfig libraries +# separated by colon (:). Will replace the path fragment by the output of +# pkgconfig. +gstreamer_system_link() { + local pdir directory libs pkgconfig pc tuple + pkgconfig=$(tc-getPKG_CONFIG) + + for plugin_dir in ${GST_PLUGINS_BUILD_DIR} ; do + pdir=$(gstreamer_get_plugin_dir ${plugin_dir}) + + for tuple in $@ ; do + directory=${tuple%:*} + pc=${tuple#*:}-${SLOT} + libs="$(${pkgconfig} --libs-only-l ${pc} || die)" + sed -e "s:\$(top_builddir)/${directory}/.*\.la:${libs}:" \ + -i "${pdir}"/Makefile.{am,in} || die + done + done +} + +# @FUNCTION: gstreamer_multilib_src_configure +# @DESCRIPTION: +# Handles logic common to configuring gstreamer plugins +gstreamer_multilib_src_configure() { + local plugin gst_conf=() ECONF_SOURCE=${ECONF_SOURCE:-${S}} + + gstreamer_get_plugins + + for plugin in ${GST_PLUGINS_LIST} ; do + if has ${plugin} ${GST_PLUGINS_BUILD} ; then + gst_conf+=( --enable-${plugin} ) + else + gst_conf+=( --disable-${plugin} ) + fi + done + + if grep -q "ORC_CHECK" "${ECONF_SOURCE}"/configure.* ; then + if in_iuse orc ; then + gst_conf+=( $(use_enable orc) ) + else + gst_conf+=( --disable-orc ) + fi + fi + + if grep -q "AM_MAINTAINER_MODE" "${ECONF_SOURCE}"/configure.* ; then + gst_conf+=( --disable-maintainer-mode ) + fi + + if grep -q "disable-schemas-compile" "${ECONF_SOURCE}"/configure ; then + gst_conf+=( --disable-schemas-compile ) + fi + + if [[ ${PN} == ${GST_ORG_MODULE} ]]; then + gst_conf+=( $(use_enable nls) ) + fi + + einfo "Configuring to build ${GST_PLUGINS_BUILD} plugin(s) ..." + econf \ + --with-package-name="Gentoo GStreamer ebuild" \ + --with-package-origin="http://www.gentoo.org" \ + "${gst_conf[@]}" "${@}" +} + +# @FUNCTION: gstreamer_multilib_src_compile +# @DESCRIPTION: +# Compiles requested gstreamer plugin. +gstreamer_multilib_src_compile() { + local plugin_dir + + for plugin_dir in ${GST_PLUGINS_BUILD_DIR} ; do + emake -C "$(gstreamer_get_plugin_dir ${plugin_dir})" + done +} + +# @FUNCTION: gstreamer_multilib_src_install +# @DESCRIPTION: +# Installs requested gstreamer plugin. +gstreamer_multilib_src_install() { + local plugin_dir + + for plugin_dir in ${GST_PLUGINS_BUILD_DIR} ; do + emake -C "$(gstreamer_get_plugin_dir ${plugin_dir})" \ + DESTDIR="${D}" install + 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 +} |