#6 typelib subpackaging and automatic provides/requires - v4
Opened 6 years ago by yaneti. Modified 6 years ago
rpms/ yaneti/gobject-introspection gir-typelib3  into  rawhide

file added
+249
@@ -0,0 +1,249 @@ 

+ #!/bin/bash

+ 

+ # Automatically find Provides and Requires for typelib() gobject-introspection bindings.

+ # can be started with -R (Requires) and -P (Provides)

+ 

+ # Copyright 2011 by Dominique Leuenberger, Amsterdam, Netherlands (dimstar [at] opensuse.org)

+ # This file is released under the GPLv2 or later.

+ 

+ function split_name_version {

+ base=$1

+ tsymbol=${base%-*}

+ # Sometimes we get a Requires on Gdk.Settings.foo, bebause you can directly use imports.gi.Gdk.Settings.Foo in Javascript.

+ # We know that the symbol in this case is called Gdk, so we cut everything after the . away.

+ symbol=$(echo $tsymbol | awk -F. '{print $1}')

+ version=${base#*-}

+ # In case there is no '-' in the filename, then the split above 'fails' and version == symbol (thus: no version specified)

+ if [ "$tsymbol" = "$version" ]; then

+ 	unset version

+ fi

+ }

+ 

+ function split_name_version2 {

+   symbol=$(echo $1 | awk -F: '{print $1}' | sed "s:[' ]::g")

+   version=$(echo $1 | awk -F: '{print $2}' | sed "s:[' ]::g")

+ }

+ 

+ function print_req_prov {

+ echo -n "typelib($symbol)"

+ if [ ! -z "$version" ]; then

+ 	echo " = ${version}"

+ else

+ 	echo ""

+ fi

+ }

+ 

+ function find_provides {

+ while read file; do

+ 	case $file in

+ 		*.typelib)

+ 			split_name_version $(basename $file | sed 's,.typelib$,,')

+ 			print_req_prov

+ 			;;

+ 	esac

+ done

+ }

+ 

+ function gresources_requires {

+ # GNOME is embedding .js files into ELF binaries for faster startup.

+ # As a result, we need to extract them and re'run the scanner over the

+ # embedded files.

+ # We extract all the gresources embedded in ELF binaries and start

+ # gi-find-deps.sh recusively over the extracted file list.

+ tmpdir=$(mktemp -d)

+ for resource in $($gresourcecmd list "$1" 2>/dev/null); do

+   mkdir -p $tmpdir/$(dirname $resource)

+   $gresourcecmd extract "$1" $resource > $tmpdir/$resource

+ done

+ find $tmpdir -type f | sort | sh $0 -R

+ rm -rf "$tmpdir"

+ }

+ 

+ function python_requires {

+ 	for module in $(grep -h -P "^\s*from gi\.repository import (\w+)" $1 | sed -e 's:#.*::' -e 's:raise ImportError.*::' -e 's:.*"from gi.repository import .*".*::' | sed -e 's,from gi.repository import,,' -r -e 's:\s+$::g' -e 's:\s+as\s+\w+::g' -e 's:,: :g'); do

+ 		split_name_version $module

+ 		print_req_prov

+ 		# Temporarly disabled... this is not true if the python code is written for python3... And there seems no real 'way' to identify this.

+ 		# echo "python-gobject >= 2.21.4"

+ 	done

+ 	for module in $(grep -h -P -o ".*(gi\.require_version\(['\"][^'\"]+['\"],\s*['\"][^'\"]+['\"]\))" $1 | sed  -e 's:#.*::' -e 's:.*gi.require_version::' -e "s:[()\"' ]::g" -e 's:,:-:'); do

+ 		split_name_version $module

+ 		print_req_prov

+ 	done

+         # python glue layers (/gi/overrides) import their typelibs slightly different

+ 	for module in $(grep -h -P -o "=\s+(get_introspection_module\(['\"][^'\"]+['\"]\))" $1 | sed -e 's:#.*::' -e 's:=.*get_introspection_module::' -e "s:[()\"' ]::g"); do

+ 		split_name_version $module

+ 		print_req_prov

+ 	done

+ }

+ 

