[Pkg-mono-svn-commits] rev 2734 - in cli-common/trunk: . debian

Mirco Bauer meebey-guest at costa.debian.org
Sat Sep 23 23:26:17 UTC 2006


Author: meebey-guest
Date: 2006-09-23 23:26:17 +0000 (Sat, 23 Sep 2006)
New Revision: 2734

Modified:
   cli-common/trunk/debian/changelog
   cli-common/trunk/debian/control
   cli-common/trunk/dh_clideps
   cli-common/trunk/dh_makeclilibs
Log:
cli-common 0.4.4 release



Modified: cli-common/trunk/debian/changelog
===================================================================
--- cli-common/trunk/debian/changelog	2006-09-23 22:45:24 UTC (rev 2733)
+++ cli-common/trunk/debian/changelog	2006-09-23 23:26:17 UTC (rev 2734)
@@ -1,12 +1,27 @@
 cli-common (0.4.4) unstable; urgency=low
 
-  * NOT RELEASED YET
   * Dylan R. E. Moonfire
     + Created dh_clifixperms to easily correct file permissions.
   * Mirco 'meebey Bauer
     + Updated link in the CLI Policy for MS .NET term usage.
+    + dh_{makeclilibs,clideps}:
+      - Bumped cli-common-dev build-depends check to >= 0.4.4
+    + dh_clideps:
+      - Rewrote many parts.
+      - Assembly ModuleRefs are now parsed.
+      - Using /etc/mono/config now for resolving DLL maps.
+      - Added override feature for detected dependencies, to support Suggests
+        and Recommends fields. (debian/$package.clideps-override)
+      - Using libxml-dom-perl now instead of hackish regex.
+      - Added special handling of libc6 dependency, the package is not called
+        libc6 on all architectures.
+    + debian/control:
+      - Removed transition dependency for cli-common on cli-common-dev.
+        (7 month for a package rename transition should be more than enough)
+      - Added libxml-dom-perl dependency to cli-common.
+      - Updated to Standards Version 3.7.2 (no changes).
 
- -- Debian Mono Group <pkg-mono-group at lists.alioth.debian.org>  Thu, 20 Jul 2006 19:28:07 -0500
+ -- Debian Mono Group <pkg-mono-group at lists.alioth.debian.org>  Sun, 24 Sep 2006 00:58:36 +0200
 
 cli-common (0.4.3) unstable; urgency=low
 

Modified: cli-common/trunk/debian/control
===================================================================
--- cli-common/trunk/debian/control	2006-09-23 22:45:24 UTC (rev 2733)
+++ cli-common/trunk/debian/control	2006-09-23 23:26:17 UTC (rev 2734)
@@ -4,11 +4,10 @@
 Maintainer: Debian Mono Group <pkg-mono-group at lists.alioth.debian.org>
 Uploaders: Mirco Bauer <meebey at meebey.net>
 Build-Depends-Indep: debhelper (>= 5.0.0), debiandoc-sgml, tetex-extra
-Standards-Version: 3.6.2.1
+Standards-Version: 3.7.2
 
 Package: cli-common
 Architecture: all
-Depends: cli-common-dev
 Description: common files between all CLI (.NET) packages
  This package must be installed if a CLI (Common Language Infrastructure)/.NET
  runtime environment is desired.
@@ -19,10 +18,6 @@
   * A FAQ for package maintainers of CLI/.NET applications.
   * Integration for CLRs (Common Language Runtime):
     + Installing libraries into existing GACs (Global Assembly Cache)
- .
- For the cli-common to cli-common-dev transistion, this packages also depends
- on cli-common-dev, till all source packages have updated their
- build-dependencies.
 
 Package: cli-common-dev
 Architecture: all
@@ -34,5 +29,5 @@
  .
  It includes debhelper scripts for managing automatic dependency tracking
  between native libraries, CLI libraries and CLI applications:
-  * dh_clideps to generate ${cli:Depends} information for debian/control
+  * dh_clideps to generate cli:Depends information for debian/control
   * dh_makeclilibs to create clilibs files that are needed/used by dh_clideps

