App-Build
view release on metacpan or search on metacpan
lib/App/Build.pm view on Meta::CPAN
=cut
sub _get_extra_dirs_attributes {
my ($self) = @_;
my $properties = $self->{properties};
my @extra_dirs = ();
my ($extra_dirs);
if ($properties->{extra_dirs}) {
if (ref($properties->{extra_dirs}) eq "ARRAY") {
@extra_dirs = @{$properties->{extra_dirs}};
$extra_dirs = { map { $_ => { dest_dir => $_ } } @extra_dirs };
}
elsif (ref($properties->{extra_dirs}) eq "HASH") {
@extra_dirs = (sort keys %{$properties->{extra_dirs}});
$extra_dirs = $properties->{extra_dirs};
}
elsif (ref($properties->{extra_dirs})) {
die "extra_dirs can be a scalar, array ref, or hash ref, but not " . ref($properties->{extra_dirs});
}
else {
@extra_dirs = split(/,/,$properties->{extra_dirs});
$extra_dirs = { map { $_ => { dest_dir => $_ } } @extra_dirs };
}
foreach my $dir (@extra_dirs) {
$extra_dirs->{$dir}{dest_dir} = $self->install_path($dir)
if $self->install_path($dir);
$extra_dirs->{$dir}{dest_dir} = $dir if (!$extra_dirs->{$dir}{dest_dir});
}
}
return($extra_dirs);
}
=head2 process_app_files()
During "./Build" (which calls ACTION_code()), the process_app_files()
method copies files from the extra_dirs to their appropriate
locations under "blib".
=cut
sub process_app_files {
my ($self) = @_;
my ($path, $files);
my @extra_dirs = $self->_get_extra_dirs();
my $extra_dirs = $self->_get_extra_dirs_attributes();
my $blib = $self->blib;
my ($contains_executables, $result, $target_file);
foreach my $dir (@extra_dirs) {
if (-d $dir) {
$contains_executables = $extra_dirs->{$dir}{executable};
$contains_executables = ($dir =~ /bin$/) ? 1 : 0 if (!defined $contains_executables);
$path = File::Spec->catfile($blib, $dir),
File::Path::mkpath($path);
$files = $self->_find_all_files($dir);
my ($should_be_executable);
while (my ($file, $dest) = each %$files) {
$target_file = File::Spec->catfile($blib, $dest);
$result = $self->copy_if_modified(from => $file, to => $target_file) || "";
if ($result && $contains_executables) {
$self->fix_shebang_line($result);
$self->make_executable($result)
if $self->_should_be_executable($result);
}
}
}
}
}
sub _should_be_executable {
my ($self, $file) = @_;
# copied from Module::Build::Base::fix_shebang_line
my $FIXIN = IO::File->new($file) or die "Can't process '$file': $!";
local $/ = "\n";
chomp(my $line = <$FIXIN>);
if ($line =~ /^\s*\#!\s*/) {
return 1;
} else {
return 0;
}
}
=head2 _find_all_files()
This is used by process_app_files() to get the list of files under "extra_dirs"
to copy to "blib".
=cut
sub _find_all_files {
my ($self, $dir) = @_;
return {} unless -d $dir;
return { map { $_, $_ } @{ $self->rscan_dir($dir, sub { -f $_ }) } };
}
=head2 rscan_dir()
Don't include CVS, RCS, and SVN (*/.svn/*) files.
=cut
sub rscan_dir {
my ($self, $dir, $pattern) = @_;
my $files = $self->SUPER::rscan_dir($dir, $pattern);
my @files = grep(!/[\/\\](CVS|RCS|\.svn)[\/\\]/, @$files);
return \@files;
}
######################################################################
# INSTALL: enhancements to "./Build install"
######################################################################
=head2 packlist()
This creates the name of the "packlist" file that needs to be
written with the list of all of the files that get installed.
=cut
( run in 1.693 second using v1.01-cache-2.11-cpan-39bf76dae61 )