diff -r e9301bb5244b -r d3f49ec0c5cd perl-openpkg/perl-openpkg.pl
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/perl-openpkg/perl-openpkg.pl Thu Sep 15 19:31:49 2011 +0200
@@ -0,0 +1,773 @@
+#!@l_prefix@/bin/perl -w
+##
+## perl-openpkg -- OpenPKG Perl Module Build Utility
+## Copyright (c) 2000-2007 OpenPKG Foundation e.V.
+## Copyright (c) 2000-2007 Ralf S. Engelschall
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS 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.
+##
+
+require 5;
+use strict;
+use Getopt::Long;
+use IO qw(Handle Seekable File Pipe Socket Dir);
+
+# program information
+my $ME = {
+ prog_path => $0,
+ prog_name => "perl-openpkg",
+ prog_vers => "2.0.1",
+ prog_date => "03-Dec-2004"
+};
+
+# program configuration
+my $CF = {
+ path_prefix => '@l_prefix@',
+ path_libdir => "",
+ path_tmpdir => ($ENV{"TMPDIR"} || "/tmp"),
+ path_wrkdir => "",
+ path_buildroot => ($ENV{"RPM_BUILD_ROOT"} || ""),
+ path_buildwork => ($ENV{"RPM_BUILD_DIR"} || ""),
+ pkg_name => ($ENV{"RPM_PACKAGE_NAME"} || ""),
+ perl_schema => "vendor",
+ perl_args => [],
+ perl_stdin => "/dev/null",
+ files_file => "-",
+ files_unquoted => 0,
+ prog_rpm => '%path_prefix%/libexec/openpkg/rpm',
+ prog_perl => '%path_prefix%/bin/perl',
+ mode_quiet => 0,
+ mode_verbose => 0,
+ run_version => 0,
+ run_help => 0,
+};
+
+# cleanup support
+my @cleanup = ();
+sub cleanup_remember {
+ my ($cmd) = @_;
+ push(@cleanup, $cmd);
+}
+sub cleanup_perform {
+ foreach my $cmd (reverse @cleanup) {
+ &runcmd($cmd);
+ }
+}
+
+# exception handling support
+$SIG{__DIE__} = sub {
+ my ($err) = @_;
+ $err =~ s|\s+at\s+.*||s if (not $CF->{mode_verbose});
+ print STDERR "$ME->{prog_name}:ERROR: $err ". ($! ? "($!)" : "") . "\n";
+ &cleanup_perform() if (not $CF->{mode_verbose});
+ exit(1);
+};
+
+# verbose message printing
+sub verbose {
+ my ($msg) = @_;
+ print STDERR "++ $msg\n" if (not $CF->{mode_quiet});
+}
+
+# expand into a full filesystem path
+sub fullpath {
+ my ($prog) = @_;
+ my $fullprog = '';
+ foreach my $path (split(/:/, $ENV{PATH})) {
+ if (-x "$path/$prog") {
+ $fullprog = "$path/$prog";
+ last;
+ }
+ }
+ return $fullprog;
+}
+
+# execution of external commands
+sub runcmd {
+ my ($cmd) = @_;
+ print STDERR "\$ $cmd\n" if ($CF->{mode_verbose});
+ $cmd = "($cmd) >/dev/null 2>&1" if ($CF->{mode_quiet});
+ return (system($cmd) == 0);
+}
+
+# create a directory (plus its missing parent dirs)
+sub mkdirp {
+ my ($dir) = @_;
+ my $pdir = $dir;
+ $pdir =~ s|/[^/]*$||s;
+ if (not -d $pdir) {
+ &mkdirp($pdir, 0755);
+ }
+ if (not -d $dir) {
+ &runcmd("umask 022 && mkdir $dir");
+ }
+}
+
+# command line parsing
+Getopt::Long::Configure("bundling");
+my $result = GetOptions(
+ 'p|prefix=s' => \$CF->{path_prefix},
+ 'l|libdir=s' => \$CF->{path_libdir},
+ 't|tmpdir=s' => \$CF->{path_tmpdir},
+ 'd|wrkdir=s' => \$CF->{path_wrkdir},
+ 'r|buildroot=s' => \$CF->{path_buildroot},
+ 'w|buildwork=s' => \$CF->{path_buildwork},
+ 'R|rpm=s' => \$CF->{prog_rpm},
+ 'P|perl=s' => \$CF->{prog_perl},
+ 's|schema=s' => \$CF->{perl_schema},
+ 'A|args=s' => \@{$CF->{perl_args}},
+ 'I|stdin=s' => \$CF->{perl_stdin},
+ 'F|files=s' => \$CF->{files_file},
+ 'U|unquoted' => \$CF->{files_unquoted},
+ 'n|pkgname=s' => \$CF->{pkg_name},
+ 'q|quiet' => \$CF->{mode_quiet},
+ 'v|verbose' => \$CF->{mode_verbose},
+ 'V|version' => \$CF->{run_version},
+ 'h|help' => \$CF->{run_help}
+) || die "option parsing failed";
+if ($CF->{run_help}) {
+ print "Usage: $ME->{prog_name} [options]\n" .
+ "Available options:\n" .
+ "\n" .
+ " -p, --prefix filesystem path to OpenPKG instance\n" .
+ " -l, --libdir filesystem path to Perl lib directory\n" .
+ " -t, --tmpdir filesystem path to temporary directory\n" .
+ " -d, --wrkdir filesystem path to working directory\n" .
+ " -r, --buildroot filesystem path to RPM build root directory\n" .
+ " -w, --buildwork filesystem path to RPM build work directory\n" .
+ " -R, --rpm filesystem path to RPM program\n" .
+ " -P, --perl filesystem path to Perl program\n" .
+ "\n" .
+ " -s, --schema Perl INSTALLDIRS schema\n" .
+ " -A, --args Perl Build.PL/Makefile.PL passed through arguments\n" .
+ " -I, --stdin filesystem path to connect to stdin\n" .
+ " -F, --files filesystem path to write RPM \%files list to\n" .
+ " -U, --unquoted output RPM \%files list in unquoted format\n" .
+ " -n, --pkgname name of involved RPM package\n" .
+ "\n" .
+ " -q, --quiet operate in quiet run-time mode\n" .
+ " -v, --verbose operate in verbose run-time mode\n" .
+ "\n" .
+ " -V, --version print out program version\n" .
+ " -h, --help print out program usage help\n";
+ exit(0);
+}
+if ($CF->{run_version}) {
+ print "OpenPKG $ME->{prog_name} $ME->{prog_vers} ($ME->{prog_date})\n";
+ exit(0);
+}
+
+# fix configuration parameters
+foreach my $cf (keys(%{$CF})) {
+ $CF->{$cf} =~ s|\%([A-Za-z_][A-Za-z0-9_]*)\%|$CF->{$1}|sge;
+}
+
+# determine operation steps
+my @steps_exist = qw(prepare configure build install fixate cleanup);
+my @steps_run = ();
+if (@ARGV > 0) {
+ foreach my $step (@ARGV) {
+ if (not grep { $_ eq $step } @steps_exist) {
+ die "operation step \"$step\" not existing";
+ }
+ push(@steps_run, $step);
+ }
+ my $steps_exist = "-".join("-", @steps_exist)."-";
+ my $steps_run = "-".join("-", @steps_run)."-";
+ if ($steps_exist !~ m|^.*${steps_run}.*$|s) {
+ die "invalid operation step order \"".join(" ", @ARGV)."\"";
+ }
+}
+else {
+ @steps_run = @steps_exist;
+}
+
+# friendly header ;-)
+&verbose("OpenPKG $ME->{prog_name} $ME->{prog_vers} ($ME->{prog_date})");
+
+# determine RPM program
+if (not -x $CF->{prog_rpm}) {
+ $CF->{prog_rpm} = &fullpath($CF->{prog_rpm});
+}
+my $V = `$CF->{prog_rpm} --version 2>/dev/null`;
+$V =~ s/^(?:rpm \(OpenPKG RPM\)|RPM version|OpenPKG RPM|rpm\s+\(.+?\))\s+([0-9ab.]+)(\.(?:SNAPSHOT|DEVEL).*)?\s*$/$1/s ||
+ die "program '$CF->{prog_rpm}' seems to be not RPM";
+&verbose("determined RPM program: $CF->{prog_rpm} ($V)");
+
+# determine Perl program
+if (not -x $CF->{prog_perl}) {
+ $CF->{prog_perl} = &fullpath($CF->{prog_perl});
+}
+$V = `$CF->{prog_perl} --version 2>/dev/null`;
+$V =~ s|^.*This is perl.+v?(5\.[\d+.]+).*$|$1|s ||
+ die "program '$CF->{prog_perl}' seems to be not Perl";
+&verbose("determined Perl program: $CF->{prog_perl} ($V)");
+
+# check for existing paths
+if ($CF->{path_buildroot} eq '') {
+ die "RPM build root directory not known (specify one with option --buildroot)";
+}
+if ($CF->{path_buildwork} eq '') {
+ die "RPM build work directory not known (specify one with option --buildwork)";
+}
+mkdir($CF->{path_buildroot}, 0700);
+mkdir($CF->{path_buildwork}, 0700);
+
+##
+## OPERATION SEQUENCE
+##
+
+# establish standard environment
+umask(022);
+
+# determine name of temporary directory
+my $tmpdir = $CF->{path_tmpdir};
+$tmpdir =~ s|/+$||s;
+my $user = (getlogin() || getpwuid($<) || $ENV{LOGNAME} || $ENV{USERNAME} || "unknown");
+my $program = $ME->{prog_name};
+my $package = ($CF->{pkg_name} || "unknown");
+$tmpdir .= "/$user-$program-$package";
+
+# determine name of perl wrapper script
+my $perlwrap = "$tmpdir/perl.sh";
+
+# optionally change working directory
+my $dir = $CF->{path_wrkdir};
+if ($dir ne '') {
+ if (not -d $dir) {
+ # be smart and guess correct directory to
+ # reduce special cases during packaging
+ $dir =~ s|^.+/||s;
+ my $parent = "";
+ my $child = $dir;
+ $child =~ s|^(.+/)([^/]+)$|$parent = $1, $2|se;
+ LOOP: while ($child ne '') {
+ foreach my $dir (glob("${parent}${child}*")) {
+ if (-d "$parent$dir") {
+ $child = $dir;
+ last LOOP;
+ }
+ }
+ $child =~ s|\W\w+$||s || last;
+ last if (-d "$parent$child");
+ }
+ $dir = "$parent$child";
+ }
+ chdir($dir) || die "cannot change to working directory \"$dir\"";
+}
+
+# determine Perl configuration
+my $pcfg = {};
+my $cmd = "$CF->{prog_perl}" .
+ " -V:installarchlib -V:installprivlib" .
+ " -V:installsitearch -V:installsitelib -V:sitelib_stem" .
+ " -V:installvendorarch -V:installvendorlib -V:vendorlib_stem";
+my $out = `$cmd 2>/dev/null || true`;
+$out =~ s|^(\S+)='([^'']*)';$|$pcfg->{$1} = $2, ''|mge;
+
+# ==== COMPAT prolog/epilog ====
+if (grep { $_ eq "prolog" or $_ eq "epilog" } @steps_run) {
+ print "This is the perl-openpkg >= 20040126 version.\n" .
+ "It was redesigned and is incompatible to previous\n" .
+ "versions. It does not support prolog/epilog steps.\n" .
+ "Please upgrade the package that uses perl-openpkg\n" .
+ "or, as a temporary workaround, downgrade perl-openpkg\n";
+ die "package/perl-openpkg incompatiblity";
+}
+
+# ==== STEP: 1. prepare ====
+if (grep { $_ eq "prepare" } @steps_run) {
+ &verbose("step 1: prepare");
+
+ # establish temporary directory
+ system("rm -rf $tmpdir >/dev/null 2>&1");
+ mkdir($tmpdir, 0700) || die "cannot create temporary directory '$tmpdir'";
+
+ # create Perl executable wrapper script
+ my $io = new IO::File ">$perlwrap"
+ || die "unable to open \"$perlwrap\" for writing";
+ print $io
+ "#!/bin/sh\n" .
+ "exec $CF->{prog_perl} \\\n" .
+ " -I$CF->{path_buildroot}$pcfg->{installarchlib} \\\n" .
+ " -I$CF->{path_buildroot}$pcfg->{installprivlib} \\\n" .
+ " -I$CF->{path_buildroot}$pcfg->{installsitearch} \\\n" .
+ " -I$CF->{path_buildroot}$pcfg->{installsitelib} \\\n" .
+ " -I$CF->{path_buildroot}$pcfg->{installvendorarch} \\\n" .
+ " -I$CF->{path_buildroot}$pcfg->{installvendorlib} \\\n" .
+ " \"\$@\"\n";
+ $io->close();
+ &runcmd("chmod 755 $perlwrap");
+
+ # establish Perl module installation areas
+ &mkdirp("$CF->{path_buildroot}$pcfg->{installarchlib}");
+ &mkdirp("$CF->{path_buildroot}$pcfg->{installprivlib}");
+ &mkdirp("$CF->{path_buildroot}$pcfg->{installsitearch}");
+ &mkdirp("$CF->{path_buildroot}$pcfg->{installsitelib}");
+ &mkdirp("$CF->{path_buildroot}$pcfg->{installvendorarch}");
+ &mkdirp("$CF->{path_buildroot}$pcfg->{installvendorlib}");
+}
+
+# ==== STEP: 2. configure ====
+if (grep { $_ eq "configure" } @steps_run) {
+ &verbose("step 2: configure");
+
+ # determine build environment and basic arguments
+ my $environment = "";
+ my $perl_args = '';
+ if (-f "Build.PL" and (system("$perlwrap -MModule::Build -e '1;' >/dev/null 2>&1") >> 8) == 0) {
+ # new-style Module::Build "Build.PL"
+ $perl_args .= " installdirs=$CF->{perl_schema}";
+ $perl_args .= " --install_path libdoc=remove-me-later";
+ $perl_args .= " destdir=$CF->{path_buildroot}";
+ if ($CF->{path_prefix} ne '' and $CF->{path_prefix} ne '@l_prefix@') {
+ $perl_args .= " install_base=$CF->{path_prefix}";
+ }
+ if ($CF->{path_libdir} ne '') {
+ $perl_args .= " --install_path lib=$CF->{path_libdir}";
+ }
+ $environment = 'Module::Build';
+ }
+ elsif (-f "Makefile.PL") { # ExtUtils::MakeMaker is part of the Perl distribution
+ # old-style ExtUtils::MakeMaker "Makefile.PL"
+ $perl_args .= " PERL=$perlwrap FULLPERL=$perlwrap";
+ $perl_args .= " INSTALLDIRS=$CF->{perl_schema}";
+ $perl_args .= " INSTALLMAN3DIR=none INSTALLSITEMAN3DIR=none INSTALLVENDORMAN3DIR=none";
+ $perl_args .= " DESTDIR=$CF->{path_buildroot}";
+ if ($CF->{path_prefix} ne '' and $CF->{path_prefix} ne '@l_prefix@') {
+ $perl_args .= " PREFIX=$CF->{path_prefix}";
+ }
+ if ($CF->{path_libdir} ne '') {
+ $perl_args .= " LIB=$CF->{path_libdir}";
+ }
+ $environment = 'ExtUtils::MakeMaker';
+ }
+ else {
+ die "neither usable Module::Build \"Build.PL\" nor ExtUtils::MakeMaker \"Makefile.PL\" file found";
+ }
+
+ # determine build-time extra arguments
+ # (assuming that they are either work for both Module::Build and
+ # ExtUtils::MakeMaker or the supplier knows what is used by us)
+ if ($#{$CF->{perl_args}} >= 0) {
+ my $user_args = join(" ", @{$CF->{perl_args}});
+ if ($user_args =~ m|#|) {
+ $user_args =~ s|#| $perl_args |;
+ $perl_args = $user_args;
+ }
+ else {
+ $perl_args .= " " . $user_args;
+ }
+ }
+
+ # determine stdin
+ if ($CF->{perl_stdin} ne "-") {
+ $perl_args .= " <$CF->{perl_stdin}";
+ }
+
+ # setup the build environment
+ if ($environment eq 'Module::Build') {
+ &verbose("configuring module via Module::Build environment");
+ &runcmd("chmod u+rw Build.PL");
+ &runcmd("cp Build.PL Build.PL.orig");
+ &runcmd("(cat Build.PL.orig; echo '') | sed -e \"s:\\\$^X:'$perlwrap':g\" >Build.PL");
+ &runcmd("$perlwrap ./Build.PL $perl_args")
+ or die "failed to \"configure\"";
+ }
+ elsif ($environment eq 'ExtUtils::MakeMaker') {
+ &verbose("configuring module via ExtUtils::MakeMaker environment");
+ &runcmd("chmod u+rw Makefile.PL");
+ &runcmd("cp Makefile.PL Makefile.PL.orig");
+ &runcmd("(cat Makefile.PL.orig; echo '') | sed -e \"s:\\\$^X:'$perlwrap':g\" >Makefile.PL");
+ &runcmd("$perlwrap ./Makefile.PL $perl_args")
+ or die "failed to \"configure\"";
+ }
+}
+
+# ==== STEP: 3. build ====
+if (grep { $_ eq "build" } @steps_run) {
+ &verbose("step 3: build");
+
+ if (-f "Build.PL" and -f "Build") {
+ # execute Build script
+ &verbose("building module via Module::Build environment");
+ &runcmd("$perlwrap Build build")
+ or die "failed to \"build\"";
+ }
+ elsif (-f "Makefile.PL" and -f "Makefile") {
+ # execute Makefile procedure
+ &verbose("building module via ExtUtils::MakeMaker environment");
+ my $make = `$CF->{prog_rpm} --eval '\%{l_make} \%{l_mflags}'`;
+ $make =~ s|\n+$||s;
+ my $make_args = "PERL=$perlwrap FULLPERL=$perlwrap";
+ &runcmd("$make $make_args pure_all")
+ or die "failed to \"build\"";
+ }
+ else {
+ die "neither \"Build\" nor \"Makefile\" found in working directory";
+ }
+}
+
+# ==== STEP: 4. install ====
+if (grep { $_ eq "install" } @steps_run) {
+ &verbose("step 4: install");
+
+ if (-f "Build.PL" and -f "Build") {
+ # execute Build script
+ &verbose("installing module via Module::Build environment");
+ &runcmd("$perlwrap Build install")
+ or die "failed to \"install\"";
+ &runcmd("rm -rf $CF->{path_buildroot}$CF->{path_prefix}/remove-me-later");
+ }
+ elsif (-f "Makefile.PL" and -f "Makefile") {
+ # execute Makefile procedure
+ &verbose("installing module via ExtUtils::MakeMaker environment");
+ my $make = `$CF->{prog_rpm} --eval '\%{l_make} \%{l_mflags}'`;
+ $make =~ s|\n+$||s;
+ my $make_args = "PERL=$perlwrap FULLPERL=$perlwrap";
+ &runcmd("$make $make_args pure_install")
+ or die "failed to \"install\"";
+ }
+ else {
+ die "neither \"Build\" nor \"Makefile\" found in working directory";
+ }
+}
+
+# ==== STEP: 5. fixate ====
+if (grep { $_ eq "fixate" } @steps_run) {
+ &verbose("step 5: fixate");
+
+ # prune installation files
+ my $libdir;
+ if ($CF->{path_libdir} ne '') {
+ $libdir = "$CF->{path_buildroot}$CF->{path_libdir}";
+ }
+ else {
+ $libdir = "$CF->{path_buildroot}$CF->{path_prefix}/lib/perl";
+ }
+ &runcmd("find $libdir -name perllocal.pod -print | xargs rm -f");
+ &runcmd("find $libdir -name .packlist -print | xargs rm -f");
+ &runcmd("find $libdir -depth -type d -print | (xargs rmdir >/dev/null 2>&1 || true)");
+
+ # determine RPM installation file list
+ my @files = ();
+ if ($CF->{path_libdir} eq '') {
+ push(@files, '%not %dir '.$CF->{path_prefix}.'/lib/perl');
+ push(@files, '%not %dir '.$pcfg->{installarchlib}.'/auto');
+ push(@files, '%not %dir '.$pcfg->{installarchlib});
+ push(@files, '%not %dir '.$pcfg->{installprivlib}.'/auto');
+ push(@files, '%not %dir '.$pcfg->{installprivlib});
+ push(@files, '%not %dir '.$pcfg->{sitelib_stem});
+ push(@files, '%not %dir '.$pcfg->{installsitearch}.'/auto');
+ push(@files, '%not %dir '.$pcfg->{installsitearch});
+ push(@files, '%not %dir '.$pcfg->{installsitelib}.'/auto');
+ push(@files, '%not %dir '.$pcfg->{installsitelib});
+ push(@files, '%not %dir '.$pcfg->{vendorlib_stem});
+ push(@files, '%not %dir '.$pcfg->{installvendorarch}.'/auto');
+ push(@files, '%not %dir '.$pcfg->{installvendorarch});
+ push(@files, '%not %dir '.$pcfg->{installvendorlib}.'/auto');
+ push(@files, '%not %dir '.$pcfg->{installvendorlib});
+ }
+ else {
+ push(@files, $CF->{path_libdir});
+ }
+
+ # output RPM installation file list
+ my $out;
+ if ($CF->{files_file} eq "-") {
+ $out = new IO::Handle;
+ $out->fdopen(fileno(STDOUT), "w");
+ }
+ else {
+ $out = new IO::File ">$CF->{files_file}";
+ }
+ if ($CF->{files_unquoted}) {
+ print $out join("\n", @files) . "\n";
+ }
+ else {
+ print $out '"'. join('"'."\n".'"', @files).'"'."\n";
+ }
+ $out->close();
+}
+
+# ==== STEP: 6. cleanup ====
+if (grep { $_ eq "cleanup" } @steps_run) {
+ &verbose("step 6: cleanup");
+
+ # remove temporary directory and its contents
+ &runcmd("rm -rf $tmpdir");
+}
+
+# die gracefully...
+&verbose("cleaning up environment");
+&cleanup_perform();
+exit(0);
+
+__END__
+
+##
+## UNIX MANUAL PAGE
+##
+
+=pod
+
+=head1 NAME
+
+B - B
+
+=head1 SYNOPSIS
+
+B
+[B<-p>|B<--prefix> I]
+[B<-D>|B<--libdir> I]
+[B<-t>|B<--tmpdir> I]
+[B<-d>|B<--wrkdir> I]
+[B<-r>|B<--buildroot> I]
+[B<-w>|B<--buildwork> I]
+[B<-R>|B<--rpm> I]
+[B<-P>|B<--perl> I]
+[B<-s>|B<--schema> I
+[B<-A>|B<--args> I]
+[B<-I>|B<--stdin> I]
+[B<-F>|B<--files> I]
+[B<-U>|B<--unquoted>]
+[B<-n>|B<--pkgname> I]
+[B<-q>|B<--quiet>]
+[B<-v>|B<--verbose>]
+[I ...]
+
+B
+[B<-v>|B<--version>]
+[B<-h>|B<--help>]
+
+=head1 DESCRIPTION
+
+The B program is an internal B packaging utility
+for building C based Perl modules during the build
+procedure of Perl module based B packages. It provides an
+adjustable C environment.
+
+=head1 OPTIONS
+
+The following command line options are available:
+
+=head2 Filesystem Paths
+
+The following command-line options set various filesystem paths.
+
+=over 4
+
+=item B<-p>, B<--prefix> I
+
+Filesystem path to OpenPKG instance. Default is C<@l_prefix@>.
+
+=item B<-l>, B<--libdir> I
+
+Filesystem path to Perl lib directory. Default is
+"IC".
+
+=item B<-t>, B<--tmpdir> I
+
+Filesystem path to temporary directory. Default is C<$TMPDIR>,
+as provided by the RPM build-time environment.
+
+=item B<-d>, B<--wrkdir> I
+
+Filesystem path to working directory. Default is current working directory
+as provided by the RPM build-time environment.
+
+=item B<-r>, B<--buildroot> I
+
+Filesystem path to RPM build root directory. Default is C<$RPM_BUILD_ROOT>,
+as provided by the RPM build-time environment.
+
+=item B<-w>, B<--buildwork> I
+
+Filesystem path to RPM build work directory. Default is C<$RPM_BUILD_DIR>,
+as provided by the RPM build-time environment.
+
+=item B<-R>, B<--rpm> I
+
+Filesystem path to RPM program. Default is "IC".
+
+=item B<-P>, B<--perl> I
+
+Filesystem path to Perl program. Default is IC.
+
+=back
+
+=head2 OpenPKG Package Information
+
+The following command-line options set various package information.
+
+=over 4
+
+=item B<-s>, B<--schema> I
+
+Sets the Perl C schema. Allowed values are
+"C", "C" and "C". The default is "C".
+
+=item B<-A>, B<--args> I
+
+Sets additional arguments which are passed through on the "C" command line. This option can be specified multiple times,
+args are joined with a space between them. If joined args contain a '#' then
+it is substituted by the automatically generated args otherwise joined args
+are appended to automatically generated args. Default is empty.
+
+=item B<-I>, B<--stdin> I
+
+Filesystem path to connect to F on the "C"
+command line. Default is "C". A value of "C<->" means reading
+from F.
+
+=item B<-F>, B<--files> I
+
+Filesystem path to write the RPM C<%files> entries to describing the
+packaging list of all installed files. The default is "C<->" meaning
+that the list is written to F.
+
+=item B<-U>, B<--unquoted>
+
+By default the RPM <%files> list is written with each path entry
+enclosed in quotation marks. For raw post-processing, this option allows
+the list to be written without enclosing quotation marks.
+
+=item B<-n>, B<--pkgname> I
+
+Name of involved RPM package.
+
+=back
+
+=head2 Run-Time Modes
+
+The following command-line options set various run-time modes.
+
+=over 4
+
+=item B<-q>, B<--quiet>
+
+Operate in quiet run-time mode.
+
+=item B<-v>, B<--verbose>
+
+Operate in verbose run-time mode.
+
+=back
+
+=head2 Stand-Alone Operations
+
+The following command-line options trigger various stand-alone operations.
+
+=over 4
+
+=item B<-V>, B<--version>
+
+Print program version only.
+
+=item B<-h>, B<--help>
+
+Print program usage help only.
+
+=back
+
+=head1 OPERATION STEPS
+
+The operation procedure of B is divided into the following
+six distinguished steps:
+
+=over 3
+
+=item B<1. prepare>
+
+This prepares the build environment by optionally creating a temporary
+directory and establishing a Perl wrapper script.
+This step can be shared between the configuration, building and installation
+of multiple modules.
+
+=item B<2. configure>
+
+This configures the Perl module by performing the equivalent of
+the command "C". This step has to be performed
+individually for each particular module.
+
+=item B<3. build>
+
+This builds the Perl module by performing the equivalent of the command
+"C". This step has to be performed individually for each
+particular module.
+
+=item B<4. install>
+
+This installs the Perl module by performing the equivalent of the
+command "C". This step has to be performed individually
+for each particular module.
+
+=item B<5. fixate>
+
+This fixates the installed files by removing unnecessary ones, fixing
+permissions and determining the resulting file list. This step can be
+shared between the configuration, building and installation of multiple
+modules.
+
+=item B<6. cleanup>
+
+This cleans up the build environment by removing all temporary files.
+This step can be shared between the configuration, building and
+installation of multiple modules.
+
+=back
+
+By default all operation steps are performed in sequence. Alternatively,
+the sequence of steps can be individually specified on the command
+line as one or more I arguments. The given sequence of Is
+has to be exactly a contiguous sub-sequence of the sequence listed
+above. As the extrem cases, it can be "C" (the same as not specifying any steps) or just perhaps
+"C" (for executing only a particular step).
+
+=head1 EXAMPLE
+
+ # packaging of single module
+ perl-openpkg
+
+ # packaging of multiple modules
+ perl-openpkg prepare
+ perl-openpkg -d Foo-1 configure build install
+ perl-openpkg -d Bar-2 configure build install
+ perl-openpkg -d Baz-3 configure build install
+ perl-openpkg fixate cleanup
+
+=head1 HISTORY
+
+The B utility was originally implemented as a small
+Bourne-Shell script for use in OpenPKG 1.1. It was later rewritten from
+scratch in Perl for OpenPKG 2.0 and especially made more flexible to
+reduce the complexity in numerious packages.
+
+=head1 SEE ALSO
+
+perl(1), "C".
+
+=head1 AUTHORS
+
+Ralf S. Engelschall Erse@engelschall.comE.
+
+=cut
+