+ function javascript_requires {

+ 	for module in $(grep -h -P -o "imports\.gi\.([^\s'\";]+)" $1 | grep -v "imports\.gi\.version" | sed -r -e 's,\s+$,,g' -e 's,imports.gi.,,'); do

+ 		split_name_version $module

+ 		print_req_prov

+ 	done

+ 	for module in $(grep -h -P -o "imports\.gi\.versions.([^\s'\";]+)\s*=\s*['\"].+['\"]" $1 | \

+ 		sed -e 's:imports.gi.versions.::' -e "s:['\"]::g" -e 's:=:-:' -e 's: ::g'); do

+ 		split_name_version $module

+ 		print_req_prov

+ 	done

+ 	# Remember files which contain a pkg.require() call

+ 	if pcregrep -M "pkg.require\\(([^;])*" $1 > /dev/null; then

+ 		# the file contains a pkg.require(..) list... let's remember th is file for the in-depth scanner

+ 		if [ -n "$jspkg" ]; then

+ 			jspkg=$1:${jspkg}

+ 		else

+ 			jspkg=$1

+ 		fi

+ 	fi

+ 	# remember files which contain exlucde filters used against pkg.require()

+ 	if pcregrep -M "const RECOGNIZED_MODULE_NAMES =([^;])*" $1 > /dev/null; then

+ 		# the file contains RECOGNIZED_MODULE_NAMES list. We remember the file name for the follow up filtering

+ 		if [ -n "$jspkgfilt" ]; then

+ 			jspkgfilt=$1:${jspkgfilt}

+ 		else

+ 			jspkgfilt=$1

+ 		fi

+ 	fi

+ 

+ }

+ 

+ function javascript_pkg_filter {

+ # For now this is a dummy function based on gnome-weather information

+ #for file in $jspkgfilt; do

+ #	FILTER=($(pcregrep -M "const RECOGNIZED_MODULE_NAMES =([^;])*" $file | grep -o "'.*'" | sed "s:'::g"))

+ #done

+   FILTER=('Lang' 'Mainloop' 'Signals' 'System' 'Params')

+ }

+ 

+ function javascript_pkg_requires {

+ # javascript files were found which specify pkg.require('..': '..'[,'..': '']); list

+ # This is used in some apps in order to have a 'centralized' point to specify all package dependencies.

+ # once we reach this function, we already know which file(s) contain the pkg.require(..) list.

+ oldIFS=$IFS

+ IFS=:

+ for file in "$jspkg"; do

+ 	IFS=$'\n'

+ 	PKGS=$(pcregrep -M "pkg.require\\(([^;])*" $file | grep -o "'.*': '.*'")

+ 	for pkg in $PKGS; do

+ 		split_name_version2 $pkg

+ 		found=0

+ 		for (( i=0 ; i<${#FILTER[@]} ; i++ )); do

+ 			if [ "$symbol" = "${FILTER[$i]}" ]; then

+ 				found=1

+ 			fi

+ 		done

+ 		if [ $found -eq 0 ]; then

+ 			print_req_prov

+ 		fi

+ 	done

+ 	IFS=:

+ done

+ IFS=$oldIFS

+ 

+ }

+ 

+ function typelib_requires {

+ 	split_name_version $(basename $1 | sed 's,.typelib$,,')

+ 	oldIFS=$IFS

+ 	IFS=$'\n'

+ 	for req in $(g-ir-inspect --print-shlibs --print-typelibs $symbol --version $version); do

+ 		case $req in

+ 			typelib:*)

+ 				module=${req#typelib: }

+ 				split_name_version $module

+ 				print_req_prov

+ 				;;

+ 			shlib:*)

+ 				echo "${req#shlib: }${shlib_64}"

+ 				;;

+ 		esac

+ 	done

+ 	IFS=$oldIFS

+ }

+ 

+ function find_requires {

+ # Currently, we detect:

+ # - in python:

+ #   . from gi.repository import foo [Unversioned requirement of 'foo']

+ #   . from gi.repository import foo-1.0 [versioned requirement]

+ #   . gi.require_version('Gtk', '3.0') (To specify a version.. there is still an import needed)

+ #   . And we do not stumble over:

+ #     from gi.repository import foo as _bar

+ #     from gi.repository import foo, bar

+ # - in JS:

+ #   . imports.gi.foo; [unversioned requirement of 'foo']

+ #   . imports.gi.goo-1.0; [versioned requirement]

+ #   . imports.gi.versions.Gtk = '3.0';

+ #   . The imports can be listed on one line, and we catch them.

+ 

+ while read file; do

+ 	case $file in

+ 		*.js)

+ 			javascript_requires "$file"

+ 			;;

+ 		*.py)

+ 			python_requires "$file"

+ 			;;

+ 		*.typelib)

+ 			typelib_requires "$file"

+ 			;;

+ 		*.gresource)

+ 			gresources_requires "$file"

+ 			;;

+ 		*)

+ 			case $(file -b $file) in

+ 				*[Pp]ython*script*)

+ 					python_requires "$file"

+ 					;;

+ 				*ELF*)

