-package main;
-use vars qw(%att);
-
-# $Id: MakeMaker.pm,v 1.174 1996/02/06 17:03:12 k Exp $
-
-package ExtUtils::MakeMaker::TieAtt;
-# this package will go away again, when we don't have modules around
-# anymore that import %att It ties an empty %att and records in which
-# object this %att was tied. FETCH and STORE return/store-to the
-# appropriate value from %$self
-
-# the warndirectuse method warns if somebody calls MM->something. It
-# has nothing to do with the tie'd %att.
-
-$Enough_limit = 5;
-
-sub TIEHASH {
- bless { SECRETHASH => $_[1]};
-}
-
-sub FETCH {
- print "Warning (non-fatal): Importing of %att is deprecated [$_[1]]
- use \$self instead\n" unless ++$Enough>$Enough_limit;
- print "Further ExtUtils::MakeMaker::TieAtt warnings suppressed\n" if $Enough==$Enough_limit;
- $_[0]->{SECRETHASH}->{$_[1]};
-}
-
-sub STORE {
- print "Warning (non-fatal): Importing of %att is deprecated [$_[1]][$_[2]]
- use \$self instead\n" unless ++$Enough>$Enough_limit;
- print "Further ExtUtils::MakeMaker::TieAtt warnings suppressed\n" if $Enough==$Enough_limit;
- $_[0]->{SECRETHASH}->{$_[1]} = $_[2];
-}
-
-sub FIRSTKEY {
- print "Warning (non-fatal): Importing of %att is deprecated [FIRSTKEY]
- use \$self instead\n" unless ++$Enough>$Enough_limit;
- print "Further ExtUtils::MakeMaker::TieAtt warnings suppressed\n" if $Enough==$Enough_limit;
- each %{$_[0]->{SECRETHASH}};
-}
-
-sub NEXTKEY {
- each %{$_[0]->{SECRETHASH}};
-}
-
-sub DESTROY {
-}
-
-sub warndirectuse {
- my($caller) = @_;
- return if $Enough>$Enough_limit;
- print STDOUT "Warning (non-fatal): Direct use of class methods deprecated; use\n";
- my($method) = $caller =~ /.*:(\w+)$/;
- print STDOUT
-' my $self = shift;
- $self->MM::', $method, "();
- instead\n";
- print "Further ExtUtils::MakeMaker::TieAtt warnings suppressed\n"
- if ++$Enough==$Enough_limit;
-}
-
-
-
-
-
+BEGIN {require 5.002;} # MakeMaker 5.17 was the last MakeMaker that was compatible with perl5.001m
package ExtUtils::MakeMaker;
-$Version = $VERSION = "5.21";
-$Version_OK = "5.05"; # Makefiles older than $Version_OK will die
+$Version = $VERSION = "5.42";
+$Version_OK = "5.17"; # Makefiles older than $Version_OK will die
# (Will be checked from MakeMaker version 4.13 onwards)
-($Revision = substr(q$Revision: 1.174 $, 10)) =~ s/\s+$//;
+($Revision = substr(q$Revision: 1.216 $, 10)) =~ s/\s+$//;
-use Config;
-use Carp;
-use Cwd;
require Exporter;
-require ExtUtils::Manifest;
-{
- # Current (5.21) FileHandle doesn't work with miniperl, so we roll our own
- # that's all copy & paste code from FileHandle.pm, version of perl5.002b3
- package FileHandle;
- use Symbol;
- sub new {
- @_ >= 1 && @_ <= 3 or croak('usage: new FileHandle [FILENAME [,MODE]]');
- my $class = shift;
- my $fh = gensym;
- if (@_) {
- FileHandle::open($fh, @_)
- or return undef;
- }
- bless $fh, $class;
- }
- sub open {
- @_ >= 2 && @_ <= 4 or croak('usage: $fh->open(FILENAME [,MODE [,PERMS]])');
- my ($fh, $file) = @_;
- if (@_ > 2) {
- my ($mode, $perms) = @_[2, 3];
- if ($mode =~ /^\d+$/) {
- defined $perms or $perms = 0666;
- return sysopen($fh, $file, $mode, $perms);
- }
- $file = "./" . $file unless $file =~ m#^/#;
- $file = _open_mode_string($mode) . " $file\0";
- }
- open($fh, $file);
- }
- sub close {
- @_ == 1 or croak('usage: $fh->close()');
- close($_[0]);
- }
-}
+use Config;
+use Carp ();
+#use FileHandle ();
use vars qw(
- $VERSION $Version_OK $Revision
- $Verbose %MM_Sections
- @MM_Sections %Recognized_Att_Keys @Get_from_Config
- %Prepend_dot_dot %Config @Parent %NORMAL_INC
- $Setup_done
+
+ @ISA @EXPORT @EXPORT_OK $AUTOLOAD
+ $ISA_TTY $Is_Mac $Is_OS2 $Is_VMS $Revision $Setup_done
+ $VERSION $Verbose $Version_OK %Config %Keep_after_flush
+ %MM_Sections %Prepend_dot_dot %Recognized_Att_Keys
+ @Get_from_Config @MM_Sections @Overridable @Parent
+
);
-#use strict qw(refs);
+# use strict;
-eval {require DynaLoader;}; # Get mod2fname, if defined. Will fail
- # with miniperl.
+# &DynaLoader::mod2fname should be available to miniperl, thus
+# should be a pseudo-builtin (cmp. os2.c).
+#eval {require DynaLoader;};
#
# Set up the inheritance before we pull in the MM_* packages, because they
#
@ISA = qw(Exporter);
@EXPORT = qw(&WriteMakefile &writeMakefile $Verbose &prompt);
-@EXPORT_OK = qw($VERSION &Version_check &help &neatvalue &mkbootstrap &mksymlists
- $Version %att); ## Import of %att is deprecated, please use OO features!
+@EXPORT_OK = qw($VERSION &Version_check &neatvalue &mkbootstrap &mksymlists
+ $Version);
# $Version in mixed case will go away!
#
#
{
package MY;
- @ISA = qw(MM);
-}
-
-{
+ @MY::ISA = qw(MM);
+### sub AUTOLOAD { use Devel::Symdump; print Devel::Symdump->rnew->as_string; Carp::confess "hey why? $AUTOLOAD" }
package MM;
- # From somwhere they will want to inherit DESTROY
sub DESTROY {}
}
+# "predeclare the package: we only load it via AUTOLOAD
+# but we have already mentioned it in @ISA
+package ExtUtils::Liblist;
+
+package ExtUtils::MakeMaker;
#
-# No we can can pull in the friends
+# Now we can pull in the friends
#
+$Is_VMS = $^O eq 'VMS';
+$Is_OS2 = $^O eq 'os2';
+$Is_Mac = $^O eq 'MacOS';
+$Is_Win32 = $^O eq 'MSWin32';
+
require ExtUtils::MM_Unix;
-if ($Is_VMS = ($Config{osname} eq 'VMS')) {
+
+if ($Is_VMS) {
require ExtUtils::MM_VMS;
- require VMS::Filespec;
- import VMS::Filespec '&vmsify';
+ require VMS::Filespec; # is a noop as long as we require it within MM_VMS
}
-if ($Is_OS2 = $Config{osname} =~ m|^os/?2$|i) {
+if ($Is_OS2) {
require ExtUtils::MM_OS2;
}
+if ($Is_Mac) {
+ require ExtUtils::MM_Mac;
+}
+if ($Is_Win32) {
+ require ExtUtils::MM_Win32;
+}
-%NORMAL_INC = %INC;
-# package name for the classes into which the first object will be blessed
-$PACKNAME = "PACK000";
-
- #####
-# # # # #####
-# # # # #
- ##### # # #####
- # # # # #
-# # # # # #
- ##### #### #####
-
+# The SelfLoader would bring a lot of overhead for MakeMaker, because
+# we know for sure we will use most of the autoloaded functions once
+# we have to use one of them. So we write our own loader
+
+sub AUTOLOAD {
+ my $code;
+ if (defined fileno(DATA)) {
+ my $fh = select DATA;
+ my $o = $/; # For future reads from the file.
+ $/ = "\n__END__\n";
+ $code = <DATA>;
+ $/ = $o;
+ select $fh;
+ close DATA;
+ eval $code;
+ if ($@) {
+ $@ =~ s/ at .*\n//;
+ Carp::croak $@;
+ }
+ } else {
+ warn "AUTOLOAD called unexpectedly for $AUTOLOAD";
+ }
+ defined(&$AUTOLOAD) or die "Myloader inconsistency error";
+ goto &$AUTOLOAD;
+}
-#
-# MakeMaker serves currently (v 5.20) only for two purposes:
-# Version_Check, and WriteMakefile. For WriteMakefile SelfLoader
-# doesn't buy us anything. But for Version_Check we win with
-# SelfLoader more than a second.
-#
# The only subroutine we do not SelfLoad is Version_Check because it's
# called so often. Loading this minimum still requires 1.2 secs on my
# Indy :-(
-#
sub Version_check {
my($checkversion) = @_;
unless $checkversion == $VERSION;
}
-# We don't selfload this, because chdir sometimes has problems
+sub warnhandler {
+ $_[0] =~ /^Use of uninitialized value/ && return;
+ $_[0] =~ /used only once/ && return;
+ $_[0] =~ /^Subroutine\s+[\w:]+\s+redefined/ && return;
+ warn @_;
+}
+
+sub ExtUtils::MakeMaker::eval_in_subdirs ;
+sub ExtUtils::MakeMaker::eval_in_x ;
+sub ExtUtils::MakeMaker::full_setup ;
+sub ExtUtils::MakeMaker::writeMakefile ;
+sub ExtUtils::MakeMaker::new ;
+sub ExtUtils::MakeMaker::check_manifest ;
+sub ExtUtils::MakeMaker::parse_args ;
+sub ExtUtils::MakeMaker::check_hints ;
+sub ExtUtils::MakeMaker::mv_all_methods ;
+sub ExtUtils::MakeMaker::skipcheck ;
+sub ExtUtils::MakeMaker::flush ;
+sub ExtUtils::MakeMaker::mkbootstrap ;
+sub ExtUtils::MakeMaker::mksymlists ;
+sub ExtUtils::MakeMaker::neatvalue ;
+sub ExtUtils::MakeMaker::selfdocument ;
+sub ExtUtils::MakeMaker::WriteMakefile ;
+sub ExtUtils::MakeMaker::prompt ($;$) ;
+
+1;
+
+__DATA__
+
+package ExtUtils::MakeMaker;
+
+sub WriteMakefile {
+ Carp::croak "WriteMakefile: Need even number of args" if @_ % 2;
+ local $SIG{__WARN__} = \&warnhandler;
+
+ unless ($Setup_done++){
+ full_setup();
+ undef &ExtUtils::MakeMaker::full_setup; #safe memory
+ }
+ my %att = @_;
+ MM->new(\%att)->flush;
+}
+
+sub prompt ($;$) {
+ my($mess,$def)=@_;
+ $ISA_TTY = -t STDIN && -t STDOUT ;
+ Carp::confess("prompt function called without an argument") unless defined $mess;
+ my $dispdef = defined $def ? "[$def] " : " ";
+ $def = defined $def ? $def : "";
+ my $ans;
+ if ($ISA_TTY) {
+ local $|=1;
+ print "$mess $dispdef";
+ chomp($ans = <STDIN>);
+ }
+ return $ans || $def;
+}
+
sub eval_in_subdirs {
my($self) = @_;
my($dir);
-# print "Starting to wade through directories:\n";
-# print join "\n", @{$self->{DIR}}, "\n";
+ use Cwd 'cwd';
my $pwd = cwd();
- # As strange things happened twice in the history of MakeMaker to $self->{DIR},
- # lets be careful, maybe it helps some:
-# my(@copy_of_DIR) = @{$self->{DIR}};
-# my %copy;
-# @copy{@copy_od_DIR} = (1) x @copy_of_DIR;
-
- # with Tk-9.02 these give me as third directory "1":
- # foreach $dir (@($self->{DIR}){
- # foreach $dir (@copy_of_DIR){
-
- # this gives mi as third directory a core dump:
- # while ($dir = shift @copy_of_DIR){
-
- # this finishes the loop immediately:
-# foreach $dir (keys %copy){
-# print "Next to come: $dir\n";
-# chdir $dir or die "Couldn't change to directory $dir: $!";
-# package main;
-# my $fh = new FileHandle;
-# $fh->open("Makefile.PL") or carp("Couldn't open Makefile.PL in $dir");
-# my $eval = join "", <$fh>;
-# $fh->close;
-# eval $eval;
-# warn "WARNING from evaluation of $dir/Makefile.PL: $@" if $@;
-# chdir $pwd or die "Couldn't change to directory $pwd: $!";
-# }
-
-
- # So this did the trick (did it?)
foreach $dir (@{$self->{DIR}}){
-# print "Next to come: $dir\n";
my($abs) = $self->catdir($pwd,$dir);
$self->eval_in_x($abs);
}
-
chdir $pwd;
-
-# print "Proudly presenting you self->{DIR}:\n";
-# print join "\n", @{$self->{DIR}}, "\n";
-
}
sub eval_in_x {
my($self,$dir) = @_;
package main;
- chdir $dir or carp("Couldn't change to directory $dir: $!");
- my $fh = new FileHandle;
- $fh->open("Makefile.PL") or carp("Couldn't open Makefile.PL in $dir");
- my $eval = join "", <$fh>;
- $fh->close;
+ chdir $dir or Carp::carp("Couldn't change to directory $dir: $!");
+# use FileHandle ();
+# my $fh = new FileHandle;
+# $fh->open("Makefile.PL") or Carp::carp("Couldn't open Makefile.PL in $dir");
+ local *FH;
+ open(FH,"Makefile.PL") or Carp::carp("Couldn't open Makefile.PL in $dir");
+# my $eval = join "", <$fh>;
+ my $eval = join "", <FH>;
+# $fh->close;
+ close FH;
eval $eval;
- warn "WARNING from evaluation of $dir/Makefile.PL: $@" if $@;
+ if ($@) {
+# if ($@ =~ /prerequisites/) {
+# die "MakeMaker WARNING: $@";
+# } else {
+# warn "WARNING from evaluation of $dir/Makefile.PL: $@";
+# }
+ warn "WARNING from evaluation of $dir/Makefile.PL: $@";
+ }
}
-# use SelfLoader;
-# sub ExtUtils::MakeMaker::full_setup ;
-# sub ExtUtils::MakeMaker::attrib_help ;
-# sub ExtUtils::MakeMaker::writeMakefile ;
-# sub ExtUtils::MakeMaker::WriteMakefile ;
-# sub ExtUtils::MakeMaker::new ;
-# sub ExtUtils::MakeMaker::check_manifest ;
-# sub ExtUtils::MakeMaker::parse_args ;
-# sub ExtUtils::MakeMaker::check_hints ;
-# sub ExtUtils::MakeMaker::mv_all_methods ;
-# sub ExtUtils::MakeMaker::prompt ;
-# sub ExtUtils::MakeMaker::help ;
-# sub ExtUtils::MakeMaker::skipcheck ;
-# sub ExtUtils::MakeMaker::flush ;
-# sub ExtUtils::MakeMaker::mkbootstrap ;
-# sub ExtUtils::MakeMaker::mksymlists ;
-# sub ExtUtils::MakeMaker::neatvalue ;
-# sub ExtUtils::MakeMaker::selfdocument ;
-
-# 1;
-
-# __DATA__
-
-#
-# We're done with inheritance setup. As we have two frequently called
-# things: Check_Version() and mod_install(), we want to reduce startup
-# time. Only WriteMakefile needs all the power here.
-#
-
sub full_setup {
$Verbose ||= 0;
$^W=1;
- $SIG{__WARN__} = sub {
- $_[0] =~ /^Use of uninitialized value/ && return;
- $_[0] =~ /used only once/ && return;
- $_[0] =~ /^Subroutine\s+[\w:]+\s+redefined/ && return;
- warn @_;
- };
+
+ # package name for the classes into which the first object will be blessed
+ $PACKNAME = "PACK000";
+
+ @Attrib_help = qw/
+
+ AUTHOR ABSTRACT ABSTRACT_FROM BINARY_LOCATION LICENSE_HREF CAPI
+ C CCFLAGS CONFIG CONFIGURE DEFINE DIR DISTNAME DL_FUNCS DL_VARS
+ EXE_FILES EXCLUDE_EXT INCLUDE_EXT NO_VC FIRST_MAKEFILE FULLPERL H
+ INC INSTALLARCHLIB INSTALLBIN INSTALLDIRS INSTALLMAN1DIR
+ INSTALLMAN3DIR INSTALLPRIVLIB INSTALLSCRIPT INSTALLSITEARCH
+ INSTALLSITELIB INST_ARCHLIB INST_BIN INST_EXE INST_LIB
+ INST_MAN1DIR INST_MAN3DIR INST_SCRIPT LDFROM LIBPERL_A LIB LIBS
+ LINKTYPE MAKEAPERL MAKEFILE MAN1PODS MAN3PODS MAP_TARGET MYEXTLIB
+ NAME NEEDS_LINKING NOECHO NORECURS OBJECT OPTIMIZE PERL PERLMAINCC
+ PERL_ARCHLIB PERL_LIB PERL_SRC PL_FILES PM PMLIBDIRS PREFIX
+ PREREQ_PM SKIP TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG
+ XS_VERSION clean depend dist dynamic_lib linkext macro realclean
+ tool_autosplit
+
+ IMPORTS
+
+ installpm
+ /;
+
+ # IMPORTS is used under OS/2
+
+ # ^^^ installpm is deprecated, will go about Summer 96
+
+ # @Overridable is close to @MM_Sections but not identical. The
+ # order is important. Many subroutines declare macros. These
+ # depend on each other. Let's try to collect the macros up front,
+ # then pasthru, then the rules.
+
+ # MM_Sections are the sections we have to call explicitly
+ # in Overridable we have subroutines that are used indirectly
+
@MM_Sections =
qw(
- post_initialize const_config constants const_loadlibs
- const_cccmd tool_autosplit tool_xsubpp tools_other dist macro
- depend post_constants pasthru c_o xs_c xs_o top_targets
- linkext dlsyms dynamic dynamic_bs dynamic_lib static
- static_lib installpm manifypods processPL installbin subdirs
- clean realclean dist_basics dist_core dist_dir dist_test
- dist_ci install force perldepend makefile staticmake test
- postamble selfdocument
+
+ post_initialize const_config constants tool_autosplit tool_xsubpp
+ tools_other dist macro depend cflags const_loadlibs const_cccmd
+ post_constants
+
+ pasthru
+
+ c_o xs_c xs_o top_targets linkext dlsyms dynamic dynamic_bs
+ dynamic_lib static static_lib manifypods processPL installbin subdirs
+ clean realclean dist_basics dist_core dist_dir dist_test dist_ci
+ install force perldepend makefile staticmake test ppd
+
); # loses section ordering
- @MM_Sections{@MM_Sections} = {} x @MM_Sections;
+ @Overridable = @MM_Sections;
+ push @Overridable, qw[
+
+ dir_target libscan makeaperl needs_linking subdir_x test_via_harness
+ test_via_script
+
+ ];
+
+ push @MM_Sections, qw[
+
+ pm_to_blib selfdocument
+
+ ];
+
+ # Postamble needs to be the last that was always the case
+ push @MM_Sections, "postamble";
+ push @Overridable, "postamble";
# All sections are valid keys.
- %Recognized_Att_Keys = %MM_Sections;
+ @Recognized_Att_Keys{@MM_Sections} = (1) x @MM_Sections;
# we will use all these variables in the Makefile
@Get_from_Config =
qw(
ar cc cccdlflags ccdlflags dlext dlsrc ld lddlflags ldflags libc
- lib_ext obj_ext ranlib sitelibexp sitearchexp so
+ lib_ext obj_ext osname osvers ranlib sitelibexp sitearchexp so exe_ext
);
my $item;
- foreach $item (split(/\n/,attrib_help())){
- next unless $item =~ m/^=item\s+(\w+)\s*$/;
- $Recognized_Att_Keys{$1} = $2;
- print "Attribute '$1' => '$2'\n" if ($Verbose >= 2);
+ foreach $item (@Attrib_help){
+ $Recognized_Att_Keys{$item} = 1;
}
foreach $item (@Get_from_Config) {
$Recognized_Att_Keys{uc $item} = $Config{$item};
}
#
- # When we pass these through to a Makefile.PL in a subdirectory, we prepend
- # "..", so that all files to be installed end up below ./blib
+ # When we eval a Makefile.PL in a subdirectory, that one will ask
+ # us (the parent) for the values and will prepend "..", so that
+ # all files to be installed end up below OUR ./blib
#
%Prepend_dot_dot =
qw(
- INST_LIB 1 INST_ARCHLIB 1 INST_EXE 1 MAP_TARGET 1 INST_MAN1DIR 1 INST_MAN3DIR 1
- PERL_SRC 1 PERL 1 FULLPERL 1
- );
-}
+ INST_BIN 1 INST_EXE 1 INST_LIB 1 INST_ARCHLIB 1 INST_SCRIPT
+ 1 MAP_TARGET 1 INST_MAN1DIR 1 INST_MAN3DIR 1 PERL_SRC 1
+ PERL 1 FULLPERL 1
-sub attrib_help {
- return $Attrib_Help if $Attrib_Help;
- my $switch = 0;
- my $help = "";
- my $line;
- while ($line = <DATA>) {
- $switch ||= $line =~ /^=item C\s*$/;
- next unless $switch;
- last if $line =~ /^=cut/;
- $help .= $line;
- }
-# close DATA;
- $Attrib_Help = $help;
+ );
+
+ my @keep = qw/
+ NEEDS_LINKING HAS_LINK_CODE
+ /;
+ @Keep_after_flush{@keep} = (1) x @keep;
}
sub writeMakefile {
END
}
-sub WriteMakefile {
- Carp::croak "WriteMakefile: Need even number of args" if @_ % 2;
- my %att = @_;
- MM->new(\%att)->flush;
-}
-
-sub new {
+sub ExtUtils::MakeMaker::new {
my($class,$self) = @_;
- full_setup() unless $Setup_done++;
-
my($key);
print STDOUT "MakeMaker (v$VERSION)\n" if $Verbose;
my(%initial_att) = %$self; # record initial attributes
+ my($prereq);
+ foreach $prereq (sort keys %{$self->{PREREQ_PM}}) {
+ my $eval = "use $prereq $self->{PREREQ_PM}->{$prereq}";
+ eval $eval;
+ if ($@){
+ warn "Warning: prerequisite $prereq $self->{PREREQ_PM}->{$prereq} not found";
+# mjn
+# } else {
+# delete $self->{PREREQ_PM}{$prereq};
+ }
+ }
+# if (@unsatisfied){
+# unless (defined $ExtUtils::MakeMaker::useCPAN) {
+# print qq{MakeMaker WARNING: prerequisites not found (@unsatisfied)
+# Please install these modules first and rerun 'perl Makefile.PL'.\n};
+# if ($ExtUtils::MakeMaker::hasCPAN) {
+# $ExtUtils::MakeMaker::useCPAN = prompt(qq{Should I try to use the CPAN module to fetch them for you?},"yes");
+# } else {
+# print qq{Hint: You may want to install the CPAN module to autofetch the needed modules\n};
+# $ExtUtils::MakeMaker::useCPAN=0;
+# }
+# }
+# if ($ExtUtils::MakeMaker::useCPAN) {
+# require CPAN;
+# CPAN->import(@unsatisfied);
+# } else {
+# die qq{prerequisites not found (@unsatisfied)};
+# }
+# warn qq{WARNING: prerequisites not found (@unsatisfied)};
+# }
+
if (defined $self->{CONFIGURE}) {
if (ref $self->{CONFIGURE} eq 'CODE') {
$self = { %$self, %{&{$self->{CONFIGURE}}}};
} else {
- croak "Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n";
+ Carp::croak "Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n";
}
}
# This is for old Makefiles written pre 5.00, will go away
if ( Carp::longmess("") =~ /runsubdirpl/s ){
- #$self->{Correct_relativ_directories}++;
- carp("WARNING: Please rerun 'perl Makefile.PL' to regenerate your Makefiles\n");
- } else {
- $self->{Correct_relativ_directories}=0;
+ Carp::carp("WARNING: Please rerun 'perl Makefile.PL' to regenerate your Makefiles\n");
}
- my $class = ++$PACKNAME;
+ my $newclass = ++$PACKNAME;
{
# no strict;
- print "Blessing Object into class [$class]\n" if $Verbose>=2;
- mv_all_methods("MY",$class);
- bless $self, $class;
+ print "Blessing Object into class [$newclass]\n" if $Verbose>=2;
+ mv_all_methods("MY",$newclass);
+ bless $self, $newclass;
push @Parent, $self;
- @{"$class\:\:ISA"} = 'MM';
+ @{"$newclass\:\:ISA"} = 'MM';
}
if (defined $Parent[-2]){
for $key (keys %Prepend_dot_dot) {
next unless defined $self->{PARENT}{$key};
$self->{$key} = $self->{PARENT}{$key};
+ # PERL and FULLPERL may be command verbs instead of full
+ # file specifications under VMS. If so, don't turn them
+ # into a filespec.
$self->{$key} = $self->catdir("..",$self->{$key})
- unless $self->{$key} =~ m!^/!;
+ unless $self->file_name_is_absolute($self->{$key})
+ || ($^O eq 'VMS' and ($key =~ /PERL$/ && $self->{$key} =~ /^[\w\-\$]+$/));
}
- $self->{PARENT}->{CHILDREN}->{$class} = $self if $self->{PARENT};
+ $self->{PARENT}->{CHILDREN}->{$newclass} = $self if $self->{PARENT};
} else {
parse_args($self,@ARGV);
}
$self->init_main();
if (! $self->{PERL_SRC} ) {
- my($pthinks) = $INC{'Config.pm'};
- $pthinks = vmsify($pthinks) if $Is_VMS;
- if ($pthinks ne $self->catfile($Config{archlibexp},'Config.pm')){
- $pthinks =~ s!/Config\.pm$!!;
- $pthinks =~ s!.*/!!;
+ my($pthinks) = $self->canonpath($INC{'Config.pm'});
+ my($cthinks) = $self->catfile($Config{'archlibexp'},'Config.pm');
+ $pthinks = VMS::Filespec::vmsify($pthinks) if $Is_VMS;
+ if ($pthinks ne $cthinks &&
+ !($Is_Win32 and lc($pthinks) eq lc($cthinks))) {
+ print "Have $pthinks expected $cthinks\n";
+ if ($Is_Win32) {
+ $pthinks =~ s![/\\]Config\.pm$!!i; $pthinks =~ s!.*[/\\]!!;
+ }
+ else {
+ $pthinks =~ s!/Config\.pm$!!; $pthinks =~ s!.*/!!;
+ }
print STDOUT <<END;
Your perl and your Config.pm seem to have different ideas about the architecture
they are running on.
for $skip (@{$self->{SKIP} || []}) {
$self->{SKIPHASH}{$skip} = 1;
}
+ delete $self->{SKIP}; # free memory
+
+ if ($self->{PARENT}) {
+ for (qw/install dist dist_basics dist_core dist_dir dist_test dist_ci/) {
+ $self->{SKIPHASH}{$_} = 1;
+ }
+ }
# We run all the subdirectories now. They don't have much to query
# from the parent, but the parent has to query them: if they need linking!
$self->eval_in_subdirs if @{$self->{DIR}};
}
- tie %::att, ExtUtils::MakeMaker::TieAtt, $self;
my $section;
foreach $section ( @MM_Sections ){
print "Processing Makefile '$section' section\n" if ($Verbose >= 2);
$self;
}
+sub WriteEmptyMakefile {
+ if (-f 'Makefile.old') {
+ chmod 0666, 'Makefile.old';
+ unlink 'Makefile.old' or warn "unlink Makefile.old: $!";
+ }
+ rename 'Makefile', 'Makefile.old' or warn "rename Makefile Makefile.old: $!"
+ if -f 'Makefile';
+ open MF, '> Makefile' or die "open Makefile for write: $!";
+ print MF <<'EOP';
+all:
+
+clean:
+
+install:
+
+makemakerdflt:
+
+test:
+
+EOP
+ close MF or die "close Makefile for write: $!";
+}
+
sub check_manifest {
print STDOUT "Checking if your kit is complete...\n";
+ require ExtUtils::Manifest;
$ExtUtils::Manifest::Quiet=$ExtUtils::Manifest::Quiet=1; #avoid warning
my(@missed)=ExtUtils::Manifest::manicheck();
if (@missed){
(getpwuid($>))[7]
]ex;
}
- # This may go away, in mid 1996
- if ($self->{Correct_relativ_directories}){
- $value = $self->catdir("..",$value)
- if $Prepend_dot_dot{$name} && ! $value =~ m!^/!;
- }
- $self->{$name} = $value;
+ $self->{uc($name)} = $value;
}
- # This may go away, in mid 1996
- delete $self->{Correct_relativ_directories};
# catch old-style 'potential_libs' and inform user how to 'upgrade'
if (defined $self->{potential_libs}){
# have to build a list with the shell
$self->{DIR} = [grep $_, split ":", $self->{DIR}];
}
+ # Turn a INCLUDE_EXT argument on the command line into an array
+ if (defined $self->{INCLUDE_EXT} && ref \$self->{INCLUDE_EXT} eq 'SCALAR') {
+ $self->{INCLUDE_EXT} = [grep $_, split '\s+', $self->{INCLUDE_EXT}];
+ }
+ # Turn a EXCLUDE_EXT argument on the command line into an array
+ if (defined $self->{EXCLUDE_EXT} && ref \$self->{EXCLUDE_EXT} eq 'SCALAR') {
+ $self->{EXCLUDE_EXT} = [grep $_, split '\s+', $self->{EXCLUDE_EXT}];
+ }
my $mmkey;
foreach $mmkey (sort keys %$self){
print STDOUT " $mmkey => ", neatvalue($self->{$mmkey}), "\n" if $Verbose;
print STDOUT "'$mmkey' is not a known MakeMaker parameter name.\n"
unless exists $Recognized_Att_Keys{$mmkey};
}
+ $| = 1 if $Verbose;
}
sub check_hints {
# First we look for the best hintsfile we have
my(@goodhints);
- my($hint)="$Config{osname}_$Config{osvers}";
+ my($hint)="${^O}_$Config{osvers}";
$hint =~ s/\./_/g;
$hint =~ s/_$//;
return unless $hint;
return unless -f "hints/$hint.pl"; # really there
# execute the hintsfile:
- my $fh = new FileHandle;
- $fh->open("hints/$hint.pl");
- @goodhints = <$fh>;
- $fh->close;
+# use FileHandle ();
+# my $fh = new FileHandle;
+# $fh->open("hints/$hint.pl");
+ local *FH;
+ open(FH,"hints/$hint.pl");
+# @goodhints = <$fh>;
+ @goodhints = <FH>;
+# $fh->close;
+ close FH;
print STDOUT "Processing hints file hints/$hint.pl\n";
eval join('',@goodhints);
print STDOUT $@ if $@;
# still trying to reduce the list to some reasonable minimum --
# because I want to make it easier for the user. A.K.
- foreach $method (@MM_Sections, qw[ dir_target
-fileparse fileparse_set_fstype installpm_x libscan makeaperl
-mksymlists needs_linking subdir_x test_via_harness
-test_via_script writedoc ]) {
+ foreach $method (@Overridable) {
# We cannot say "next" here. Nick might call MY->makeaperl
# which isn't defined right now
- # next unless defined &{"${from}::$method"};
+ # Above statement was written at 4.23 time when Tk-b8 was
+ # around. As Tk-b9 only builds with 5.002something and MM 5 is
+ # standard, we try to enable the next line again. It was
+ # commented out until MM 5.23
+
+ next unless defined &{"${from}::$method"};
*{"${to}::$method"} = \&{"${from}::$method"};
# delete would do, if we were sure, nobody ever called
# MY->makeaperl directly
-
+
# delete $symtab->{$method};
-
+
# If we delete a method, then it will be undefined and cannot
# be called. But as long as we have Makefile.PLs that rely on
# %MY:: being intact, we have to fill the hole with an
# inheriting method:
- eval "package MY; sub $method {local *$method; shift->MY::$method(\@_); }";
-
+ eval "package MY; sub $method { shift->SUPER::$method(\@_); }";
}
# We have to clean out %INC also, because the current directory is
# out of a History.pl file which is "required" so woudn't get
# loaded again in another extension requiring a History.pl
- my $inc;
- foreach $inc (keys %INC) {
- next if $NORMAL_INC{$inc};
- #warn "***$inc*** deleted";
- delete $INC{$inc};
- }
-
-}
-
-sub prompt {
- my($mess,$def)=@_;
- BEGIN { $ISA_TTY = -t STDIN && -t STDOUT }
- Carp::confess("prompt function called without an argument") unless defined $mess;
- $def = "" unless defined $def;
- my $dispdef = "[$def] ";
- my $ans;
- if ($ISA_TTY) {
- local $|=1;
- print "$mess $dispdef";
- chop($ans = <STDIN>);
- }
- return $ans if defined $ans;
- return $def;
+ # With perl5.002_01 the deletion of entries in %INC caused Tk-b11
+ # to core dump in the middle of a require statement. The required
+ # file was Tk/MMutil.pm. The consequence is, we have to be
+ # extremely careful when we try to give perl a reason to reload a
+ # library with same name. The workaround prefers to drop nothing
+ # from %INC and teach the writers not to use such libraries.
+
+# my $inc;
+# foreach $inc (keys %INC) {
+# #warn "***$inc*** deleted";
+# delete $INC{$inc};
+# }
}
-sub help {print &attrib_help, "\n";}
-
-sub skipcheck{
+sub skipcheck {
my($self) = shift;
my($section) = @_;
if ($section eq 'dynamic') {
sub flush {
my $self = shift;
my($chunk);
- my $fh = new FileHandle;
+# use FileHandle ();
+# my $fh = new FileHandle;
+ local *FH;
print STDOUT "Writing $self->{MAKEFILE} for $self->{NAME}\n";
unlink($self->{MAKEFILE}, "MakeMaker.tmp", $Is_VMS ? 'Descrip.MMS' : '');
- $fh->open(">MakeMaker.tmp") or die "Unable to open MakeMaker.tmp: $!";
+# $fh->open(">MakeMaker.tmp") or die "Unable to open MakeMaker.tmp: $!";
+ open(FH,">MakeMaker.tmp") or die "Unable to open MakeMaker.tmp: $!";
for $chunk (@{$self->{RESULT}}) {
- print $fh "$chunk\n";
+# print $fh "$chunk\n";
+ print FH "$chunk\n";
}
- $fh->close;
+# $fh->close;
+ close FH;
my($finalname) = $self->{MAKEFILE};
rename("MakeMaker.tmp", $finalname);
chmod 0644, $finalname unless $Is_VMS;
+
+ if ($self->{PARENT}) {
+ foreach (keys %$self) { # safe memory
+ delete $self->{$_} unless $Keep_after_flush{$_};
+ }
+ }
+
system("$Config::Config{eunicefix} $finalname") unless $Config::Config{eunicefix} eq ":";
}
}
return "$v" unless $t eq 'HASH';
my(@m, $key, $val);
- push(@m,"$key=>".neatvalue($val)) while (($key,$val) = each %$v);
+ while (($key,$val) = each %$v){
+ last unless defined $key; # cautious programming in case (undef,undef) is true
+ push(@m,"$key=>".neatvalue($val)) ;
+ }
return "{ ".join(', ',@m)." }";
}
package ExtUtils::MakeMaker;
1;
-# Without selfLoader we need
-__DATA__
-
-
-# For SelfLoader we need
-# __END__ DATA
-
+__END__
=head1 NAME
that can be individually overridden. Each subroutine returns the text
it wishes to have written to the Makefile.
-=head2 Hintsfile support
-
-MakeMaker.pm uses the architecture specific information from
-Config.pm. In addition it evaluates architecture specific hints files
-in a C<hints/> directory. The hints files are expected to be named
-like their counterparts in C<PERL_SRC/hints>, but with an C<.pl> file
-name extension (eg. C<next_3_2.pl>). They are simply C<eval>ed by
-MakeMaker within the WriteMakefile() subroutine, and can be used to
-execute commands as well as to include special variables. The rules
-which hintsfile is chosen are the same as in Configure.
+MakeMaker is object oriented. Each directory below the current
+directory that contains a Makefile.PL. Is treated as a separate
+object. This makes it possible to write an unlimited number of
+Makefiles with a single invocation of WriteMakefile().
-The hintsfile is eval()ed immediately after the arguments given to
-WriteMakefile are stuffed into a hash reference $self but before this
-reference becomes blessed. So if you want to do the equivalent to
-override or create an attribute you would say something like
+=head2 How To Write A Makefile.PL
- $self->{LIBS} = ['-ldbm -lucb -lc'];
+The short answer is: Don't.
-=head2 What's new in version 5 of MakeMaker
+ Always begin with h2xs.
+ Always begin with h2xs!
+ ALWAYS BEGIN WITH H2XS!
-MakeMaker 5 is pure object oriented. This allows us to write an
-unlimited number of Makefiles with a single perl process. 'perl
-Makefile.PL' with MakeMaker 5 goes through all subdirectories
-immediately and evaluates any Makefile.PL found in the next level
-subdirectories. The benefit of this approach comes in useful for both
-single and multi directories extensions.
+even if you're not building around a header file, and even if you
+don't have an XS component.
-Multi directory extensions have an immediately visible speed
-advantage, because there's no startup penalty for any single
-subdirectory Makefile.
+Run h2xs(1) before you start thinking about writing a module. For so
+called pm-only modules that consist of C<*.pm> files only, h2xs has
+the C<-X> switch. This will generate dummy files of all kinds that are
+useful for the module developer.
-Single directory packages benefit from the much improved
-needs_linking() method. As the main Makefile knows everything about
-the subdirectories, a needs_linking() method can now query all
-subdirectories if there is any linking involved down in the tree. The
-speedup for PM-only Makefiles seems to be around 1 second on my
-Indy 100 MHz.
+The medium answer is:
-=head2 Incompatibilities between MakeMaker 5.00 and 4.23
-
-There are no incompatibilities in the short term, as all changes are
-accompanied by short-term workarounds that guarantee full backwards
-compatibility.
-
-You are likely to face a few warnings that expose deprecations which
-will result in incompatibilities in the long run:
-
-You should not use %att directly anymore. Instead any subroutine you
-override in the MY package will be called by the object method, so you
-can access all object attributes directly via the object in $_[0].
-
-You should not call the class methos MM->something anymore. Instead
-you should call the superclass. Something like
-
- sub MY::constants {
- my $self = shift;
- $self->MM::constants();
- }
-
-Especially the libscan() and exescan() methods should be altered
-towards OO programming, that means do not expect that $_ to contain
-the path but rather $_[1].
-
-Try to build several extensions simultanously to debug your
-Makefile.PL. You can unpack a bunch of distributed packages within one
-directory and run
-
- perl -MExtUtils::MakeMaker -e 'WriteMakefile()'
-
-That's actually fun to watch :)
-
-Final suggestion: Try to delete all of your MY:: subroutines and
-watch, if you really still need them. MakeMaker might already do what
-you want without them. That's all about it.
+ use ExtUtils::MakeMaker;
+ WriteMakefile( NAME => "Foo::Bar" );
+The long answer is the rest of the manpage :-)
=head2 Default Makefile Behaviour
-The automatically generated Makefile enables the user of the extension
-to invoke
+The generated Makefile enables the user of the extension to invoke
perl Makefile.PL # optionally "perl Makefile.PL verbose"
make
=head2 make test
-MakeMaker checks for the existence of a file named "test.pl" in the
+MakeMaker checks for the existence of a file named F<test.pl> in the
current directory and if it exists it adds commands to the test target
of the generated Makefile that will execute the script with the proper
set of perl C<-I> options.
all matching files via the L<Test::Harness> module with the C<-I>
switches set correctly.
+=head2 make testdb
+
+A useful variation of the above is the target C<testdb>. It runs the
+test under the Perl debugger (see L<perldebug>). If the file
+F<test.pl> exists in the current directory, it is used for the test.
+
+If you want to debug some other testfile, set C<TEST_FILE> variable
+thusly:
+
+ make testdb TEST_FILE=t/mytest.t
+
+By default the debugger is called using C<-d> option to perl. If you
+want to specify some other option, set C<TESTDB_SW> variable:
+
+ make testdb TESTDB_SW=-Dx
+
=head2 make install
make alone puts all relevant files into directories that are named by
-the macros INST_LIB, INST_ARCHLIB, INST_EXE, INST_MAN1DIR, and
-INST_MAN3DIR. All these default to something below ./blib if
-you are I<not> building below the perl source directory. If you I<are>
+the macros INST_LIB, INST_ARCHLIB, INST_SCRIPT, INST_MAN1DIR, and
+INST_MAN3DIR. All these default to something below ./blib if you are
+I<not> building below the perl source directory. If you I<are>
building below the perl source, INST_LIB and INST_ARCHLIB default to
- ../../lib, and INST_EXE is not defined.
+ ../../lib, and INST_SCRIPT is not defined.
The I<install> target of the generated Makefile copies the files found
below each of the INST_* directories to their INSTALL*
INSTALLDIRS set to
perl site
- INST_LIB INSTALLPRIVLIB INSTALLSITELIB
INST_ARCHLIB INSTALLARCHLIB INSTALLSITEARCH
- INST_EXE INSTALLBIN
+ INST_LIB INSTALLPRIVLIB INSTALLSITELIB
+ INST_BIN INSTALLBIN
+ INST_SCRIPT INSTALLSCRIPT
INST_MAN1DIR INSTALLMAN1DIR
INST_MAN3DIR INSTALLMAN3DIR
The INSTALL... macros in turn default to their %Config
($Config{installprivlib}, $Config{installarchlib}, etc.) counterparts.
-If you don't want to keep the defaults, MakeMaker helps you to
-minimize the typing needed: the usual relationship between
-INSTALLPRIVLIB and INSTALLARCHLIB is determined by Configure at perl
-compilation time. MakeMaker supports the user who sets
-INSTALLPRIVLIB. If INSTALLPRIVLIB is set, but INSTALLARCHLIB not, then
-MakeMaker defaults the latter to be the same subdirectory of
-INSTALLPRIVLIB as Configure decided for the counterparts in %Config ,
-otherwise it defaults to INSTALLPRIVLIB. The same relationship holds
-for INSTALLSITELIB and INSTALLSITEARCH.
+You can check the values of these variables on your system with
-MakeMaker gives you much more freedom than needed to configure
-internal variables and get different results. It is worth to mention,
-that make(1) also lets you configure most of the variables that are
-used in the Makefile. But in the majority of situations this will not
-be necessary, and should only be done, if the author of a package
-recommends it.
+ perl '-V:install.*'
+And to check the sequence in which the library directories are
+searched by perl, run
-=head2 PREFIX attribute
+ perl -le 'print join $/, @INC'
-The PREFIX attribute can be used to set the INSTALL* attributes in one
-go. The quickest way to install a module in a non-standard place
+
+=head2 PREFIX and LIB attribute
+
+PREFIX and LIB can be used to set several INSTALL* attributes in one
+go. The quickest way to install a module in a non-standard place might
+be
+
+ perl Makefile.PL LIB=~/lib
+
+This will install the module's architecture-independent files into
+~/lib, the architecture-dependent files into ~/lib/$archname/auto.
+
+Another way to specify many INSTALL directories with a single
+parameter is PREFIX.
perl Makefile.PL PREFIX=~
This will replace the string specified by $Config{prefix} in all
$Config{install*} values.
-Note, that the tilde expansion is done by MakeMaker, not by perl by
-default, nor by make.
+Note, that in both cases the tilde expansion is done by MakeMaker, not
+by perl by default, nor by make. Conflicts between parmeters LIB,
+PREFIX and the various INSTALL* arguments are resolved so that
+XXX
If the user has superuser privileges, and is not working on AFS
(Andrew File System) or relatives, then the defaults for
-INSTALLPRIVLIB, INSTALLARCHLIB, INSTALLBIN, etc. will be appropriate,
+INSTALLPRIVLIB, INSTALLARCHLIB, INSTALLSCRIPT, etc. will be appropriate,
and this incantation will be the best:
perl Makefile.PL; make; make test
have to do this by calling
perl Makefile.PL INSTALLSITELIB=/afs/here/today \
- INSTALLBIN=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages
+ INSTALLSCRIPT=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages
make
Be careful to repeat this procedure every time you recompile an
If perl has not yet been installed then PERL_SRC can be defined on the
command line as shown in the previous section.
-=head2 Useful Default Makefile Macros
-
-FULLEXT = Pathname for extension directory (eg DBD/Oracle).
-
-BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
-
-ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD)
-INST_LIBDIR = C<$(INST_LIB)$(ROOTEXT)>
+=head2 Which architecture dependent directory?
-INST_AUTODIR = C<$(INST_LIB)/auto/$(FULLEXT)>
+If you don't want to keep the defaults for the INSTALL* macros,
+MakeMaker helps you to minimize the typing needed: the usual
+relationship between INSTALLPRIVLIB and INSTALLARCHLIB is determined
+by Configure at perl compilation time. MakeMaker supports the user who
+sets INSTALLPRIVLIB. If INSTALLPRIVLIB is set, but INSTALLARCHLIB not,
+then MakeMaker defaults the latter to be the same subdirectory of
+INSTALLPRIVLIB as Configure decided for the counterparts in %Config ,
+otherwise it defaults to INSTALLPRIVLIB. The same relationship holds
+for INSTALLSITELIB and INSTALLSITEARCH.
-INST_ARCHAUTODIR = C<$(INST_ARCHLIB)/auto/$(FULLEXT)>
+MakeMaker gives you much more freedom than needed to configure
+internal variables and get different results. It is worth to mention,
+that make(1) also lets you configure most of the variables that are
+used in the Makefile. But in the majority of situations this will not
+be necessary, and should only be done, if the author of a package
+recommends it (or you know what you're doing).
=head2 Using Attributes and Parameters
and the values portion of the XS attribute hash. This is not
currently used by MakeMaker but may be handy in Makefile.PLs.
+=item CCFLAGS
+
+String that will be included in the compiler call command line between
+the arguments INC and OPTIMIZE.
+
=item CONFIG
Arrayref. E.g. [qw(archname manext)] defines ARCHNAME & MANEXT from
=item CONFIGURE
CODE reference. The subroutine should return a hash reference. The
-hash may contain further attributes, e.g. {LIBS => ...}, that have to
+hash may contain further attributes, e.g. {LIBS =E<gt> ...}, that have to
be determined by some evaluation method.
=item DEFINE
(linker options) at present. Defaults to []. (e.g. [ qw(
Foo_version Foo_numstreams Foo_tree ) ])
+=item EXCLUDE_EXT
+
+Array of extension names to exclude when doing a static build. This
+is ignored if INCLUDE_EXT is present. Consult INCLUDE_EXT for more
+details. (e.g. [ qw( Socket POSIX ) ] )
+
+This attribute may be most useful when specified as a string on the
+commandline: perl Makefile.PL EXCLUDE_EXT='Socket Safe'
+
=item EXE_FILES
Ref to array of executable files. The files will be copied to the
-INST_EXE directory. Make realclean will delete them from there
+INST_SCRIPT directory. Make realclean will delete them from there
again.
+=item NO_VC
+
+In general any generated Makefile checks for the current version of
+MakeMaker and the version the Makefile was built under. If NO_VC is
+set, the version check is neglected. Do not write this into your
+Makefile.PL, use it interactively instead.
+
=item FIRST_MAKEFILE
The name of the Makefile to be produced. Defaults to the contents of
Ref to array of *.h file names. Similar to C.
+=item IMPORTS
+
+IMPORTS is only used on OS/2.
+
=item INC
Include file dirs eg: C<"-I/usr/5include -I/path/to/inc">
+=item INCLUDE_EXT
+
+Array of extension names to be included when doing a static build.
+MakeMaker will normally build with all of the installed extensions when
+doing a static build, and that is usually the desired behavior. If
+INCLUDE_EXT is present then MakeMaker will build only with those extensions
+which are explicitly mentioned. (e.g. [ qw( Socket POSIX ) ])
+
+It is not necessary to mention DynaLoader or the current extension when
+filling in INCLUDE_EXT. If the INCLUDE_EXT is mentioned but is empty then
+only DynaLoader and the current extension will be included in the build.
+
+This attribute may be most useful when specified as a string on the
+commandline: perl Makefile.PL INCLUDE_EXT='POSIX Socket Devel::Peek'
+
=item INSTALLARCHLIB
Used by 'make install', which copies files from INST_ARCHLIB to this
=item INSTALLBIN
-Used by 'make install' which copies files from INST_EXE to this
-directory.
+Directory to install binary files (e.g. tkperl) into.
=item INSTALLDIRS
Used by 'make install', which copies files from INST_LIB to this
directory if INSTALLDIRS is set to perl.
+=item INSTALLSCRIPT
+
+Used by 'make install' which copies files from INST_SCRIPT to this
+directory.
+
=item INSTALLSITELIB
Used by 'make install', which copies files from INST_LIB to this
Same as INST_LIB for architecture dependent files.
+=item INST_BIN
+
+Directory to put real binary files during 'make'. These will be copied
+to INSTALLBIN during 'make install'
+
=item INST_EXE
-Directory, where executable scripts should be installed during
-'make'. Defaults to "./blib/bin", just to have a dummy location during
-testing. make install will copy the files in INST_EXE to INSTALLBIN.
+Old name for INST_SCRIPT. Deprecated. Please use INST_SCRIPT if you
+need to use it.
=item INST_LIB
Directory to hold the man pages at 'make' time
+=item INST_SCRIPT
+
+Directory, where executable files should be installed during
+'make'. Defaults to "./blib/bin", just to have a dummy location during
+testing. make install will copy the files in INST_SCRIPT to
+INSTALLSCRIPT.
+
=item LDFROM
defaults to "$(OBJECT)" and is used in the ld command to specify
The filename of the perllibrary that will be used together with this
extension. Defaults to libperl.a.
+=item LIB
+
+LIB can only be set at C<perl Makefile.PL> time. It has the effect of
+setting both INSTALLPRIVLIB and INSTALLSITELIB to that value regardless any
+
=item LIBS
An anonymous array of alternative library
=item NOECHO
-Defaults the C<@>. By setting it to an empty string you can generate a
+Defaults to C<@>. By setting it to an empty string you can generate a
Makefile that echos all commands. Mainly used in debugging MakeMaker
itself.
string containing all object files, e.g. "tkpBind.o
tkpButton.o tkpCanvas.o"
+=item OPTIMIZE
+
+Defaults to C<-O>. Set it to C<-g> to turn debugging on. The flag is
+passed to subdirectory makes.
+
=item PERL
Perl binary for tasks that can be done by miniperl
{'name_of_file.pm' => '$(INST_LIBDIR)/install_as.pm'}
-By default this will include *.pm and *.pl. If a lib directory
-exists and is not listed in DIR (above) then any *.pm and *.pl files
-it contains will also be included by default. Defining PM in the
+By default this will include *.pm and *.pl and the files found in
+the PMLIBDIRS directories. Defining PM in the
Makefile.PL will override PMLIBDIRS.
=item PMLIBDIRS
Ref to array of subdirectories containing library files. Defaults to
-[ 'lib', $(BASEEXT) ]. The directories will be scanned and any files
+[ 'lib', $(BASEEXT) ]. The directories will be scanned and I<any> files
they contain will be installed in the corresponding location in the
library. A libscan() method can be used to alter the behaviour.
Defining PM in the Makefile.PL will override PMLIBDIRS.
decided at the build time of your perl (unless you override one of
them, of course).
-=item PREREQ
+=item PREREQ_PM
-Placeholder, not yet implemented. Will eventually be a hashref: Names
-of modules that need to be available to run this extension (e.g. Fcntl
-for SDBM_File) are the keys of the hash and the desired version is the
-value. Needs further evaluation, should probably allow to define
-prerequisites among header files, libraries, perl version, etc.
+Hashref: Names of modules that need to be available to run this
+extension (e.g. Fcntl for SDBM_File) are the keys of the hash and the
+desired version is the value. If the required version number is 0, we
+only check if any version is installed already.
=item SKIP
Arryref. E.g. [qw(name1 name2)] skip (do not write) sections of the
-Makefile
+Makefile. Caution! Do not use the SKIP attribute for the neglectible
+speedup. It may seriously damage the resulting Makefile. Only use it,
+if you really need it.
=item TYPEMAPS
single line to compute the version number. The first line in the file
that contains the regular expression
- /(\$[\w:]*\bVERSION)\b.*=/
+ /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/
will be evaluated with eval() and the value of the named variable
B<after> the eval() will be assigned to the VERSION attribute of the
MakeMaker object. The following lines will be parsed o.k.:
$VERSION = '1.00';
- ( $VERSION ) = '$Revision: 1.174 $ ' =~ /\$Revision:\s+([^\s]+)/;
+ *VERSION = \'1.01';
+ ( $VERSION ) = '$Revision: 1.216 $ ' =~ /\$Revision:\s+([^\s]+)/;
$FOO::VERSION = '1.10';
+ *FOO::VERSION = \'1.11';
but these will fail:
local $VERSION = '1.02';
local $FOO::VERSION = '1.30';
-The file named in VERSION_FROM is added as a dependency to Makefile to
-guarantee, that the Makefile contains the correct VERSION macro after
-a change of the file.
+The file named in VERSION_FROM is not added as a dependency to
+Makefile. This is not really correct, but it would be a major pain
+during development to have to rewrite the Makefile for any smallish
+change in that file. If you want to make sure that the Makefile
+contains the correct VERSION macro after any change of the file, you
+would have to do something like
+
+ depend => { Makefile => '$(VERSION_FROM)' }
+
+See attribute C<depend> below.
=item XS
=head2 Additional lowercase attributes
can be used to pass parameters to the methods which implement that
-part of the Makefile. These are not normally required:
+part of the Makefile.
=over 2
=item dist
{TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => 'gz',
- SHAR => 'shar -m', DIST_CP => 'ln'}
+ SHAR => 'shar -m', DIST_CP => 'ln', ZIP => '/bin/zip',
+ ZIPFLAGS => '-rl', DIST_DEFAULT => 'private tardist' }
If you specify COMPRESS, then SUFFIX should also be altered, as it is
needed to tell make the target file of the compression. Setting
=item installpm
- {SPLITLIB => '$(INST_LIB)' (default) or '$(INST_ARCHLIB)'}
+Deprecated as of MakeMaker 5.23. See L<ExtUtils::MM_Unix/pm_to_blib>.
=item linkext
or you can edit the default by saying something like:
sub MY::c_o {
- my $self = shift;
- local *c_o;
- $_=$self->MM::c_o;
- s/old text/new text/;
- $_;
+ package MY; # so that "SUPER" works right
+ my $inherited = shift->SUPER::c_o(@_);
+ $inherited =~ s/old text/new text/;
+ $inherited;
}
-Both methods above are available for backwards compatibility with
-older Makefile.PLs.
+If you running experiments with embedding perl as a library into other
+applications, you might find MakeMaker not sufficient. You'd better
+have a look at ExtUtils::embed which is a collection of utilities for
+embedding.
If you still need a different solution, try to develop another
subroutine, that fits your needs and submit the diffs to
F<perl5-porters@nicoh.com> or F<comp.lang.perl.misc> as appropriate.
+For a complete description of all MakeMaker methods see L<ExtUtils::MM_Unix>.
+
+Here is a simple example of how to add a new target to the generated
+Makefile:
+
+ sub MY::postamble {
+ '
+ $(MYEXTLIB): sdbm/Makefile
+ cd sdbm && $(MAKE) all
+ ';
+ }
+
+
+=head2 Hintsfile support
+
+MakeMaker.pm uses the architecture specific information from
+Config.pm. In addition it evaluates architecture specific hints files
+in a C<hints/> directory. The hints files are expected to be named
+like their counterparts in C<PERL_SRC/hints>, but with an C<.pl> file
+name extension (eg. C<next_3_2.pl>). They are simply C<eval>ed by
+MakeMaker within the WriteMakefile() subroutine, and can be used to
+execute commands as well as to include special variables. The rules
+which hintsfile is chosen are the same as in Configure.
+
+The hintsfile is eval()ed immediately after the arguments given to
+WriteMakefile are stuffed into a hash reference $self but before this
+reference becomes blessed. So if you want to do the equivalent to
+override or create an attribute you would say something like
+
+ $self->{LIBS} = ['-ldbm -lucb -lc'];
+
=head2 Distribution Support
For authors of extensions MakeMaker provides several Makefile
=item make tardist
-First does a command $(PREOP) which defaults to a null command. Does a
-distdir next and runs C<tar> on that directory into a tarfile. Then
-deletes the distdir. Finishes with a command $(POSTOP) which defaults
-to a null command.
+First does a distdir. Then a command $(PREOP) which defaults to a null
+command, followed by $(TOUNIX), which defaults to a null command under
+UNIX, and will convert files in distribution directory to UNIX format
+otherwise. Next it runs C<tar> on that directory into a tarfile and
+deletes the directory. Finishes with a command $(POSTOP) which
+defaults to a null command.
=item make dist
=item make shdist
-First does a command $(PREOP) which defaults to a null command. Does a
-distdir next and runs C<shar> on that directory into a sharfile. Then
-deletes the distdir. Finishes with a command $(POSTOP) which defaults
-to a null command. Note: For shdist to work properly a C<shar>
-program that can handle directories is mandatory.
+First does a distdir. Then a command $(PREOP) which defaults to a null
+command. Next it runs C<shar> on that directory into a sharfile and
+deletes the intermediate directory again. Finishes with a command
+$(POSTOP) which defaults to a null command. Note: For shdist to work
+properly a C<shar> program that can handle directories is mandatory.
+
+=item make zipdist
+
+First does a distdir. Then a command $(PREOP) which defaults to a null
+command. Runs C<$(ZIP) $(ZIPFLAGS)> on that directory into a
+zipfile. Then deletes that directory. Finishes with a command
+$(POSTOP) which defaults to a null command.
=item make ci
COMPRESS ('compress')
POSTOP ('@ :')
PREOP ('@ :')
+ TO_UNIX (depends on the system)
RCS_LABEL ('rcs -q -Nv$(VERSION_SYM):')
SHAR ('shar')
SUFFIX ('Z')
TAR ('tar')
TARFLAGS ('cvf')
+ ZIP ('zip')
+ ZIPFLAGS ('-r')
An example:
WriteMakefile( 'dist' => { COMPRESS=>"gzip", SUFFIX=>"gz" })
+=head2 Disabling an extension
-=head1 AUTHORS
+If some events detected in F<Makefile.PL> imply that there is no way
+to create the Module, but this is a normal state of things, then you
+can create a F<Makefile> which does nothing, but succeeds on all the
+"usual" build targets. To do so, use
-Andy Dougherty F<E<lt>doughera@lafcol.lafayette.eduE<gt>>, Andreas
-KE<ouml>nig F<E<lt>A.Koenig@franz.ww.TU-Berlin.DEE<gt>>, Tim Bunce
-F<E<lt>Tim.Bunce@ig.co.ukE<gt>>. VMS support by Charles Bailey
-F<E<lt>bailey@HMIVAX.HUMGEN.UPENN.EDUE<gt>>. OS/2 support by Ilya
-Zakharevich F<E<lt>ilya@math.ohio-state.eduE<gt>>. Contact the
-makemaker mailing list C<mailto:makemaker@franz.ww.tu-berlin.de>, if
-you have any questions.
+ ExtUtils::MakeMaker::WriteEmptyMakefile();
+
+instead of WriteMakefile().
-=head1 MODIFICATION HISTORY
+This may be useful if other modules expect this module to be I<built>
+OK, as opposed to I<work> OK (say, this system-dependent module builds
+in a subdirectory of some other distribution, or is listed as a
+dependency in a CPAN::Bundle, but the functionality is supported by
+different means on the current architecture).
-For a more complete documentation see the file Changes in the
-MakeMaker distribution package.
+=head1 SEE ALSO
-=head1 TODO
+ExtUtils::MM_Unix, ExtUtils::Manifest, ExtUtils::testlib,
+ExtUtils::Install, ExtUtils::embed
-See the file Todo in the MakeMaker distribution package.
+=head1 AUTHORS
+
+Andy Dougherty <F<doughera@lafcol.lafayette.edu>>, Andreas KE<ouml>nig
+<F<A.Koenig@franz.ww.TU-Berlin.DE>>, Tim Bunce <F<Tim.Bunce@ig.co.uk>>.
+VMS support by Charles Bailey <F<bailey@genetics.upenn.edu>>. OS/2
+support by Ilya Zakharevich <F<ilya@math.ohio-state.edu>>. Contact the
+makemaker mailing list C<mailto:makemaker@franz.ww.tu-berlin.de>, if
+you have any questions.
=cut