#!/bin/sh # # Generate perl module package dependencies # # Copyright (C) 2007 Peter Colberg # Licensed under the terms of the GNU General Public License. # if [ $# -lt 3 ]; then echo >&2 "Usage: $(basename $0) STAGING-DIR PERL-BUILD-DIR [FILES...] [DIRECTORIES...]" 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_SCRIPT' use strict; use warnings; use Module::ScanDeps; use File::Find; use Cwd; our $sitelib = "/usr/lib/perl5/5.10"; sub scandeps { my $builddir = Cwd::abs_path(shift); my @scanpaths = @_; my ($curdir, @pkgdirs, $dir, @deps, %depends, $file); our ($pkg, %bundles, $path, @files); @pkgdirs = glob($builddir . "/*/ipkg"); $curdir = getcwd(); @INC = (); for $dir (@pkgdirs) { chdir($dir) or die "$dir: $!"; for $pkg (glob("*")) { chdir($dir . "/" . $pkg . $sitelib) or next; push @INC, getcwd(); sub wanted { return unless (-f $_); s/^\.\///; $bundles{$_} = $pkg; } find({ wanted => \&wanted, no_chdir => 1 }, "."); } } chdir($curdir) or die "$curdir: $!\n"; for $path (@scanpaths) { sub scan_wanted { return unless (-f $_ and /\.(pl|pm)$/); push @files, $_; } if (-f $path) { push @files, $path; } elsif (-d $path) { find({ wanted => \&scan_wanted, no_chdir => 1 }, $path); } } @deps = keys %{scan_deps(files => \@files, recurse => 0)}; for $file (grep { not exists $bundles{$_} } @deps) { warn "could not resolve dependency: $file\n"; } %depends = map { $bundles{$_}, 1 } grep { exists $bundles{$_} } @deps; if (%depends) { print join(' ', 'perl', sort keys %depends), "\n"; } } if (@ARGV > 1) { scandeps(@ARGV); } PERL_SCRIPT