[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