r21949 - in /packages/unstable/gobject-introspection/debian: changelog dh_girepository

joss at users.alioth.debian.org joss at users.alioth.debian.org
Sat Oct 17 13:56:16 UTC 2009


Author: joss
Date: Sat Oct 17 13:56:15 2009
New Revision: 21949

URL: http://svn.debian.org/wsvn/pkg-gnome/?sc=1&rev=21949
Log:
Introduce debhelper script, dh_girepository.

Added:
    packages/unstable/gobject-introspection/debian/dh_girepository   (with props)
Modified:
    packages/unstable/gobject-introspection/debian/changelog

Modified: packages/unstable/gobject-introspection/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-gnome/packages/unstable/gobject-introspection/debian/changelog?rev=21949&op=diff
==============================================================================
--- packages/unstable/gobject-introspection/debian/changelog [utf-8] (original)
+++ packages/unstable/gobject-introspection/debian/changelog [utf-8] Sat Oct 17 13:56:15 2009
@@ -3,6 +3,7 @@
   * Remove obsolete statement regarding a dropped package.
   * Switch to python-support, the dependencies created by python-central 
     are broken.
+  * Introduce debhelper script, dh_girepository.
 
  -- Josselin Mouette <joss at debian.org>  Sat, 17 Oct 2009 15:26:49 +0200
 

