Update of /cvsroot/fink/scripts/buildfink In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv32215
Modified Files: buildfink Log Message: Oops, we had dep lists inside-out Index: buildfink =================================================================== RCS file: /cvsroot/fink/scripts/buildfink/buildfink,v retrieving revision 1.36 retrieving revision 1.37 diff -u -d -r1.36 -r1.37 --- buildfink 27 Oct 2006 15:25:40 -0000 1.36 +++ buildfink 31 Oct 2006 05:33:38 -0000 1.37 @@ -310,8 +310,8 @@ doLog("Couldn't get dependencies for $pkg: $@"); next; } - foreach my $altlist (@deps) { - foreach my $alt (map {$_->get_name()} @$altlist) { + foreach my $dep (@deps) { + foreach my $alt (map {$_->get_name()} @$dep) { $dependents{$alt} ||= {}; $dependents{$alt}->{$pkg} = 1; } @@ -643,59 +643,42 @@ return; } - # @deps is in conjunctive normal form. That is, it is a list like: - # {{A ^ B ^ C} v {D ^ E} v {F}} - # In other words, a list of alternatives, and each alternative is a - # series of packages which must all be satisfied. - my $satisfied = 0; - my @faildep; - my @satisfiable_alts; - CHECKSAT: foreach my $alternative (@deps) { - foreach my $altdep (@$alternative) { - my $depname = $altdep->get_name(); - my $depstat = $pkglist->{$depname}; + # @deps is in disjunctive normal form. That is, it is a list like: + # {{A v B v C} ^ {D v E} ^ {F}} + # In other words, a list of dependencies, and each dependency is a + # list of packages which can satisfy it. + DEP: foreach my $dep (@deps) { + my @alts = sort { + # Prefer already-installed deps. + + my $status_a = $pkglist->{$a}; + my $score_a = 0; + $score_a = 1 if defined($status_a) and $status_a == PKGSTATUS_INSTALLED; + my $status_b = $pkglist->{$b}; + my $score_b = 0; + $score_b = 1 if defined($status_b) and $status_b == PKGSTATUS_INSTALLED; + + $score_b <=> $score_a; + } filterSplitoffs(map {$_->get_name()} @$dep); + + foreach my $alt (@alts) { + my $depstat = $pkglist->{$alt}; $depstat = PKGSTATUS_INSTALL unless defined($depstat); if($depstat == PKGSTATUS_FAILED or $depstat == PKGSTATUS_PROCESSING) { - push @faildep, $depname; - next CHECKSAT; + next; } - } - push @satisfiable_alts, $alternative; - } - - foreach my $alternative (sort { - # Count the number of uninstalled packages in this alternative. - # If we have an alternative that doesn't require any extra - # building, pick that one. - - my @pkgs_a = map {$_->get_name()} @$a; - my $unsats_a = grep {!defined($pkglist->{$_}) or $pkglist->{$_} != PKGSTATUS_INSTALLED} @pkgs_a; - - my @pkgs_b = map {$_->get_name()} @$b; - my $unsats_b = grep {!defined($pkglist->{$_}) or $pkglist->{$_} != PKGSTATUS_INSTALLED} @pkgs_b; - - $unsats_a <=> $unsats_b; - } @satisfiable_alts) { - # This alternative is satisfiable - foreach my $altdep (@$alternative) { - my $depname = $altdep->get_name(); - $pkglist->{$depname} = PKGSTATUS_INSTALL if !defined($pkglist->{$depname}); - next if $pkglist->{$depname} == PKGSTATUS_INSTALLED; - recurseOnDepends($pkglist, filterSplitoffs($depname), 1, $finkfiles); - if($pkglist->{$depname} == PKGSTATUS_FAILED) { - push @faildep, $depname; - next CHECKSAT; + $pkglist->{$alt} = PKGSTATUS_INSTALL if !defined($pkglist->{$alt}); + next if $pkglist->{$alt} == PKGSTATUS_INSTALLED; + recurseOnDepends($pkglist, $alt, 1, $finkfiles); + if($pkglist->{$alt} == PKGSTATUS_FAILED) { + next; } - } - - $satisfied = 1; - last; - } - if(!$satisfied) { - logPackageFail($pkg, "Can't figure out how to build. Unsatisfied dependencies: " . join(" ", sort @faildep)); - return; + next DEP; + logPackageFail($pkg, "Can't figure out how to build. Unsatisfied dependencies: " . join(" ", @alts)); + return; + } } if($DoValidate) { ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ Fink-commits mailing list Fink-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/fink-commits