aboutsummaryrefslogtreecommitdiff
path: root/ports-mgmt/porteasy
diff options
context:
space:
mode:
Diffstat (limited to 'ports-mgmt/porteasy')
-rw-r--r--ports-mgmt/porteasy/Makefile33
-rw-r--r--ports-mgmt/porteasy/pkg-comment1
-rw-r--r--ports-mgmt/porteasy/pkg-descr22
-rw-r--r--ports-mgmt/porteasy/pkg-plist1
-rw-r--r--ports-mgmt/porteasy/src/porteasy.8265
-rw-r--r--ports-mgmt/porteasy/src/porteasy.pl999
6 files changed, 0 insertions, 1321 deletions
diff --git a/ports-mgmt/porteasy/Makefile b/ports-mgmt/porteasy/Makefile
deleted file mode 100644
index 6595cfaa2665..000000000000
--- a/ports-mgmt/porteasy/Makefile
+++ /dev/null
@@ -1,33 +0,0 @@
-# New ports collection makefile for: porteasy
-# Date created: September 19th 2000
-# Whom: des
-#
-# $FreeBSD$
-#
-# This port is self contained in the src directory.
-#
-
-PORTNAME= porteasy
-PORTVERSION= 2.2
-CATEGORIES= misc
-MASTER_SITES= # none
-DISTFILES= # none
-
-MAINTAINER= des@FreeBSD.org
-
-NO_BUILD= yes
-NO_WRKSUBDIR= yes
-USE_PERL5= yes
-
-SRC= ${.CURDIR}/src
-
-MAN8= porteasy.8
-
-do-fetch:
- @${DO_NADA}
-
-do-install:
- @${INSTALL_SCRIPT} ${SRC}/porteasy.pl ${PREFIX}/bin/porteasy
- @${INSTALL_MAN} ${SRC}/porteasy.8 ${PREFIX}/man/man8
-
-.include <bsd.port.mk>
diff --git a/ports-mgmt/porteasy/pkg-comment b/ports-mgmt/porteasy/pkg-comment
deleted file mode 100644
index b0b24b7f52b0..000000000000
--- a/ports-mgmt/porteasy/pkg-comment
+++ /dev/null
@@ -1 +0,0 @@
-A tool for fetching and building ports
diff --git a/ports-mgmt/porteasy/pkg-descr b/ports-mgmt/porteasy/pkg-descr
deleted file mode 100644
index 2a2391f38f59..000000000000
--- a/ports-mgmt/porteasy/pkg-descr
+++ /dev/null
@@ -1,22 +0,0 @@
-Porteasy lets you install ports and build packages without maintaining
-a full ports tree. It achieves this by scanning the ports index for
-dependency information, and using CVS to update only the ports you
-requested and their dependencies.
-
-Here are some of the things porteasy does for you:
-
- - automatically update the necessary files (and only the necessary
- files) using CVS (including anoncvs support)
-
- - list all of a port's dependencies, optionally hiding those that
- are already installed
-
- - fetch all the necessary distfiles right away, in a single batch,
- so you don't have to wait for one dependency to build before
- fetching the next one's distfile. Dialup users will love this.
-
- - build and install arbitrary ports.
-
- - build packages.
-
- -- des@freebsd.org
diff --git a/ports-mgmt/porteasy/pkg-plist b/ports-mgmt/porteasy/pkg-plist
deleted file mode 100644
index 6b52c1b30876..000000000000
--- a/ports-mgmt/porteasy/pkg-plist
+++ /dev/null
@@ -1 +0,0 @@
-bin/porteasy
diff --git a/ports-mgmt/porteasy/src/porteasy.8 b/ports-mgmt/porteasy/src/porteasy.8
deleted file mode 100644
index ad5a504e9c0d..000000000000
--- a/ports-mgmt/porteasy/src/porteasy.8
+++ /dev/null
@@ -1,265 +0,0 @@
-.\"-
-.\" Copyright (c) 2000 Dag-Erling Coïdan Smørgrav
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer
-.\" in this position and unchanged.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd September 19, 2000
-.Dt PORTEASY 8
-.Os
-.Sh NAME
-.Nm porteasy
-.Nd fetch and build ports
-.Sh SYNOPSIS
-.Nm porteasy
-.Op Fl abCceFfhikLluVv
-.Op Fl D Ar date
-.Op Fl d Ar dir
-.Op Fl p Ar dir
-.Op Fl r Ar dir
-.Op Fl t Ar tag
-.Op Ar port ...
-.Sh DESCRIPTION
-.Nm
-maintains an updated ports tree, and fetches and builds ports
-automatically, keeping track of dependencies.
-.Pp
-The following options are available:
-.Bl -tag -width Fl
-.It Fl a
-Use the FreeBSD project's anoncvs server as CVS root directory.
-.It Fl b
-Build the selected ports.
-.It Fl C
-Don't clean port directories after building.
-.It Fl c
-Clean the selected ports.
-.It Fl D Ar date
-Specify a date to use for
-.Xr cvs 1
-operations.
-.It Fl d Ar dir
-Specify the package database directory (normally
-.Pa /var/db/pkg ) .
-.It Fl e
-Deselect ports that are already installed.
-.It Fl F
-Force installation and registration, even if the port is already
-installed.
-.It Fl f
-Fetch the selected ports.
-.It Fl h
-Show a summary of options and parameters.
-.It Fl i
-Describe the selected ports.
-.It Fl k
-Build packages for the selected ports.
-.It Fl L
-List the packing lists for the selected ports.
-.It Fl l
-List the selected ports.
-.It Fl p Ar dir
-Specify the ports directory (normally
-.Pa /usr/ports ) .
-.It Fl r Ar dir
-Specify the CVS root directory.
-.It Fl t Ar tag
-Specify a tag to use for
-.Xr cvs 1
-operations.
-.It Fl u
-Update all necessary files using
-.Xr cvs 1 .
-.It Fl V
-Show the
-.Nm
-version number and exit.
-.It Fl v
-Verbose mode: show more information about what is being done.
-.El
-.Pp
-If no options are specified, the default is to build the specified
-ports.
-.Ss Port names
-The port names listed on the command line may be either unqualified or
-fully qualified.
-A fully qualified port name is the path to the port directory relative
-to the root of the ports tree (i.e. the port's category and name
-separated by a slash).
-An unqualified port name is the name of the package built by the
-intended port, or part of that name.
-.Pp
-Unqualified names need to be looked up in the ports index, which is
-usually slightly out of date, so fully qualified names should be used
-whenever possible.
-.Ss Sequence of operation
-This section describes the operations performed by
-.Nm
-and the order in which they are performed.
-.Bl -tag -width indent
-.It Update index
-If the
-.Fl u
-option was specified and some unqualified port names were listed on
-the command line, the index file is updated using
-.Xr cvs 1 .
-.It Select ports
-The selection list is initialized with the ports listed on the command
-line, marked as explicit dependencies.
-Any unqualified names are looked up in the index, using simple
-heuristics to identify incompletely named ports.
-If a certain match is not found,
-.Nm
-prints a list of possible matches and exits.
-.Pp
-All direct and indirect dependencies of the ports listed on the
-command line are also selected and marked as dependencies.
-.It Update ports tree and discover dependencies
-If the
-.Fl u
-option was specified, the port directories for all selected ports are
-updated using
-.Xr cvs 1 .
-Each selected port's Makefile is scanned to discover dependencies,
-which are in turn selected and marked as implicit dependencies.
-This process is repeated until no new dependencies are found.
-.It Deselect installed ports
-.Pp
-If the
-.Fl e
-option was specified,
-.Nm
-checks to see if any of the selected ports are already installed;
-those that are are deselected.
-This process is not very accurate, as it will not detect if an older
-or alternate version of a selected port is installed.
-.It List selected ports
-If the
-.Fl l
-option was specified, the fully qualified name and package name of all
-selected ports are listed.
-Explicitly selected ports are indicated with a star.
-.It Show packing lists
-If the
-.Fk L
-option was specified, the packing lists for all explicitly selected
-ports are shown.
-.It Describe selected ports
-If the
-.Fl i
-option was specified,
-.Nm
-prints a description of each port that was specified on the command
-line.
-If no ports were specified,
-.Nm
-instead prints a list of all installed ports, with unknown ports (i.e.
-ports that are not in the index file, or are out of date) indicated
-with a question mark.
-.It Clean the tree
-If the
-.Fl c
-option was specified,
-.Nm
-runs the
-.Sq clean
-target on every selected port.
-If no ports were selected,
-.Nm
-runs the
-.Sq clean
-target on every known port that is present in the tree.
-.It Fetch ports
-If at least one of the
-.Fl b ,
-.Fl f
-or
-.Fl k
-options was specified,
-.Nm
-runs the
-.Sq fetch
-target on every selected port.
-.It Build, install, package, clean ports
-If one or both of the
-.Fl f
-or
-.Fl k
-options were specified,
-.Nm
-runs the
-.Sq install
-or
-.Sq package
-target, followed by the
-.Sq clean
-target (unless the
-.Fl C
-option was specified), on every explicitly selected port.
-.Nm
-lets the ports system handle dependencies on its own, since the
-reported dependencies are sometimes too inclusive.
-.El
-.Sh IMPLEMENTATION NOTES
-There may be a significant difference between what ports are selected
-(and listed if the
-.Fl l
-option is specified) and what ports are actually installed and/or have
-packages built for them, since implicitly selected ports that are
-already installed, or somehow pass the dependency check (e.g. because
-an alternate, equivalent port has been installed) will be passed over
-by the ports system, as indeed they should.
-.Pp
-.Nm
-tries to minimize the number of times
-.Xr cvs 1
-is invoked, since the overhead involved in connecting to a remote
-server is usually quite high (and the user might have to type a
-password every time), but prefers correctness to performance.
-The maximum number of invocations is (2 + NC + NP), where NC and NP
-are the number of distinct categories and ports (including master
-directories and dependencies).
-.Sh ENVIRONMENT
-.Bl -tag -width PORTEASY_OPTIONS
-.It Ev PORTEASY_OPTIONS
-Specifies a set of default options for
-.Nm .
-These options can be overridden by command line parameters.
-.El
-.Sh FILES
-.Nm
-maintains and operates on a ports tree, normally
-.Pa /usr/ports .
-Some information is gathered from the package database, normally
-located in
-.Pa /var/db/pkg .
-.Sh AUTHORS
-.Nm
-was written by
-.An Dag-Erling Smørgrav Aq des@FreeBSD.org .
-Several people contributed their comments and suggestions, most
-notably
-.An Eivind Eklund Aq eivind@FreeBSD.org .
diff --git a/ports-mgmt/porteasy/src/porteasy.pl b/ports-mgmt/porteasy/src/porteasy.pl
deleted file mode 100644
index 2331e2c4441f..000000000000
--- a/ports-mgmt/porteasy/src/porteasy.pl
+++ /dev/null
@@ -1,999 +0,0 @@
-#!/usr/bin/perl -w
-#-
-# Copyright (c) 2000 Dag-Erling Coïdan Smørgrav
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer
-# in this position and unchanged.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# $FreeBSD$
-#
-
-use strict;
-use Fcntl;
-use Getopt::Long;
-
-my $VERSION = "2.2";
-my $COPYRIGHT = "Copyright (c) 2000 Dag-Erling Smørgrav. All rights reserved.";
-
-# Constants
-sub ANONCVS_ROOT { ":pserver:anoncvs\@anoncvs.FreeBSD.org:/home/ncvs" }
-sub REQ_EXPLICIT { 1 }
-sub REQ_IMPLICIT { 2 }
-sub REQ_MASTER { 4 }
-
-sub PATH_CVS { "/usr/bin/cvs" }
-sub PATH_LDCONFIG { "/sbin/ldconfig" }
-sub PATH_MAKE { "/usr/bin/make" }
-
-# Global parameters
-my $dbdir = "/var/db/pkg"; # Package database directory
-my $index = undef; # Index file
-my $portsdir = "/usr/ports"; # Ports directory
-my $tag = undef; # cvs tag to use
-my $date = undef; # cvs date to use
-
-# Global flags
-my $anoncvs = 0; # Use anoncvs.FreeBSD.org
-my $clean = 0; # Clean ports
-my $cvsroot = 0; # CVS root directory
-my $exclude = 0; # Do not list installed ports
-my $fetch = 0; # Fetch ports
-my $force = 0; # Force package registration
-my $info = 0; # Show port info
-my $dontclean = 0; # Don't clean after build
-my $packages = 0; # Build packages
-my $list = 0; # List ports
-my $plist = 0; # Print packing list
-my $build = 0; # Build ports
-my $update = 0; # Update ports tree from CVS
-my $verbose = 0; # Verbose mode
-
-# Global variables
-my %ports; # Maps ports to their directory.
-my %pkgname; # Inverse of the above map
-my %masterport; # Maps ports to their master ports
-my %reqd; # Ports that need to be installed
-my %installed; # Ports that are already installed
-my $suppressed; # Suppress output
-
-#
-# Shortcut for 'print STDERR'
-#
-sub stderr(@) {
- print(STDERR @_);
-}
-
-#
-# Similar to err(3)
-#
-sub bsd::err($$@) {
- my $code = shift; # Return code
- my $fmt = shift; # Format string
- my @args = @_; # Arguments
-
- my $msg; # Error message
-
- $msg = sprintf($fmt, @args);
- stderr("$msg: $!\n");
- exit($code);
-}
-
-#
-# Similar to errx(3)
-#
-sub bsd::errx($$@) {
- my $code = shift; # Return code
- my $fmt = shift; # Format string
- my @args = @_; # Arguments
-
- my $msg; # Error message
-
- $msg = sprintf($fmt, @args);
- stderr("$msg\n");
- exit($code);
-}
-
-#
-# Similar to warn(3)
-#
-sub bsd::warn($@) {
- my $fmt = shift; # Format string
- my @args = @_; # Arguments
-
- my $msg; # Error message
-
- $msg = sprintf($fmt, @args);
- stderr("$msg: $!\n");
-}
-
-#
-# Similar to warnx(3)
-#
-sub bsd::warnx($@) {
- my $fmt = shift; # Format string
- my @args = @_; # Arguments
-
- my $msg; # Error message
-
- $msg = sprintf($fmt, @args);
- stderr("$msg\n");
-}
-
-#
-# Call the specified sub with output suppressed
-#
-sub suppress($@) {
- my $subr = shift; # Subroutine to call
- my @args = @_; # Arguments
-
- my $oldsuppressed; # Old suppress flag
- my $rtn; # Return value
-
- if (!$verbose) {
- $oldsuppressed = $suppressed;
- $suppressed = 1;
- }
- $rtn = &{$subr}(@args);
- if (!$verbose) {
- $suppressed = $oldsuppressed;
- }
- return $rtn;
-}
-
-
-#
-# Print an info message
-#
-sub info(@) {
-
- my $msg; # Message
-
- if ($verbose) {
- $msg = join(' ', @_);
- chomp($msg);
- stderr("$msg\n");
- }
-}
-
-#
-# Print an info message about a subprocess
-#
-sub cmdinfo(@) {
- info(">>>", @_);
-}
-
-#
-# Change working directory
-#
-sub cd($) {
- my $dir = shift; # Directory to change to
-
- cmdinfo("cd $dir");
- chdir($dir)
- or bsd::err(1, "unable to chdir to %s", $dir);
-}
-
-#
-# Run a command and return its output
-#
-sub cmd($@) {
- my $cmd = shift; # Command to run
- my @args = @_; # Arguments
-
- my $pid; # Child pid
- local *PIPE; # Pipe
- my $output; # Output
-
- cmdinfo(join(" ", $cmd, @args));
- if (!defined($pid = open(PIPE, "-|"))) {
- bsd::err(1, "open()");
- } elsif ($pid == 0) {
- exec($cmd, @args);
- die("child: exec(): $!\n");
- }
- $output = "";
- while (<PIPE>) {
- $output .= $_;
- if (!$suppressed) {
- stderr($_);
- }
- }
- if (!close(PIPE)) {
- if ($? & 0xff) {
- bsd::warnx("%s caught signal %d", $cmd, $? & 0x7f);
- } elsif ($? >> 8) {
- bsd::warnx("%s returned exit code %d", $cmd, $? >> 8);
- } else {
- bsd::warn("close()");
- }
- return undef;
- }
- return $output || "\n";
-}
-
-#
-# Run CVS
-#
-sub cvs($;@) {
- my $cmd = shift; # CVS command
-
- my @args; # Arguments to CVS
-
- if (!$update) {
- return "\n";
- }
- if (!$verbose) {
- push(@args, "-q");
- }
- push(@args, "-f", "-z3", "-R", "-d$cvsroot", $cmd, "-A");
- if ($cmd eq "checkout") {
- push(@args, "-P");
- } elsif ($cmd eq "update") {
- push(@args, "-P", "-d");
- }
- if ($tag) {
- push(@args, "-r$tag");
- }
- if ($date) {
- push(@args, "-D$date");
- }
- push(@args, @_);
- return cmd(&PATH_CVS, @args);
-}
-
-#
-# Run make
-#
-sub make($@) {
- my $port = shift; # Port category/name
- my @args = @_;
-
- push(@args, "PORTSDIR=$portsdir")
- unless ($portsdir eq "/usr/ports");
- cd("$portsdir/$port");
- return cmd(&PATH_MAKE, @args);
-}
-
-#
-# The undocumented command.
-#
-sub ecks() {
-
- local *FILE; # File handle
-
- sysopen(FILE, "/var/db/port.mkversion", O_RDWR|O_CREAT|O_TRUNC, 0644)
- or bsd::err(1, "open()");
- print(FILE "20380119\n");
- close(FILE);
-}
-
-#
-# Update the index file
-#
-sub update_index() {
-
- my $parent; # Parent directory
-
- $parent = $portsdir;
- $parent =~ s/\/*ports\/*$//;
- cd($parent);
- if (-f "ports/INDEX" || (-d "ports" && -d "ports/CVS")) {
- cvs("update", "ports/INDEX")
- or bsd::errx(1, "error updating the index file");
- } else {
- cvs("checkout", "-l", "ports")
- or bsd::errx(1, "error checking out the index file");
- }
- cvs("update", "-l", "ports/Mk")
- or bsd::errx(1, "error updating the Makefiles");
-}
-
-#
-# Read the ports index
-#
-sub read_index() {
-
- local *INDEX; # File handle
- my $line; # Line from file
-
- info("Reading index file");
- sysopen(INDEX, $index, O_RDONLY)
- or bsd::err(1, "can't open $index");
- while ($line = <INDEX>) {
- my @port; # Port info
-
- @port = split(/\|/, $line, 3);
- $port[1] =~ s|^/usr/ports/*||;
- $ports{$port[0]} = $port[1];
- $pkgname{$port[1]} = $port[0];
- }
- close(INDEX);
- info(keys(%ports) . " ports in index");
-}
-
-#
-# Find a port by a portion of it's package name
-#
-sub find_port($) {
- my $port = shift; # Port to find
-
- my @suggest; # Suggestions
-
- stderr("Can't find required port '$port'");
- @suggest = grep(/^$port/i, keys(%ports));
- if (@suggest == 1 && $suggest[0] =~ m/^$port[0-9.-]/) {
- $port = $ports{$suggest[0]};
- stderr(", assuming you mean $pkgname{$port}.\n");
- return $port;
- } elsif (@suggest) {
- stderr(", maybe you mean:\n " . (join("\n ", @suggest)));
- }
- stderr("\n");
- return undef;
-}
-
-#
-# Add a port to the list of required ports
-#
-sub add_port($$) {
- my $port = shift; # Port to add
- my $req = shift; # Requirement (explicit or implicit)
-
- my $realport; # Real port name
-
- if ($port =~ m|^([^/]+/[^/]+)$|) {
- $realport = $1;
- } else {
- if (exists($ports{$port})) {
- $realport = $ports{$port};
- } else {
- $realport = find_port($port);
- }
- }
- if (!$realport) {
- return 1;
- }
- if (!exists($reqd{$realport})) {
- $reqd{$realport} = 0;
- }
- $reqd{$realport} |= $req;
- return 0;
-}
-
-#
-# Find master directory for a port
-#
-sub find_master($) {
- my $port = shift; # Port
-
- local *FILE; # File handle
- my $master; # Master directory
-
- if ($masterport{$port}) {
- return $masterport{$port};
- }
-
- # Look for MASTERDIR in the Makefile. We can't use 'make -V'
- # because the Makefile might try to include the master port's
- # Makefile, which might not be checked out yet.
- open(FILE, "$portsdir/$port/Makefile")
- or bsd::err(1, "unable to read Makefile for $port");
- while (<FILE>) {
- if (/^MASTERDIR\s*=\s*(\S+)\s*$/) {
- $master = $1;
- } elsif (/^\.?include \"([^\"]+)\/Makefile\"\s*$/) {
- $master = $1;
- }
- if (defined($master)) {
- $master =~ s/^\$\{.CURDIR\}//;
- $master = "/$port/$master";
- $master =~ s|/+|/|g;
- 1 while ($master =~ s|/[^\./]*/\.\./|/|);
- $master =~ s|^/||;
- if ($master !~ m|^[^/]+/[^/]+$|) {
- bsd::warn("invalid master for %s: %s", $port, $master);
- next;
- }
- close(FILE);
- info("$master is master for $port\n");
- return $masterport{$port} = $master;
- }
- }
- close(FILE);
- return undef;
-}
-
-#
-# Find a dynamic library
-#
-sub find_library($) {
- my $library = shift; # Library to find
-
- my $ldconfig; # Output from ldconfig(8)
-
- $ldconfig = suppress(\&cmd, (&PATH_LDCONFIG, "-r"))
- or errx(1, "unable to run ldconfig");
- if ($ldconfig =~ m/^\s*\d+:-l$library => (.*)$/m) {
- info("The $library library is installed as $1");
- return 1;
- }
- return 0;
-}
-
-#
-# Find a binary
-#
-sub find_binary($) {
- my $binary = shift; # Binary to find
-
- my $dir; # Directory
-
- if ($binary =~ m|^/|) {
- info("$binary is installed as $binary");
- return (-x $binary);
- }
- foreach $dir (split(/:/, $ENV{'PATH'})) {
- if (-x "$dir/$binary") {
- info("$binary is installed as $dir/$binary");
- return 1;
- }
- }
- return 0;
-}
-
-#
-# Find a port's dependencies
-#
-sub find_dependencies($) {
- my $port = shift; # Port
-
- my $dependvars; # Dependency variables
- my $item; # Iterator
- my %depends; # Hash of dependencies
- my ($lhs, $rhs); # Left, right hand side of dependency spec
-
- $dependvars = suppress(\&make, ($port,
- "-VFETCH_DEPENDS",
- "-VBUILD_DEPENDS",
- "-VRUN_DEPENDS",
- "-VLIB_DEPENDS",
- "-VDEPENDS"))
- or bsd::errx(1, "failed to obtain dependency list");
- %depends = ();
- foreach $item (split(' ', $dependvars)) {
- if ($item !~ m|^([^:]+):$portsdir/([^/:]+/[^/:]+)/?(:[^:]+)?$|) {
- bsd::warnx("invalid dependency: %s", $item);
- }
- ($lhs, $rhs) = ($1, $2);
- if ($exclude) {
- if ($installed{$rhs}) {
- next;
- }
- info("Verifying status of $rhs ($lhs)");
- if (($lhs =~ m|^/| && -f $lhs) ||
- ($lhs =~ m/\.\d+$/ && find_library($lhs)) ||
- find_binary($lhs)) {
- info("$rhs seems to be installed");
- $installed{$rhs} = 1;
- next;
- }
- $installed{$rhs} = -1;
- }
- info("Adding $rhs as a dependency for $port");
- $depends{$rhs} = 1;
- }
- return keys(%depends);
-}
-
-#
-# Update all necessary files to build the specified ports
-#
-sub update_ports_tree(@) {
- my @ports = @_; # Ports to update
-
- my $port; # Port name
- my $category; # Category name
- my %upd_cat; # Hash of updated categories
- my %upd_port; # Hash of updated ports
- my %processed; # Hash of processed ports
- my @additional; # Additional dependencies
- my $n; # Pass count
-
- foreach $port (@ports) {
- push(@additional, $port);
- }
- for ($n = 0; ; ++$n) {
- my @update_now; # Ports that need updating now
- my $item; # Iterator
- my $master; # Master port
- my $dependency; # Dependency
-
- # Determine which ports need updating
- foreach $item (@additional) {
- next if $processed{$item};
- ($category, $port) = split(/\//, $item);
- if (!exists($upd_port{$category})) {
- $upd_port{$category} = {};
- }
- if (!exists($upd_port{$category}->{$port})) {
- $upd_port{$category}->{$port} = 0;
- }
- push(@update_now, $item);
- }
- last unless @update_now;
- info("Pass $n:", @update_now);
-
- # Update the relevant sections of the ports tree
- foreach $category (keys(%upd_port)) {
- my @ports; # Ports to update
-
- if (!$upd_cat{$category}) {
- cd($portsdir);
- cvs("update", "-l", $category)
- or bsd::errx(1, "error updating the '$category' category");
- $upd_cat{$category} = 1;
- }
- foreach $port (keys(%{$upd_port{$category}})) {
- next if ($upd_port{$category}->{$port});
- push(@ports, $port);
- $upd_port{$category}->{$port} = 1;
- }
- if (@ports) {
- cd("$portsdir/$category");
- cvs("update", @ports)
- or bsd::errx(1, "error updating the '$category' category");
- }
- }
-
- # Process all unprocessed ports we know of so far
- foreach $port (@update_now) {
- # See if the port has an unprocessed master port
- if (($master = find_master($port)) && !$processed{$master}) {
- add_port($master, &REQ_MASTER);
- info("Adding $master to head of line\n");
- unshift(@additional, $master);
- # Need to process master before we continue
- next;
- }
-
- # Find the port's package name
- if (!exists($pkgname{$port})) {
- if ($pkgname{$port} = suppress(\&make, ($port, "-VPKGNAME"))) {
- chomp($pkgname{$port});
- } else {
- warnx("failed to obtain package name for $port");
- }
- }
-
- # Find the port's dependencies
- foreach $dependency (find_dependencies($port)) {
- next if ($processed{$dependency});
- if ($reqd{$port} == &REQ_MASTER) {
- add_port($dependency, &REQ_MASTER);
- } else {
- add_port($dependency, &REQ_IMPLICIT);
- }
- info("Adding $dependency to back of line\n");
- push(@additional, $dependency);
- }
-
- # Mark port as processed
- $processed{$port} = 1;
- }
- }
-}
-
-#
-# Show port info
-#
-sub show_port_info($) {
- my $port = shift; # Port to show info for
-
- local *FILE; # File handle
- my $info; # Port info
-
- sysopen(FILE, "$portsdir/$port/pkg-descr", O_RDONLY)
- or bsd::err(1, "can't read description for $port");
- $info = join("| ", <FILE>);
- close(FILE);
- print("+--- Description for $port ($pkgname{$port}):\n| ${info}+---\n");
-}
-
-#
-# Show port plist
-#
-sub show_port_plist($) {
- my $port = shift; # Port to show plist for
-
- my $master; # Master port
- local *FILE; # File handle
- my $file; # File name
- my %files; # Files to list
- my $prefix; # Prefix
-
- $prefix = suppress(\&make, ($port, "-VPREFIX"));
- chomp($prefix);
- $master = $port;
- while (!-f "$portsdir/$master/pkg-plist") {
- if (!($master = $masterport{$master})) {
- bsd:errx(1, "$port has no packing list");
- }
- }
- sysopen(FILE, "$portsdir/$master/pkg-plist", O_RDONLY)
- or bsd::err(1, "can't read packing list for $port");
- while (<FILE>) {
- chomp();
- $file = undef;
- if (m/^[^\@]/) {
- $file = $_;
- } elsif (m/^\@cwd\s+(\S+)\s*$/) {
- $prefix = $1;
- } elsif (m/^\@dirrm\s+(\S+)\s*$/) {
- $file = "$1/";
- } elsif (m/^\@comment\s+/) {
- # ignore
- } else {
- bsd::warnx("unrecognized plist directive: $_");
- }
- if (defined($file)) {
- if ($file !~ m/^\//) {
- $file = "$prefix/$file";
- }
- $file =~ s|/+|/|g;
- $files{$file} = 1;
- }
- }
- close(FILE);
- # XXX list man pages?
- print("+--- Packing list for $port ($pkgname{$port}):\n");
- foreach (sort(keys(%files))) {
- print("| $_\n");
- }
- print("+---\n");
-}
-
-#
-# List installed ports
-#
-sub list_installed() {
-
- local *DIR; # Directory handle
- my $port; # Port name
- my $unknown; # Unknown ports
-
- opendir(DIR, $dbdir)
- or bsd::err(1, "can't read database directory");
- print("Installed ports:\n");
- foreach $port (readdir(DIR)) {
- next if ($port eq "." || $port eq ".." || ! -d "$dbdir/$port");
- if (exists($ports{$port})) {
- print(" $port\n");
- } else {
- print(" ? $port\n");
- ++$unknown;
- }
- }
- if ($unknown) {
- print("Recommend you run pkg_version(1).\n");
- }
-}
-
-#
-# Clean a port
-#
-sub clean_port($) {
- my $port = shift; # Port to clean
-
- make($port, "clean")
- or bsd::warnx("failed to clean %s", $port);
-}
-
-#
-# Clean the tree
-#
-sub clean_tree() {
-
- my $port; # Port name
-
- # We could just cd to $portsdir and 'make clean', but it'd
- # be extremely noisy due to only having a partial tree
- foreach $port (keys(%ports)) {
- if (-d "$portsdir/$port") {
- make($port, "clean", "NO_DEPENDS=yes")
- or bsd::warnx("failed to clean %s", $port);
- }
- }
-}
-
-#
-# Fetch a port
-#
-sub fetch_port($) {
- my $port = shift; # Port to fetch
-
- make($port, "fetch")
- or bsd::errx(1, "failed to fetch %s", $port);
-}
-
-#
-# Build a port
-#
-sub build_port($) {
- my $port = shift; # Port to build
-
- my @makeargs; # Arguments to make()
-
- if ($packages) {
- push(@makeargs, "package", "DEPENDS_TARGET=package");
- } else {
- push(@makeargs, "install");
- }
- if ($force) {
- push(@makeargs, "-DFORCE_PKG_REGISTER");
- }
- if (!$dontclean) {
- push(@makeargs, "clean");
- }
- make($port, @makeargs)
- or bsd::errx(1, "failed to %s %s", $packages ? "package" : "build", $port);
-}
-
-#
-# Print usage message and exit
-#
-sub usage() {
-
- stderr("Usage: porteasy [-abCceFfhikluVv] [-d dir] [-D date]\n" .
- " [-p dir] [-r dir] [-t tag] [port ...]\n");
- exit(1);
-}
-
-#
-# Print version
-#
-sub version() {
-
- stderr("This is porteasy $VERSION.
-$COPYRIGHT
-");
- exit(1);
-}
-
-#
-# Print help text
-#
-sub help() {
-
- stderr("This is porteasy $VERSION.
-$COPYRIGHT
-
-Options:
- -a, --anoncvs Use the FreeBSD project's anoncvs server
- -b, --build Build required ports
- -c, --clean Clean the specified ports
- -C, --dontclean Don't clean after build
- -e, --exclude-installed Exclude installed ports
- -f, --fetch Fetch distfiles
- -h, --help Show this information
- -i, --info Show info about specified ports
- -k, --packages Build packages for the specified ports
- -L, --plist Show the packing lists for the specified ports
- -l, --list List required ports and their dependencies
- -u, --update Update relevant portions of the ports tree
- -V, --version Show version number
- -v, --verbose Verbose mode
-
-Parameters:
- -D, --date=DATE Specify CVS date
- -d, --dbdir=DIR Specify package directory (default $dbdir)
- -p, --portsdir=DIR Specify ports directory (default $portsdir)
- -r, --cvsroot=DIR Specify CVS root
- -t, --tag=TAG Specify CVS tag
-
-Report bugs to <des\@freebsd.org>.
-");
- exit(1);
-}
-
-MAIN:{
- my $port; # Port name
- my $err = 0; # Error count
- my $need_index; # Need the index
-
- # Get option defaults
- if ($ENV{'PORTEASY_OPTIONS'}) {
- foreach (split(' ', $ENV{'PORTEASY_OPTIONS'})) {
- unshift(@ARGV, $_);
- }
- }
-
- # Scan command line options
- Getopt::Long::Configure("auto_abbrev", "bundling");
- GetOptions(
- "a|anoncvs" => \$anoncvs,
- "b|build" => \$build,
- "c|clean" => \$clean,
- "C|dontclean" => \$dontclean,
- "D|date=s" => \$date,
- "d|dbdir=s" => \$dbdir,
- "e|exclude-installed" => \$exclude,
- "F|force-pkg-register" => \$force,
- "f|fetch" => \$fetch,
- "h|help" => \&help,
- "i|info" => \$info,
- "k|packages" => \$packages,
- "L|plist" => \$plist,
- "l|list" => \$list,
- "p|portsdir=s" => \$portsdir,
- "r|cvsroot=s" => \$cvsroot,
- "t|tag=s" => \$tag,
- "u|update" => \$update,
- "V|version" => \&version,
- "v|verbose" => \$verbose,
- "x|ecks" => \&ecks,
- )
- or usage();
-
- if (!($clean || $fetch || $info || $list || $packages || $plist)) {
- $build = 1;
- }
-
- if (!@ARGV && ($build || $fetch || $list || $packages || $plist)) {
- usage();
- }
-
- if ($portsdir !~ m/^\//) {
- $portsdir = `pwd` . $portsdir;
- $portsdir =~ s/\n/\//s;
- }
-
- if ($portsdir !~ m/\/ports\/?$/) {
- bsd::errx(1, "ports directory must be named 'ports'");
- }
-
- $index = "$portsdir/INDEX";
-
- # 'package' implies 'build'
- if ($packages) {
- $build = 1;
- }
-
- # Set and check CVS root
- if ($anoncvs && !$cvsroot) {
- $cvsroot = &ANONCVS_ROOT;
- }
- if (!$cvsroot) {
- $cvsroot = $ENV{'CVSROOT'};
- }
- if ($update && !$cvsroot) {
- bsd::errx(1, "No CVS root, please use the -r option or set \$CVSROOT");
- }
-
- # Check if we need the index
- if (!@ARGV && $info) {
- $need_index = 1;
- }
- foreach $port (@ARGV) {
- if ($port !~ m/\//) {
- $need_index = 1;
- }
- }
-
- # Step 1: read the ports index
- if ($need_index) {
- update_index();
- read_index();
- }
-
- # Step 2: build list of explicitly required ports
- foreach $port (@ARGV) {
- $err += add_port($port, &REQ_EXPLICIT);
- }
- if ($err) {
- bsd::errx(1, "some required ports were not found.");
- }
-
- # Step 3: update port directories and discover dependencies
- if (!($build || $fetch || ($info && @ARGV) || $list)) {
- $update = 0;
- }
- update_ports_tree(keys(%reqd));
-
- # Step 4: deselect ports which are already installed
- if ($exclude) {
- foreach $port (keys(%reqd)) {
- if ((exists($installed{$port}) && $installed{$port} > 0) ||
- -d "$dbdir/$pkgname{$port}") {
- info("$port is already installed");
- delete $reqd{$port};
- }
- }
- }
-
- # Step 5: list selected ports
- if ($list) {
- foreach $port (sort(keys(%reqd))) {
- next if ($reqd{$port} == &REQ_MASTER);
- print((($reqd{$port} & &REQ_EXPLICIT) ? " * " : " "),
- "$port ($pkgname{$port})\n");
- }
- }
-
- # Step 6: show info (or list installed packages)
- if ($info) {
- if (!@ARGV) {
- list_installed();
- } else {
- foreach $port (keys(%reqd)) {
- if ($reqd{$port} & &REQ_EXPLICIT) {
- show_port_info($port);
- }
- }
- }
- }
-
- # Step 7: show packing list
- if ($plist) {
- foreach $port (keys(%reqd)) {
- if ($reqd{$port} & &REQ_EXPLICIT) {
- show_port_plist($port);
- }
- }
- }
-
- # Step 8: clean the ports directories (or the entire tree)
- if ($clean) {
- if (!@ARGV) {
- clean_tree();
- } else {
- foreach $port (keys(%reqd)) {
- if ($reqd{$port} & &REQ_EXPLICIT) {
- clean_port($port);
- }
- }
- }
- }
-
- # Step 9: fetch distfiles
- if ($fetch) {
- foreach $port (keys(%reqd)) {
- if ($reqd{$port} != &REQ_MASTER) {
- fetch_port($port);
- }
- }
- }
-
- # Step A: build ports - only the explicitly required ones, since
- # some dependencies (most commonly XFree86) may be bogus.
- if ($build || $packages) {
- foreach $port (keys(%reqd)) {
- if ($reqd{$port} & &REQ_EXPLICIT) {
- build_port($port);
- }
- }
- }
-
- # Done!
- exit(0);
-}