Thu, 02 Aug 2012 01:14:45 +0200
Correct typical english grammar mistakes in german linguistics.
1 #!@l_prefix@/bin/perl -w
2 ##
3 ## perl-openpkg -- OpenPKG Perl Module Build Utility
4 ## Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>
5 ## Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>
6 ##
7 ## Permission to use, copy, modify, and distribute this software for
8 ## any purpose with or without fee is hereby granted, provided that
9 ## the above copyright notice and this permission notice appear in all
10 ## copies.
11 ##
12 ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
13 ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
14 ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
15 ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
16 ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
17 ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
18 ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
19 ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20 ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
21 ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
22 ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 ## SUCH DAMAGE.
24 ##
26 require 5;
27 use strict;
28 use Getopt::Long;
29 use IO qw(Handle Seekable File Pipe Socket Dir);
31 # program information
32 my $ME = {
33 prog_path => $0,
34 prog_name => "perl-openpkg",
35 prog_vers => "2.0.1",
36 prog_date => "03-Dec-2004"
37 };
39 # program configuration
40 my $CF = {
41 path_prefix => '@l_prefix@',
42 path_libdir => "",
43 path_tmpdir => ($ENV{"TMPDIR"} || "/tmp"),
44 path_wrkdir => "",
45 path_buildroot => ($ENV{"RPM_BUILD_ROOT"} || ""),
46 path_buildwork => ($ENV{"RPM_BUILD_DIR"} || ""),
47 pkg_name => ($ENV{"RPM_PACKAGE_NAME"} || ""),
48 perl_schema => "vendor",
49 perl_args => [],
50 perl_stdin => "/dev/null",
51 files_file => "-",
52 files_unquoted => 0,
53 prog_rpm => '%path_prefix%/libexec/openpkg/rpm',
54 prog_perl => '%path_prefix%/bin/perl',
55 mode_quiet => 0,
56 mode_verbose => 0,
57 run_version => 0,
58 run_help => 0,
59 };
61 # cleanup support
62 my @cleanup = ();
63 sub cleanup_remember {
64 my ($cmd) = @_;
65 push(@cleanup, $cmd);
66 }
67 sub cleanup_perform {
68 foreach my $cmd (reverse @cleanup) {
69 &runcmd($cmd);
70 }
71 }
73 # exception handling support
74 $SIG{__DIE__} = sub {
75 my ($err) = @_;
76 $err =~ s|\s+at\s+.*||s if (not $CF->{mode_verbose});
77 print STDERR "$ME->{prog_name}:ERROR: $err ". ($! ? "($!)" : "") . "\n";
78 &cleanup_perform() if (not $CF->{mode_verbose});
79 exit(1);
80 };
82 # verbose message printing
83 sub verbose {
84 my ($msg) = @_;
85 print STDERR "++ $msg\n" if (not $CF->{mode_quiet});
86 }
88 # expand into a full filesystem path
89 sub fullpath {
90 my ($prog) = @_;
91 my $fullprog = '';
92 foreach my $path (split(/:/, $ENV{PATH})) {
93 if (-x "$path/$prog") {
94 $fullprog = "$path/$prog";
95 last;
96 }
97 }
98 return $fullprog;
99 }
101 # execution of external commands
102 sub runcmd {
103 my ($cmd) = @_;
104 print STDERR "\$ $cmd\n" if ($CF->{mode_verbose});
105 $cmd = "($cmd) >/dev/null 2>&1" if ($CF->{mode_quiet});
106 return (system($cmd) == 0);
107 }
109 # create a directory (plus its missing parent dirs)
110 sub mkdirp {
111 my ($dir) = @_;
112 my $pdir = $dir;
113 $pdir =~ s|/[^/]*$||s;
114 if (not -d $pdir) {
115 &mkdirp($pdir, 0755);
116 }
117 if (not -d $dir) {
118 &runcmd("umask 022 && mkdir $dir");
119 }
120 }
122 # command line parsing
123 Getopt::Long::Configure("bundling");
124 my $result = GetOptions(
125 'p|prefix=s' => \$CF->{path_prefix},
126 'l|libdir=s' => \$CF->{path_libdir},
127 't|tmpdir=s' => \$CF->{path_tmpdir},
128 'd|wrkdir=s' => \$CF->{path_wrkdir},
129 'r|buildroot=s' => \$CF->{path_buildroot},
130 'w|buildwork=s' => \$CF->{path_buildwork},
131 'R|rpm=s' => \$CF->{prog_rpm},
132 'P|perl=s' => \$CF->{prog_perl},
133 's|schema=s' => \$CF->{perl_schema},
134 'A|args=s' => \@{$CF->{perl_args}},
135 'I|stdin=s' => \$CF->{perl_stdin},
136 'F|files=s' => \$CF->{files_file},
137 'U|unquoted' => \$CF->{files_unquoted},
138 'n|pkgname=s' => \$CF->{pkg_name},
139 'q|quiet' => \$CF->{mode_quiet},
140 'v|verbose' => \$CF->{mode_verbose},
141 'V|version' => \$CF->{run_version},
142 'h|help' => \$CF->{run_help}
143 ) || die "option parsing failed";
144 if ($CF->{run_help}) {
145 print "Usage: $ME->{prog_name} [options]\n" .
146 "Available options:\n" .
147 "\n" .
148 " -p, --prefix <dir-path> filesystem path to OpenPKG instance\n" .
149 " -l, --libdir <dir-path> filesystem path to Perl lib directory\n" .
150 " -t, --tmpdir <dir-path> filesystem path to temporary directory\n" .
151 " -d, --wrkdir <dir-path> filesystem path to working directory\n" .
152 " -r, --buildroot <dir-path> filesystem path to RPM build root directory\n" .
153 " -w, --buildwork <dir-path> filesystem path to RPM build work directory\n" .
154 " -R, --rpm <file-path> filesystem path to RPM program\n" .
155 " -P, --perl <file-path> filesystem path to Perl program\n" .
156 "\n" .
157 " -s, --schema <schema> Perl INSTALLDIRS schema\n" .
158 " -A, --args <arguments> Perl Build.PL/Makefile.PL passed through arguments\n" .
159 " -I, --stdin <file-path> filesystem path to connect to stdin\n" .
160 " -F, --files <file-path> filesystem path to write RPM \%files list to\n" .
161 " -U, --unquoted output RPM \%files list in unquoted format\n" .
162 " -n, --pkgname <package-name> name of involved RPM package\n" .
163 "\n" .
164 " -q, --quiet operate in quiet run-time mode\n" .
165 " -v, --verbose operate in verbose run-time mode\n" .
166 "\n" .
167 " -V, --version print out program version\n" .
168 " -h, --help print out program usage help\n";
169 exit(0);
170 }
171 if ($CF->{run_version}) {
172 print "OpenPKG $ME->{prog_name} $ME->{prog_vers} ($ME->{prog_date})\n";
173 exit(0);
174 }
176 # fix configuration parameters
177 foreach my $cf (keys(%{$CF})) {
178 $CF->{$cf} =~ s|\%([A-Za-z_][A-Za-z0-9_]*)\%|$CF->{$1}|sge;
179 }
181 # determine operation steps
182 my @steps_exist = qw(prepare configure build install fixate cleanup);
183 my @steps_run = ();
184 if (@ARGV > 0) {
185 foreach my $step (@ARGV) {
186 if (not grep { $_ eq $step } @steps_exist) {
187 die "operation step \"$step\" not existing";
188 }
189 push(@steps_run, $step);
190 }
191 my $steps_exist = "-".join("-", @steps_exist)."-";
192 my $steps_run = "-".join("-", @steps_run)."-";
193 if ($steps_exist !~ m|^.*${steps_run}.*$|s) {
194 die "invalid operation step order \"".join(" ", @ARGV)."\"";
195 }
196 }
197 else {
198 @steps_run = @steps_exist;
199 }
201 # friendly header ;-)
202 &verbose("OpenPKG $ME->{prog_name} $ME->{prog_vers} ($ME->{prog_date})");
204 # determine RPM program
205 if (not -x $CF->{prog_rpm}) {
206 $CF->{prog_rpm} = &fullpath($CF->{prog_rpm});
207 }
208 my $V = `$CF->{prog_rpm} --version 2>/dev/null`;
209 $V =~ s/^(?:rpm \(OpenPKG RPM\)|RPM version|OpenPKG RPM|rpm\s+\(.+?\))\s+([0-9ab.]+)(\.(?:SNAPSHOT|DEVEL).*)?\s*$/$1/s ||
210 die "program '$CF->{prog_rpm}' seems to be not RPM";
211 &verbose("determined RPM program: $CF->{prog_rpm} ($V)");
213 # determine Perl program
214 if (not -x $CF->{prog_perl}) {
215 $CF->{prog_perl} = &fullpath($CF->{prog_perl});
216 }
217 $V = `$CF->{prog_perl} --version 2>/dev/null`;
218 $V =~ s|^.*This is perl.+v?(5\.[\d+.]+).*$|$1|s ||
219 die "program '$CF->{prog_perl}' seems to be not Perl";
220 &verbose("determined Perl program: $CF->{prog_perl} ($V)");
222 # check for existing paths
223 if ($CF->{path_buildroot} eq '') {
224 die "RPM build root directory not known (specify one with option --buildroot)";
225 }
226 if ($CF->{path_buildwork} eq '') {
227 die "RPM build work directory not known (specify one with option --buildwork)";
228 }
229 mkdir($CF->{path_buildroot}, 0700);
230 mkdir($CF->{path_buildwork}, 0700);
232 ##
233 ## OPERATION SEQUENCE
234 ##
236 # establish standard environment
237 umask(022);
239 # determine name of temporary directory
240 my $tmpdir = $CF->{path_tmpdir};
241 $tmpdir =~ s|/+$||s;
242 my $user = (getlogin() || getpwuid($<) || $ENV{LOGNAME} || $ENV{USERNAME} || "unknown");
243 my $program = $ME->{prog_name};
244 my $package = ($CF->{pkg_name} || "unknown");
245 $tmpdir .= "/$user-$program-$package";
247 # determine name of perl wrapper script
248 my $perlwrap = "$tmpdir/perl.sh";
250 # optionally change working directory
251 my $dir = $CF->{path_wrkdir};
252 if ($dir ne '') {
253 if (not -d $dir) {
254 # be smart and guess correct directory to
255 # reduce special cases during packaging
256 $dir =~ s|^.+/||s;
257 my $parent = "";
258 my $child = $dir;
259 $child =~ s|^(.+/)([^/]+)$|$parent = $1, $2|se;
260 LOOP: while ($child ne '') {
261 foreach my $dir (glob("${parent}${child}*")) {
262 if (-d "$parent$dir") {
263 $child = $dir;
264 last LOOP;
265 }
266 }
267 $child =~ s|\W\w+$||s || last;
268 last if (-d "$parent$child");
269 }
270 $dir = "$parent$child";
271 }
272 chdir($dir) || die "cannot change to working directory \"$dir\"";
273 }
275 # determine Perl configuration
276 my $pcfg = {};
277 my $cmd = "$CF->{prog_perl}" .
278 " -V:installarchlib -V:installprivlib" .
279 " -V:installsitearch -V:installsitelib -V:sitelib_stem" .
280 " -V:installvendorarch -V:installvendorlib -V:vendorlib_stem";
281 my $out = `$cmd 2>/dev/null || true`;
282 $out =~ s|^(\S+)='([^'']*)';$|$pcfg->{$1} = $2, ''|mge;
284 # ==== COMPAT prolog/epilog ====
285 if (grep { $_ eq "prolog" or $_ eq "epilog" } @steps_run) {
286 print "This is the perl-openpkg >= 20040126 version.\n" .
287 "It was redesigned and is incompatible to previous\n" .
288 "versions. It does not support prolog/epilog steps.\n" .
289 "Please upgrade the package that uses perl-openpkg\n" .
290 "or, as a temporary workaround, downgrade perl-openpkg\n";
291 die "package/perl-openpkg incompatiblity";
292 }
294 # ==== STEP: 1. prepare ====
295 if (grep { $_ eq "prepare" } @steps_run) {
296 &verbose("step 1: prepare");
298 # establish temporary directory
299 system("rm -rf $tmpdir >/dev/null 2>&1");
300 mkdir($tmpdir, 0700) || die "cannot create temporary directory '$tmpdir'";
302 # create Perl executable wrapper script
303 my $io = new IO::File ">$perlwrap"
304 || die "unable to open \"$perlwrap\" for writing";
305 print $io
306 "#!/bin/sh\n" .
307 "exec $CF->{prog_perl} \\\n" .
308 " -I$CF->{path_buildroot}$pcfg->{installarchlib} \\\n" .
309 " -I$CF->{path_buildroot}$pcfg->{installprivlib} \\\n" .
310 " -I$CF->{path_buildroot}$pcfg->{installsitearch} \\\n" .
311 " -I$CF->{path_buildroot}$pcfg->{installsitelib} \\\n" .
312 " -I$CF->{path_buildroot}$pcfg->{installvendorarch} \\\n" .
313 " -I$CF->{path_buildroot}$pcfg->{installvendorlib} \\\n" .
314 " \"\$@\"\n";
315 $io->close();
316 &runcmd("chmod 755 $perlwrap");
318 # establish Perl module installation areas
319 &mkdirp("$CF->{path_buildroot}$pcfg->{installarchlib}");
320 &mkdirp("$CF->{path_buildroot}$pcfg->{installprivlib}");
321 &mkdirp("$CF->{path_buildroot}$pcfg->{installsitearch}");
322 &mkdirp("$CF->{path_buildroot}$pcfg->{installsitelib}");
323 &mkdirp("$CF->{path_buildroot}$pcfg->{installvendorarch}");
324 &mkdirp("$CF->{path_buildroot}$pcfg->{installvendorlib}");
325 }
327 # ==== STEP: 2. configure ====
328 if (grep { $_ eq "configure" } @steps_run) {
329 &verbose("step 2: configure");
331 # determine build environment and basic arguments
332 my $environment = "";
333 my $perl_args = '';
334 if (-f "Build.PL" and (system("$perlwrap -MModule::Build -e '1;' >/dev/null 2>&1") >> 8) == 0) {
335 # new-style Module::Build "Build.PL"
336 $perl_args .= " installdirs=$CF->{perl_schema}";
337 $perl_args .= " --install_path libdoc=remove-me-later";
338 $perl_args .= " destdir=$CF->{path_buildroot}";
339 if ($CF->{path_prefix} ne '' and $CF->{path_prefix} ne '@l_prefix@') {
340 $perl_args .= " install_base=$CF->{path_prefix}";
341 }
342 if ($CF->{path_libdir} ne '') {
343 $perl_args .= " --install_path lib=$CF->{path_libdir}";
344 }
345 $environment = 'Module::Build';
346 }
347 elsif (-f "Makefile.PL") { # ExtUtils::MakeMaker is part of the Perl distribution
348 # old-style ExtUtils::MakeMaker "Makefile.PL"
349 $perl_args .= " PERL=$perlwrap FULLPERL=$perlwrap";
350 $perl_args .= " INSTALLDIRS=$CF->{perl_schema}";
351 $perl_args .= " INSTALLMAN3DIR=none INSTALLSITEMAN3DIR=none INSTALLVENDORMAN3DIR=none";
352 $perl_args .= " DESTDIR=$CF->{path_buildroot}";
353 if ($CF->{path_prefix} ne '' and $CF->{path_prefix} ne '@l_prefix@') {
354 $perl_args .= " PREFIX=$CF->{path_prefix}";
355 }
356 if ($CF->{path_libdir} ne '') {
357 $perl_args .= " LIB=$CF->{path_libdir}";
358 }
359 $environment = 'ExtUtils::MakeMaker';
360 }
361 else {
362 die "neither usable Module::Build \"Build.PL\" nor ExtUtils::MakeMaker \"Makefile.PL\" file found";
363 }
365 # determine build-time extra arguments
366 # (assuming that they are either work for both Module::Build and
367 # ExtUtils::MakeMaker or the supplier knows what is used by us)
368 if ($#{$CF->{perl_args}} >= 0) {
369 my $user_args = join(" ", @{$CF->{perl_args}});
370 if ($user_args =~ m|#|) {
371 $user_args =~ s|#| $perl_args |;
372 $perl_args = $user_args;
373 }
374 else {
375 $perl_args .= " " . $user_args;
376 }
377 }
379 # determine stdin
380 if ($CF->{perl_stdin} ne "-") {
381 $perl_args .= " <$CF->{perl_stdin}";
382 }
384 # setup the build environment
385 if ($environment eq 'Module::Build') {
386 &verbose("configuring module via Module::Build environment");
387 &runcmd("chmod u+rw Build.PL");
388 &runcmd("cp Build.PL Build.PL.orig");
389 &runcmd("(cat Build.PL.orig; echo '') | sed -e \"s:\\\$^X:'$perlwrap':g\" >Build.PL");
390 &runcmd("$perlwrap ./Build.PL $perl_args")
391 or die "failed to \"configure\"";
392 }
393 elsif ($environment eq 'ExtUtils::MakeMaker') {
394 &verbose("configuring module via ExtUtils::MakeMaker environment");
395 &runcmd("chmod u+rw Makefile.PL");
396 &runcmd("cp Makefile.PL Makefile.PL.orig");
397 &runcmd("(cat Makefile.PL.orig; echo '') | sed -e \"s:\\\$^X:'$perlwrap':g\" >Makefile.PL");
398 &runcmd("$perlwrap ./Makefile.PL $perl_args")
399 or die "failed to \"configure\"";
400 }
401 }
403 # ==== STEP: 3. build ====
404 if (grep { $_ eq "build" } @steps_run) {
405 &verbose("step 3: build");
407 if (-f "Build.PL" and -f "Build") {
408 # execute Build script
409 &verbose("building module via Module::Build environment");
410 &runcmd("$perlwrap Build build")
411 or die "failed to \"build\"";
412 }
413 elsif (-f "Makefile.PL" and -f "Makefile") {
414 # execute Makefile procedure
415 &verbose("building module via ExtUtils::MakeMaker environment");
416 my $make = `$CF->{prog_rpm} --eval '\%{l_make} \%{l_mflags}'`;
417 $make =~ s|\n+$||s;
418 my $make_args = "PERL=$perlwrap FULLPERL=$perlwrap";
419 &runcmd("$make $make_args pure_all")
420 or die "failed to \"build\"";
421 }
422 else {
423 die "neither \"Build\" nor \"Makefile\" found in working directory";
424 }
425 }
427 # ==== STEP: 4. install ====
428 if (grep { $_ eq "install" } @steps_run) {
429 &verbose("step 4: install");
431 if (-f "Build.PL" and -f "Build") {
432 # execute Build script
433 &verbose("installing module via Module::Build environment");
434 &runcmd("$perlwrap Build install")
435 or die "failed to \"install\"";
436 &runcmd("rm -rf $CF->{path_buildroot}$CF->{path_prefix}/remove-me-later");
437 }
438 elsif (-f "Makefile.PL" and -f "Makefile") {
439 # execute Makefile procedure
440 &verbose("installing module via ExtUtils::MakeMaker environment");
441 my $make = `$CF->{prog_rpm} --eval '\%{l_make} \%{l_mflags}'`;
442 $make =~ s|\n+$||s;
443 my $make_args = "PERL=$perlwrap FULLPERL=$perlwrap";
444 &runcmd("$make $make_args pure_install")
445 or die "failed to \"install\"";
446 }
447 else {
448 die "neither \"Build\" nor \"Makefile\" found in working directory";
449 }
450 }
452 # ==== STEP: 5. fixate ====
453 if (grep { $_ eq "fixate" } @steps_run) {
454 &verbose("step 5: fixate");
456 # prune installation files
457 my $libdir;
458 if ($CF->{path_libdir} ne '') {
459 $libdir = "$CF->{path_buildroot}$CF->{path_libdir}";
460 }
461 else {
462 $libdir = "$CF->{path_buildroot}$CF->{path_prefix}/lib/perl";
463 }
464 &runcmd("find $libdir -name perllocal.pod -print | xargs rm -f");
465 &runcmd("find $libdir -name .packlist -print | xargs rm -f");
466 &runcmd("find $libdir -depth -type d -print | (xargs rmdir >/dev/null 2>&1 || true)");
468 # determine RPM installation file list
469 my @files = ();
470 if ($CF->{path_libdir} eq '') {
471 push(@files, '%not %dir '.$CF->{path_prefix}.'/lib/perl');
472 push(@files, '%not %dir '.$pcfg->{installarchlib}.'/auto');
473 push(@files, '%not %dir '.$pcfg->{installarchlib});
474 push(@files, '%not %dir '.$pcfg->{installprivlib}.'/auto');
475 push(@files, '%not %dir '.$pcfg->{installprivlib});
476 push(@files, '%not %dir '.$pcfg->{sitelib_stem});
477 push(@files, '%not %dir '.$pcfg->{installsitearch}.'/auto');
478 push(@files, '%not %dir '.$pcfg->{installsitearch});
479 push(@files, '%not %dir '.$pcfg->{installsitelib}.'/auto');
480 push(@files, '%not %dir '.$pcfg->{installsitelib});
481 push(@files, '%not %dir '.$pcfg->{vendorlib_stem});
482 push(@files, '%not %dir '.$pcfg->{installvendorarch}.'/auto');
483 push(@files, '%not %dir '.$pcfg->{installvendorarch});
484 push(@files, '%not %dir '.$pcfg->{installvendorlib}.'/auto');
485 push(@files, '%not %dir '.$pcfg->{installvendorlib});
486 }
487 else {
488 push(@files, $CF->{path_libdir});
489 }
491 # output RPM installation file list
492 my $out;
493 if ($CF->{files_file} eq "-") {
494 $out = new IO::Handle;
495 $out->fdopen(fileno(STDOUT), "w");
496 }
497 else {
498 $out = new IO::File ">$CF->{files_file}";
499 }
500 if ($CF->{files_unquoted}) {
501 print $out join("\n", @files) . "\n";
502 }
503 else {
504 print $out '"'. join('"'."\n".'"', @files).'"'."\n";
505 }
506 $out->close();
507 }
509 # ==== STEP: 6. cleanup ====
510 if (grep { $_ eq "cleanup" } @steps_run) {
511 &verbose("step 6: cleanup");
513 # remove temporary directory and its contents
514 &runcmd("rm -rf $tmpdir");
515 }
517 # die gracefully...
518 &verbose("cleaning up environment");
519 &cleanup_perform();
520 exit(0);
522 __END__
524 ##
525 ## UNIX MANUAL PAGE
526 ##
528 =pod
530 =head1 NAME
532 B<perl-openpkg> - B<OpenPKG Perl Module Build Utility>
534 =head1 SYNOPSIS
536 B<perl-openpkg>
537 [B<-p>|B<--prefix> I<dir-path>]
538 [B<-D>|B<--libdir> I<dir-path>]
539 [B<-t>|B<--tmpdir> I<dir-path>]
540 [B<-d>|B<--wrkdir> I<dir-path>]
541 [B<-r>|B<--buildroot> I<dir-path>]
542 [B<-w>|B<--buildwork> I<dir-path>]
543 [B<-R>|B<--rpm> I<file-path>]
544 [B<-P>|B<--perl> I<file-path>]
545 [B<-s>|B<--schema> I<schema>
546 [B<-A>|B<--args> I<arguments>]
547 [B<-I>|B<--stdin> I<file-path>]
548 [B<-F>|B<--files> I<file-path>]
549 [B<-U>|B<--unquoted>]
550 [B<-n>|B<--pkgname> I<name>]
551 [B<-q>|B<--quiet>]
552 [B<-v>|B<--verbose>]
553 [I<step> ...]
555 B<perl-openpkg>
556 [B<-v>|B<--version>]
557 [B<-h>|B<--help>]
559 =head1 DESCRIPTION
561 The B<perl-openpkg> program is an internal B<OpenPKG> packaging utility
562 for building C<ExtUtils::MakeMaker> based Perl modules during the build
563 procedure of Perl module based B<OpenPKG> packages. It provides an
564 adjustable C<ExtUtils::MakeMaker> environment.
566 =head1 OPTIONS
568 The following command line options are available:
570 =head2 Filesystem Paths
572 The following command-line options set various filesystem paths.
574 =over 4
576 =item B<-p>, B<--prefix> I<dir-path>
578 Filesystem path to OpenPKG instance. Default is C<@l_prefix@>.
580 =item B<-l>, B<--libdir> I<dir-path>
582 Filesystem path to Perl lib directory. Default is
583 "I<prefix>C</lib/perl>".
585 =item B<-t>, B<--tmpdir> I<dir-path>
587 Filesystem path to temporary directory. Default is C<$TMPDIR>,
588 as provided by the RPM build-time environment.
590 =item B<-d>, B<--wrkdir> I<dir-path>
592 Filesystem path to working directory. Default is current working directory
593 as provided by the RPM build-time environment.
595 =item B<-r>, B<--buildroot> I<dir-path>
597 Filesystem path to RPM build root directory. Default is C<$RPM_BUILD_ROOT>,
598 as provided by the RPM build-time environment.
600 =item B<-w>, B<--buildwork> I<dir-path>
602 Filesystem path to RPM build work directory. Default is C<$RPM_BUILD_DIR>,
603 as provided by the RPM build-time environment.
605 =item B<-R>, B<--rpm> I<file-path>
607 Filesystem path to RPM program. Default is "I<prefix>C</bin/openpkg rpm>".
609 =item B<-P>, B<--perl> I<file-path>
611 Filesystem path to Perl program. Default is I<prefix>C</bin/perl>.
613 =back
615 =head2 OpenPKG Package Information
617 The following command-line options set various package information.
619 =over 4
621 =item B<-s>, B<--schema> I<schema>
623 Sets the Perl C<INSTALLDIRS> schema. Allowed values are
624 "C<perl>", "C<site>" and "C<vendor>". The default is "C<vendor>".
626 =item B<-A>, B<--args> I<arguments>
628 Sets additional arguments which are passed through on the "C<perl
629 Makefile.PL>" command line. This option can be specified multiple times,
630 args are joined with a space between them. If joined args contain a '#' then
631 it is substituted by the automatically generated args otherwise joined args
632 are appended to automatically generated args. Default is empty.
634 =item B<-I>, B<--stdin> I<file-path>
636 Filesystem path to connect to F<stdin> on the "C<perl Makefile.PL>"
637 command line. Default is "C</dev/null>". A value of "C<->" means reading
638 from F<stdin>.
640 =item B<-F>, B<--files> I<file-path>
642 Filesystem path to write the RPM C<%files> entries to describing the
643 packaging list of all installed files. The default is "C<->" meaning
644 that the list is written to F<stdout>.
646 =item B<-U>, B<--unquoted>
648 By default the RPM <%files> list is written with each path entry
649 enclosed in quotation marks. For raw post-processing, this option allows
650 the list to be written without enclosing quotation marks.
652 =item B<-n>, B<--pkgname> I<name>
654 Name of involved RPM package.
656 =back
658 =head2 Run-Time Modes
660 The following command-line options set various run-time modes.
662 =over 4
664 =item B<-q>, B<--quiet>
666 Operate in quiet run-time mode.
668 =item B<-v>, B<--verbose>
670 Operate in verbose run-time mode.
672 =back
674 =head2 Stand-Alone Operations
676 The following command-line options trigger various stand-alone operations.
678 =over 4
680 =item B<-V>, B<--version>
682 Print program version only.
684 =item B<-h>, B<--help>
686 Print program usage help only.
688 =back
690 =head1 OPERATION STEPS
692 The operation procedure of B<perl-openpkg> is divided into the following
693 six distinguished steps:
695 =over 3
697 =item B<1. prepare>
699 This prepares the build environment by optionally creating a temporary
700 directory and establishing a Perl wrapper script.
701 This step can be shared between the configuration, building and installation
702 of multiple modules.
704 =item B<2. configure>
706 This configures the Perl module by performing the equivalent of
707 the command "C<perl Makefile.PL>". This step has to be performed
708 individually for each particular module.
710 =item B<3. build>
712 This builds the Perl module by performing the equivalent of the command
713 "C<make all>". This step has to be performed individually for each
714 particular module.
716 =item B<4. install>
718 This installs the Perl module by performing the equivalent of the
719 command "C<make install>". This step has to be performed individually
720 for each particular module.
722 =item B<5. fixate>
724 This fixates the installed files by removing unnecessary ones, fixing
725 permissions and determining the resulting file list. This step can be
726 shared between the configuration, building and installation of multiple
727 modules.
729 =item B<6. cleanup>
731 This cleans up the build environment by removing all temporary files.
732 This step can be shared between the configuration, building and
733 installation of multiple modules.
735 =back
737 By default all operation steps are performed in sequence. Alternatively,
738 the sequence of steps can be individually specified on the command
739 line as one or more I<step> arguments. The given sequence of I<step>s
740 has to be exactly a contiguous sub-sequence of the sequence listed
741 above. As the extrem cases, it can be "C<prepare configure build install
742 fixate cleanup>" (the same as not specifying any steps) or just perhaps
743 "C<build>" (for executing only a particular step).
745 =head1 EXAMPLE
747 # packaging of single module
748 perl-openpkg
750 # packaging of multiple modules
751 perl-openpkg prepare
752 perl-openpkg -d Foo-1 configure build install
753 perl-openpkg -d Bar-2 configure build install
754 perl-openpkg -d Baz-3 configure build install
755 perl-openpkg fixate cleanup
757 =head1 HISTORY
759 The B<perl-openpkg> utility was originally implemented as a small
760 Bourne-Shell script for use in OpenPKG 1.1. It was later rewritten from
761 scratch in Perl for OpenPKG 2.0 and especially made more flexible to
762 reduce the complexity in numerious packages.
764 =head1 SEE ALSO
766 perl(1), "C<perldoc ExtUtils::MakeMaker>".
768 =head1 AUTHORS
770 Ralf S. Engelschall E<lt>rse@engelschall.comE<gt>.
772 =cut