+ 					gresources_requires "$file"

+ 					;;

+ 			esac

+ 			;;

+ 	esac

+ done

+ # The pkg filter is a place holder. This should read the filter from the javascript files.

+ #if [ -n "$jspkgfilt" ]; then

+ javascript_pkg_filter

+ #fi

+ # in case the javascript parser above detected files which specify pkg.require, we enter the more in-depth scanning scheme for those files.

+ if [ -n "$jspkg" ]; then

+ 	javascript_pkg_requires

+ fi

+ }

+ 

+ function inList() {

+   for word in $1; do

+     [[ "$word" = "$2" ]] && return 0

+   done

+   return 1

+ }

+ 

+ x64bitarch="x86_64 ppc64 ppc64le s390x ia64 aarch64"

+ 

+ for path in \

+ 	$(for tlpath in \

+ 	$(find ${RPM_BUILD_ROOT}/usr/lib64 ${RPM_BUILD_ROOT}/usr/lib /usr/lib64 /usr/lib -name '*.typelib' 2>/dev/null); do

+         	dirname $tlpath; done | sort --unique ); do

+ 	export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:$path

+ done

+ 

+ if which gresource >/dev/null 2>&1; then

+   gresourcecmd=$(which gresource 2>/dev/null)

+ else

+   grsourcecmd="false"

+ fi

+ 

+ if inList "$x64bitarch" "${HOSTTYPE}"; then

+ 	shlib_64="()(64bit)"

+ fi

+ case $1 in

+ 	-P)	

+ 		find_provides

+ 		;;

+ 	-R)

+ 		find_requires

+ 		;;

+ esac

+ 

file modified
+47 -1
@@ -12,6 +12,10 @@ 

  Source0:        https://download.gnome.org/sources/gobject-introspection/1.54/%{name}-%{version}.tar.xz

  Patch0:         0001-tools-use-real-PYTHON-instead-of-usr-bin-env.patch

  

+ Source1:        gi-find-deps.sh

+ Source2:        typelib.attr

+ 

+ BuildRequires:  typelib-srpm-macros

  BuildRequires:  glib2-devel >= %{glib2_version}

  BuildRequires:  python3-devel

  BuildRequires:  gettext
@@ -30,6 +34,26 @@ 

  BuildRequires:  gtk-doc

  

  Requires:       glib2%{?_isa} >= %{glib2_version}

+ # Bundled before the introduction of typelibs subpackages

+ # so keep temporary compatibility by requring all of them

+ Requires:       typelib(cairo) = 1.0

+ Requires:       typelib(DBus) = 1.0

+ Requires:       typelib(DBusGLib) = 1.0

+ Requires:       typelib(fontconfig) = 2.0

+ Requires:       typelib(freetype2) = 2.0

+ Requires:       typelib(Gio) = 2.0

+ Requires:       typelib(GIRepository) = 2.0

+ Requires:       typelib(GL) = 1.0

+ Requires:       typelib(GLib) = 2.0

+ Requires:       typelib(GModule) = 2.0

+ Requires:       typelib(GObject) = 2.0

+ Requires:       typelib(libxml2) = 2.0

+ Requires:       typelib(win32) = 1.0

+ Requires:       typelib(xfixes) = 4.0

+ Requires:       typelib(xft) = 2.0

+ Requires:       typelib(xlib) = 2.0

+ Requires:       typelib(xrandr) = 1.3

+ 

  

  %description

  GObject Introspection can scan C header and source files in order to
@@ -40,6 +64,7 @@ 

  %package devel

  Summary:        Libraries and headers for gobject-introspection

  Requires:       %{name}%{?_isa} = %{version}-%{release}

+ Requires:       typelib-srpm-macros

  # Not always, but whatever, it's a tiny dep to pull in

  Requires:       libtool

  # For g-ir-doctool
@@ -58,6 +83,8 @@ 

  

  %install

  %make_install

+ install -D -p -m 0755 %{SOURCE1} $RPM_BUILD_ROOT%{_rpmconfigdir}/gi-find-deps.sh

+ install -D -p %{SOURCE2} $RPM_BUILD_ROOT%{_fileattrsdir}/typelib.attr

  

  # Remove lib64 rpaths

  chrpath --delete $RPM_BUILD_ROOT%{_bindir}/g-ir-compiler
@@ -70,12 +97,29 @@ 

  

  %ldconfig_scriptlets

  

+ %typelib -b -r %{name}%{_isa} DBus 1.0

+ %typelib -b -r %{name}%{_isa} DBusGLib 1.0

+ %typelib -b -r %{name}%{_isa} GIRepository 2.0