Modified: cli-common/trunk/dh_clideps
===================================================================
--- cli-common/trunk/dh_clideps	2006-09-23 22:45:24 UTC (rev 2733)
+++ cli-common/trunk/dh_clideps	2006-09-23 23:26:17 UTC (rev 2734)
@@ -7,6 +7,7 @@
 =cut
 
 use strict;
+use Cwd;
 use File::Find;
 use File::Temp;
 use Debian::Debhelper::Dh_Lib;
@@ -54,10 +55,31 @@
 This option can be used to specify a relaxed dependency on the VM/CLR
 by-hand in the control file, eg. "mono-runtime | cli-runtime".
 
+=item B<-l>directory[:directory:directory:..]
+
+Before mondis is run, MONO_GAC_PREFIX have added to it the specified directory (or
+directories -- separate with colons). This is useful for multi-binary packages where a library is
+built in one package and another package contains binaries linked against said library. Relative
+paths will be made absolute for the benefit of monodis.
+
+Note that the directory given should be the complete or relative path to a directory that contains
+the library. See example below.
+
 =item B<internal-mono>                             
 
 Uses the mono runtime in . (used for bootstrapping mono packages)  
 
+=head1 EXAMPLES
+
+Suppose that your source package produces libfoo1.0-cil and libbar1.0-cil
+binary packages.
+In your rules file, first run dh_makeclilibs, then dh_clideps:
+
+  dh_makeclilibs -V
+  dh_clideps -l debian/libfoo1.0-cil/usr:debian/libbar1.0-cil/usr
+or
+  dh_clideps -l debian/tmp
+
 =cut
 
 init();
@@ -66,17 +88,36 @@
 my $cli = '/usr/bin/cli';
 my $cli_version = `$cli --version 2>&1`;
 my $cli_parser;
-my $pwd=`pwd`;
+my $cli_parser_paths;
+my $pwd = `pwd`;
 chomp $pwd;
 
+my $mono_gac_prefix = "/usr";
+if ($dh{L_PARAMS}) { 
+  my @paths=();
+  # Add to existing paths, if set.
+  push @paths, $ENV{'MONO_GAC_PREFIX'} if exists $ENV{'MONO_GAC_PREFIX'};
+  foreach (split(/:/, $dh{L_PARAMS})) {
+    # Force the path absolute.
+    if (m:^/:) {
+      push @paths, $_;
+    } else {
+      push @paths, getcwd()."/$_";
+    }
+  }
+  $mono_gac_prefix .= ":" . join(':', @paths);
+}
+
 if (defined($ARGV[0]) && $ARGV[0] eq "internal-mono") {
     $clr = "mono";
-    $cli_parser = "LD_LIBRARY_PATH=$pwd/debian/tmp/usr/lib MONO_PATH=$pwd/debian/tmp/usr/lib/mono/1.0:$pwd/debian/tmp/usr/lib/mono/2.0 $pwd/debian/tmp/usr/bin/monodis";
+    $cli_parser = "$pwd/debian/tmp/usr/bin/monodis";
+    $cli_parser_paths = "LD_LIBRARY_PATH=$pwd/debian/tmp/usr/lib MONO_PATH=$pwd/debian/tmp/usr/lib/mono/1.0:$pwd/debian/tmp/usr/lib/mono/2.0 MONO_GAC_PREFIX=$mono_gac_prefix ";
     $cli_version = `LD_LIBRARY_PATH=$pwd/debian/tmp/usr/lib $pwd/debian/tmp/usr/bin/mono --version 2>&1`;
     verbose_print("Will use built Mono (debian/tmp/usr/bin/monodis) for CIL parsing.");
 } elsif (-x "/usr/bin/monodis") {
     $clr = "mono";
     $cli_parser = "/usr/bin/monodis";
+    $cli_parser_paths = "MONO_GAC_PREFIX=$mono_gac_prefix ";
     verbose_print("Will use Mono (/usr/bin/monodis) for CIL parsing.");
 } elsif (-x "/usr/bin/ildasm") {
     $clr = "pnet";
@@ -91,8 +132,8 @@
   open(FILE, 'debian/control');
   my @filedata = <FILE>;
   close(FILE);
-  if (!($filedata[0] =~ /Build-Depends(-Indep)?: .*cli-common-dev \(>= 0\.4\.0\)/)) {
-      warning("Warning! No Build-Depends(-Indep) on cli-common-dev (>= 0.4.0)!");
+  if (!($filedata[0] =~ /Build-Depends(-Indep)?: .*cli-common-dev \(>= 0\.4\.4\)/)) {
+      warning("Warning! No Build-Depends(-Indep) on cli-common-dev (>= 0.4.4)!");
   }
 }
 
@@ -116,6 +157,7 @@
   }
 }
 
