gobject-introspection/gi-find-deps.sh

81 lines
2.0 KiB
Bash

#!/bin/sh
# 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
symbol=${base%-*}
version=${base#*-}
# In case there is no '-' in the filename, then the split above 'fails' and version == symbol (thus: no version specified)
if [ "$symbol" = "$version" ]; then
unset version
fi
}
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
/usr/lib[^/]*/girepository-1.0/*.typelib)
split_name_version $(basename $file | sed 's,.typelib$,,')
print_req_prov
;;
esac
done
}
function find_requires {
# FIXME: There are multiple ways how the gi bindings can be imported. We only catch the 'basic' one
# Currently, we detect:
# - in python:
# . from gi.repository import foo [Unversioned requirement of 'foo']
# . from gi.repository import foo-1.0 [versioned requirement]
# . And we do not stumble over from gi.repository import foo as _bar
# - in JS:
# . imports.gi.foo; [unversioned requirement of 'foo']
# . imports.gi.goo-1.0; [versioned requirement]
# . The imports can be listed on one line, and we catch them.
# Not detected froms:
# - imports.gi.versions.Gtk = '3.0';
# - gi.require_version('Gtk', '3.0')
while read file; do
case $file in
*.js)
for module in $(grep -h -P -o "imports.gi.([^\s;]+)" $file | grep -v "imports.gi.version" | sed 's,imports.gi.,,'); do
split_name_version $module
print_req_prov
done
;;
*.py)
for module in $(grep -h -P "from gi.repository import (\w+)" $file | sed -e 's,from gi.repository import,,' -r -e 's:\s+as\s+\w+::g' -e 's:,::g'); do
split_name_version $module
print_req_prov
done
;;
esac
done
}
case $1 in
-P)
find_provides
;;
-R)
find_requires
;;
esac