+ %typelib -b -r %{name}%{_isa} GL 1.0

+ %typelib -b -r %{name}%{_isa} GLib 2.0

+ %typelib -b -r %{name}%{_isa} GModule 2.0

+ %typelib -b -r %{name}%{_isa} GObject 2.0

+ %typelib -b -r %{name}%{_isa} Gio 2.0

+ %typelib -b -r %{name}%{_isa} cairo 1.0

+ %typelib -b -r %{name}%{_isa} fontconfig 2.0

+ %typelib -b -r %{name}%{_isa} freetype2 2.0

+ %typelib -b -r %{name}%{_isa} libxml2 2.0

+ %typelib -b -r %{name}%{_isa} win32 1.0

+ %typelib -b -r %{name}%{_isa} xfixes 4.0

+ %typelib -b -r %{name}%{_isa} xft 2.0

+ %typelib -b -r %{name}%{_isa} xlib 2.0

+ %typelib -b -r %{name}%{_isa} xrandr 1.3

+ 

  %files

  %license COPYING

  

  %{_libdir}/lib*.so.*

  %dir %{_libdir}/girepository-1.0

- %{_libdir}/girepository-1.0/*.typelib

  

  %files devel

  %{_libdir}/lib*.so
@@ -88,6 +132,8 @@ 

  %{_datadir}/aclocal/introspection.m4

  %{_mandir}/man1/*.gz

  %{_datadir}/gtk-doc/html/gi/

+ %{_rpmconfigdir}/gi-find-deps.sh

+ %{_fileattrsdir}/typelib.attr

  

  %changelog

  * Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1.54.1-6

file added
+3
@@ -0,0 +1,3 @@ 

+ %__typelib_requires     %{?_typelib_generator:%{_rpmconfigdir}/gi-find-deps.sh -R}

+ %__typelib_provides     %{?_typelib_generator:%{_rpmconfigdir}/gi-find-deps.sh -P}

+ %__typelib_path         %{?_typelib_generator:^(%{_libdir}/girepository-1.0/.*\.typelib$)||(.*\.gresource)|(.*\.py)|(.*\.js)|(.*\.so)|(%{_bindir}/.*)$}

--- this is the latest version of the proposal , please see PR #1, #4, #5 for previous incarnations

Providie automatic provides/requires for gir typelib files
and autotmatic typelib sub-packaging in the form of
typelib-<namespace>_<version> based on the typelib macro
from typelib-srpm-macros.

Borrowed the gi-find-deps.sh tool verbatim from SUSE
which has been using something like this for ages

The fileattr prov/req scripts are tied to a global flag -
_typelib_generator, which is set once the typelib macro is used
If the typelib macro is not used nothing changes for packages
currently having typelibs

-- with the change applied the build result for g-i looks something like

.....
Wrote: /builddir/build/RPMS/gobject-introspection-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/gobject-introspection-devel-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/gobject-introspection-debugsource-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-DBus_1.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-DBusGLib_1.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-GIRepository_2.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-GL_1.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-GLib_2.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-GModule_2.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-GObject_2.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-Gio_2.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-cairo_1.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-fontconfig_2.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-freetype2_2.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-libxml2_2.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-win32_1.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-xfixes_4.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-xft_2.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-xlib_2.0-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/typelib-xrandr_1.3-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/gobject-introspection-debuginfo-1.54.1-9.fc28.x86_64.rpm
Wrote: /builddir/build/RPMS/gobject-introspection-devel-debuginfo-1.54.1-9.fc28.x86_64.rpm
...

With proposed changes in the buildroot, an example change like this for gdk-pixbuf2 :

diff --git a/gdk-pixbuf2.spec b/gdk-pixbuf2.spec
index 34b93da..66b360c 100644
--- a/gdk-pixbuf2.spec
+++ b/gdk-pixbuf2.spec
@@ -127,11 +127,12 @@ gdk-pixbuf-query-loaders-%{__isa_bits} --update-cache
 %transfiletriggerpostun -- %{_libdir}/gdk-pixbuf-2.0/2.10.0/loaders
 gdk-pixbuf-query-loaders-%{__isa_bits} --update-cache

+%typelib GdkPixbuf 2.0
+
 %files -f gdk-pixbuf.lang
 %license COPYING
 %doc AUTHORS NEWS
 %{_libdir}/libgdk_pixbuf-2.0.so.*
-%{_libdir}/girepository-1.0
 %dir %{_libdir}/gdk-pixbuf-2.0
 %dir %{_libdir}/gdk-pixbuf-2.0/2.10.0
 %dir %{_libdir}/gdk-pixbuf-2.0/2.10.0/loaders

would result in a build product like this:

......
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/gdk-pixbuf2-2.36.11-2.fc28.x86_64.rpm
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/gdk-pixbuf2-modules-2.36.11-2.fc28.x86_64.rpm
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/gdk-pixbuf2-xlib-2.36.11-2.fc28.x86_64.rpm
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/gdk-pixbuf2-xlib-devel-2.36.11-2.fc28.x86_64.rpm
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/gdk-pixbuf2-devel-2.36.11-2.fc28.x86_64.rpm
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/gdk-pixbuf2-tests-2.36.11-2.fc28.x86_64.rpm
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/gdk-pixbuf2-debugsource-2.36.11-2.fc28.x86_64.rpm
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/typelib-GdkPixbuf_2.0-2.36.11-2.fc28.x86_64.rpm
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/gdk-pixbuf2-debuginfo-2.36.11-2.fc28.x86_64.rpm
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/gdk-pixbuf2-modules-debuginfo-2.36.11-2.fc28.x86_64.rpm
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/gdk-pixbuf2-xlib-debuginfo-2.36.11-2.fc28.x86_64.rpm
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/gdk-pixbuf2-devel-debuginfo-2.36.11-2.fc28.x86_64.rpm
Wrote: /home/yaneti/rpmbuild/RPMS/x86_64/gdk-pixbuf2-tests-debuginfo-2.36.11-2.fc28.x86_64.rpm
....

with the typelib subpackage being:

$ rpm -qlp --provides --requires /home/yaneti/rpmbuild/RPMS/x86_64/typelib-GdkPixbuf_2.0-2.36.11-2.fc28.x86_64.rpm
typelib(GdkPixbuf) = 2.0
typelib-GdkPixbuf_2.0 = 2.36.11-2.fc28
typelib-GdkPixbuf_2.0(x86-64) = 2.36.11-2.fc28
libgdk_pixbuf-2.0.so.0()(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
typelib(GLib) = 2.0
typelib(GModule) = 2.0
typelib(GObject) = 2.0
typelib(Gio) = 2.0
/usr/lib64/girepository-1.0/GdkPixbuf-2.0.typelib

1 new commit added

  • devel should also require typelib-srpm-macros
6 years ago

1 new commit added

  • Extract dep information from more than typelibs - gresource, py, js...
6 years ago

To give you some perspective on what the end goal would be. With the last patch handling more files types in the buildroot and a gnome-shell build with %global _typelib_generator 1 the requires for typelibs look like this.

$ rpm -qRp /home/yaneti/rpmbuild/RPMS/x86_64/gnome-shell-3.27.1-5.fc28.x86_64.rpm | grep typelib
typelib(AccountsService)
typelib(Atk)
typelib(Atk) = 1.0
typelib(Atspi)
typelib(Caribou)
typelib(Clutter)
typelib(Clutter) = 1
typelib(ClutterX11) = 1
typelib(Cogl)
typelib(Cogl) = 1
typelib(CoglPango) = 1
typelib(DBusGLib) = 1.0
typelib(GDesktopEnums)
typelib(GDesktopEnums) = 3.0
typelib(GL) = 1.0
typelib(GLib)
typelib(GLib) = 2.0
typelib(GModule) = 2.0
typelib(GObject)
typelib(GObject) = 2.0
typelib(GWeather)
typelib(Gcr)
typelib(Gdk) = 3.0
typelib(GdkPixbuf) = 2.0
typelib(Gdm)
typelib(Geoclue)
typelib(Gio)
typelib(Gio) = 2.0
typelib(GnomeBluetooth)
typelib(GnomeDesktop)
typelib(Gtk) = 3.0
typelib(Gvc)
typelib(Gvc) = 1.0
typelib(IBus)
typelib(Json) = 1.0
typelib(Meta)
typelib(Meta) = 1
typelib(NMClient)
typelib(NMClient) = 1.0
typelib(NMGtk)
typelib(NetworkManager)
typelib(NetworkManager) = 1.0
typelib(Pango)
typelib(Pango) = 1.0
typelib(PangoCairo) = 1.0
typelib(Polkit)
typelib(PolkitAgent)
typelib(Rsvg)
typelib(Shell)
typelib(ShellMenu)
typelib(ShellMenu) = 0.1
typelib(Soup)
typelib(Soup) = 2.4
typelib(St)
typelib(St) = 1.0
typelib(TelepathyGLib) = 0.12
typelib(TelepathyLogger) = 0.2
typelib(UPowerGlib)
typelib(WebKit2)
typelib(cairo) = 1.0
typelib(xfixes) = 4.0
typelib(xlib) = 2.0