+
 # Cleaning the paths given on the command line
 foreach (@ARGV) {
     s#/$##;
@@ -123,24 +165,45 @@
 }
 
 my $fh;
-my %libdata;
+
+verbose_print("Loading clilibs...");
+my %clilibdata;
 open($fh, "cat /var/lib/dpkg/info/*.clilibs debian/*/DEBIAN/clilibs 2> /dev/null |");
 while (<$fh>) {
     /(\S+)\s+(\S+)\s+(\w.*)\n?/;
-    $libdata{"$1/$2"} = $3;
+    $clilibdata{"$1/$2"} = $3;
 }
+close($fh);
 
+
+verbose_print("Loading shlibs...");
 my %shlibdata;
+open($fh, "cat /var/lib/dpkg/info/*.shlibs $pwd/debian/shlibs.local $pwd/debian/*/DEBIAN/shlibs 2> /dev/null |");
+while (<$fh>) {
+  /(\S+)\s+(\S+)\s+(\w.*)\n?/;
+  my ($soname, $soversion, $dependency);
+  #chomp;
+  #my($soname, $soversion, $dependency) = split(/\s+/, $_, 3);
+  $soname = $1;
+  $soversion = $2;
+  $dependency = $3;
+  $shlibdata{"$soname.so.$soversion"} = $dependency;
+}
+close($fh);
 
 foreach my $package (@{$dh{DOPACKAGES}}) {
     my $tmp = tmpdir($package);
-    my %deps;
-    my @depkgs;
+    my %refs = ( depends => [],
+                 recommends => [],
+                 suggests => [] );
     my $found_exe = 0;
     my $needs_net_1_0 = 0;
     my $needs_net_2_0 = 0;
     
-    delsubstvar($package, "cli:Depends");    # for idempotency
+    # for idempotency
+    delsubstvar($package, "cli:Depends");
+    delsubstvar($package, "cli:Suggests");
+    delsubstvar($package, "cli:Recommends");
 
     # find binaries
     find (sub {
@@ -150,8 +213,17 @@
         if (/\.exe$/) {
           $found_exe = 1;
         }
+
+        verbose_print("Package: $package Assembly: $file");
+        
+        my %shlibRefs = resolveShlibRefs($package, $file);
+        push(@{$refs{depends}},    @{$shlibRefs{depends}});
+        push(@{$refs{recommends}}, @{$shlibRefs{recommends}});
+        push(@{$refs{suggests}},   @{$shlibRefs{suggests}});
+        
         my (undef, $tmpfile) = File::Temp::tempfile("/tmp/".basename($0).".XXXX", UNLINK => 1);
-        my $command = "LANG=C $cli_parser --assemblyref $file 2>&1 > $tmpfile";
+        my $command = "LANG=C $cli_parser_paths MONO_GAC_PREFIX=\$MONO_GAC_PREFIX:$tmp/usr $cli_parser --assemblyref $file 2>&1 > $tmpfile";
+        verbose_print("running CLI parser command: $command");
         
         system($command);
         if ($?) {
@@ -167,9 +239,6 @@
           return;
         }
         
-        if (my $extra = extraDeps($file)) {
-           push(@depkgs, $extra);
-        }
         our($vers, $name, $key);
         local *F;
         open(F, $tmpfile);
@@ -185,10 +254,10 @@
                 $key =~ s/\ //g;
                 $key = $vers . "__" . lc($key);
                 my $compat = "$name/$key";
-                if (!defined($libdata{$compat})) {
+                if (!defined($clilibdata{$compat})) {
                     warning("Warning: No Debian dependency data for $name ($key)!");
                 } else {
-                    push(@depkgs, $libdata{$compat});
+                    push(@{$refs{depends}}, $clilibdata{$compat});
                 }
                 #print "ok, ".$deps{ "$name/$vers" . "__" . lc($key) };
 
@@ -208,100 +277,228 @@
         close(F);
      }, $tmp);
 
-    my %depkgsFiltered;
-    for (@depkgs) {
-       for (split(/\s*,\s*/, $_ )) {
-          # filter dupes and don't depend on this package
-          /^(\S+)/;
-          if ($1 ne $package) {
-            $depkgsFiltered{$_} = 1;
-          }
-       }
-    }
-    
-    # now filter the dupes coming from shlibs
-    if (defined($dh{D_FLAG})) {
-       if (open($fh, "< $pwd/debian/$package.substvars" )) {
-          while (<$fh>) {
-             if (/^shlibs:Depends=(.*)\n?/) {
-                for (split(/\s*,\s*/, $1)) {
-                   delete $depkgsFiltered{$_};
-                }
-             }
-          }
-       } else {
-          verbose_print("Could not read $pwd/debian/$package.substvars");
-       }
-    }
+    $refs{depends}    = filterDuplicates($package, $refs{depends});
+    $refs{recommends} = filterDuplicates($package, $refs{recommends});
+    $refs{suggests}   = filterDuplicates($package, $refs{suggests});
 
-    my $deps;
+    my $vm_ref = "";
     if (!defined($dh{R_FLAG}) && $found_exe) {
         if ($clr eq "mono") {
           if ($needs_net_2_0) {
-            $deps = "mono-runtime (>= 1.1.8.1)";
+            $vm_ref = "mono-runtime (>= 1.1.8.1), ";
           } elsif ($needs_net_1_0) {
-            $deps = "mono-runtime (>= 1.0)";
+            $vm_ref = "mono-runtime (>= 1.0), ";
           } else {
-            $deps = "mono-runtime (>= $cli_version)";
+            $vm_ref = "mono-runtime (>= $cli_version), ";
           }
         } elsif ($clr eq "pnet") {
-          $deps = "pnet-interpreter (>= $cli_version)";
+          $vm_ref = "pnet-interpreter (>= $cli_version), ";
         }
     }
     
     if (-f "$tmp/usr/share/cli-common/packages.d/$package.installcligac") {
-    	$deps .= ", " if defined $deps && $deps ne '';
-        $deps .= "cli-common (>= 0.4.0)";
+        $vm_ref .= "cli-common (>= 0.4.0), ";
     }
     
-    $deps .= join(", ", "",
-        sort {
-            # beautify the sort order, requested by meebey
-            my $apkg;
-            $a =~ /^\S+/;
-            $apkg=$&;
-            $b =~ /^\S+/;
-            if($apkg eq $&) {
-               return -1 if( ($a=~/>=/) && ($b=~/<</));
-               return 1 if( ($b=~/>=/) && ($a=~/<</));
-            }
-            $a cmp $b;
-        } (keys %depkgsFiltered)
-    );
+    #$deps .= join(", ", "",
+    #    sort {
+    #        # beautify the sort order, requested by meebey
+    #        my $apkg;
+    #        $a =~ /^\S+/;
+    #        $apkg=$&;
+    #        $b =~ /^\S+/;
+    #        if($apkg eq $&) {
+    #           return -1 if( ($a=~/>=/) && ($b=~/<</));
+    #           return 1 if( ($b=~/>=/) && ($a=~/<</));
+    #        }
+    #        $a cmp $b;
+    #    } (keys %depkgsFiltered)
+    #);
+    
+    @{$refs{depends}}    = sort(@{$refs{depends}});
+    @{$refs{recommends}} = sort(@{$refs{recommends}});
+    @{$refs{suggests}}   = sort(@{$refs{suggests}});
 
-    addsubstvar($package, "cli:Depends", $deps);
+    addsubstvar($package, "cli:Depends",    $vm_ref . join(", ", @{$refs{depends}}));
+    addsubstvar($package, "cli:Recommends", join(", ", @{$refs{recommends}}));
+    addsubstvar($package, "cli:Suggests",   join(", ", @{$refs{suggests}}));
 }
 
-sub extraDeps {
-   my $config=$_[0].".config";
-   return undef if (! -r $config);
-   my $ret=undef;
+sub filterDuplicates {
+  my $package = shift;
+  my $packages = shift;
+  
+  my %packagesFiltered;
+  for (@{$packages}) {
+    # filter dupes and don't depend on this package
+    /^(\S+)/;
+    if ($1 ne $package) {
+      $packagesFiltered{$_} = 1;
+    }
+  }
 
-   if (!%shlibdata) {
-      open($fh, "cat /var/lib/dpkg/info/*.shlibs $pwd/debian/shlibs.local $pwd/debian/*/DEBIAN/shlibs 2>/dev/null |");
+  # now filter the dupes coming from shlibs
+  if (defined($dh{D_FLAG})) {
+    my $fh;
+    if (open($fh, "< $pwd/debian/$package.substvars" )) {
       while (<$fh>) {
-          /(\S+)\s+(\S+)\s+(\w.*)\n?/;
-          my ($soname, $soversion, $dependency);
-          #chomp;
-          #my($soname, $soversion, $dependency) = split(/\s+/, $_, 3);
-          $soname = $1;    
-          $soversion = $2; 
-          $dependency = $3;
-          $shlibdata{"$soname.so.$soversion"} = $dependency;
+        if (/^shlibs:Depends=(.*)\n?/) {
+          for (split(/\s*,\s*/, $1)) {
+            delete $packagesFiltered{$_};
+          }
+        }
       }
+      close($fh);
+    } else {
+      verbose_print("Could not read $pwd/debian/$package.substvars");
+    }
+  }
+  
+  return [ keys %packagesFiltered ];
+}
+
+sub loadDllMap {
+   my $filename = shift;
+   our $dllmapdata = shift;
+   if (!-f $filename) {
+     verbose_print("loadDllMap(): DLL map $filename not found, ignoring...");
+     return;
    }
+   
+   use XML::DOM;
+   my $parser = new XML::DOM::Parser;
+   my $doc = $parser->parsefile($filename, whitespace => 'strip');
+   my $root = $doc->getDocumentElement();
+   my @mapentries = $root->getElementsByTagName("dllmap");
+   foreach my $mapentry (@mapentries) {
+     my $dll = $mapentry->getAttribute("dll");
+     my $target = $mapentry->getAttribute("target");
+     #verbose_print("DLL map: '$dll' target: '$target'");
+     $dllmapdata->{$dll} = $target;
+   }
+}
 
-   $config = `cat $config`;
-   while ($config =~ s/\Wtarget\W*=\W*(\w[\w.\-\d]+\.so\.\d+)//) {
-       verbose_print("found $config: '$1'");
-       if (defined($shlibdata{$1})) {
-           $ret .= ", ".$shlibdata{$1};
+sub resolveShlibRefs {
+   my $package = shift;
+   my $assembly_filename = shift;
+   my $config_filename = $assembly_filename.".config";
+   my %ret = ( depends => [],
+               recommends => [],
+               suggests => [] );
+   if (-r $config_filename) {
+     verbose_print("Found DLL map: $config_filename");
+   } else {
+     verbose_print("Found no specific DLL map, but resolving modulerefs anyway");
+   }
+
+   # load dll maps
+   verbose_print("Loading DLL maps for: $assembly_filename...");
+   my %dllmapdata;
+   loadDllMap("/etc/mono/config", \%dllmapdata);
+   loadDllMap("$pwd/debian/tmp/etc/mono/config", \%dllmapdata);
+   loadDllMap($config_filename, \%dllmapdata);
+    
+   # load clideps overrides
+   verbose_print("Loading clideps-override...");
+   my %clideps_override;
+   open($fh, "cat $pwd/debian/$package.clideps-override 2> /dev/null |");
+   while (<$fh>) {
+     /(\S+)\s+(\S+)(?:\s+(\(\S+\s+\S+\)))?\n?/;
+     my ($type, $package, $version);
+     $type = $1;    
+     $package = $2; 
+     $version = $3 if defined($3);
+     if ($version) {
+       $clideps_override{$package} = $type." ".$version;
+     } else {
+       $clideps_override{$package} = $type;
+     }
+   }
+   close($fh);
+   
+   # parse modulerefs
+   my (undef, $tmpfile) = File::Temp::tempfile("/tmp/".basename($0).".XXXX", UNLINK => 1);
+   my $command = "LANG=C $cli_parser_paths $cli_parser --moduleref $assembly_filename 2>&1 > $tmpfile";
+   
+   system($command);
+   if ($?) {
+     my $output;
+     {
+       local *F;
+       open(F, $tmpfile);
+       local $/;
+       $output = <F>;
+       close(F);
+     }
+     error("cli_parser call failed: '".$command."' rc: $? output: $output");
+     return;
+   }
+   
+   local *F;
+   open(F, $tmpfile);
+   while (<F>) {
+     my $name = $1 if /\d+:\s+(.*)\n/;
+     if (!defined($name)) {
+       next;
+     }
+     my $target = $dllmapdata{$name};
+     
+     if (defined($target)) {
+       verbose_print("Resolved moduleref via DLL map: $name to: $target");
+     } elsif (defined($shlibdata{$name})) {
+       verbose_print("Resolved moduleref via direct match in shlibs");
+     } else {
+       warning("Warning: Could not resolve moduleref: $name for: $assembly_filename!");
+       next;
+     }
+ 
+     my $pkgref;
+     if (defined($target) && defined($shlibdata{$target})) {
+       $pkgref = $shlibdata{$target};
+     } elsif (defined($shlibdata{$name})) {
+       $pkgref = $shlibdata{$name};
+     } elsif (defined($target) && defined($shlibdata{$target.".0"})) {
+       # for DLL maps that have an unversioned library as target
+       $pkgref = $shlibdata{$target.".0"};
+     } else {
+       warning("Warning: Missing shlibs entry: $target or $name for: $assembly_filename!");
+       next;
+     }
+
+     my $type = "depends";
+     my $pkg = $pkgref;
+     $pkgref =~ m/(\S+)(?:\s+(\(\S+\s+\S+\)))?/;
+     my $pkgname = $1;
+     my $ver = $2;
+     # hack for libc6, for ia64 and alpha the package name is libc6.1
+     if ($pkgname =~ m/^libc6/) {
+       $pkg = "libc6 $ver | libc6.1 $ver";
+     }
+     
+     if (defined($clideps_override{$pkgname})) {
+       verbose_print("Found clideps-overidde: $pkgname for: $package");
+
+       my $override = $clideps_override{$pkgname};
+       $override =~ m/(\S+)(?:\s+(\(\S+\s+\S+\)))?/;
+       if ($1 eq "suggests" ||
+           $1 eq "recommends") {
+           $type = $1;
+       } elsif ($1 eq "ignores") {
        } else {
-           warning("Warning: Missing shlibs entry for $1!");
+         warning("Warning: unknown override type: $1 in: '$override' for: $package!");
        }
-   }
-   $ret =~ s/^, // if $ret;
-   return $ret;
+       
+       if (defined($2)) {
+         $pkg = "$pkgname $2";
+       } else {
+         $pkg = $pkgref;
+       }
+     }
+     push(@{$ret{$type}}, $pkg);
+   } 
+   close(F);
+   
+   return %ret;
 }
 
 =head1 SEE ALSO
@@ -313,6 +510,7 @@
 =head1 AUTHOR
 
 Mirco Bauer <meebey at meebey.net>, Eduard Bloch <blade at debian.org>,
-partialy based on code from Brendan O'Dea <bod at debian.org>.
+partialy based on code from Brendan O'Dea <bod at debian.org> and
+Joey Hess <joeyh at debian.org>.
 
 =cut

Modified: cli-common/trunk/dh_makeclilibs
===================================================================
--- cli-common/trunk/dh_makeclilibs	2006-09-23 22:45:24 UTC (rev 2733)
+++ cli-common/trunk/dh_makeclilibs	2006-09-23 23:26:17 UTC (rev 2734)
@@ -147,8 +147,8 @@
   open(FILE, 'debian/control');
   my @filedata = <FILE>;
   close FILE;
-  if (!($filedata[0] =~ /Build-Depends(-Indep)?: .*cli-common-dev \(>= 0\.4\.0\)/)) {
-      warning("Warning! No Build-Depends(-Indep) on cli-common-dev (>= 0.4.0)!");
+  if (!($filedata[0] =~ /Build-Depends(-Indep)?: .*cli-common-dev \(>= 0\.4\.4\)/)) {
+      warning("Warning! No Build-Depends(-Indep) on cli-common-dev (>= 0.4.4)!");
   }
 }
 




More information about the Pkg-mono-svn-commits mailing list