ASPEER-MakeMaker

 view release on metacpan or  search on metacpan

lib/ASPEER/MakeMaker.pm  view on Meta::CPAN

    push (@_, qw(const_config postamble)) unless $_[1];
    require ASPEER::MakeMaker::MM::Import;
    goto &ASPEER::MakeMaker::MM::Import::import;

}



#==============================================================================
#
#  Methods to support Makefile targets from here on
#
sub dump_param {

    my ($self, $param_hr)=(shift(), arg(@_));
    print Dumper($param_hr);

}



#  Copy template files from this module to target
#
sub util_sync {

    my ($self, $param_hr)=(shift(), arg(@_));
    my ($srce_pn)=@{$param_hr->{'ARGV_AR'}};


    #  Get dest
    #
    msg('util_sync start');
    my $srce_fn=basename($srce_pn) ||
        return err("unable to get basebane from path: $srce_pn");
    my $to_inst_pm_ar=$param_hr->{'TO_INST_PM_AR'} ||
        return err('unable to get TO_INST_PM_AR Makefile param');
    my ($dest_pn)=(grep { /MM\/${srce_fn}$/ } @{$to_inst_pm_ar});
    $dest_pn ||
        return err("unable to get destination for $srce_fn from TO_INST_PM_AR: %s, dest file must exist !", Dumper($to_inst_pm_ar));


    die "usage: $self->util_sync(..., source_filename)\n"
        unless $srce_pn && $dest_pn;

    die "source file not found: $srce_pn\n"
        unless -e $srce_pn;
    die "source is not a regular file: $srce_pn\n"
        unless -f _;
    die "source is not readable: $srce_pn\n"
        unless -r _;

    my $dest_dir=dirname($dest_pn);
    die "destination directory not found: $dest_dir\n"
        unless -d $dest_dir;

    my $srce_abs=File::Spec->rel2abs($srce_pn);
    my $dest_abs=File::Spec->rel2abs($dest_pn);
    die "source and destination are the same path: $srce_abs\n"
        if $srce_abs eq $dest_abs;

    my @srce_stat=stat($srce_pn)
        or die "stat failed for source $srce_pn: $!\n";

    if (-e $dest_pn) {

        my @dest_stat=stat($dest_pn)
            or die "stat failed for destination $dest_pn: $!\n";

        die "source and destination are the same file: $srce_pn -> $dest_pn\n"
            if $srce_stat[0] == $dest_stat[0] && $srce_stat[1] == $dest_stat[1];

    }

    my ($tmp_fh, $tmp_fn)=tempfile('.util_sync.XXXXXXXX', DIR => $dest_dir);
    close($tmp_fh)
        or die "close failed for temporary file $tmp_fn: $!\n";

    eval {
        my $text=slurp($srce_pn);
        my $name=$param_hr->{'NAME'} ||
            die "target module name unavailable for $dest_pn\n";
        my $version=$param_hr->{'VERSION'};
        my $version_from_fn=$param_hr->{'VERSION_FROM'};
        if ($version_from_fn && -f $version_from_fn) {
            require ExtUtils::MakeMaker;
            my $version_from=MM->parse_version($version_from_fn);
            $version=$version_from
                if defined($version_from) && length($version_from) && $version_from ne 'undef';
        }
        $text=~s/\Q$self\E/$name/g;
        $text=~s/(\$VERSION\s*=\s*')[^']*(';)/$1$version$2/
            if defined($version) && length($version);
        blurp($tmp_fn, $text);
        chmod($srce_stat[2] & 07777, $tmp_fn)
            or die "chmod failed for temporary file $tmp_fn: $!\n";
        utime($srce_stat[8], $srce_stat[9], $tmp_fn)
            or die "utime failed for temporary file $tmp_fn: $!\n";
        rename($tmp_fn, $dest_pn)
            or die "rename failed from $tmp_fn to $dest_pn: $!\n";
        1;
    } or do {
        my $err=$@ || 'unknown error';
        unlink($tmp_fn) if -e $tmp_fn;
        die $err;
    };


    msg("updated $dest_pn");
    return 1;
}

__END__

=begin markdown

# ASPEER::MakeMaker

## Name

ASPEER::MakeMaker - parent entry point and shared make-target methods for MakeMaker plugins

## Synopsis

```perl
use ASPEER::MakeMaker;
use ExtUtils::MakeMaker;



( run in 0.473 second using v1.01-cache-2.11-cpan-3b040b67cf0 )