"Fossies" - the Fresh Open Source Software Archive

Member "RT-Extension-Assets-1.05/inc/Module/Install/Makefile.pm" (6 May 2015, 12063 Bytes) of package /linux/misc/RT-Extension-Assets-1.05.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "Makefile.pm" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 1.02_vs_1.04.

    1 #line 1
    2 package Module::Install::Makefile;
    3 
    4 use strict 'vars';
    5 use ExtUtils::MakeMaker   ();
    6 use Module::Install::Base ();
    7 use Fcntl qw/:flock :seek/;
    8 
    9 use vars qw{$VERSION @ISA $ISCORE};
   10 BEGIN {
   11     $VERSION = '1.14';
   12     @ISA     = 'Module::Install::Base';
   13     $ISCORE  = 1;
   14 }
   15 
   16 sub Makefile { $_[0] }
   17 
   18 my %seen = ();
   19 
   20 sub prompt {
   21     shift;
   22 
   23     # Infinite loop protection
   24     my @c = caller();
   25     if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) {
   26         die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])";
   27     }
   28 
   29     # In automated testing or non-interactive session, always use defaults
   30     if ( ($ENV{AUTOMATED_TESTING} or -! -t STDIN) and ! $ENV{PERL_MM_USE_DEFAULT} ) {
   31         local $ENV{PERL_MM_USE_DEFAULT} = 1;
   32         goto &ExtUtils::MakeMaker::prompt;
   33     } else {
   34         goto &ExtUtils::MakeMaker::prompt;
   35     }
   36 }
   37 
   38 # Store a cleaned up version of the MakeMaker version,
   39 # since we need to behave differently in a variety of
   40 # ways based on the MM version.
   41 my $makemaker = eval $ExtUtils::MakeMaker::VERSION;
   42 
   43 # If we are passed a param, do a "newer than" comparison.
   44 # Otherwise, just return the MakeMaker version.
   45 sub makemaker {
   46     ( @_ < 2 or $makemaker >= eval($_[1]) ) ? $makemaker : 0
   47 }
   48 
   49 # Ripped from ExtUtils::MakeMaker 6.56, and slightly modified
   50 # as we only need to know here whether the attribute is an array
   51 # or a hash or something else (which may or may not be appendable).
   52 my %makemaker_argtype = (
   53  C                  => 'ARRAY',
   54  CONFIG             => 'ARRAY',
   55 # CONFIGURE          => 'CODE', # ignore
   56  DIR                => 'ARRAY',
   57  DL_FUNCS           => 'HASH',
   58  DL_VARS            => 'ARRAY',
   59  EXCLUDE_EXT        => 'ARRAY',
   60  EXE_FILES          => 'ARRAY',
   61  FUNCLIST           => 'ARRAY',
   62  H                  => 'ARRAY',
   63  IMPORTS            => 'HASH',
   64  INCLUDE_EXT        => 'ARRAY',
   65  LIBS               => 'ARRAY', # ignore ''
   66  MAN1PODS           => 'HASH',
   67  MAN3PODS           => 'HASH',
   68  META_ADD           => 'HASH',
   69  META_MERGE         => 'HASH',
   70  PL_FILES           => 'HASH',
   71  PM                 => 'HASH',
   72  PMLIBDIRS          => 'ARRAY',
   73  PMLIBPARENTDIRS    => 'ARRAY',
   74  PREREQ_PM          => 'HASH',
   75  CONFIGURE_REQUIRES => 'HASH',
   76  SKIP               => 'ARRAY',
   77  TYPEMAPS           => 'ARRAY',
   78  XS                 => 'HASH',
   79 # VERSION            => ['version',''],  # ignore
   80 # _KEEP_AFTER_FLUSH  => '',
   81 
   82  clean      => 'HASH',
   83  depend     => 'HASH',
   84  dist       => 'HASH',
   85  dynamic_lib=> 'HASH',
   86  linkext    => 'HASH',
   87  macro      => 'HASH',
   88  postamble  => 'HASH',
   89  realclean  => 'HASH',
   90  test       => 'HASH',
   91  tool_autosplit => 'HASH',
   92 
   93  # special cases where you can use makemaker_append
   94  CCFLAGS   => 'APPENDABLE',
   95  DEFINE    => 'APPENDABLE',
   96  INC       => 'APPENDABLE',
   97  LDDLFLAGS => 'APPENDABLE',
   98  LDFROM    => 'APPENDABLE',
   99 );
  100 
  101 sub makemaker_args {
  102     my ($self, %new_args) = @_;
  103     my $args = ( $self->{makemaker_args} ||= {} );
  104     foreach my $key (keys %new_args) {
  105         if ($makemaker_argtype{$key}) {
  106             if ($makemaker_argtype{$key} eq 'ARRAY') {
  107                 $args->{$key} = [] unless defined $args->{$key};
  108                 unless (ref $args->{$key} eq 'ARRAY') {
  109                     $args->{$key} = [$args->{$key}]
  110                 }
  111                 push @{$args->{$key}},
  112                     ref $new_args{$key} eq 'ARRAY'
  113                         ? @{$new_args{$key}}
  114                         : $new_args{$key};
  115             }
  116             elsif ($makemaker_argtype{$key} eq 'HASH') {
  117                 $args->{$key} = {} unless defined $args->{$key};
  118                 foreach my $skey (keys %{ $new_args{$key} }) {
  119                     $args->{$key}{$skey} = $new_args{$key}{$skey};
  120                 }
  121             }
  122             elsif ($makemaker_argtype{$key} eq 'APPENDABLE') {
  123                 $self->makemaker_append($key => $new_args{$key});
  124             }
  125         }
  126         else {
  127             if (defined $args->{$key}) {
  128                 warn qq{MakeMaker attribute "$key" is overriden; use "makemaker_append" to append values\n};
  129             }
  130             $args->{$key} = $new_args{$key};
  131         }
  132     }
  133     return $args;
  134 }
  135 
  136 # For mm args that take multiple space-separated args,
  137 # append an argument to the current list.
  138 sub makemaker_append {
  139     my $self = shift;
  140     my $name = shift;
  141     my $args = $self->makemaker_args;
  142     $args->{$name} = defined $args->{$name}
  143         ? join( ' ', $args->{$name}, @_ )
  144         : join( ' ', @_ );
  145 }
  146 
  147 sub build_subdirs {
  148     my $self    = shift;
  149     my $subdirs = $self->makemaker_args->{DIR} ||= [];
  150     for my $subdir (@_) {
  151         push @$subdirs, $subdir;
  152     }
  153 }
  154 
  155 sub clean_files {
  156     my $self  = shift;
  157     my $clean = $self->makemaker_args->{clean} ||= {};
  158       %$clean = (
  159         %$clean,
  160         FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), @_),
  161     );
  162 }
  163 
  164 sub realclean_files {
  165     my $self      = shift;
  166     my $realclean = $self->makemaker_args->{realclean} ||= {};
  167       %$realclean = (
  168         %$realclean,
  169         FILES => join ' ', grep { length $_ } ($realclean->{FILES} || (), @_),
  170     );
  171 }
  172 
  173 sub libs {
  174     my $self = shift;
  175     my $libs = ref $_[0] ? shift : [ shift ];
  176     $self->makemaker_args( LIBS => $libs );
  177 }
  178 
  179 sub inc {
  180     my $self = shift;
  181     $self->makemaker_args( INC => shift );
  182 }
  183 
  184 sub _wanted_t {
  185 }
  186 
  187 sub tests_recursive {
  188     my $self = shift;
  189     my $dir = shift || 't';
  190     unless ( -d $dir ) {
  191         die "tests_recursive dir '$dir' does not exist";
  192     }
  193     my %tests = map { $_ => 1 } split / /, ($self->tests || '');
  194     require File::Find;
  195     File::Find::find(
  196         sub { /\.t$/ and -f $_ and $tests{"$File::Find::dir/*.t"} = 1 },
  197         $dir
  198     );
  199     $self->tests( join ' ', sort keys %tests );
  200 }
  201 
  202 sub write {
  203     my $self = shift;
  204     die "&Makefile->write() takes no arguments\n" if @_;
  205 
  206     # Check the current Perl version
  207     my $perl_version = $self->perl_version;
  208     if ( $perl_version ) {
  209         eval "use $perl_version; 1"
  210             or die "ERROR: perl: Version $] is installed, "
  211             . "but we need version >= $perl_version";
  212     }
  213 
  214     # Make sure we have a new enough MakeMaker
  215     require ExtUtils::MakeMaker;
  216 
  217     if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) {
  218         # This previous attempted to inherit the version of
  219         # ExtUtils::MakeMaker in use by the module author, but this
  220         # was found to be untenable as some authors build releases
  221         # using future dev versions of EU:MM that nobody else has.
  222         # Instead, #toolchain suggests we use 6.59 which is the most
  223         # stable version on CPAN at time of writing and is, to quote
  224         # ribasushi, "not terminally fucked, > and tested enough".
  225         # TODO: We will now need to maintain this over time to push
  226         # the version up as new versions are released.
  227         $self->build_requires(     'ExtUtils::MakeMaker' => 6.59 );
  228         $self->configure_requires( 'ExtUtils::MakeMaker' => 6.59 );
  229     } else {
  230         # Allow legacy-compatibility with 5.005 by depending on the
  231         # most recent EU:MM that supported 5.005.
  232         $self->build_requires(     'ExtUtils::MakeMaker' => 6.36 );
  233         $self->configure_requires( 'ExtUtils::MakeMaker' => 6.36 );
  234     }
  235 
  236     # Generate the MakeMaker params
  237     my $args = $self->makemaker_args;
  238     $args->{DISTNAME} = $self->name;
  239     $args->{NAME}     = $self->module_name || $self->name;
  240     $args->{NAME}     =~ s/-/::/g;
  241     $args->{VERSION}  = $self->version or die <<'EOT';
  242 ERROR: Can't determine distribution version. Please specify it
  243 explicitly via 'version' in Makefile.PL, or set a valid $VERSION
  244 in a module, and provide its file path via 'version_from' (or
  245 'all_from' if you prefer) in Makefile.PL.
  246 EOT
  247 
  248     if ( $self->tests ) {
  249         my @tests = split ' ', $self->tests;
  250         my %seen;
  251         $args->{test} = {
  252             TESTS => (join ' ', grep {!$seen{$_}++} @tests),
  253         };
  254     } elsif ( $Module::Install::ExtraTests::use_extratests ) {
  255         # Module::Install::ExtraTests doesn't set $self->tests and does its own tests via harness.
  256         # So, just ignore our xt tests here.
  257     } elsif ( -d 'xt' and ($Module::Install::AUTHOR or $ENV{RELEASE_TESTING}) ) {
  258         $args->{test} = {
  259             TESTS => join( ' ', map { "$_/*.t" } grep { -d $_ } qw{ t xt } ),
  260         };
  261     }
  262     if ( $] >= 5.005 ) {
  263         $args->{ABSTRACT} = $self->abstract;
  264         $args->{AUTHOR}   = join ', ', @{$self->author || []};
  265     }
  266     if ( $self->makemaker(6.10) ) {
  267         $args->{NO_META}   = 1;
  268         #$args->{NO_MYMETA} = 1;
  269     }
  270     if ( $self->makemaker(6.17) and $self->sign ) {
  271         $args->{SIGN} = 1;
  272     }
  273     unless ( $self->is_admin ) {
  274         delete $args->{SIGN};
  275     }
  276     if ( $self->makemaker(6.31) and $self->license ) {
  277         $args->{LICENSE} = $self->license;
  278     }
  279 
  280     my $prereq = ($args->{PREREQ_PM} ||= {});
  281     %$prereq = ( %$prereq,
  282         map { @$_ } # flatten [module => version]
  283         map { @$_ }
  284         grep $_,
  285         ($self->requires)
  286     );
  287 
  288     # Remove any reference to perl, PREREQ_PM doesn't support it
  289     delete $args->{PREREQ_PM}->{perl};
  290 
  291     # Merge both kinds of requires into BUILD_REQUIRES
  292     my $build_prereq = ($args->{BUILD_REQUIRES} ||= {});
  293     %$build_prereq = ( %$build_prereq,
  294         map { @$_ } # flatten [module => version]
  295         map { @$_ }
  296         grep $_,
  297         ($self->configure_requires, $self->build_requires)
  298     );
  299 
  300     # Remove any reference to perl, BUILD_REQUIRES doesn't support it
  301     delete $args->{BUILD_REQUIRES}->{perl};
  302 
  303     # Delete bundled dists from prereq_pm, add it to Makefile DIR
  304     my $subdirs = ($args->{DIR} || []);
  305     if ($self->bundles) {
  306         my %processed;
  307         foreach my $bundle (@{ $self->bundles }) {
  308             my ($mod_name, $dist_dir) = @$bundle;
  309             delete $prereq->{$mod_name};
  310             $dist_dir = File::Basename::basename($dist_dir); # dir for building this module
  311             if (not exists $processed{$dist_dir}) {
  312                 if (-d $dist_dir) {
  313                     # List as sub-directory to be processed by make
  314                     push @$subdirs, $dist_dir;
  315                 }
  316                 # Else do nothing: the module is already present on the system
  317                 $processed{$dist_dir} = undef;
  318             }
  319         }
  320     }
  321 
  322     unless ( $self->makemaker('6.55_03') ) {
  323         %$prereq = (%$prereq,%$build_prereq);
  324         delete $args->{BUILD_REQUIRES};
  325     }
  326 
  327     if ( my $perl_version = $self->perl_version ) {
  328         eval "use $perl_version; 1"
  329             or die "ERROR: perl: Version $] is installed, "
  330             . "but we need version >= $perl_version";
  331 
  332         if ( $self->makemaker(6.48) ) {
  333             $args->{MIN_PERL_VERSION} = $perl_version;
  334         }
  335     }
  336 
  337     if ($self->installdirs) {
  338         warn qq{old INSTALLDIRS (probably set by makemaker_args) is overriden by installdirs\n} if $args->{INSTALLDIRS};
  339         $args->{INSTALLDIRS} = $self->installdirs;
  340     }
  341 
  342     my %args = map {
  343         ( $_ => $args->{$_} ) } grep {defined($args->{$_} )
  344     } keys %$args;
  345 
  346     my $user_preop = delete $args{dist}->{PREOP};
  347     if ( my $preop = $self->admin->preop($user_preop) ) {
  348         foreach my $key ( keys %$preop ) {
  349             $args{dist}->{$key} = $preop->{$key};
  350         }
  351     }
  352 
  353     my $mm = ExtUtils::MakeMaker::WriteMakefile(%args);
  354     $self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile');
  355 }
  356 
  357 sub fix_up_makefile {
  358     my $self          = shift;
  359     my $makefile_name = shift;
  360     my $top_class     = ref($self->_top) || '';
  361     my $top_version   = $self->_top->VERSION || '';
  362 
  363     my $preamble = $self->preamble
  364         ? "# Preamble by $top_class $top_version\n"
  365             . $self->preamble
  366         : '';
  367     my $postamble = "# Postamble by $top_class $top_version\n"
  368         . ($self->postamble || '');
  369 
  370     local *MAKEFILE;
  371     open MAKEFILE, "+< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!";
  372     eval { flock MAKEFILE, LOCK_EX };
  373     my $makefile = do { local $/; <MAKEFILE> };
  374 
  375     $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /;
  376     $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g;
  377     $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g;
  378     $makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m;
  379     $makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m;
  380 
  381     # Module::Install will never be used to build the Core Perl
  382     # Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks
  383     # PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist
  384     $makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m;
  385     #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m;
  386 
  387     # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well.
  388     $makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g;
  389 
  390     # XXX - This is currently unused; not sure if it breaks other MM-users
  391     # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg;
  392 
  393     seek MAKEFILE, 0, SEEK_SET;
  394     truncate MAKEFILE, 0;
  395     print MAKEFILE  "$preamble$makefile$postamble" or die $!;
  396     close MAKEFILE  or die $!;
  397 
  398     1;
  399 }
  400 
  401 sub preamble {
  402     my ($self, $text) = @_;
  403     $self->{preamble} = $text . $self->{preamble} if defined $text;
  404     $self->{preamble};
  405 }
  406 
  407 sub postamble {
  408     my ($self, $text) = @_;
  409     $self->{postamble} ||= $self->admin->postamble;
  410     $self->{postamble} .= $text if defined $text;
  411     $self->{postamble}
  412 }
  413 
  414 1;
  415 
  416 __END__
  417 
  418 #line 544