#!/bin/sh # # Generate perl base modules package definitions # # Copyright (C) 2007 Peter Colberg # Licensed under the terms of the GNU General Public License. # if [ $# -lt 1 ]; then echo >&2 "Usage: $(basename $0) STAGING-DIR [OUTFILE]" exit 1 fi STAGING_DIR="$1" PERL_BIN="$STAGING_DIR/usr/bin/perl" PERL_LIB="$STAGING_DIR/usr/lib/perl5/5.10" INC_DIR="$(dirname $0)" shift "$PERL_BIN" -I"$INC_DIR" -I"$PERL_LIB" - "$PERL_LIB" "$@" <<'PERL_SCRIPT' use strict; use warnings; use Module::ScanDeps; use File::Find; use File::Basename; our $skipfiles = 'CORE vmsish.pm auto/sdbm'; our %defmodules = ( 'essential' => 'lib.pm vars.pm strict.pm warnings.pm warnings Carp Carp.pm Exporter Exporter.pm locale.pm subs.pm overload.pm constant.pm', 'getoptpl' => 'getopt.pl getopts.pl', 'utf8' => 'utf8_heavy.pl', 'Getopt' => 'newgetopt.pl', 'open' => 'open2.pl open3.pl', 'Config' => 'Config_heavy.pl', 'bytes' => 'bytes_heavy.pl', ); our %defdepends = ( 'DB_File' => 'libdb1-compat', 'GDBM_File' => 'libgdbm', ); our $prefix = 'perlbase-'; sub template ($) { $_ = $_[0]; return < \&wanted, no_chdir => 1}, '.'); for $pkg (keys %modules) { $packages{$pkg} = []; $excludes{$pkg} = []; $depends{$pkg} = {}; } for $file (keys %files) { $mod = $files{$file}; $parent = $files{dirname($file)}; if (defined ($mod)) { if (defined ($parent) and not ($parent eq $mod)) { push @{$packages{$mod}}, $file; push @{$excludes{$parent}}, $file; } elsif (not defined ($parent)) { push @{$packages{$mod}}, $file; } } elsif (defined ($parent)) { push @{$excludes{$parent}}, $file; } } for $mod (keys %defdepends) { ($pkg = $prefix . $mod) =~ tr/A-Z_/a-z-/; for $dep (split / /, $defdepends{$mod}) { ${$depends{$pkg}}{$dep} = 1; } } @INC = ('.'); for $file (grep { -f $_ and defined $files{$_} } keys %files) { @deps = keys %{scan_deps(files => [ $file ], recurse => 0)}; $pkg = $files{$file}; for $dep (grep { not defined $files{$_} } @deps) { warn "$file: could not resolve dependency: $dep\n"; } for $dep (grep { defined $files{$_} } @deps) { next if ($files{$dep} eq $pkg); ${$depends{$pkg}}{$files{$dep}} = 1; } } for $pkg (sort keys %packages) { push @result, template({ package => $pkg, module => $modules{$pkg}, depends => join(' ', 'perl', sort keys %{$depends{$pkg}}), files => join(' ', sort @{$packages{$pkg}}), exclude => join(' ', sort @{$excludes{$pkg}}), }); } return join('', @result); } if (@ARGV > 1) { open FILE, ">$ARGV[1]" or die "$ARGV[1]: $!\n"; print FILE scandeps($ARGV[0]); close FILE; } else { print scandeps($ARGV[0] or '.'); } PERL_SCRIPT