|
|
- #!/bin/sh
- #
- # Generate perl base modules package definitions
- #
- # Copyright (C) 2007 Peter Colberg <peter@petercolberg.org>
- # 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 <<TEMPLATE;
- define Package/$$_{package}
- SECTION:=lang
- CATEGORY:=Languages
- URL:=http://www.cpan.org/
- TITLE:=$$_{module} perl module
- DEPENDS:=$$_{depends}
- endef
-
- define Package/$$_{package}/install
- \$(call perlmod/Install,\$(1),$$_{files},$$_{exclude})
- endef
-
- \$(eval \$(call BuildPackage,$$_{package}))
-
-
- TEMPLATE
- }
-
-
- sub scandeps ($) {
- my $sitedir = shift;
- my @result;
-
- my ($mod, $file, @deps, $dep, %depends, $parent, $pkg);
- our (%files, %modules);
- my (%packages, %excludes);
-
- for $mod (keys %defmodules) {
- ($pkg = $prefix . $mod) =~ tr/A-Z_/a-z-/;
- $modules{$pkg} = $mod;
- for $file (split / /, $defmodules{$mod}) {
- $files{$file} = $pkg;
- }
- }
- for $file ('pod', 'Pod', split(/ /, $skipfiles)) {
- $files{$file} = undef;
- }
-
- sub wanted {
- s/^\.\///;
- return if (/^(\.|auto)$/ or exists $files{$_});
- if (/\.pod$/) {
- $files{$_} = undef;
- }
- elsif (exists $files{dirname($_)}) {
- $files{$_} = $files{dirname($_)};
- }
- elsif (m!^(?:auto/)?([^./]+)(?:\.(?:pl|pm)|/|$)!) {
- (my $pkg = $prefix . $1) =~ tr/A-Z_/a-z-/;
- $modules{$pkg} = $1;
- $files{$_} = $pkg;
- }
- else {
- $files{$_} = undef;
- }
- }
- chdir($sitedir);
- find({ wanted => \&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
|