use Getopt::Long qw(:config no_ignore_case permute); use Pod::Usage; use Module::Mapper; use strict; use warnings; my $path = undef; my @modules = (); my @localdirs = (); my @exes = (); my $help = 0; my %options = ( Libs => \@localdirs, Modules => \@modules, Scripts => \@exes, Verbose => sub { print $_[0]; } ); GetOptions( 'a|all' => sub { $options{All} = 1; }, 'e|exe=s' => sub {push @exes, $_[1]; }, 'h|help' => \$help, 'I|useINC' => sub { $options{UseINC} = 1; }, 'l|lib=s' => sub { push @localdirs, $_[1]; }, 'M|module=s' => sub { push @modules, $_[1]; }, 'o|out|output=s' => sub { $options{Output} = $_[1]; }, 'p|pod' => sub { $options{IncludePOD} = 1; }, 'P|project' => sub { $options{Project} = $_[1]; }, ); pod2usage(1) if $help; # # normalize and test for the directories # foreach (@localdirs) { s![/\\]$!!; die "Cannot find directory $_, exitting.\n" unless -d; } die "Nothing to do, exitting (perhaps you forgot -e or -M ?)." if $options{UseINC} && (! scalar @localdirs) && (! scalar @modules) && (! scalar @exes); my $modules = find_sources(%options); die $@ unless $modules; =pod =head1 NAME mapmodule =head1 SYNOPSIS mapmodule [options] Options: -a|-all locate all children of specified modules -e|-exe pathname to an executable script -h|-help display this help and exit -I|-useINC search in @INC after searching any specified local directories -l|-lib search for modules -M|-module a module to search for (in X::Y::Z format) -o|-out|-output target root directory mapped paths -p|-pod include POD files (ending in .pod) in search -P|-project root project directory (for project mode only) Multiple source modules, executables, and libraries may be specified, e.g., mapmodule -a -o ./sources -I -l ./lib1 -l ./lib2 -M Some::Module -e ./bin/mapmodule searches ./lib1, ./lib2, and @INC for the first occurance of Some/Module.pm, and maps the results to ./sources/lib/Some/Module.pm if found in @INC, or ./sources/blib/Some/Module.pm if found in ./lib1 or ./lib2, and also maps ./bin/mapmodule to ./source/bin/mapmodule. If the directory where Some::Module was found has a Module directory, it will recurse through it to map all the child module files found. If none of -l, -e, or -M is specified, collects all modules found in './lib' and all files in './bin' (aka "project mode"), e.g., mapmodule -o ./sources will map all modules under ./lib to ./sources/blib and all scripts under ./bin to ./sources/bin. =head1 DESCRIPTION Using L, searches either specified directories, or @INC (or both) for the specified module(s) or executable(s). Prints the full path where the sources were found and (optionally) a mapping output path if the -o options was specified. If -o is specified, then the output path is mapped as follows: Source Type Location ----------- ------------------------ executables /bin local modules /blib @INC modules /lib