$NetBSD: patch-aw,v 1.4 2011/12/04 21:55:01 marino Exp $ --- ../FreeBSD/lib/Tinderbox/MakeCache.pm 2011-10-16 00:52:55.000000000 +0000 +++ lib/Tinderbox/MakeCache.pm @@ -31,14 +31,14 @@ use strict; # a list of variables that we pull from the port Makefile our @makeTargets = ( - 'PKGNAME', 'IGNORE', - 'NO_PACKAGE', 'FORBIDDEN', + 'PKGNAME', '_CBBH', 'EXTRACT_DEPENDS', 'PATCH_DEPENDS', 'FETCH_DEPENDS', 'BUILD_DEPENDS', 'LIB_DEPENDS', 'RUN_DEPENDS', 'TEST_DEPENDS', 'MAINTAINER', - 'COMMENT', 'PORTNAME', - 'DISTFILES', + 'COMMENT', 'PKGBASE', + 'DISTFILES', 'BOOTSTRAP_DEPENDS', + 'DEPENDS' ); # Create a new cache object @@ -48,6 +48,7 @@ sub new { CACHE => undef, SEEN => undef, BASEDIR => shift, + OPTFILE => shift, }, $name; $self; @@ -60,20 +61,95 @@ sub _execMake { my $self = shift; my $port = shift; my @ret; - my $tmp; + my $target; + my $deptype; + my $tmp = ''; return if ($self->{SEEN}->{$port} eq 1); - $tmp = '-V ' . join(' -V ', @makeTargets); + foreach $target (@makeTargets) { + $tmp .= "-V '\${" . $target . "}' "; + } my $dir = $self->{BASEDIR} . '/' . $port; - @ret = split("\n", `cd $dir && make $tmp`); + my $customOptions = $self->_package_options ($dir); + my $nativeOptions = $self->_native_preferences (); + @ret = split("\n", `cd $dir && bmake $customOptions $nativeOptions $tmp`); foreach $tmp (@makeTargets) { - $self->{CACHE}->{$port}{$tmp} = shift @ret; + $deptype = $tmp; + if (${tmp} eq "BOOTSTRAP_DEPENDS") { + $deptype = "FETCH_DEPENDS"; + } + $self->{CACHE}->{$port}{$deptype} = shift @ret; } $self->{SEEN}->{$port} = 1; } +# Get option variable name and requested options +sub _package_options { + my $self = shift; + my $dir = shift; + unless (-e $self->{OPTFILE}) { + return ""; + } + my @data = split("\n", + `cd $dir && bmake -V '\${PKGNAME}' -V '\${PKG_OPTIONS_VAR}'`); + my $pkname = $data[0]; + my $optvar = $data[1]; + $pkname =~ s/nb[0-9]+$//; + my $instruction = `grep ^$pkname: $self->{OPTFILE}`; + unless ($instruction) { + return ""; + } + my @customSet = split(/:/, $instruction); + unless (scalar (@customSet) >= 3) { + return ""; + } + return $optvar . '="' . $customSet[2] . '"'; +} + +# Recreate a trim function +sub _trim { + my $self = shift; + my $string = shift; + $string =~ s/^\s+//; + $string =~ s/\s+$//; + return $string; +} + +# Figure out if we want to avoid built-in dependencies or not +sub _native_preferences { + my $self = shift; + my $moremk = $self->{OPTFILE}; + $moremk =~ s!/?[^/]*/*$!!; + $moremk .= '/more_mk.conf'; + unless (-e $moremk) { + return ""; + } + my @worker; + my $result = ""; + my $ppkgsrc=`grep PREFER_PKGSRC $moremk`; + my $pnative=`grep PREFER_NATIVE $moremk`; + my $develop=`grep PKG_DEVELOPER $moremk`; + if ($ppkgsrc) { + @worker = split(/=/, $ppkgsrc); + if (scalar (@worker) >= 2) { + $result = 'PREFER_PKGSRC="' . $self->_trim($worker[1]) . '" '; + } + } + if ($pnative) { + @worker = split(/=/, $pnative); + if (scalar (@worker) >= 2) { + $result .= 'PREFER_NATIVE="' . $self->_trim($worker[1]) . '" '; + } + } + if ($develop) { + $result .= 'PKG_DEVELOPER=yes '; + } + $result .= 'SKIP_LICENSE_CHECK=yes '; + return $result; +} + # Internal function for returning a port variable sub _getVariable { my $self = shift; @@ -90,16 +166,30 @@ sub _getList { my $port = shift; my $item = shift; my @deps; + my $found; $self->_execMake($port); foreach my $dep (split(/\s+/, $self->{CACHE}->{$port}{$item})) { - my ($d, $ddir) = split(/:/, $dep); - if (!defined($ddir) || $item eq 'DEPENDS') { + my ($d, $ddir) = split(/:/, $self->_trim($dep)); + if (!defined($ddir)) { $ddir = $d; } - $ddir =~ s|^$self->{BASEDIR}/||; + if ($d =~ /^{perl>=?5.+,.+}$/) { + $ddir = "lang/perl5" + } else { + $ddir =~ s|^$self->{BASEDIR}/||; + $ddir =~ s|^\.\.\/\.\.\/||; + } if ($ddir) { - push @deps, $ddir; + $found = 0; + foreach my $storedep (@deps) { + if ($storedep eq $ddir) { + $found = 1; + } + } + if (!$found) { + push @deps, $ddir; + } } } return @deps; @@ -109,7 +199,7 @@ sub _getList { sub Name { my $self = shift; my $port = shift; - return $self->_getVariable($port, 'PORTNAME'); + return $self->_getVariable($port, 'PKGBASE'); } # Package name @@ -133,6 +223,13 @@ sub Maintainer { return $self->_getVariable($port, 'MAINTAINER'); } +# Buildlink3 dependencies +sub Buildlink3Depends { + my $self = shift; + my $port = shift; + return $self->_getList($port, 'DEPENDS'); +} + # Extract dependencies sub ExtractDepends { my $self = shift; @@ -189,8 +286,8 @@ sub IgnoreList { my $n = 0; $self->_execMake($port); - foreach my $var ('NO_PACKAGE', 'IGNORE', 'FORBIDDEN') { - $n++ if ($self->{CACHE}->{$port}{$var} ne ""); + foreach my $var ('_CBBH') { + $n++ if ($self->{CACHE}->{$port}{$var} ne "yes"); } return $n eq 0 ? "" : $self->PkgName($port); } @@ -206,6 +303,17 @@ sub FetchDependsList { return grep { !$uniq{$_}++ } @deps; } +sub Buildlink3DependsList { + my $self = shift; + my $port = shift; + + my @deps; + push(@deps, $self->Buildlink3Depends($port)); + + my %uniq; + return grep { !$uniq{$_}++ } @deps; +} + sub ExtractDependsList { my $self = shift; my $port = shift; @@ -250,6 +358,7 @@ sub BuildDependsList { push(@deps, $self->FetchDepends($port)); push(@deps, $self->BuildDepends($port)); push(@deps, $self->LibDepends($port)); + push(@deps, $self->Buildlink3Depends($port)); my %uniq; return grep { !$uniq{$_}++ } @deps; @@ -263,6 +372,7 @@ sub RunDependsList { my @deps; push(@deps, $self->LibDepends($port)); push(@deps, $self->RunDepends($port)); + push(@deps, $self->Buildlink3Depends($port)); my %uniq; return grep { !$uniq{$_}++ } @deps;