Added: packages/unstable/gobject-introspection/debian/dh_girepository
URL: http://svn.debian.org/wsvn/pkg-gnome/packages/unstable/gobject-introspection/debian/dh_girepository?rev=21949&op=file
==============================================================================
--- packages/unstable/gobject-introspection/debian/dh_girepository (added)
+++ packages/unstable/gobject-introspection/debian/dh_girepository [utf-8] Sat Oct 17 13:56:15 2009
@@ -1,0 +1,292 @@
+#! /usr/bin/perl -w
+
+=head1 NAME
+
+dh_girepository - compute dependencies for GObject introspection packages
+
+=cut
+
+use strict;
+use File::Find;
+use Debian::Debhelper::Dh_Lib;
+
+=head1 SYNOPSIS
+
+B<dh_girepository> [I<debhelper options>] [-lI<directory>] [-X I<item> [...]]
+
+=head1 DESCRIPTION
+
+dh_girepository is a debhelper program to compute dependencies for packages
+shipping GObject introspection data.
+
+The dependencies are generated in the ${gir:Depends} substitution variable.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-l>I<directory>
+
+Specify a directory (or a colon-separated list of directories) where to look
+for the .gir XML files that were used to generate the .typelib files that
+are scanned. This option is only necessary if those files are not shipped in
+another, architecture-dependent package.
+
+=item B<-X> I<item>
+
+Exclude files that contain I<item> anywhere in their filename from being
+analyzed.
+
+=back
+
+=cut
+
+# Initialisation code
+init(options => {
+    "l=s", => \$dh{L_PARAMS},
+});
+my @paths_first = ();
+if ($dh{L_PARAMS}) {
+    push @paths_first, split /:/, $dh{L_PARAMS};
+}
+isnative($dh{MAINPACKAGE}); # Necessary to have $dh{VERSION}
+my $bin_version = $dh{VERSION};
+my @archpackages = getpackages("arch");
+
+my $typelib_path = "/usr/lib/girepository-1.0";
+my $gir_path = "/usr/share/gir-1.0";
+my $arch_triplet = `dpkg-architecture -qDEB_BUILD_GNU_TYPE`;
+chomp $arch_triplet;
+my @libdirs = ("/lib/$arch_triplet", "/lib", "/usr/lib/$arch_triplet", "/usr/lib");
+
+# Get Build-Depends in an array
+my @bdeps;
+my $cur = 0;
+open (my $control, "<", "debian/control") or error ("Cannot open debian/control");
+while (<$control>) {
+    chomp;
+    s/\s+$//;
+    if ($cur) {
+        if (/^\s+(.*)$/) {
+            push @bdeps, split ",",$1;
+            if ($1 !~ /,$/) {
+                $cur = 0;
+            }
+        } else {
+            $cur = 0;
+        }
+    }
+    if (/^Build-Depends:\s*(.*)$/) {
+        push @bdeps, split ",",$1;
+        if ($1 =~ /,$/) {
+            $cur = 1;
+        } else {
+            $cur = 0;
+        }
+    }
+}
+close $control;
+
+
+# We can’t parse .typelib files, so we need the corresponding .gir
+# somewhere in the same source package (or with -l).
+
+sub find_gir {
+    my $req = shift;
+    $req =~ s/\.typelib$//;
+    my $f;
+    foreach my $path (@paths_first) {
+        $f = "$path/$req.gir";
+        if (-f $f) {
+            verbose_print ("Found $req.gir in $path");
+            return $f;
+        }
+    }
+    foreach my $otherpkg (@archpackages) {
+        $f = tmpdir($otherpkg)."$gir_path/$req.gir";
+        if (-f $f) {
+            verbose_print ("Found $req.gir in $otherpkg package");
+            return $f;
+        }
+    }
+    error("Could not find gir file for $req.typelib");
+}
+
+
+# Function used for dependencies on other .typelib files
+
+sub require_typelib {
+    my $req = shift;
+    my $package = shift;
+    my $fullpath = "$typelib_path/$req";
+
+    verbose_print ("Dependency: $req");
+    if (-f tmpdir($package)."$fullpath") {
+        verbose_print("  found in the same package");
+        return;
+    }
+    foreach my $otherpkg (@archpackages) {
+        if (-f tmpdir($otherpkg)."$fullpath") {
+            verbose_print ("  found in $otherpkg");
+            addsubstvar ($package, "gir:Depends", $otherpkg, "= $bin_version");
+            return;
+        }
+    }
+    error("Could not find $req dependency") unless -f "$fullpath";
+    my @output = (split ':', `dpkg -S $fullpath 2>/dev/null`);
+    error("$fullpath does not belong to any package") unless @output;
+    my $deppkg = $output[0];
+    # Look for version information in build-dependencies
+    my $found = 0;
+    foreach my $bdep (@bdeps) {
+        if ($bdep =~ /^\s*([a-z0-9\._\-\+]+)\s*\((.*)\)/) {
+            if ($1 eq $deppkg) {
+                addsubstvar ($package, "gir:Depends", $1, $2);
+                $found = 1;
+            }
+        }
+    }
+    if (! $found) {
+        addsubstvar ($package, "gir:Depends", $deppkg);
+    }
+}
+
+
+sub find_library_in_package {
+    my $req = shift;
+    my $package = shift;
+    my $tmp = "";
+    if ($package) {
+        $tmp = tmpdir ($package);
+    }
+    my @loclibdirs = grep -d, map "$tmp$_", @libdirs;
+    foreach my $libdir (@loclibdirs) {
+        if (-f "$libdir/$req" or -l "$libdir/$req") {
+            return "$libdir/$req";
+        }
+    }
+}
+
+sub find_library {
+    my $req = shift;
+    my $package = shift;
+
+    my $file = find_library_in_package ($req, $package);
+    if ($file) {
+        verbose_print ("    found in the same package");
+    } else {
+        foreach my $otherpkg (@archpackages) {
+            $file = find_library_in_package ($req, $otherpkg);
+            if ($file) {
+                verbose_print ("    found in $otherpkg");
+                last;
+            }
+        }
+    }
+    if (!$file) {
+        $file = find_library_in_package ($req);
+        if ($file) {
+            verbose_print ("    found on filesystem");
+        } else {
+            error ("Could not find library $req");
+        }
+    }
+
+    if (-l $file and not -f $file) {
+        # We have a symbolic link that points to another package
+        verbose_print ("    ... it's a symlink ...");
+        return find_library (readlink ($file), $package);
+    }
+    return $file;
+}
+
+foreach my $package (@{$dh{DOPACKAGES}}) {
+    my $tmp = tmpdir($package);
+    my $ext = pkgext($package);
+    my $typelibdir = "$tmp$typelib_path";
+    my @bin_files = ();
+    my @c_files = ();
+    my @typelib_deps = ();
+    next unless -d $typelibdir;
+    opendir(DIRHANDLE, $typelibdir);
+    while (my $typelib = readdir(DIRHANDLE)) {
+        next unless $typelib =~ /\.typelib$/;
+        next if excludefile ($typelib);
+        my $girfile = find_gir ($typelib);
+        error("Unable to open $girfile") unless open (my $f, "<", $girfile);
+        verbose_print ("$girfile...");
+        my @libraries = ();
+        my @symbols = ();
+        my $infunction = 0;
+        while (<$f>) {
+            # "Parse" the XML file
+            chomp;
+            if (/<include\s+name="(.*?)"\s+version="(.*?)"\/>/) {
+                # Dependency on another typelib file
+                my $deptypelib="$1-$2.typelib";
+                verbose_print ("  Dependency: $deptypelib");
+                if (! grep { $_ eq $deptypelib } @typelib_deps) {
+                    push @typelib_deps, $deptypelib;
+                }
+            } elsif (/shared-library="(.*?)"/) {
+                # Dependency on a shared library
+                foreach my $shlibname (split ",", $1) {
+                    if ($shlibname !~ /\.so/) {
+                        $shlibname = "lib$shlibname.so"
+                    }
+                    verbose_print ("  Library: $shlibname");
+                    push @libraries, find_library ($shlibname, $package);
+                }
+            } elsif (/<(method|constructor|function)\s.*c:identifier="(.*?)"/) {
+                push @symbols, $2;
+            } elsif (/<(method|constructor|function)/) {
+                $infunction = 1;
+            } elsif ($infunction and /c:identifier="(.*?)"/) {
+                push @symbols, $1;
+            }
+            if (/>$/) {
+                $infunction = 0;
+            }
+        }
+        close $f;
+        verbose_print(sprintf("  %d symbols found", $#symbols+1));
+        if (@libraries or @symbols) {
+            my $c_file = "$typelibdir/$typelib.c";
+            my $bin_file = "$typelibdir/$typelib.so";
+            verbose_print ("  writing $c_file");
+            if (!$dh{NO_ACT}){
+                error("Unable to open $girfile") unless open (F, ">", $c_file);
+                print F "void gir_dummy_function () {\n";
+                foreach my $symbol (@symbols) {
+                    print F "$symbol ();\n";
+                }
+                print F "}";
+                close F;
+            }
+            push @c_files, $c_file;
+
+            # Build a dummy binary using all referenced symbols and libraries
+            # We use -shared so that gcc doesn’t try to resolve references
+            verbose_print ("  building $bin_file");
+            doit (("gcc", "-shared", "-fPIC", "-o", $bin_file, $c_file, @libraries));
+            push @bin_files, $bin_file;
+        }
+    }
+    if (@bin_files) {
+        # dpkg-shlibdeps expects this directory to exist
+        if (! -d "$tmp/DEBIAN") {
+            doit("install","-o",0,"-g",0,"-d","$tmp/DEBIAN");
+        }
+
+        # Let dpkg-shlibdeps generate the corresponding dependencies
+        # It must run first since otherwise it overwrites the variable
+        doit (("dpkg-shlibdeps", "-pgir", "-Tdebian/${ext}substvars", "-xlibc6", "-xlibc0", @bin_files));
+    }
+    doit (("rm", "-f", @c_files, @bin_files));
+    
+    # Generate dependencies on other .typelib files
+    foreach my $dep (@typelib_deps) {
+        require_typelib ($dep, $package);
+    }
+}
+

Propchange: packages/unstable/gobject-introspection/debian/dh_girepository
------------------------------------------------------------------------------
    svn:executable = *




More information about the pkg-gnome-commits mailing list