On (2002/07/21 21:08), Eric Anholt wrote:

> You don't have XFree86-4 uninstalled, or don't have it uninstalled
> successfully.  Just removing the XFree86-4 metaport doesn't remove the
> miniports that contain the actual files.  If you are going to build
> without using portupgrade, you should start from scratch wrt XFree86
> (all XFree86-4 ports uninstalled along with imake-4).

I find the situation with the XFree86-4 metaports annoying, so allow me
to share my "portdeps" solution.

I use this perl script to build all dependencies of a port, in the
correct order, before building the port itself.

I use /usr/ports/makefile as follows:

| MY_STUFF?=    \
|       archivers/unzip \
|       ...
|       x11/XFree86-4 \
|       ...
|       x11/xlockmore
| 
| MY_FULL_LIST!=  ${.CURDIR}/Tools/portdeps ${MY_STUFF}
| SUBDIR?=      ${MY_FULL_LIST}
| 
| update:
|       @cvs -qR update -dPA ${SUBDIR}
| 
| .include <bsd.port.subdir.mk>

The script /usr/ports/Tools/portdeps is attached.  I wrote it in a hurry
ages ago, so it's probably a little sucky.

Then, I can do this to build all the ports I want, along with all their
dependencies, in the correct order:

        cd /usr/ports
        make install
        make clean

Or, I can just build one particular port, with all its dependencies, in
the correct order:

        cd /usr/ports
        make MY_STUFF=x11/XFree86-4

Ciao,
Sheldon.
#!/usr/bin/perl -w
#
# Takes one or more "port name" arguments, each consisting of the name of a
# port, preceded by its primary category and a forward slash, e.g.
#
#       databases/gnats
#
# EXAMPLE:
#
#       cd /usr/ports
#       portdeps `make -f ./makefile -V SUBDIR`
#
use strict;

my $PROGNAME = 'portdeps';

my %desired;
my %required_by;
my %mustbuild;
my %seen;
my %unresolved;
my @buildlist;
my $basedir;
my $loop_prot;
my $deps_only;

$basedir = `pwd`;
chomp $basedir;

if (defined($ARGV[0]) and $ARGV[0] eq '-d') {
        $deps_only = 1;
        shift @ARGV;
}

foreach (@ARGV) {
        $unresolved{$_} = 1;
        $desired{$_} = 1;
}

$loop_prot = 100;
while (keys %unresolved and $loop_prot--) {
        foreach my $port (keys %unresolved) {
                my (@index_parts, $make_out, @prereqs);

                next if $seen{$port}++;

                $mustbuild{$port} = 1;
                delete $unresolved{$port};
                chdir($basedir) or
                        die "$PROGNAME: chdir: $basedir: $!\n";
                chdir($port) or
                        die "$PROGNAME: chdir: $port: $!\n";
                $make_out = `make describe`;
                if ($?) {
                        die "$PROGNAME can't make describe: $port\n";
                }
                @index_parts = split(/\|/, $make_out);
                $index_parts[1] =~ /([^\/]+\/[^\/]+)$/;
                $port = $1;
                @prereqs = split(' ', "$index_parts[7] $index_parts[8]");
                foreach my $req_path (@prereqs) {
                        my $req;

                        $req_path =~ /([^\/]+\/[^\/]+)$/;
                        $req = $1;
                        if (exists $required_by{$req}) {
                                push(@{$required_by{$req}}, $port);
                        } else {
                                $required_by{$req} = [ $port ];
                                $unresolved{$req} = 1;
                        }
                }
        }
}

$loop_prot = 100;
while (keys %mustbuild and $loop_prot--) {
CANDIDATE:
        foreach my $candidate (keys %mustbuild) {
                foreach my $dependency (@{$required_by{$candidate}}) {
                        if (not grep {$_ eq $dependency} @buildlist) {
                                next CANDIDATE;
                        }
                }
                unshift(@buildlist, $candidate);
                delete($mustbuild{$candidate});
        }
}

foreach my $port (@buildlist) {
        if (not $deps_only or not exists $desired{$port}) {
                print "$port\n";
        }
}
exit 0;

Reply via email to