OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Michael van Elst
Root: /e/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-src Date: 03-Feb-2003 17:52:24
Branch: HEAD Handle: 2003020316522300
Modified files:
openpkg-src/openpkg-tool
openpkg-build.pl
Log:
use options from installed base to direct parser to correct
dependencies
Summary:
Revision Changes Path
1.48 +88 -34 openpkg-src/openpkg-tool/openpkg-build.pl
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: openpkg-src/openpkg-tool/openpkg-build.pl
============================================================================
$ cvs diff -u -r1.47 -r1.48 openpkg-build.pl
--- openpkg-src/openpkg-tool/openpkg-build.pl 3 Feb 2003 12:58:55 -0000 1.47
+++ openpkg-src/openpkg-tool/openpkg-build.pl 3 Feb 2003 16:52:23 -0000 1.48
@@ -554,23 +554,39 @@
}
#
+# merge any number of options together
+#
+sub combine_options {
+ my($old) = shift;
+ my($new) = { %$old };
+ foreach (grep { defined $_ } @_) {
+ override_options($new,$_,''),
+ }
+ return $new;
+}
+
+#
# pull in OPTIONS for a package or an RPM file
#
-sub get_with ($$;$) {
- my($env,$t,$fn) = @_;
+sub get_with ($;$) {
+ my($t,$fn) = @_;
my(@l,%with);
my($opt);
- if (($env && $env->{zero}) || $t->{OPTIONS}) {
+ if ($t->{OPTIONS}) {
$opt = $t->{OPTIONS};
} else {
if (defined $fn) {
@l = run("$RPM -qi -p $fn");
+ $opt = parse_options(\@l);
+ # don't write back result, this is just
+ # for testing compatibility of a binary
+ # package
} else {
@l = run("$RPM -qi $t->{name}");
+ $opt = parse_options(\@l);
+ $t->{OPTIONS} = $opt;
}
- $opt = parse_options(\@l);
- $t->{OPTIONS} = $opt if $env;
}
return $opt;
}
@@ -675,8 +691,8 @@
return $l =~ /(?:^|\s)\Q$p\E(?:\s|$)/;
}
-sub simple_text_parser ($$$$$) {
- my($fh,$url,$with,$map,$pfmatch) = @_;
+sub simple_text_parser ($$$$$$) {
+ my($fh,$url,$with,$map,$pfmatch,$installed) = @_;
my(@include);
my($section);
@@ -826,8 +842,12 @@
: parse_options($desc);
if ($options) {
- $mywith = { %$options };
- override_options($mywith, $with, '');
+ my(@t) = get_targets($installed->{$name},sub { 1; });
+ $mywith = combine_options(
+ $options,
+ @t ? $t[0]->{OPTIONS} : undef,
+ $with
+ );
} else {
$mywith = $with;
}
@@ -860,8 +880,8 @@
return \@include;
}
-sub xml_parser ($$$$$) {
- my($fh, $url, $with, $map, $pfmatch) = @_;
+sub xml_parser ($$$$$$) {
+ my($fh, $url, $with, $map, $pfmatch, $installed) = @_;
my(@include);
my($xml,$rep,$sub);
@@ -917,8 +937,12 @@
: parse_options($desc);
if ($options) {
- $mywith = { %$options };
- override_options($mywith, $with, '');
+ my(@t) = get_targets($installed->{$name},sub { 1; });
+ $mywith = combine_options(
+ $options,
+ @t ? $t[0]->{OPTIONS} : undef,
+ $with
+ );
} else {
$mywith = $with;
}
@@ -993,8 +1017,8 @@
# fetch index from file or URL
# recursively fetch sub-indexes
#
-sub get_index ($$$$$) {
- my($url,$fn,$with,$noxml,$pfmatch) = @_;
+sub get_index ($$$$$$) {
+ my($url,$fn,$with,$noxml,$pfmatch,$installed) = @_;
my(%map,$include);
open_index($url,$fn);
@@ -1007,9 +1031,11 @@
}
if ($noxml) {
- $include = simple_text_parser(\*RFH, $url, $with, \%map, $pfmatch);
+ $include = simple_text_parser(\*RFH, $url, $with,
+ \%map, $pfmatch, $installed);
} else {
- $include = xml_parser(\*RFH, $url, $with, \%map, $pfmatch);
+ $include = xml_parser(\*RFH, $url, $with,
+ \%map, $pfmatch, $installed);
}
close(RFH)
@@ -1022,7 +1048,7 @@
foreach (@$include) {
my($submap);
my($suburl,$subfn) = relurl($url,$fn,$_);
- $submap = get_index($suburl,$subfn,$with,$noxml,$pfmatch);
+ $submap = get_index($suburl,$subfn,$with,$noxml,$pfmatch,$installed);
while (my($name,$vmap) = each %$submap) {
while (my($vs,$recs) = each %$vmap) {
push @{$map{$name}->{$vs}}, @$recs;
@@ -1046,11 +1072,22 @@
}
#
+# fetch targets of a name that
+# satisfies a condition
+#
+sub get_targets ($$) {
+ my($relmap, $cond) = @_;
+ return map {
+ @{$relmap->{$_}}
+ } get_versions($relmap, $cond);
+}
+
+#
# there can be multiple sources for a target release
#
sub chose_source ($$$$@) {
my($env, $name, $select, $vmap, @vers) = @_;
- my(@recs,@nrecs,$rec);
+ my(@recs,@nrecs,$rec,%nam);
return unless @vers;
@@ -1096,16 +1133,19 @@
}
if (scalar(@recs) > 1) {
-
- print "# ambigous sources for $name\n";
- my($i) = 0;
- foreach (@recs) {
- print "# $i: ".vsn($_)." = $_->{href}\n";
- $i++;
+ %nam = map { $_->{name} => 1 } @recs;
+ if (scalar(keys %nam) > 1) {
+ print "# ambigous sources for $name\n";
+ my($i) = 0;
+ foreach (@recs) {
+ print "# $i: ".vsn($_)." = $_->{href}\n";
+ $i++;
+ }
+ return;
}
- return;
-
- } elsif (@recs) {
+ }
+
+ if (@recs) {
if ($env->{upgrade}) {
$rec = $recs[-1];
} else {
@@ -1314,7 +1354,7 @@
if ($i && (@vers = get_versions($i, $cond))) {
foreach (@vers) {
$t = $i->{$_}->[0];
- get_with($env,$t);
+ get_with($t);
if (target_suitable($t, $env->{with})) {
$tdef = $t;
unless ($env->{upgrade}) {
@@ -1395,7 +1435,7 @@
return;
}
# use options from installed base
- override_options(get_with($env,$target), get_with($env,$t),
+ override_options(get_with($target), get_with($t),
$env->{config}->{optreg});
# remember this is a rebuild for a proxy package
$target->{PROXY} = $t->{PROXY};
@@ -1701,7 +1741,7 @@
my(%target) = %$t;
# pull in options from binary RPM file
- get_with(undef,\%target, $fn);
+ get_with(\%target, $fn);
return \%target;
}
@@ -1744,8 +1784,21 @@
#
if ($old) {
$old = { %$old };
- if (!override_options($old, $new, $c->{optreg}) && !$rebuild) {
- return '';
+ if (!override_options($old, $new, $c->{optreg})) {
+ #
+ # nothing was changed against previous options
+ #
+ # if $rebuild is true this is an already installed
+ # target and 'previous options' may be different
+ # from the package defaults
+ #
+ # but if $rebuild is false this is a package from
+ # repository, it must be package defaults and we
+ # can drop the --defines from the script
+ #
+ if (!$rebuild) {
+ return '';
+ }
}
} else {
$old = $new;
@@ -1998,7 +2051,8 @@
$opt_f,
($opt_W ? undef : \%with),
$opt_X,
- $config->{platform});
+ $config->{platform},
+ $installed);
$env = {
config => $config,
@@ .
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [EMAIL PROTECTED]