home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
vsiftp.vmssoftware.com
/
VSIPUBLIC@vsiftp.vmssoftware.com.tar
/
FREEWARE
/
FREEWARE40.ZIP
/
perl5
/
perl5_003.pat-gz
/
perl5_003.pat
Wrap
Text File
|
1996-06-24
|
341KB
|
11,149 lines
#!/bin/sh
#
# This is patch 5.003 for Perl.
#
# Apply over Perl 5.002_01 using patch -p1 -N.
# (If you're using a version of Perl prior to 5.002_01, it's
# probably easier for you to start with a fresh copy of Perl
# 5.003, which can be obtained from any CPAN site. A list of
# CPAN sites is available from http://perl.com/CPAN.)
#
# This patch makes the following changes to Perl 5.002_01:
# 1. Fixes a security bug in the handling of setuid
# programs on some systems.
# 2. Updates MakeMaker to version 5.34.
# 3. Fixes a bug which caused real numbers between
# 0 and -1 to be incorrectly optimized to ints
# in comparisons.
# 4. Updates Makefile.PLs for standard extensions to
# conform to the current version of MakeMaker.
# 5. Updates hints files for BSD/OS, HP-UX, Linux,
# MachTen, and Solaris.
# 6. Updates VMS-specific to handling of file
# specification strings.
# 7. Fixes a bug in installperl which left installed
# C header files with the wrong permissions.
# Information on changes to each file is at the head of the diff
# for that file. You can extract them using grep '^#:'.
exit 0 # in case this file is fed to /bin/sh
#: INSTALL:
#: Include $shrpdir in the list of installation directories.
#: Update comments on using GNU as/ld under SunOS and Solaris
diff -crN perl5.002_01/INSTALL perl5.003/INSTALL
*** perl5.002_01/INSTALL Mon Mar 25 01:04:10 1996
--- perl5.003/INSTALL Mon Jun 24 16:07:53 1996
***************
*** 312,317 ****
--- 312,318 ----
installscript=`echo $installscript | sed "s!$prefix!$installprefix!"`
installsitelib=`echo $installsitelib | sed "s!$prefix!$installprefix!"`
installsitearch=`echo $installsitearch | sed "s!$prefix!$installprefix!"`
+ shrpdir=`echo $shrpdir | sed "s!$prefix!$installprefix!"`
Then, you can Configure and install in the usual way:
***************
*** 536,544 ****
and i_varags='undef' in config.sh. The problem is usually solved
by running fixincludes correctly.
! If you wish to use dynamic loading on SunOS or Solaris, and you
! have GNU as and GNU ld installed, you may need to add B<-B/bin/> to
! your $ccflags and $ldflags so that the system's versions of as
and ld are used.
If you run into dynamic loading problems, check your setting of
--- 537,546 ----
and i_varags='undef' in config.sh. The problem is usually solved
by running fixincludes correctly.
! If you have problems with dynamic loading using gcc on SunOS or
! Solaris, and you are using GNU as and GNU ld, you may need to add
! B<-B/bin/> (for SunOS) or B<-B/usr/ccs/bin> (for Solaris) to your
! $ccflags, $ldflags, and $lddlflags so that the system's versions of as
and ld are used.
If you run into dynamic loading problems, check your setting of
#: ext/DynaLoader/Makefile.PL:
#: Add NAME attribute to suppress MakeMaker "guess" warning
diff -crN perl5.002_01/ext/DynaLoader/Makefile.PL perl5.003/ext/DynaLoader/Makefile.PL
*** perl5.002_01/ext/DynaLoader/Makefile.PL Wed Jan 31 13:26:40 1996
--- perl5.003/ext/DynaLoader/Makefile.PL Sun Jun 23 22:07:51 1996
***************
*** 1,6 ****
--- 1,7 ----
use ExtUtils::MakeMaker;
WriteMakefile(
+ NAME => 'DynaLoader',
LINKTYPE => 'static',
DEFINE => '-DLIBC="$(LIBC)"',
MAN3PODS => ' ', # Pods will be built by installman.
#: ext/Fcntl/Makefile.PL:
#: Add NAME attribute to suppress MakeMaker "guess" warning
diff -crN perl5.002_01/ext/Fcntl/Makefile.PL perl5.003/ext/Fcntl/Makefile.PL
*** perl5.002_01/ext/Fcntl/Makefile.PL Wed Jan 31 13:27:05 1996
--- perl5.003/ext/Fcntl/Makefile.PL Sun Jun 23 22:08:33 1996
***************
*** 1,5 ****
--- 1,6 ----
use ExtUtils::MakeMaker;
WriteMakefile(
+ NAME => 'Fcntl',
MAN3PODS => ' ', # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'Fcntl.pm',
#: ext/FileHandle/Makefile.PL:
#: Add NAME attribute to suppress MakeMaker "guess" warning
diff -crN perl5.002_01/ext/FileHandle/Makefile.PL perl5.003/ext/FileHandle/Makefile.PL
*** perl5.002_01/ext/FileHandle/Makefile.PL Mon Feb 12 14:50:53 1996
--- perl5.003/ext/FileHandle/Makefile.PL Sun Jun 23 22:08:59 1996
***************
*** 1,5 ****
--- 1,6 ----
use ExtUtils::MakeMaker;
WriteMakefile(
+ NAME => 'FileHandle',
MAN3PODS => ' ', # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'FileHandle.pm',
diff -crN perl5.002_01/ext/GDBM_File/Makefile.PL perl5.003/ext/GDBM_File/Makefile.PL
#: ext/GDBM_File/Makefile.PL:
#: Add NAME attribute to suppress MakeMaker "guess" warning
*** perl5.002_01/ext/GDBM_File/Makefile.PL Wed Jan 31 13:27:27 1996
--- perl5.003/ext/GDBM_File/Makefile.PL Sun Jun 23 22:09:34 1996
***************
*** 1,5 ****
--- 1,6 ----
use ExtUtils::MakeMaker;
WriteMakefile(
+ NAME => 'GDBM_File',
LIBS => ["-L/usr/local/lib -lgdbm", "-ldbm"],
MAN3PODS => ' ', # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
#: ext/NDBM_File/Makefile.PL:
#: Add NAME attribute to suppress MakeMaker "guess" warning
diff -crN perl5.002_01/ext/NDBM_File/Makefile.PL perl5.003/ext/NDBM_File/Makefile.PL
*** perl5.002_01/ext/NDBM_File/Makefile.PL Wed Jan 31 13:27:46 1996
--- perl5.003/ext/NDBM_File/Makefile.PL Sun Jun 23 22:10:04 1996
***************
*** 1,5 ****
--- 1,6 ----
use ExtUtils::MakeMaker;
WriteMakefile(
+ NAME => 'NDBM_File',
LIBS => ["-L/usr/local/lib -lndbm", "-ldbm -lucb"],
MAN3PODS => ' ', # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
#: ext/NDBM_File/NDBM_File.pm:
#: C<use strict> with Perl 5.002 or later to avoid confusing warnings
#: if installed in a library also used by Perl 5.001m. (It still won't
#: work with 5,001m, but the error message now states this more clearly.)
diff -crN perl5.002_01/ext/NDBM_File/NDBM_File.pm perl5.003/ext/NDBM_File/NDBM_File.pm
*** perl5.002_01/ext/NDBM_File/NDBM_File.pm Wed Feb 14 21:14:26 1996
--- perl5.003/ext/NDBM_File/NDBM_File.pm Mon Jun 24 16:07:53 1996
***************
*** 1,6 ****
package NDBM_File;
! use strict;
use vars qw($VERSION @ISA);
require Tie::Hash;
--- 1,10 ----
package NDBM_File;
! BEGIN {
! if ($] >= 5.002) {
! use strict;
! }
! }
use vars qw($VERSION @ISA);
require Tie::Hash;
#: ext/ODBM_File/Makefile.PL:
#: Add NAME attribute to suppress MakeMaker "guess" warning
diff -crN perl5.002_01/ext/ODBM_File/Makefile.PL perl5.003/ext/ODBM_File/Makefile.PL
*** perl5.002_01/ext/ODBM_File/Makefile.PL Wed Jan 31 13:28:05 1996
--- perl5.003/ext/ODBM_File/Makefile.PL Sun Jun 23 22:10:27 1996
***************
*** 1,5 ****
--- 1,6 ----
use ExtUtils::MakeMaker;
WriteMakefile(
+ NAME => 'ODBM_File',
LIBS => ["-ldbm -lucb"],
MAN3PODS => ' ', # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
#: ext/POSIX/Makefile.PL:
#: Add NAME attribute to suppress MakeMaker "guess" warning
diff -crN perl5.002_01/ext/POSIX/Makefile.PL perl5.003/ext/POSIX/Makefile.PL
*** perl5.002_01/ext/POSIX/Makefile.PL Wed Jan 31 13:28:25 1996
--- perl5.003/ext/POSIX/Makefile.PL Sun Jun 23 23:47:59 1996
***************
*** 1,6 ****
use ExtUtils::MakeMaker;
WriteMakefile(
! LIBS => ["-lm -lposix -lcposix"],
MAN3PODS => ' ', # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'POSIX.pm',
--- 1,7 ----
use ExtUtils::MakeMaker;
WriteMakefile(
! NAME => 'POSIX',
! LIBS => ["-lm -lposix -lcposix"],
MAN3PODS => ' ', # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'POSIX.pm',
#: ext/SDBM_File/Makefile.PL:
#: Add NAME attribute to suppress MakeMaker "guess" warning
diff -crN perl5.002_01/ext/SDBM_File/Makefile.PL perl5.003/ext/SDBM_File/Makefile.PL
*** perl5.002_01/ext/SDBM_File/Makefile.PL Wed Jan 31 13:28:45 1996
--- perl5.003/ext/SDBM_File/Makefile.PL Sun Jun 23 22:11:07 1996
***************
*** 6,11 ****
--- 6,12 ----
# which perform the corresponding actions in the subdirectory.
WriteMakefile(
+ NAME => 'SDBM_File',
MYEXTLIB => 'sdbm/libsdbm$(LIB_EXT)',
MAN3PODS => ' ', # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
#: ext/SDBM_File/sdbm/Makefile.PL:
#: Add NAME attribute to suppress MakeMaker "guess" warning
diff -crN perl5.002_01/ext/SDBM_File/sdbm/Makefile.PL perl5.003/ext/SDBM_File/sdbm/Makefile.PL
*** perl5.002_01/ext/SDBM_File/sdbm/Makefile.PL Sat Jan 20 00:56:27 1996
--- perl5.003/ext/SDBM_File/sdbm/Makefile.PL Sun Jun 23 22:11:45 1996
***************
*** 1,5 ****
--- 1,6 ----
use ExtUtils::MakeMaker;
WriteMakefile(
+ 'NAME' => 'SDBM_File',
'LINKTYPE' => 'static',
'DEFINE' => '-DSDBM -DDUFF',
'SKIP' => [qw(static static_lib dynamic dynamic_lib)],
#: ext/Safe/Makefile.PL:
#: Add NAME attribute to suppress MakeMaker "guess" warning
diff -crN perl5.002_01/ext/Safe/Makefile.PL perl5.003/ext/Safe/Makefile.PL
*** perl5.002_01/ext/Safe/Makefile.PL Wed Jan 31 13:29:04 1996
--- perl5.003/ext/Safe/Makefile.PL Sun Jun 23 22:12:21 1996
***************
*** 1,5 ****
--- 1,6 ----
use ExtUtils::MakeMaker;
WriteMakefile(
+ NAME => 'Safe',
MAN3PODS => ' ', # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'Safe.pm',
#: ext/Socket/Makefile.PL:
#: Add NAME attribute to suppress MakeMaker "guess" warning
diff -crN perl5.002_01/ext/Socket/Makefile.PL perl5.003/ext/Socket/Makefile.PL
*** perl5.002_01/ext/Socket/Makefile.PL Wed Jan 31 13:29:20 1996
--- perl5.003/ext/Socket/Makefile.PL Sun Jun 23 22:12:44 1996
***************
*** 1,5 ****
--- 1,6 ----
use ExtUtils::MakeMaker;
WriteMakefile(
+ NAME => 'Socket',
VERSION_FROM => 'Socket.pm',
MAN3PODS => ' ', # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
#: hints/bsdos.sh
#: Distinguish between 2.0.x and 2.1.x, and use dynamic linking
#: in the latter
diff -crN perl5.002_01/hints/bsdos.sh perl5.003/hints/bsdos.sh
*** perl5.002_01/hints/bsdos.sh Mon Mar 25 01:04:08 1996
--- perl5.003/hints/bsdos.sh Mon Jun 24 16:49:28 1996
***************
*** 49,75 ****
'') cc='gcc2' ;;
esac
;;
! 2.*)
! case "$osvers" in
! 2.1*) # dlopen() is supported in 2.1
! usedl='true'
! d_dlopen='define'
! cccdlflags='none'
! # pre-link against the shared C library
! lddlflags='-r -lc_s.2.1.0'
!
! # BSD/OS 2.1 doesn't (yet) support `true' dynamic linking
! # so we `preload' the shared libraries by linking
! # against them; even though we don't pull in any symbols.
! libswanted="Xpm Xaw Xmu Xt SM ICE Xext X11 $libswanted"
! libswanted="rpc curses termcap $libswanted"
!
! # Use the system malloc or else you'll have dualing mallocs!
! d_mymalloc='undef'
! usemymalloc='n'
! ;;
! esac
!
# default to GCC 2.X w/shared libraries
case "$cc" in
'') cc='shlicc2' ;;
--- 49,55 ----
'') cc='gcc2' ;;
esac
;;
! 2.0*)
# default to GCC 2.X w/shared libraries
case "$cc" in
'') cc='shlicc2' ;;
***************
*** 83,88 ****
--- 63,96 ----
# setre?[ug]id() have been replaced by the _POSIX_SAVED_IDS stuff
# in 4.4BSD-based systems (including BSD/OS 2.0 and later).
# See http://www.bsdi.com/bsdi-man?setuid(2)
+ d_setregid='undef'
+ d_setreuid='undef'
+ d_setrgid='undef'
+ d_setruid='undef'
+ ;;
+ 2.1*)
+ # Use 2.1's shlicc2 for dynamic linking
+ # Since cc -o is linking, use it for compiling too.
+ # I'm not sure whether Configure is careful about
+ # distinguishing between the two.
+
+ case "$cc" in
+ '') cc='shlicc2'
+ cccdlflags=' ' ;; # Avoid the dreaded -fpic
+ esac
+
+ # Link with shared libraries in 2.1
+ # Turns out that shlicc2 will automatically use the
+ # shared libs, so don't explicitly specify -lc_s.2.1.*
+ case "$ld" in
+ '') ld='shlicc2'
+ lddlflags='-r' ;; # this one is necessary
+ esac
+
+ # setre?[ug]id() have been replaced by the _POSIX_SAVED_IDS stuff
+ # in 4.4BSD-based systems (including BSD/OS 2.0 and later).
+ # See http://www.bsdi.com/bsdi-man?setuid(2)
+ # This stuff may or may not be right, but it works.
d_setregid='undef'
d_setreuid='undef'
d_setrgid='undef'
#: hints/hpux.sh:
#: Make deferred loading of shared libraries the default
diff -crN perl5.002_01/hints/hpux.sh perl5.003/hints/hpux.sh
*** perl5.002_01/hints/hpux.sh Tue Feb 27 18:46:35 1996
--- perl5.003/hints/hpux.sh Mon Jun 24 16:49:34 1996
***************
*** 94,104 ****
set `echo " $libswanted " | sed -e 's@ ld @ @' -e 's@ dbm @ @' -e 's@ BSD @ @' -e 's@ PW @ @'`
libswanted="$*"
! # If you copy the perl binaries to other systems and the dynamic loader
! # complains about missing libraries, you can either copy the shared libraries
! # or switch the comments to recompile perl to use archive libraries
! # ccdlflags="-Wl,-E -Wl,-a,archive $ccdlflags"
! ccdlflags="-Wl,-E $ccdlflags"
usemymalloc='y'
alignbytes=8
--- 94,107 ----
set `echo " $libswanted " | sed -e 's@ ld @ @' -e 's@ dbm @ @' -e 's@ BSD @ @' -e 's@ PW @ @'`
libswanted="$*"
! # By setting the deferred flag below, this means that if you run perl on a
! # system that does not have the required shared library that you linked it
! # with, it will die when you try to access a symbol in the (missing) shared
! # library. If you would rather know at perl startup time that you are
! # missing an important shared library, switch the comments so that immediate,
! # rather than deferred loading is performed.
! # ccdlflags="-Wl,-E $ccdlflags"
! ccdlflags="-Wl,-E -Wl,-B,deferred $ccdlflags"
usemymalloc='y'
alignbytes=8
#: hints/linux.sh:
#: Allow Configure to determine malloctype
#: Don't mess with $nm_so_opt
#: Make sure messages get to the right places
#: Disable NDBM, since some systems have problems with the libraries
#: Don't use gcvt() to print floats; it's buggy in some versions of libc
diff -crN perl5.002_01/hints/linux.sh perl5.003/hints/linux.sh
*** perl5.002_01/hints/linux.sh Mon Mar 25 01:04:09 1996
--- perl5.003/hints/linux.sh Mon Jun 24 16:07:53 1996
***************
*** 9,15 ****
# Consolidated by Andy Dougherty <doughera@lafcol.lafayette.edu>
#
# Updated Thu Feb 8 11:56:10 EST 1996
! # Add ability to use command-line overrides for optinal settings.
# perl goes into the /usr tree. See the Filesystem Standard
# available via anonymous FTP at tsx-11.mit.edu in
--- 9,19 ----
# Consolidated by Andy Dougherty <doughera@lafcol.lafayette.edu>
#
# Updated Thu Feb 8 11:56:10 EST 1996
!
! # Updated Thu May 30 10:50:22 EDT 1996 by <doughera@lafcol.lafayette.edu>
!
! # Updated Fri Jun 21 11:07:54 EDT 1996
! # NDBM support for ELF renabled by <kjahds@kjahds.com>
# perl goes into the /usr tree. See the Filesystem Standard
# available via anonymous FTP at tsx-11.mit.edu in
***************
*** 19,25 ****
'') prefix='/usr' ;;
esac
- # This may not be needed in 5.002 since sigaction is used.
# gcc-2.6.3 defines _G_HAVE_BOOL to 1, but doesn't actually supply bool.
ccflags="-Dbool=char -DHAS_BOOL $ccflags"
--- 23,28 ----
***************
*** 32,40 ****
# function in <sys/stat.h>.
d_lstat=define
- # I think Configure gets this right now, but I'd appreciate reports.
- malloctype='void *'
-
# Explanation?
case "$usemymalloc" in
'') usemymalloc='n' ;;
--- 35,40 ----
***************
*** 64,76 ****
}
EOM
if ${cc:-gcc} try.c >/dev/null 2>&1 && ./a.out; then
! cat <<'EOM'
You appear to have ELF support. I'll try to use it for dynamic loading.
EOM
! nm_so_opt='-dynamic'
else
! cat <<'EOM'
You don't have an ELF gcc. I will use dld if possible. If you are
using a version of DLD earlier than 3.2.6, or don't have it at all, you
--- 64,81 ----
}
EOM
if ${cc:-gcc} try.c >/dev/null 2>&1 && ./a.out; then
! cat <<'EOM' >&4
You appear to have ELF support. I'll try to use it for dynamic loading.
+ If dynamic loading doesn't work, read hints/linux.sh for further information.
EOM
!
! #For RedHat Linux 3.0.3, you may need to fetch
! # ftp://ftp.redhat.com/pub/redhat-3.0.3/i386/updates/RPMS/ld.so-1.7.14-3.i386.rpm
! #
!
else
! cat <<'EOM' >&4
You don't have an ELF gcc. I will use dld if possible. If you are
using a version of DLD earlier than 3.2.6, or don't have it at all, you
***************
*** 92,136 ****
## uncomment the next two lines:
#ldflags="-static"
#so='none'
fi
rm -f try.c a.out
if /bin/bash -c exit; then
echo You appear to have a working bash. Good.
else
! cat << 'EOM'
! Warning: it would appear you have a defective bash shell installed. This is
! likely to give you a failure of op/exec test #5 during the test phase of the
! build, Upgrading to a recent version (1.14.4 or later) should fix the
! problem.
EOM
fi
! # In addition, on some systems there is a problem with perl and NDBM, which
! # causes AnyDBM and NDBM_File to lock up. This is evidenced in the tests as
! # AnyDBM just freezing. Currently we disable NDBM for all linux systems.
! # If someone can suggest a more robust test, that would be appreciated.
#
! # More info:
! # Date: Wed, 7 Feb 1996 03:21:04 +0900
! # From: Jeffrey Friedl <jfriedl@nff.ncl.omron.co.jp>
! #
! # I tried compiling with DBM support and sure enough things locked up
! # just as advertised. Checking into it, I found that the lockup was
! # during the call to dbm_open. Not *in* dbm_open -- but between the call
! # to and the jump into.
#
! # To make a long story short, making sure that the *.a and *.sa pairs of
! # /usr/lib/lib{m,db,gdbm}.{a,sa}
! # were perfectly in sync took care of it.
! #
! # This will generate a harmless message:
! # Hmm...You had some extra variables I don't know about...I'll try to keep 'em.
! # Propagating recommended variable d_dbm_open
! case "$d_dbm_open" in
! '') d_dbm_open=undef ;;
! esac
--- 97,163 ----
## uncomment the next two lines:
#ldflags="-static"
#so='none'
+
+ # In addition, on some systems there is a problem with perl and NDBM
+ # which causes AnyDBM and NDBM_File to lock up. This is evidenced
+ # in the tests as AnyDBM just freezing. Apparently, this only
+ # happens on a.out systems, so we disable NDBM for all a.out linux
+ # systems. If someone can suggest a more robust test
+ # that would be appreciated.
+ #
+ # More info:
+ # Date: Wed, 7 Feb 1996 03:21:04 +0900
+ # From: Jeffrey Friedl <jfriedl@nff.ncl.omron.co.jp>
+ #
+ # I tried compiling with DBM support and sure enough things locked up
+ # just as advertised. Checking into it, I found that the lockup was
+ # during the call to dbm_open. Not *in* dbm_open -- but between the call
+ # to and the jump into.
+ #
+ # To make a long story short, making sure that the *.a and *.sa pairs of
+ # /usr/lib/lib{m,db,gdbm}.{a,sa}
+ # were perfectly in sync took care of it.
+ #
+ # This will generate a harmless Whoa There! message
+ case "$d_dbm_open" in
+ '') cat <<'EOM' >&4
+
+ Disabling ndbm. This will generate a Whoa There message in Configure.
+ Read hints/linux.sh for further information.
+ EOM
+ # You can override this with Configure -Dd_dbm_open
+ d_dbm_open=undef
+ ;;
+ esac
fi
rm -f try.c a.out
if /bin/bash -c exit; then
+ echo
echo You appear to have a working bash. Good.
else
! cat << 'EOM' >&4
+ *********************** Warning! *********************
+ It would appear you have a defective bash shell installed. This is likely to
+ give you a failure of op/exec test #5 during the test phase of the build,
+ Upgrading to a recent version (1.14.4 or later) should fix the problem.
+ ******************************************************
EOM
fi
! # Avoid some troublesome gcvt() functions. With some libc versions,
! # perl -e '$x=1e5; print "$x\n";' prints 1e+5. We'd like it
! # to print 100000 instead, consistent with the integer value given
! # on other platforms. This isn't a bug in gcvt, really; more in our
! # expectations for it. We'd like it to behave exactly as
! # sprintf %.16g, but it isn't documented to do that.
#
! # We'll use sprintf() instead, since we can control the output more
! # precisely.
#
! # The next version of Configure will check for this automatically.
! d_Gconvert='sprintf((b),"%.*g",(n),(x))'
#: hints/machten.sh:
#: Don't use buggy sigsetjmp
#: Don't use nlinks returned by stat to count subdirectories
diff -crN perl5.002_01/hints/machten.sh perl5.003/hints/machten.sh
*** perl5.002_01/hints/machten.sh Mon Feb 12 14:53:13 1996
--- perl5.003/hints/machten.sh Mon Jun 24 16:07:54 1996
***************
*** 12,26 ****
# Mark Pease <peasem@primenet.com>
# Martijn Koster <m.koster@webcrawler.com>
# Richard Yeh <rcyeh@cco.caltech.edu>
!
#
# Comments, questions, and improvements welcome!
#
# MachTen 4.X does support dynamic loading, but perl doesn't
# know how to use it yet.
#
! # Last modified by Andy Dougherty <doughera@lafcol.lafayette.edu>
! # Thu Feb 8 15:07:52 EST 1996
# Configure doesn't know how to parse the nm output.
usenm=undef
--- 12,28 ----
# Mark Pease <peasem@primenet.com>
# Martijn Koster <m.koster@webcrawler.com>
# Richard Yeh <rcyeh@cco.caltech.edu>
! #
! # File::Find's use of link count disabled by Dominic Dunlop 950528
! # Perl's use of sigsetjmp etc. disabled by Dominic Dunlop 950521
#
# Comments, questions, and improvements welcome!
#
# MachTen 4.X does support dynamic loading, but perl doesn't
# know how to use it yet.
#
! # Updated by Dominic Dunlop <domo@tcp.ip.lu>
! # Tue May 28 11:20:08 WET DST 1996
# Configure doesn't know how to parse the nm output.
usenm=undef
***************
*** 29,31 ****
--- 31,62 ----
# I don't know if this is true for all MachTen systems, or how to
# determine this automatically.
alignbytes=8
+
+ # There appears to be a problem with perl's use of sigsetjmp and
+ # friends. Use setjmp and friends instead.
+ d_sigsetjmp='undef'
+
+ # MachTen always reports ony two links to directories, even if they
+ # contain subdirectories. Consequently, we use this variable to stop
+ # File::Find using the link count to determine whether there are
+ # subdirectories to be searched. This will generate a harmless message:
+ # Hmm...You had some extra variables I don't know about...I'll try to keep 'em.
+ # Propagating recommended variable dont_use_nlink
+ dont_use_nlink=define
+
+ cat <<'EOM' >&4
+
+ Tests
+ io/fs test 4 and
+ op/stat test 3
+ may fail since MachTen does not return a useful nlinks field to stat
+ on directories.
+
+ At the end of Configure, you will see a harmless message
+
+ Hmm...You had some extra variables I don't know about...I'll try to keep 'em.
+ Propagating recommended variable dont_use_nlink
+
+ Read the File::Find documentation for more information.
+
+ EOM
#: hints/solaris_2.sh:
#: Remove outdated fixincludes test
#: Update message about workarounds for GNU as/ld
diff -crN perl5.002_01/hints/solaris_2.sh perl5.003/hints/solaris_2.sh
*** perl5.002_01/hints/solaris_2.sh Mon Feb 12 14:53:38 1996
--- perl5.003/hints/solaris_2.sh Mon Jun 24 16:07:54 1996
***************
*** 3,9 ****
# Andy Dougherty <doughera@lafcol.lafayette.edu>
# Based on input from lots of folks, especially
# Dean Roehrich <roehrich@ironwood-fddi.cray.com>
!
# See man vfork.
usevfork=false
--- 3,9 ----
# Andy Dougherty <doughera@lafcol.lafayette.edu>
# Based on input from lots of folks, especially
# Dean Roehrich <roehrich@ironwood-fddi.cray.com>
!
# See man vfork.
usevfork=false
***************
*** 142,160 ****
awk '{print $NF}' | sed 's/specs$/include/'`
# Determine if the fixed-includes look like they'll work.
! sed 1q $tmp/stdarg.h 2>&1 | grep 'stdarg.h for GNU' 2>&1 >/dev/null
! case $? in
! 0) ;;
! *)
! cat <<END
!
! NOTE: The fixincludes or just-fixinc script for gcc was not run
! properly. Your gcc may not be able to compile Perl. Inform your system
! administrator that ${cc:-cc} is not properly installed.
!
! END
! ;;
! esac
# See if as(1) is GNU as(1). GNU as(1) won't work for this job.
case $verbose in
--- 142,148 ----
awk '{print $NF}' | sed 's/specs$/include/'`
# Determine if the fixed-includes look like they'll work.
! # Doesn't work anymore for gcc-2.7.2.
# See if as(1) is GNU as(1). GNU as(1) won't work for this job.
case $verbose in
***************
*** 164,170 ****
NOTE: You are using GNU as(1). GNU as(1) will not build Perl.
You must arrange to use /usr/ccs/bin/as, perhaps by setting
! GCC_EXEC_PREFIX.
END
;;
--- 152,158 ----
NOTE: You are using GNU as(1). GNU as(1) will not build Perl.
You must arrange to use /usr/ccs/bin/as, perhaps by setting
! GCC_EXEC_PREFIX or by including -B/usr/ccs/bin in your cc command.
END
;;
***************
*** 178,184 ****
NOTE: You are using GNU ld(1). GNU ld(1) will not build Perl.
You must arrange to use /usr/ccs/bin/ld, perhaps by setting
! GCC_EXEC_PREFIX.
END
;;
--- 166,172 ----
NOTE: You are using GNU ld(1). GNU ld(1) will not build Perl.
You must arrange to use /usr/ccs/bin/ld, perhaps by setting
! GCC_EXEC_PREFIX or by including -B/usr/ccs/bin in your cc command.
END
;;
#: installperl
#: Insure that installed C header files are world-readable
diff -crN perl5.002_01/installperl perl5.003/installperl
*** perl5.002_01/installperl Mon Mar 25 01:04:10 1996
--- perl5.003/installperl Mon Jun 24 16:08:25 1996
***************
*** 177,182 ****
--- 177,183 ----
mkpath("$installarchlib/CORE", 1, 0777);
foreach $file (<*.h libperl*.*>) {
cp_if_diff($file,"$installarchlib/CORE/$file");
+ &chmod(0444,"$installarchlib/CORE/$file");
}
# AIX needs perl.exp installed as well.
cp_if_diff("perl.exp" ,"$installarchlib/CORE/perl.exp") if ($^O eq 'aix');
#: lib/ExtUtils/Install.pm
#: Update to MakeMaker 5.34
diff -crN perl5.002_01/lib/ExtUtils/Install.pm perl5.003/lib/ExtUtils/Install.pm
*** perl5.002_01/lib/ExtUtils/Install.pm Mon Mar 25 01:04:13 1996
--- perl5.003/lib/ExtUtils/Install.pm Sun Jun 23 20:52:28 1996
***************
*** 1,27 ****
package ExtUtils::Install;
use Exporter;
- use SelfLoader;
use Carp ();
!
@ISA = ('Exporter');
@EXPORT = ('install','uninstall','pm_to_blib');
$Is_VMS = $^O eq 'VMS';
#use vars qw( @EXPORT @ISA $Is_VMS );
#use strict;
! 1;
!
! sub ExtUtils::Install::install;
! sub ExtUtils::Install::uninstall;
! sub ExtUtils::Install::pm_to_blib;
! sub ExtUtils::Install::my_cmp;
!
! __DATA__
sub install {
! my($hash,$verbose,$nonono) = @_;
$verbose ||= 0;
$nonono ||= 0;
--- 1,30 ----
package ExtUtils::Install;
+ $VERSION = substr q$Revision: 1.12 $, 10;
+ # $Id: Install.pm,v 1.12 1996/06/23 20:46:07 k Exp $
+
use Exporter;
use Carp ();
! use Config ();
! use vars qw(@ISA @EXPORT $VERSION);
@ISA = ('Exporter');
@EXPORT = ('install','uninstall','pm_to_blib');
$Is_VMS = $^O eq 'VMS';
+ my $splitchar = $^O eq 'VMS' ? '|' : $^O eq 'os2' ? ';' : ':';
+ my @PERL_ENV_LIB = split $splitchar, defined $ENV{'PERL5LIB'} ? $ENV{'PERL5LIB'} : $ENV{'PERLLIB'};
+ my $Inc_uninstall_warn_handler;
+
#use vars qw( @EXPORT @ISA $Is_VMS );
#use strict;
! sub forceunlink {
! chmod 0666, $_[0];
! unlink $_[0] or Carp::croak("Cannot forceunlink $_[0]: $!")
! }
sub install {
! my($hash,$verbose,$nonono,$inc_uninstall) = @_;
$verbose ||= 0;
$nonono ||= 0;
***************
*** 31,37 ****
use File::Copy qw(copy);
use File::Find qw(find);
use File::Path qw(mkpath);
! # require "auto/ExtUtils/Install/my_cmp.al"; # Hairy, but for the first
# time use we are in a different directory when autoload happens, so
# the relativ path to ./blib is ill.
--- 34,44 ----
use File::Copy qw(copy);
use File::Find qw(find);
use File::Path qw(mkpath);
! # The following lines were needed with AutoLoader (left for the record)
! # my $my_req = $self->catfile(qw(auto ExtUtils Install my_cmp.al));
! # require $my_req;
! # $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al));
! # require $my_req; # Hairy, but for the first
# time use we are in a different directory when autoload happens, so
# the relativ path to ./blib is ill.
***************
*** 47,53 ****
#Check if there are files, and if yes, look if the corresponding
#target directory is writable for us
opendir DIR, $source_dir_or_file or next;
! while ($_ = readdir DIR) {
next if $_ eq "." || $_ eq ".." || $_ eq ".exists";
if (-w $hash{$source_dir_or_file} || mkpath($hash{$source_dir_or_file})) {
last;
--- 54,60 ----
#Check if there are files, and if yes, look if the corresponding
#target directory is writable for us
opendir DIR, $source_dir_or_file or next;
! for (readdir DIR) {
next if $_ eq "." || $_ eq ".." || $_ eq ".exists";
if (-w $hash{$source_dir_or_file} || mkpath($hash{$source_dir_or_file})) {
last;
***************
*** 89,96 ****
return if $_ eq ".exists";
my $targetdir = $MY->catdir($hash{$source},$File::Find::dir);
my $targetfile = $MY->catfile($targetdir,$_);
- my $diff = 0;
if ( -f $targetfile && -s _ == $size) {
# We have a good chance, we can skip this one
$diff = my_cmp($_,$targetfile);
--- 96,103 ----
return if $_ eq ".exists";
my $targetdir = $MY->catdir($hash{$source},$File::Find::dir);
my $targetfile = $MY->catfile($targetdir,$_);
+ my $diff = 0;
if ( -f $targetfile && -s _ == $size) {
# We have a good chance, we can skip this one
$diff = my_cmp($_,$targetfile);
***************
*** 101,121 ****
if ($diff){
if (-f $targetfile){
! unlink $targetfile or Carp::croak("Couldn't unlink $targetfile");
} else {
mkpath($targetdir,0,0755) unless $nonono;
print "mkpath($targetdir,0,0755)\n" if $verbose>1;
}
copy($_,$targetfile) unless $nonono;
! print "Installing $targetfile\n" if $verbose;
utime($atime,$mtime + $Is_VMS,$targetfile) unless $nonono>1;
print "utime($atime,$mtime,$targetfile)\n" if $verbose>1;
chmod $mode, $targetfile;
print "chmod($mode, $targetfile)\n" if $verbose>1;
} else {
! print "Skipping $targetfile (unchanged)\n";
}
-
$write{$targetfile}++;
}, ".");
--- 108,135 ----
if ($diff){
if (-f $targetfile){
! forceunlink($targetfile) unless $nonono;
} else {
mkpath($targetdir,0,0755) unless $nonono;
print "mkpath($targetdir,0,0755)\n" if $verbose>1;
}
copy($_,$targetfile) unless $nonono;
! print "Installing $targetfile\n";
utime($atime,$mtime + $Is_VMS,$targetfile) unless $nonono>1;
print "utime($atime,$mtime,$targetfile)\n" if $verbose>1;
+ $mode = 0444 | ( $mode & 0111 ? 0111 : 0 );
chmod $mode, $targetfile;
print "chmod($mode, $targetfile)\n" if $verbose>1;
} else {
! print "Skipping $targetfile (unchanged)\n" if $verbose;
! }
!
! if (! defined $inc_uninstall) { # it's called
! } elsif ($inc_uninstall == 0){
! inc_uninstall($_,$File::Find::dir,$verbose,1); # nonono set to 1
! } else {
! inc_uninstall($_,$File::Find::dir,$verbose,0); # nonono set to 0
}
$write{$targetfile}++;
}, ".");
***************
*** 163,177 ****
sub uninstall {
my($fil,$verbose,$nonono) = @_;
die "no packlist file found: $fil" unless -f $fil;
local *P;
open P, $fil or Carp::croak("uninstall: Could not read packlist file $fil: $!");
while (<P>) {
chomp;
print "unlink $_\n" if $verbose;
! unlink($_) || Carp::carp("Couldn't unlink $_") unless $nonono;
}
print "unlink $fil\n" if $verbose;
! unlink($fil) || Carp::carp("Couldn't unlink $fil") unless $nonono;
}
sub pm_to_blib {
--- 177,232 ----
sub uninstall {
my($fil,$verbose,$nonono) = @_;
die "no packlist file found: $fil" unless -f $fil;
+ # my $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al));
+ # require $my_req; # Hairy, but for the first
local *P;
open P, $fil or Carp::croak("uninstall: Could not read packlist file $fil: $!");
while (<P>) {
chomp;
print "unlink $_\n" if $verbose;
! forceunlink($_) unless $nonono;
}
print "unlink $fil\n" if $verbose;
! forceunlink($fil) unless $nonono;
! }
!
! sub inc_uninstall {
! my($file,$libdir,$verbose,$nonono) = @_;
! my($dir);
! my $MY = {};
! bless $MY, 'MY';
! my %seen_dir = ();
! foreach $dir (@INC, @PERL_ENV_LIB, @Config::Config{qw/archlibexp privlibexp sitearchexp sitelibexp/}) {
! next if $dir eq ".";
! next if $seen_dir{$dir}++;
! my($targetfile) = $MY->catfile($dir,$libdir,$file);
! next unless -f $targetfile;
!
! # The reason why we compare file's contents is, that we cannot
! # know, which is the file we just installed (AFS). So we leave
! # an identical file in place
! my $diff = 0;
! if ( -f $targetfile && -s _ == -s $file) {
! # We have a good chance, we can skip this one
! $diff = my_cmp($file,$targetfile);
! } else {
! print "#$file and $targetfile differ\n" if $verbose>1;
! $diff++;
! }
!
! next unless $diff;
! if ($nonono) {
! if ($verbose) {
! $Inc_uninstall_warn_handler ||= new ExtUtils::Install::Warn;
! $libdir =~ s|^\./|| ; # That's just cosmetics, no need to port. It looks prettier.
! $Inc_uninstall_warn_handler->add("$libdir/$file",$targetfile);
! }
! # if not verbose, we just say nothing
! } else {
! print "Unlinking $targetfile (shadowing?)\n";
! forceunlink($targetfile);
! }
! }
}
sub pm_to_blib {
***************
*** 181,186 ****
--- 236,243 ----
use File::Copy qw(copy);
use File::Path qw(mkpath);
use AutoSplit;
+ # my $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al));
+ # require $my_req; # Hairy, but for the first
my $umask = umask 0022 unless $Is_VMS;
mkpath($autodir,0,0755);
***************
*** 191,207 ****
next;
}
if (-f $fromto->{$_}){
! unlink $fromto->{$_} or Carp::carp("Couldn't unlink $fromto->{$_}");
} else {
mkpath(dirname($fromto->{$_}),0,0755);
}
copy($_,$fromto->{$_});
! chmod((stat)[2],$fromto->{$_});
print "cp $_ $fromto->{$_}\n";
next unless /\.pm$/;
autosplit($fromto->{$_},$autodir);
}
umask $umask unless $Is_VMS;
}
1;
--- 248,288 ----
next;
}
if (-f $fromto->{$_}){
! forceunlink($fromto->{$_});
} else {
mkpath(dirname($fromto->{$_}),0,0755);
}
copy($_,$fromto->{$_});
! chmod(0444 | ( (stat)[2] & 0111 ? 0111 : 0 ),$fromto->{$_});
print "cp $_ $fromto->{$_}\n";
next unless /\.pm$/;
autosplit($fromto->{$_},$autodir);
}
umask $umask unless $Is_VMS;
+ }
+
+ package ExtUtils::Install::Warn;
+
+ sub new { bless {}, shift }
+
+ sub add {
+ my($self,$file,$targetfile) = @_;
+ push @{$self->{$file}}, $targetfile;
+ }
+
+ sub DESTROY {
+ my $self = shift;
+ my($file,$i,$plural);
+ foreach $file (sort keys %$self) {
+ $plural = @{$self->{$file}} > 1 ? "s" : "";
+ print "## Differing version$plural of $file found. You might like to\n";
+ for (0..$#{$self->{$file}}) {
+ print "rm ", $self->{$file}[$_], "\n";
+ $i++;
+ }
+ }
+ $plural = $i>1 ? "all those files" : "this file";
+ print "## Running 'make install UNINST=1' will unlink $plural for you.\n";
}
1;
#: lib/ExtUtils/Liblist.pm
#: Update to MakeMaker 5.34
diff -crN perl5.002_01/lib/ExtUtils/Liblist.pm perl5.003/lib/ExtUtils/Liblist.pm
*** perl5.002_01/lib/ExtUtils/Liblist.pm Mon Mar 25 01:04:15 1996
--- perl5.003/lib/ExtUtils/Liblist.pm Sun Jun 23 20:52:37 1996
***************
*** 2,7 ****
--- 2,9 ----
# Broken out of MakeMaker from version 4.11
+ $ExtUtils::Liblist::VERSION = substr q$Revision: 1.19 $, 10;
+
use Config;
use Cwd 'cwd';
use File::Basename;
***************
*** 10,16 ****
sub ext {
my($self,$potential_libs, $Verbose) = @_;
! if ($^O eq 'os2' and $Config{libs}) {
# Dynamic libraries are not transitive, so we may need including
# the libraries linked against perl.dll again.
--- 12,18 ----
sub ext {
my($self,$potential_libs, $Verbose) = @_;
! if ($^O =~ 'os2' and $Config{libs}) {
# Dynamic libraries are not transitive, so we may need including
# the libraries linked against perl.dll again.
***************
*** 45,53 ****
if $Verbose;
next;
}
! if ($thislib !~ m|^/|) {
print STDOUT "Warning: $ptype$thislib changed to $ptype$pwd/$thislib\n";
! $thislib = "$pwd/$thislib";
}
push(@searchpath, $thislib);
push(@extralibs, "$ptype$thislib");
--- 47,55 ----
if $Verbose;
next;
}
! unless ($self->file_name_is_absolute($thislib)) {
print STDOUT "Warning: $ptype$thislib changed to $ptype$pwd/$thislib\n";
! $thislib = $self->catdir($pwd,$thislib);
}
push(@searchpath, $thislib);
push(@extralibs, "$ptype$thislib");
#: lib/ExtUtils/MM_Unix.pm
#: Update to MakeMaker 5.34
diff -crN perl5.002_01/lib/ExtUtils/MM_Unix.pm perl5.003/lib/ExtUtils/MM_Unix.pm
*** perl5.002_01/lib/ExtUtils/MM_Unix.pm Mon Mar 25 01:04:28 1996
--- perl5.003/lib/ExtUtils/MM_Unix.pm Mon Jun 24 16:14:28 1996
***************
*** 1,32 ****
package ExtUtils::MM_Unix;
! # $Id: MM_Unix.pm,v 1.14 1996/02/29 07:59:10 k Exp $
!
! # Loading Time cumulated
! require Exporter; # 0.28 0.28
! use Config; # 0.37 0.38
! use File::Basename qw(basename dirname fileparse); # 0.47 0.48
! use DirHandle; # 0.37 0.58
! # use FileHandle (); # 1.28 !!!! 1.46
!
! # And another benchmark. I have deleted MakeMaker completely from the perl installation
! # and deleted blib and pm_to_blib, the timestamp file.
!
! # MM_Unix with Selfloader:
! # perl Makefile.PL 4.34s user 0.57s system 84% cpu 5.844 total
! # make 14.77s user 3.16s system 78% cpu 22.698 total
!
! # MM_Unix with my own autoloader
! # perl Makefile.PL 3.82s user 0.55s system 73% cpu 5.920 total
! # make 14.70s user 3.27s system 82% cpu 21.714 total
!
Exporter::import('ExtUtils::MakeMaker',
qw( $Verbose &neatvalue));
! $Is_OS2 = $^O eq 'os2';
! $Is_VMS = $^O eq 'VMS';
=head1 NAME
--- 1,23 ----
package ExtUtils::MM_Unix;
! $VERSION = substr q$Revision: 1.101 $, 10;
! # $Id: MM_Unix.pm,v 1.101 1996/06/23 20:51:18 k Exp k $
+ require Exporter;
+ use Config;
+ use File::Basename qw(basename dirname fileparse);
+ use DirHandle;
Exporter::import('ExtUtils::MakeMaker',
qw( $Verbose &neatvalue));
! $Is_OS2 = $^O =~ m|^os/?2$|i;
! $Is_Mac = $^O eq "MacOS";
!
! if ($Is_VMS = $^O eq 'VMS') {
! require VMS::Filespec;
! import VMS::Filespec qw( &vmsify );
! }
=head1 NAME
***************
*** 64,70 ****
development. Please refer to the code for not suitably documented
sections and complain loudly to the makemaker mailing list.
! Not all of the methos below are overridable in a
Makefile.PL. Overridable methods are marked as (o). All methods are
overridable by a platform specific MM_*.pm file (See
L<ExtUtils::MM_VMS>) and L<ExtUtils::MM_OS2>).
--- 55,61 ----
development. Please refer to the code for not suitably documented
sections and complain loudly to the makemaker mailing list.
! Not all of the methods below are overridable in a
Makefile.PL. Overridable methods are marked as (o). All methods are
overridable by a platform specific MM_*.pm file (See
L<ExtUtils::MM_VMS>) and L<ExtUtils::MM_OS2>).
***************
*** 73,1936 ****
=over 2
=item catdir
Concatenate two or more directory names to form a complete path ending
! with a directory
=cut
# ';
! sub catdir {
shift;
! my $result = join('/',@_);
! $result =~ s:/(\./)+:/:g;
! $result =~ s:/+:/:g;
! $result =~ s:/$::;
$result;
}
=item catfile
! Concatenate two or more directory names and a filename to form a
complete path ending with a filename
=cut
sub catfile {
! shift;
! my $result = join('/',@_);
! $result =~ s:/(\./)+:/:g;
! $result =~ s:/+:/:g;
! $result;
}
! sub ExtUtils::MM_Unix::guess_name ;
! sub ExtUtils::MM_Unix::init_main ;
! sub ExtUtils::MM_Unix::init_dirscan ;
! sub ExtUtils::MM_Unix::init_others ;
! sub ExtUtils::MM_Unix::find_perl ;
! sub ExtUtils::MM_Unix::post_initialize ;
sub ExtUtils::MM_Unix::const_config ;
- sub ExtUtils::MM_Unix::constants ;
sub ExtUtils::MM_Unix::const_loadlibs ;
! sub ExtUtils::MM_Unix::const_cccmd ;
! sub ExtUtils::MM_Unix::tool_autosplit ;
! sub ExtUtils::MM_Unix::tool_xsubpp ;
! sub ExtUtils::MM_Unix::xsubpp_version ;
! sub ExtUtils::MM_Unix::tools_other ;
! sub ExtUtils::MM_Unix::dist ;
! sub ExtUtils::MM_Unix::macro ;
sub ExtUtils::MM_Unix::depend ;
! sub ExtUtils::MM_Unix::post_constants ;
! sub ExtUtils::MM_Unix::pasthru ;
! sub ExtUtils::MM_Unix::c_o ;
! sub ExtUtils::MM_Unix::xs_c ;
! sub ExtUtils::MM_Unix::xs_o ;
! sub ExtUtils::MM_Unix::top_targets ;
! sub ExtUtils::MM_Unix::linkext ;
sub ExtUtils::MM_Unix::dlsyms ;
sub ExtUtils::MM_Unix::dynamic ;
sub ExtUtils::MM_Unix::dynamic_bs ;
sub ExtUtils::MM_Unix::dynamic_lib ;
! sub ExtUtils::MM_Unix::static ;
! sub ExtUtils::MM_Unix::static_lib ;
! #sub ExtUtils::MM_Unix::installpm ;
! #sub ExtUtils::MM_Unix::installpm_x ;
! sub ExtUtils::MM_Unix::pm_to_blib ;
sub ExtUtils::MM_Unix::manifypods ;
sub ExtUtils::MM_Unix::processPL ;
- sub ExtUtils::MM_Unix::installbin ;
- sub ExtUtils::MM_Unix::subdirs ;
- sub ExtUtils::MM_Unix::subdir_x ;
- sub ExtUtils::MM_Unix::clean ;
sub ExtUtils::MM_Unix::realclean ;
! sub ExtUtils::MM_Unix::dist_basics ;
! sub ExtUtils::MM_Unix::dist_core ;
! sub ExtUtils::MM_Unix::dist_dir ;
! sub ExtUtils::MM_Unix::dist_test ;
! sub ExtUtils::MM_Unix::dist_ci ;
! sub ExtUtils::MM_Unix::install ;
! sub ExtUtils::MM_Unix::force ;
! sub ExtUtils::MM_Unix::perldepend ;
! sub ExtUtils::MM_Unix::makefile ;
sub ExtUtils::MM_Unix::staticmake ;
sub ExtUtils::MM_Unix::test ;
sub ExtUtils::MM_Unix::test_via_harness ;
sub ExtUtils::MM_Unix::test_via_script ;
! sub ExtUtils::MM_Unix::postamble ;
! sub ExtUtils::MM_Unix::makeaperl ;
! sub ExtUtils::MM_Unix::extliblist ;
! sub ExtUtils::MM_Unix::dir_target ;
! sub ExtUtils::MM_Unix::needs_linking ;
! sub ExtUtils::MM_Unix::has_link_code ;
sub ExtUtils::MM_Unix::writedoc ;
! sub ExtUtils::MM_Unix::perl_script ;
! sub ExtUtils::MM_Unix::maybe_command ;
! sub ExtUtils::MM_Unix::maybe_command_in_dirs ;
! sub ExtUtils::MM_Unix::prefixify ;
! sub ExtUtils::MM_Unix::file_name_is_absolute ;
! sub ExtUtils::MM_Unix::replace_manpage_separator ;
! sub ExtUtils::MM_Unix::path ;
! sub ExtUtils::MM_Unix::lsdir ;
! sub ExtUtils::MM_Unix::exescan ;
! sub ExtUtils::MM_Unix::libscan ;
! sub ExtUtils::MM_Unix::nicetext ;
package ExtUtils::MM_Unix;
! use SelfLoader;
! #sub AUTOLOAD {
! # my $code;
! # if (defined fileno(DATA)) {
! # while (<DATA>) {
! # last if /^__END__/;
! # $code .= $_;
! # }
! # 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;
! #}
!
!
1;
! __DATA__
=head2 SelfLoaded methods
! =item nicetext
!
! misnamed method (will have to be changed). The MM_Unix method just
! returns the argument without further processing.
! On VMS used to insure that colons marking targets are preceded by
! space - most Unix Makes don't need this, but it's necessary under VMS
! to distinguish the target delimiter from a colon appearing as part of
! a filespec.
=cut
! sub nicetext {
! my($self,$text) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! $text;
! }
! =item libscan (o)
! Takes a path to a file that is found by init_dirscan and returns false
! if we don't want to include this file in the library. Mainly used to
! exclude RCS, CVS, and SCCS directories from installation.
! =cut
! # ';
! sub libscan {
! my($self,$path) = @_;
! return '' if $path =~ m:/(RCS|CVS|SCCS)/: ;
! $path;
}
! =item exescan
! Deprecated method. Use libscan instead.
=cut
! sub exescan {
! my($self,$path) = @_;
! $path;
! }
!
! =item lsdir
!
! Takes as arguments a directory name and a regular expression. Returns
! all entries in the directory that match the regular expression.
! =cut
! sub lsdir {
! my($self) = shift;
! my($dir, $regex) = @_;
! my(@ls);
! my $dh = new DirHandle;
! $dh->open($dir || ".") or return ();
! @ls = $dh->read;
! $dh->close;
! @ls = grep(/$regex/, @ls) if $regex;
! @ls;
! }
! =item path
! Takes no argument, returns the environment variable PATH as an array.
! =cut
! sub path {
! my($self) = @_;
! my $path_sep = $Is_OS2 ? ";" : ":";
! my $path = $ENV{PATH};
! $path =~ s:\\:/:g if $Is_OS2;
! my @path = split $path_sep, $path;
! }
! =item replace_manpage_separator
- Takes the name of a package, which may be a nested package, in the
- form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
! =cut
!
! sub replace_manpage_separator {
! my($self,$man) = @_;
! $man =~ s,/+,::,g;
! $man;
! }
! =item file_name_is_absolute
! Takes as argument a path and returns true, it it is an absolute path.
! =cut
- sub file_name_is_absolute {
- my($self,$file) = @_;
- $file =~ m:^/: ;
}
! =item prefixify
!
! Check a path variable in $self from %Config, if it contains a prefix,
! and replace it with another one.
! Takes as arguments an attribute name, a search prefix and a
! replacement prefix. Changes the attribute in the object.
=cut
! sub prefixify {
! my($self,$var,$sprefix,$rprefix) = @_;
! $self->{uc $var} ||= $Config{lc $var};
! $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
! $self->{uc $var} =~ s/\Q$sprefix\E/$rprefix/;
! }
!
! =item maybe_command_in_dirs
!
! method under development. Not yet used. Ask Ilya :-)
! =cut
! sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
! # Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
! my($self, $names, $dirs, $trace, $ver) = @_;
! my($name, $dir);
! foreach $dir (@$dirs){
! next unless defined $dir; # $self->{PERL_SRC} may be undefined
! foreach $name (@$names){
! my($abs,$tryabs);
! if ($self->file_name_is_absolute($name)) {
! $abs = $name;
! } elsif ($name =~ m|/|) {
! $abs = $self->catfile(".", $name); # not absolute
! } else {
! $abs = $self->catfile($dir, $name);
! }
! print "Checking $abs for $name\n" if ($trace >= 2);
! next unless $tryabs = $self->maybe_command($abs);
! print "Substituting $tryabs instead of $abs\n"
! if ($trace >= 2 and $tryabs ne $abs);
! $abs = $tryabs;
! if (defined $ver) {
! print "Executing $abs\n" if ($trace >= 2);
! if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
! print "Using PERL=$abs\n" if $trace;
! return $abs;
! }
! } else { # Do not look for perl
! return $abs;
! }
! }
}
}
! =item maybe_command
! Returns true, if the argument is likely to be a command.
=cut
! sub maybe_command {
! my($self,$file) = @_;
! return $file if -x $file && ! -d $file;
! return;
}
! =item perl_script
! Returns true, if the argument is likely to be a perl script. On
! MM_Unix this is true for any ordinary, readable file.
=cut
! sub perl_script {
! my($self,$file) = @_;
! return 1 if -r $file && ! -d $file;
! return;
}
! =item guess_name
! Guess the name of this package by examining the working directory's
! name. MakeMaker calls this only if the developer has not supplied a
! NAME attribute.
=cut
! # ';
!
! sub guess_name {
! my($self) = @_;
! use Cwd 'cwd';
! my $name = cwd();
! $name =~ s:.*/:: unless ($name =~ s:^.*/ext/::);
! $name =~ s#/#::#g;
! $name =~ s#[\-_][\d.\-]+$##; # this is new with MM 5.00
! $name;
}
! =item init_main
! Initializes NAME, FULLEXT, BASEEXT, ROOTEXT, DLBASE, PERL_SRC,
! PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
! PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, MAP_TARGET,
! LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
=cut
! sub init_main {
my($self) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
!
! # --- Initialize Module Name and Paths
!
! # NAME = The perl module name for this extension (eg DBD::Oracle).
! # 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 /.
! ($self->{FULLEXT} =
! $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
! # Copied from DynaLoader:
! my(@modparts) = split(/::/,$self->{NAME});
! my($modfname) = $modparts[-1];
! # Some systems have restrictions on files names for DLL's etc.
! # mod2fname returns appropriate file base name (typically truncated)
! # It may also edit @modparts if required.
! if (defined &DynaLoader::mod2fname) {
! $modfname = &DynaLoader::mod2fname(\@modparts);
! } elsif ($Is_OS2) { # Need manual correction if run with miniperl:-(
! $modfname = substr($modfname, 0, 7) . '_';
}
! ($self->{BASEEXT} =
! $self->{NAME}) =~ s!.*::!! ; #eg. Socket
!
! if (defined &DynaLoader::mod2fname or $Is_OS2) {
! # As of 5.001m, dl_os2 appends '_'
! $self->{DLBASE} = $modfname; #eg. Socket_
! } else {
! $self->{DLBASE} = '$(BASEEXT)';
! }
!
! ($self->{ROOTEXT} =
! $self->{FULLEXT}) =~ s#/?\Q$self->{BASEEXT}\E$## ; #eg. /BSD/Foo
! $self->{ROOTEXT} = ($Is_VMS ? '' : '/') . $self->{ROOTEXT} if $self->{ROOTEXT};
! # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
! # *Real* information: where did we get these two from? ...
! my $inc_config_dir = dirname($INC{'Config.pm'});
! my $inc_carp_dir = dirname($INC{'Carp.pm'});
!
! unless ($self->{PERL_SRC}){
! my($dir);
! foreach $dir (qw(.. ../.. ../../..)){
! if ( -f "$dir/config.sh"
! && -f "$dir/perl.h"
! && -f "$dir/lib/Exporter.pm") {
! $self->{PERL_SRC}=$dir ;
! last;
! }
! }
}
- if ($self->{PERL_SRC}){
- $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib");
- $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
- $self->{PERL_INC} = $self->{PERL_SRC};
- # catch a situation that has occurred a few times in the past:
- warn <<EOM unless (-s $self->catfile($self->{PERL_SRC},'cflags') or $Is_VMS && -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt'));
- You cannot build extensions below the perl source tree after executing
- a 'make clean' in the perl source tree.
-
- To rebuild extensions distributed with the perl source you should
- simply Configure (to include those extensions) and then build perl as
- normal. After installing perl the source tree can be deleted. It is
- not needed for building extensions by running 'perl Makefile.PL'
- usually without extra arguments.
! It is recommended that you unpack and build additional extensions away
! from the perl source tree.
! EOM
! } else {
! # we should also consider $ENV{PERL5LIB} here
! $self->{PERL_LIB} ||= $Config::Config{privlibexp};
! $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp};
! $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
! my $perl_h;
! die <<EOM unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h")));
! Error: Unable to locate installed Perl libraries or Perl source code.
! It is recommended that you install perl in a standard location before
! building extensions. You can say:
! $^X Makefile.PL PERL_SRC=/path/to/perl/source/directory
! if you have not yet installed perl but still want to build this
! extension now.
! (You get this message, because MakeMaker could not find "$perl_h")
! EOM
! # print STDOUT "Using header files found in $self->{PERL_INC}\n"
! # if $Verbose && $self->needs_linking();
! }
! # We get SITELIBEXP and SITEARCHEXP directly via
! # Get_from_Config. When we are running standard modules, these
! # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
! # set it to "site". I prefer that INSTALLDIRS be set from outside
! # MakeMaker.
! $self->{INSTALLDIRS} ||= "site";
! # INST_LIB typically pre-set if building an extension after
! # perl has been built and installed. Setting INST_LIB allows
! # you to build directly into, say $Config::Config{privlibexp}.
! unless ($self->{INST_LIB}){
! ##### XXXXX We have to change this nonsense
! if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
! $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
! } else {
! $self->{INST_LIB} = $self->catdir(".","blib","lib");
! }
}
! $self->{INST_ARCHLIB} ||= $self->catdir(".","blib","arch");
! $self->{INST_EXE} ||= $self->catdir('.','blib','bin');
! # The user who requests an installation directory explicitly
! # should not have to tell us a architecture installation directory
! # as well We look if a directory exists that is named after the
! # architecture. If not we take it as a sign that it should be the
! # same as the requested installation directory. Otherwise we take
! # the found one.
! # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
! my($libpair);
! for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) {
! my $lib = "install$libpair->{l}";
! my $Lib = uc $lib;
! my $Arch = uc "install$libpair->{a}";
! if( $self->{$Lib} && ! $self->{$Arch} ){
! my($ilib) = $Config{$lib};
! $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS;
! $self->prefixify($Arch,$ilib,$self->{$Lib});
! unless (-d $self->{$Arch}) {
! print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose;
! $self->{$Arch} = $self->{$Lib};
! }
! print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
! }
! }
! # we have to look at the relation between $Config{prefix} and the
! # requested values. We're going to set the $Config{prefix} part of
! # all the installation path variables to literally $(PREFIX), so
! # the user can still say make PREFIX=foo
! my($prefix) = $Config{'prefix'};
! $prefix = VMS::Filespec::unixify($prefix) if $Is_VMS;
! unless ($self->{PREFIX}){
! $self->{PREFIX} = $prefix;
! }
! my($install_variable);
! for $install_variable (qw/INSTALLPRIVLIB INSTALLARCHLIB INSTALLBIN INSTALLMAN1DIR
! INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH/) {
! $self->prefixify($install_variable,$prefix,q[$(PREFIX)]);
! }
! # Now we head at the manpages. Maybe they DO NOT want manpages
! # installed
! $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
! unless defined $self->{INSTALLMAN1DIR};
! unless (defined $self->{INST_MAN1DIR}){
! if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
! $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
! } else {
! $self->{INST_MAN1DIR} = $self->catdir('.','blib','man1');
! }
! }
! $self->{MAN1EXT} ||= $Config::Config{man1ext};
! $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
! unless defined $self->{INSTALLMAN3DIR};
! unless (defined $self->{INST_MAN3DIR}){
! if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
! $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
! } else {
! $self->{INST_MAN3DIR} = $self->catdir('.','blib','man3');
! }
}
! $self->{MAN3EXT} ||= $Config::Config{man3ext};
! # Get some stuff out of %Config if we haven't yet done so
! print STDOUT "CONFIG must be an array ref\n"
! if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
! $self->{CONFIG} = [] unless (ref $self->{CONFIG});
! push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
! push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
! my(%once_only,$m);
! foreach $m (@{$self->{CONFIG}}){
! next if $once_only{$m};
! print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
! unless exists $Config::Config{$m};
! $self->{uc $m} ||= $Config::Config{$m};
! $once_only{$m} = 1;
! }
! # This is too dangerous:
! # if ($^O eq "next") {
! # $self->{AR} = "libtool";
! # $self->{AR_STATIC_ARGS} = "-o";
! # }
! # But I leave it as a placeholder
! $self->{AR_STATIC_ARGS} ||= "cr";
! # These should never be needed
! $self->{LD} ||= 'ld';
! $self->{OBJ_EXT} ||= '.o';
! $self->{LIB_EXT} ||= '.a';
! $self->{MAP_TARGET} ||= "perl";
! $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
! # make a simple check if we find Exporter
! warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
! (Exporter.pm not found)"
! unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
! $self->{NAME} eq "ExtUtils::MakeMaker";
!
! # Determine VERSION and VERSION_FROM
! ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
! if ($self->{VERSION_FROM}){
! # use FileHandle ();
! # my $fh = new FileHandle;
! local *FH;
! # $fh->open($self->{VERSION_FROM}) or die "Could not open '$self->{VERSION_FROM}' (attribute VERSION_FROM): $!";
! open(FH,$self->{VERSION_FROM}) or
! die "Could not open '$self->{VERSION_FROM}' (attribute VERSION_FROM): $!";
! # while (<$fh>) {
! while (<FH>) {
! chop;
! next unless /\$([\w:]*\bVERSION)\b.*=/;
! local $ExtUtils::MakeMaker::module_version_variable = $1;
! my($eval) = "$_;";
! eval $eval;
! die "Could not eval '$eval': $@" if $@;
! if ($self->{VERSION} = $ {$ExtUtils::MakeMaker::module_version_variable}){
! print "$self->{NAME} VERSION is $self->{VERSION} (from $self->{VERSION_FROM})\n" if $Verbose;
! } else {
! # XXX this should probably croak
! print "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n";
! }
! last;
! }
! # close $fh;
! close FH;
! }
!
! # if your FOO.pm says
! # $VERSION = substr(q$Revision: 1.14 $, 10);
! # then MM says something like
! # -DXS_VERSION=\"n.nn \"
! if ($self->{VERSION}) {
! $self->{VERSION} =~ s/^\s+//;
! $self->{VERSION} =~ s/\s+$//;
! }
!
! $self->{VERSION} = "0.10" unless $self->{VERSION};
! ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
! # Graham Barr and Paul Marquess had some ideas how to ensure
! # version compatibility between the *.pm file and the
! # corresponding *.xs file. The bottomline was, that we need an
! # XS_VERSION macro that defaults to VERSION:
! $self->{XS_VERSION} ||= $self->{VERSION};
! # --- Initialize Perl Binary Locations
! # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
! # will be working versions of perl 5. miniperl has priority over perl
! # for PERL to ensure that $(PERL) is usable while building ./ext/*
! my ($component,@defpath);
! foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
! push @defpath, $component if defined $component;
! }
! $self->{PERL} =
! $self->find_perl(5.0, [ $^X, 'miniperl','perl','perl5',"perl$]" ],
! \@defpath, $Verbose ) unless ($self->{PERL});
! # don't check if perl is executable, maybe they have decided to
! # supply switches with perl
! # Define 'FULLPERL' to be a non-miniperl (used in test: target)
! ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
! unless ($self->{FULLPERL});
}
! =item init_dirscan
! Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, MAN*PODS, EXE_FILES.
=cut
! sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
! my($self) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
! local(%pm); #the sub in find() has to see this hash
! $ignore{'test.pl'} = 1;
! $ignore{'makefile.pl'} = 1 if $Is_VMS;
! foreach $name ($self->lsdir(".")){
! next if ($name =~ /^\./ or $ignore{$name});
! next unless $self->libscan($name);
! if (-d $name){
! $dir{$name} = $name if (-f "$name/Makefile.PL");
! } elsif ($name =~ /\.xs$/){
! my($c); ($c = $name) =~ s/\.xs$/.c/;
! $xs{$name} = $c;
! $c{$c} = 1;
! } elsif ($name =~ /\.c(pp|xx|c)?$/i){ # .c .C .cpp .cxx .cc
! $c{$name} = 1
! unless $name =~ m/perlmain\.c/; # See MAP_TARGET
! } elsif ($name =~ /\.h$/i){
! $h{$name} = 1;
! } elsif ($name =~ /\.(p[ml]|pod)$/){
! $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
! } elsif ($name =~ /\.PL$/ && $name ne "Makefile.PL") {
! ($pl_files{$name} = $name) =~ s/\.PL$// ;
! } elsif ($Is_VMS && $name =~ /\.pl$/ && $name ne 'makefile.pl' &&
! $name ne 'test.pl') { # case-insensitive filesystem
! ($pl_files{$name} = $name) =~ s/\.pl$// ;
! }
! }
!
! # Some larger extensions often wish to install a number of *.pm/pl
! # files into the library in various locations.
!
! # The attribute PMLIBDIRS holds an array reference which lists
! # subdirectories which we should search for library files to
! # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We
! # recursively search through the named directories (skipping any
! # which don't exist or contain Makefile.PL files).
!
! # For each *.pm or *.pl file found $self->libscan() is called with
! # the default installation path in $_[1]. The return value of
! # libscan defines the actual installation location. The default
! # libscan function simply returns the path. The file is skipped
! # if libscan returns false.
!
! # The default installation location passed to libscan in $_[1] is:
! #
! # ./*.pm => $(INST_LIBDIR)/*.pm
! # ./xyz/... => $(INST_LIBDIR)/xyz/...
! # ./lib/... => $(INST_LIB)/...
! #
! # In this way the 'lib' directory is seen as the root of the actual
! # perl library whereas the others are relative to INST_LIBDIR
! # (which includes ROOTEXT). This is a subtle distinction but one
! # that's important for nested modules.
!
! $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
! unless $self->{PMLIBDIRS};
!
! #only existing directories that aren't in $dir are allowed
!
! # Avoid $_ wherever possible:
! # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
! my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
! my ($pmlibdir);
! @{$self->{PMLIBDIRS}} = ();
! foreach $pmlibdir (@pmlibdirs) {
! -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
! }
!
! if (@{$self->{PMLIBDIRS}}){
! print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
! if ($Verbose >= 2);
! require File::Find;
! File::Find::find(sub {
! if (-d $_){
! if ($_ eq "CVS" || $_ eq "RCS"){
! $File::Find::prune = 1;
! }
! return;
! }
! my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
! my($striplibpath,$striplibname);
! $prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:);
! ($striplibname,$striplibpath) = fileparse($striplibpath);
! my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
! local($_) = $inst; # for backwards compatibility
! $inst = $self->libscan($inst);
! print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
! return unless $inst;
! $pm{$path} = $inst;
! }, @{$self->{PMLIBDIRS}});
! }
!
! $self->{DIR} = [sort keys %dir] unless $self->{DIR};
! $self->{XS} = \%xs unless $self->{XS};
! $self->{PM} = \%pm unless $self->{PM};
! $self->{C} = [sort keys %c] unless $self->{C};
! my(@o_files) = @{$self->{C}};
! $self->{O_FILES} = [grep s/\.c(pp|xx|c)?$/$self->{OBJ_EXT}/i, @o_files] ;
! $self->{H} = [sort keys %h] unless $self->{H};
! $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
! # Set up names of manual pages to generate from pods
! if ($self->{MAN1PODS}) {
! } elsif ( $self->{INST_MAN1DIR} =~ /^(none|\s*)$/ ) {
! $self->{MAN1PODS} = {};
! } else {
! my %manifypods = ();
! if ( exists $self->{EXE_FILES} ) {
! foreach $name (@{$self->{EXE_FILES}}) {
! # use FileHandle ();
! # my $fh = new FileHandle;
! local *FH;
! my($ispod)=0;
! # one day test, if $/ can be set to '' safely (is the bug fixed that was in 5.001m?)
! # if ($fh->open("<$name")) {
! if (open(FH,"<$name")) {
! my $testpodline;
! # while ($testpodline = <$fh>) {
! while ($testpodline = <FH>) {
! if($testpodline =~ /^=head1\s+\w+/) {
! $ispod=1;
! last;
! }
! }
! # $fh->close;
! close FH;
! } else {
! # If it doesn't exist yet, we assume, it has pods in it
! $ispod = 1;
! }
! if( $ispod ) {
! $manifypods{$name} = $self->catfile('$(INST_MAN1DIR)',basename($name).'.$(MAN1EXT)');
! }
! }
! }
! $self->{MAN1PODS} = \%manifypods;
! }
! if ($self->{MAN3PODS}) {
! } elsif ( $self->{INST_MAN3DIR} =~ /^(none|\s*)$/ ) {
! $self->{MAN3PODS} = {};
! } else {
! my %manifypods = (); # we collect the keys first, i.e. the files
! # we have to convert to pod
! foreach $name (keys %{$self->{PM}}) {
! if ($name =~ /\.pod$/ ) {
! $manifypods{$name} = $self->{PM}{$name};
! } elsif ($name =~ /\.p[ml]$/ ) {
! # use FileHandle ();
! # my $fh = new FileHandle;
! local *FH;
! my($ispod)=0;
! # $fh->open("<$name");
! open(FH,"<$name");
! my $testpodline;
! # while ($testpodline = <$fh>) {
! while ($testpodline = <FH>) {
! if($testpodline =~ /^=head1\s+\w+/) {
! $ispod=1;
! last;
! }
! #Speculation on the future (K.A., not A.K. :)
! #if(/^=don't\S+install/) { $ispod=0; last}
! }
! # $fh->close;
! close FH;
! if( $ispod ) {
! $manifypods{$name} = $self->{PM}{$name};
! }
! }
! }
! # Remove "Configure.pm" and similar, if it's not the only pod listed
! # To force inclusion, just name it "Configure.pod", or override MAN3PODS
! foreach $name (keys %manifypods) {
! if ($name =~ /(config|setup).*\.pm/i) {
! delete $manifypods{$name};
! next;
! }
! my($manpagename) = $name;
! unless ($manpagename =~ s!^(\W*)lib\W!$1!) {
! $manpagename = $self->catfile($self->{ROOTEXT},$manpagename);
! }
! $manpagename =~ s/\.p(od|m|l)$//;
! # Strip leading slashes
! $manpagename =~ s!^/+!!;
! # Turn other slashes into colons
! # $manpagename =~ s,/+,::,g;
! $manpagename = $self->replace_manpage_separator($manpagename);
! $manifypods{$name} = $self->catfile("\$(INST_MAN3DIR)","$manpagename.\$(MAN3EXT)");
! }
! $self->{MAN3PODS} = \%manifypods;
! }
}
! =item init_others
! Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
! OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
! MAKEFILE, NOECHO, RM_F, RM_RF, TOUCH, CP, MV, CHMOD, UMASK_NULL
=cut
! sub init_others { # --- Initialize Other Attributes
my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
! # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
! # undefined. In any case we turn it into an anon array:
! # May check $Config{libs} too, thus not empty.
! $self->{LIBS}=[''] unless $self->{LIBS};
! $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq SCALAR;
! $self->{LD_RUN_PATH} = "";
! my($libs);
! foreach $libs ( @{$self->{LIBS}} ){
! $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
! my(@libs) = $self->extliblist($libs);
! if ($libs[0] or $libs[1] or $libs[2]){
! # LD_RUN_PATH now computed by ExtUtils::Liblist
! ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
! last;
! }
! }
! if ( $self->{OBJECT} ) {
! $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
! }
! else {
! # init_dirscan should have found out, if we have C files
! $self->{OBJECT} = "";
! $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
! }
! $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
! $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
! $self->{PERLMAINCC} ||= '$(CC)';
! $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
! # Sanity check: don't define LINKTYPE = dynamic if we're skipping
! # the 'dynamic' section of MM. We don't have this problem with
! # 'static', since we either must use it (%Config says we can't
! # use dynamic loading) or the caller asked for it explicitly.
! if (!$self->{LINKTYPE}) {
! $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
! ? 'static'
! : ($Config::Config{usedl} ? 'dynamic' : 'static');
! };
! # These get overridden for VMS and maybe some other systems
! $self->{NOOP} ||= "sh -c true";
! $self->{FIRST_MAKEFILE} ||= "Makefile";
! $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
! $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
! $self->{NOECHO} = '@' unless defined $self->{NOECHO};
! $self->{RM_F} ||= "rm -f";
! $self->{RM_RF} ||= "rm -rf";
! $self->{TOUCH} ||= "touch";
! $self->{CP} ||= "cp";
! $self->{MV} ||= "mv";
! $self->{CHMOD} ||= "chmod";
! $self->{UMASK_NULL} ||= "umask 0";
! }
! =item extliblist
! Called by init_others, and calls ext ExtUtils::Liblist. See
! L<ExtUtils::Liblist> for details.
! =cut
! sub extliblist {
! my($self,$libs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! require ExtUtils::Liblist;
! $self->ext($libs, $Verbose);
}
! =item find_perl
! Finds the executables PERL and FULLPERL
=cut
! sub find_perl {
! my($self, $ver, $names, $dirs, $trace) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my($name, $dir);
! if ($trace >= 2){
! print "Looking for perl $ver by these names:
! @$names
! in these dirs:
! @$dirs
! ";
! }
! foreach $dir (@$dirs){
! next unless defined $dir; # $self->{PERL_SRC} may be undefined
! foreach $name (@$names){
! my $abs;
! if ($self->file_name_is_absolute($name)) {
! $abs = $name;
! } elsif (($name =~ m|/|) && ($name !~ m|^\.{1,2}/|)) {
! # name is a path that does not begin with dot or dotdot
! $abs = $self->catfile(".", $name);
! } else {
! $abs = $self->catfile($dir, $name);
! }
! print "Checking $abs\n" if ($trace >= 2);
! next unless $self->maybe_command($abs);
! print "Executing $abs\n" if ($trace >= 2);
! if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
! print "Using PERL=$abs\n" if $trace;
! return $abs;
! }
! }
! }
! print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
! 0; # false and not empty
}
! =head2 Methods to actually produce chunks of text for the Makefile
!
! The methods here are called in the order specified by
! @ExtUtils::MakeMaker::MM_Sections. This manpage reflects the order as
! well as possible. Some methods call each other, so in doubt refer to
! the code.
!
! =item post_initialize (o)
! Returns an ampty string per default. Used in Makefile.PLs to add some
! chunk of text to the Makefile after the object is initialized.
=cut
! sub post_initialize {
my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! "";
}
! =item const_config (o)
! Defines a couple of constants in the Makefile that are inported from
! %Config.
=cut
! sub const_config {
! # --- Constants Sections ---
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my(@m,$m);
! push(@m,"\n# These definitions are from config.sh (via $INC{'Config.pm'})\n");
! push(@m,"\n# They may have been overridden via Makefile.PL or on the command line\n");
! my(%once_only);
! foreach $m (@{$self->{CONFIG}}){
! # SITE*EXP macros are defined in &constants; avoid duplicates here
! next if $once_only{$m} or $m eq 'sitelibexp' or $m eq 'sitearchexp';
! push @m, "\U$m\E = ".$self->{uc $m}."\n";
! $once_only{$m} = 1;
! }
! join('', @m);
! }
! =item constants (o)
! Initializes lots of constants and .SUFFIXES and .PHONY
! =cut
! sub constants {
! my($self) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my(@m,$tmp);
! for $tmp (qw/
! AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
! INST_LIB INST_ARCHLIB INST_EXE PREFIX INSTALLDIRS INSTALLPRIVLIB
! INSTALLARCHLIB INSTALLSITELIB INSTALLSITEARCH INSTALLBIN PERL_LIB
! PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
! FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_INC PERL FULLPERL
! / ) {
! next unless defined $self->{$tmp};
! push @m, "$tmp = $self->{$tmp}\n";
! }
! push @m, qq{
! VERSION_MACRO = VERSION
! DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
! XS_VERSION_MACRO = XS_VERSION
! XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
! };
! push @m, qq{
! MAKEMAKER = \$(PERL_LIB)/ExtUtils/MakeMaker.pm
! MM_VERSION = $ExtUtils::MakeMaker::VERSION
! };
! push @m, q{
! # 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)
! # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
! };
! for $tmp (qw/
! FULLEXT BASEEXT ROOTEXT DLBASE VERSION_FROM INC DEFINE OBJECT
! LDFROM LINKTYPE
! / ) {
! next unless defined $self->{$tmp};
! push @m, "$tmp = $self->{$tmp}\n";
! }
! push @m, "
! # Handy lists of source code files:
! XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
! C_FILES = ".join(" \\\n\t", @{$self->{C}})."
! O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
! H_FILES = ".join(" \\\n\t", @{$self->{H}})."
! MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
! MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
! ";
! for $tmp (qw/
! INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
! /) {
! next unless defined $self->{$tmp};
! push @m, "$tmp = $self->{$tmp}\n";
! }
! push @m, "
! # work around a famous dec-osf make(1) feature(?):
! makemakerdflt: all
! .SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
! # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that
! # some make implementations will delete the Makefile when we rebuild it. Because
! # we call false(1) when we rebuild it. So make(1) is not completely wrong when it
! # does so. Our milage may vary.
! # .PRECIOUS: Makefile # seems to be not necessary anymore
! .PHONY: all config static dynamic test linkext manifest
! # Where is the Config information that we are using/depend on
! CONFIGDEP = \$(PERL_ARCHLIB)/Config.pm \$(PERL_INC)/config.h
! ";
! push @m, '
! # Where to put things:
! INST_LIBDIR = $(INST_LIB)$(ROOTEXT)
! INST_ARCHLIBDIR = $(INST_ARCHLIB)$(ROOTEXT)
! INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT)
! INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT)
! ';
! if ($self->has_link_code()) {
! push @m, '
! INST_STATIC = $(INST_ARCHAUTODIR)/$(BASEEXT)$(LIB_EXT)
! INST_DYNAMIC = $(INST_ARCHAUTODIR)/$(DLBASE).$(DLEXT)
! INST_BOOT = $(INST_ARCHAUTODIR)/$(BASEEXT).bs
! ';
! } else {
! push @m, '
! INST_STATIC =
! INST_DYNAMIC =
! INST_BOOT =
';
! }
! if ($Is_OS2) {
! $tmp = "$self->{BASEEXT}.def";
! } else {
! $tmp = "";
! }
! push @m, "
! EXPORT_LIST = $tmp
! ";
! if ($Is_OS2) {
! $tmp = "\$(PERL_INC)/libperl.lib";
! } else {
! $tmp = "";
! }
! push @m, "
! PERL_ARCHIVE = $tmp
! ";
! # push @m, q{
! #INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
! #
! #PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
! #};
! push @m, q{
! TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
! PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
! };
join('',@m);
}
! =item const_loadlibs
! Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See
! L<ExtUtils::Liblist> for details.
=cut
! sub const_loadlibs {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! return "" unless $self->needs_linking;
! my @m;
! push @m, qq{
! # $self->{NAME} might depend on some other libraries:
! # See ExtUtils::Liblist for details
! #
! };
! my($tmp);
! for $tmp (qw/
! EXTRALIBS LDLOADLIBS BSLOADLIBS LD_RUN_PATH
! /) {
! next unless defined $self->{$tmp};
! push @m, "$tmp = $self->{$tmp}\n";
! }
! return join "", @m;
}
! =item cflags
! Does very much the same as the cflags script in the perl
! distribution. It doesn't return the whole compiler command line, but
! initializes all of its parts. The const_cccmd method then actually
! returns the definition of the CCCMD macro which uses these parts.
=cut
! #'
!
! sub cflags {
! my($self,$libperl)=@_;
! return $self->{CFLAGS} if $self->{CFLAGS};
! return '' unless $self->needs_linking();
! my($prog, $uc, $perltype, %cflags);
! $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
! $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
! @cflags{qw(cc ccflags optimize large split shellflags)}
! = @Config{qw(cc ccflags optimize large split shellflags)};
! my($optdebug) = "";
! $cflags{shellflags} ||= '';
! my(%map) = (
! D => '-DDEBUGGING',
! E => '-DEMBED',
! DE => '-DDEBUGGING -DEMBED',
! M => '-DEMBED -DMULTIPLICITY',
! DM => '-DDEBUGGING -DEMBED -DMULTIPLICITY',
! );
! if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){
! $uc = uc($1);
! } else {
! $uc = ""; # avoid warning
! }
! $perltype = $map{$uc} ? $map{$uc} : "";
! if ($uc =~ /^D/) {
! $optdebug = "-g";
! }
! my($name);
! ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
! if ($prog = $Config::Config{$name}) {
! # Expand hints for this extension via the shell
! print STDOUT "Processing $name hint:\n" if $Verbose;
! my(@o)=`cc=\"$cflags{cc}\"
! ccflags=\"$cflags{ccflags}\"
! optimize=\"$cflags{optimize}\"
! perltype=\"$cflags{perltype}\"
! optdebug=\"$cflags{optdebug}\"
! large=\"$cflags{large}\"
! split=\"$cflags{'split'}\"
! eval '$cflags{prog}'
! echo cc=\$cflags{cc}
! echo ccflags=\$cflags{ccflags}
! echo optimize=\$cflags{optimize}
! echo perltype=\$cflags{perltype}
! echo optdebug=\$cflags{optdebug}
! echo large=\$cflags{large}
! echo split=\$cflags{'split'}
! `;
! my($line);
! foreach $line (@o){
! chomp $line;
! if ($line =~ /(.*?)=\s*(.*)\s*$/){
! $cflags{$1} = $2;
! print STDOUT " $1 = $2\n" if $Verbose;
! } else {
! print STDOUT "Unrecognised result from hint: '$line'\n";
}
}
}
! if ($optdebug) {
! $cflags{optimize} = $optdebug;
! }
! for (qw(ccflags optimize perltype large split)) {
! $cflags{$_} =~ s/^\s+//;
! $cflags{$_} =~ s/\s+/ /g;
! $cflags{$_} =~ s/\s+$//;
! $self->{uc $_} ||= $cflags{$_}
! }
! return $self->{CFLAGS} = qq{
! CCFLAGS = $self->{CCFLAGS}
! OPTIMIZE = $self->{OPTIMIZE}
! PERLTYPE = $self->{PERLTYPE}
! LARGE = $self->{LARGE}
! SPLIT = $self->{SPLIT}
! };
}
! =item const_cccmd
! Returns the full compiler call for C programs and stores the
! definition in CONST_CCCMD.
=cut
! sub const_cccmd {
! my($self,$libperl)=@_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
}
! return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
! return '' unless $self->needs_linking();
! return $self->{CONST_CCCMD} =
! q{CCCMD = $(CC) -c $(INC) $(CCFLAGS) $(OPTIMIZE) \\
! $(PERLTYPE) $(LARGE) $(SPLIT) $(DEFINE_VERSION) \\
! $(XS_DEFINE_VERSION)};
}
! =item pm_to_blib
! Defines target that copies all files in the hash PM to their
! destination and autosplits them. See L<ExtUtils::Install/pm_to_blib>
! =cut
! sub pm_to_blib {
! my $self = shift;
! my($autodir) = $self->catdir('$(INST_LIB)','auto');
! return q{
! pm_to_blib: $(TO_INST_PM)
! }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
! "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
! -e 'pm_to_blib({@ARGV},"}.$autodir.q{")' $(PM_TO_BLIB)
! }.$self->{NOECHO}.q{$(TOUCH) $@
! };
! }
! =item tool_autosplit (o)
! Defines a simple perl call that runs autosplit. May be deprecated by
! pm_to_blib soon.
! =cut
! sub tool_autosplit {
! # --- Tool Sections ---
! my($self, %attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
}
- my($asl) = "";
- $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
- q{
- # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
- AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
- };
- }
-
- =item tool_xsubpp (o)
! Determines typemaps, xsubpp version, prototype behaviour.
! =cut
! sub tool_xsubpp {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my($xsdir) = $self->catdir($self->{PERL_LIB},"ExtUtils");
! my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
! if( $self->{TYPEMAPS} ){
! my $typemap;
! foreach $typemap (@{$self->{TYPEMAPS}}){
! if( ! -f $typemap ){
! warn "Typemap $typemap not found.\n";
}
! else{
! push(@tmdeps, $typemap);
}
}
}
! push(@tmdeps, "typemap") if -f "typemap";
! my(@tmargs) = map("-typemap $_", @tmdeps);
! if( exists $self->{XSOPT} ){
! unshift( @tmargs, $self->{XSOPT} );
! }
!
!
! my $xsubpp_version = $self->xsubpp_version("$xsdir/xsubpp");
!
! # What are the correct thresholds for version 1 && 2 Paul?
! if ( $xsubpp_version > 1.923 ){
! $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
} else {
! if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
! print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
! Your version of xsubpp is $xsubpp_version and cannot handle this.
! Please upgrade to a more recent version of xsubpp.
! };
! } else {
! $self->{XSPROTOARG} = "";
}
- }
-
- return qq{
- XSUBPPDIR = $xsdir
- XSUBPP = \$(XSUBPPDIR)/xsubpp
- XSPROTOARG = $self->{XSPROTOARG}
- XSUBPPDEPS = @tmdeps
- XSUBPPARGS = @tmargs
- };
- };
-
- sub xsubpp_version
- {
- my($self,$xsubpp) = @_;
- return $Xsubpp_Version if defined $Xsubpp_Version; # global variable
! my ($version) ;
! # try to figure out the version number of the xsubpp on the system
! # first try the -v flag, introduced in 1.921 & 2.000a2
! my $command = "$self->{PERL} -I$self->{PERL_LIB} $xsubpp -v 2>&1";
! print "Running $command\n" if $Verbose >= 2;
! $version = `$command` ;
! warn "Running '$command' exits with status " . ($?>>8) if $?;
! chop $version ;
! return $Xsubpp_Version = $1 if $version =~ /^xsubpp version (.*)/ ;
! # nope, then try something else
! my $counter = '000';
! my ($file) = 'temp' ;
! $counter++ while -e "$file$counter"; # don't overwrite anything
! $file .= $counter;
- open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
- print F <<EOM ;
- MODULE = fred PACKAGE = fred
! int
! fred(a)
! int a;
! EOM
! close F ;
! $command = "$self->{PERL} $xsubpp $file 2>&1";
! print "Running $command\n" if $Verbose >= 2;
! my $text = `$command` ;
! warn "Running '$command' exits with status " . ($?>>8) if $?;
! unlink $file ;
- # gets 1.2 -> 1.92 and 2.000a1
- return $Xsubpp_Version = $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
! # it is either 1.0 or 1.1
! return $Xsubpp_Version = 1.1 if $text =~ /^Warning: ignored semicolon/ ;
! # none of the above, so 1.0
! return $Xsubpp_Version = "1.0" ;
! }
- =item tools_other (o)
! Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
! the Makefile. Also defines the perl programs MKPATH,
! WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
- =cut
! sub tools_other {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my @m;
! push @m, qq{
! SHELL = /bin/sh
! LD = $self->{LD}
! TOUCH = $self->{TOUCH}
! CP = $self->{CP}
! MV = $self->{MV}
! RM_F = $self->{RM_F}
! RM_RF = $self->{RM_RF}
! CHMOD = $self->{CHMOD}
! UMASK_NULL = $self->{UMASK_NULL}
! };
! push @m, q{
! # The following is a portable way to say mkdir -p
! # To see which directories are created, change the if 0 to if 1
! MKPATH = $(PERL) -wle '$$"="/"; foreach $$p (@ARGV){' \\
! -e 'next if -d $$p; my(@p); foreach(split(/\//,$$p)){' \\
! -e 'push(@p,$$_); next if -d "@p/"; print "mkdir @p" if 0;' \\
! -e 'mkdir("@p",0777)||die $$! } } exit 0;'
! # This helps us to minimize the effect of the .exists files A yet
! # better solution would be to have a stable file in the perl
! # distribution with a timestamp of zero. But this solution doesn't
! # need any changes to the core distribution and works with older perls
! EQUALIZE_TIMESTAMP = $(PERL) -we 'open F, ">$$ARGV[1]"; close F;' \\
! -e 'utime ((stat("$$ARGV[0]"))[8,9], $$ARGV[1])'
! };
! return join "", @m if $self->{PARENT};
! push @m, q{
! # Here we warn users that an old packlist file was found somewhere,
! # and that they should call some uninstall routine
! WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
! -e 'print "WARNING: I have found an old package in\n";' \\
! -e 'print "\t$$ARGV[0].\n";' \\
! -e 'print "Please make sure the two installations are not conflicting\n";'
! MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
! -e 'install({@ARGV},1);'
! DOC_INSTALL = $(PERL) -e '$$\="\n\n";print "=head3 ", scalar(localtime), ": C<", shift, ">";' \
! -e 'print "=over 4";' \
! -e 'while ($$key = shift and $$val = shift){print "=item *";print "C<$$key: $$val>";}' \
! -e 'print "=back";'
! UNINSTALL = $(PERL) -MExtUtils::Install \
! -e 'uninstall($$ARGV[0],1);'
! };
! return join "", @m;
! }
! =item dist (o)
! Defines a lot of macros for distribution support.
! =cut
- sub dist {
- my($self, %attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
! my(@m);
! # VERSION should be sanitised before use as a file name
! my($name) = $attribs{NAME} || '$(DISTVNAME)';
! my($tar) = $attribs{TAR} || 'tar'; # eg /usr/bin/gnutar
! my($tarflags) = $attribs{TARFLAGS} || 'cvf';
! my($zip) = $attribs{ZIP} || 'zip'; # eg pkzip Yuck!
! my($zipflags) = $attribs{ZIPFLAGS} || '-r';
! my($compress) = $attribs{COMPRESS} || 'compress'; # eg gzip
! my($suffix) = $attribs{SUFFIX} || '.Z'; # eg .gz
! my($shar) = $attribs{SHAR} || 'shar'; # eg "shar --gzip"
! my($preop) = $attribs{PREOP} || "$self->{NOECHO}\$(NOOP)"; # eg update MANIFEST
! my($postop) = $attribs{POSTOP} || "$self->{NOECHO}\$(NOOP)"; # eg remove the distdir
! my($ci) = $attribs{CI} || 'ci -u';
! my($rcs_label)= $attribs{RCS_LABEL}|| 'rcs -Nv$(VERSION_SYM): -q';
! my($dist_cp) = $attribs{DIST_CP} || 'best';
! my($dist_default) = $attribs{DIST_DEFAULT} || 'tardist';
! push @m, "
! DISTVNAME = \$(DISTNAME)-\$(VERSION_SYM)
! TAR = $tar
! TARFLAGS = $tarflags
! ZIP = $zip
! ZIPFLAGS = $zipflags
! COMPRESS = $compress
! SUFFIX = $suffix
! SHAR = $shar
! PREOP = $preop
! POSTOP = $postop
! CI = $ci
! RCS_LABEL = $rcs_label
! DIST_CP = $dist_cp
! DIST_DEFAULT = $dist_default
! ";
! join "", @m;
! }
! =item macro (o)
! Simple subroutine to insert the macros defined by the macro attribute
! into the Makefile.
! =cut
! sub macro {
! my($self,%attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
}
! my(@m,$key,$val);
! while (($key,$val) = each %attribs){
! last unless defined $key;
! push @m, "$key = $val\n";
}
! join "", @m;
! }
! =item depend (o)
! Same as macro for the depend attribute.
- =cut
! sub depend {
! my($self,%attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
}
! my(@m,$key,$val);
! while (($key,$val) = each %attribs){
! last unless defined $key;
! push @m, "$key : $val\n\t$self->{NOECHO}\$(NOOP)\n\n";
}
! join "", @m;
! }
- =item post_constants (o)
! Returns an empty string per default. Dedicated to overrides from
! within Makefile.PL after all constants have been defined.
! =cut
! sub post_constants{
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! "";
! }
! =item pasthru (o)
! Defines the string that is passed to recursive make calls in
! subdirectories.
! =cut
! sub pasthru {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
}
- my(@m,$key);
! my(@pasthru);
- # We don't have to pass thru the install thingies anymore: make
- # install is run in base directory only:
! # foreach $key (qw(INSTALLPRIVLIB INSTALLARCHLIB INSTALLBIN
! # INSTALLMAN1DIR INSTALLMAN3DIR LIBPERL_A
! # LINKTYPE PREFIX INSTALLSITELIB
! # INSTALLSITEARCH INSTALLDIRS)){
! foreach $key (qw(LIBPERL_A LINKTYPE PREFIX OPTIMIZE)){
! push @pasthru, "$key=\"\$($key)\"";
}
! push @m, "\nPASTHRU = ", join ("\\\n\t", @pasthru), "\n";
! join "", @m;
}
! =item c_o (o)
! Defines the suffix rules to compile different flavors of C files to
! object files.
=cut
! sub c_o {
! # --- Translation Sections ---
!
my($self) = shift;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
- return '' unless $self->needs_linking();
- my(@m);
- push @m, '
- .c$(OBJ_EXT):
- $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
! .C$(OBJ_EXT):
! $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.C
! .cpp$(OBJ_EXT):
! $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cpp
! .cxx$(OBJ_EXT):
! $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cxx
! .cc$(OBJ_EXT):
! $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cc
! ';
! join "", @m;
}
! =item xs_c (o)
! Defines the suffix rules to compile XS files to C.
=cut
! sub xs_c {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! return '' unless $self->needs_linking();
! '
! .xs.c:
! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >$*.tc && mv $*.tc $@
! ';
! }
! =item xs_o (o)
! Defines suffix rules to go from XS to object files directly. This is
! only intended for broken make implementations.
! =cut
! sub xs_o { # many makes are too dumb to use xs_c then c_o
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! return '' unless $self->needs_linking();
! '
! .xs$(OBJ_EXT):
! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && mv xstmp.c $*.c
! $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
! ';
! }
! =item top_targets (o)
! Defines the targets all, subdirs, config, and O_FILES
! =cut
! sub top_targets {
! # --- Target Sections ---
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my(@m);
! push @m, '
! #all :: config $(INST_PM) subdirs linkext manifypods
- all :: pure_all manifypods
- '.$self->{NOECHO}.'$(NOOP)
! pure_all :: config pm_to_blib subdirs linkext
! '.$self->{NOECHO}.'$(NOOP)
! subdirs :: $(MYEXTLIB)
! '.$self->{NOECHO}.'$(NOOP)
! config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)/.exists
! '.$self->{NOECHO}.'$(NOOP)
! config :: $(INST_ARCHAUTODIR)/.exists
! '.$self->{NOECHO}.'$(NOOP)
! config :: $(INST_AUTODIR)/.exists
! '.$self->{NOECHO}.'$(NOOP)
! ';
! push @m, qq{
! config :: Version_check
! $self->{NOECHO}\$(NOOP)
! } unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
! push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
! if (%{$self->{MAN1PODS}}) {
! push @m, qq[
! config :: \$(INST_MAN1DIR)/.exists
! $self->{NOECHO}\$(NOOP)
! ];
! push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
}
! if (%{$self->{MAN3PODS}}) {
! push @m, qq[
! config :: \$(INST_MAN3DIR)/.exists
! $self->{NOECHO}\$(NOOP)
! ];
! push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
}
! push @m, '
! $(O_FILES): $(H_FILES)
! ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
! push @m, q{
! help:
! perldoc ExtUtils::MakeMaker
! };
! push @m, q{
! Version_check:
! }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
! -MExtUtils::MakeMaker=Version_check \
! -e 'Version_check("$(MM_VERSION)")'
! };
! join('',@m);
}
=item linkext (o)
--- 64,1855 ----
=over 2
+ =item canonpath
+
+ No physical check on the filesystem, but a logical cleanup of a
+ path. On UNIX eliminated successive slashes and successive "/.".
+
+ =cut
+
+ sub canonpath {
+ my($self,$path) = @_;
+ $path =~ s|/+|/|g ; # xx////xx -> xx/xx
+ $path =~ s|(/\.)+/|/|g ; # xx/././xx -> xx/xx
+ $path =~ s|^(\./)+|| unless $path eq "./"; # ./xx -> xx
+ $path =~ s|/$|| unless $path eq "/"; # xx/ -> xx
+ $path;
+ }
+
=item catdir
Concatenate two or more directory names to form a complete path ending
! with a directory. But remove the trailing slash from the resulting
! string, because it doesn't look good, isn't necessary and confuses
! OS2. Of course, if this is the root directory, don't cut off the
! trailing slash :-)
=cut
# ';
! sub catdir {
shift;
! my @args = @_;
! for (@args) {
! # append a slash to each argument unless it has one there
! $_ .= "/" unless substr($_,length($_)-1,1) eq "/";
! }
! my $result = join('', @args);
! # remove a trailing slash unless we are root
! substr($result,length($result)-1,1) = ""
! if length($result) > 1 && substr($result,length($result)-1,1) eq "/";
$result;
}
=item catfile
! Concatenate one or more directory names and a filename to form a
complete path ending with a filename
=cut
sub catfile {
! my $self = shift @_;
! my $file = pop @_;
! return $file unless @_;
! my $dir = $self->catdir(@_);
! for ($dir) {
! $_ .= "/" unless substr($_,length($_)-1,1) eq "/";
! }
! return $dir.$file;
}
! =item curdir
!
! Returns a string representing of the current directory. "." on UNIX.
!
! =cut
!
! sub curdir {
! return "." ;
! }
!
! =item rootdir
!
! Returns a string representing of the root directory. "/" on UNIX.
!
! =cut
!
! sub rootdir {
! return "/";
! }
!
! =item updir
!
! Returns a string representing of the parent directory. ".." on UNIX.
!
! =cut
!
! sub updir {
! return "..";
! }
!
! sub ExtUtils::MM_Unix::c_o ;
! sub ExtUtils::MM_Unix::clean ;
! sub ExtUtils::MM_Unix::const_cccmd ;
sub ExtUtils::MM_Unix::const_config ;
sub ExtUtils::MM_Unix::const_loadlibs ;
! sub ExtUtils::MM_Unix::constants ;
sub ExtUtils::MM_Unix::depend ;
! sub ExtUtils::MM_Unix::dir_target ;
! sub ExtUtils::MM_Unix::dist ;
! sub ExtUtils::MM_Unix::dist_basics ;
! sub ExtUtils::MM_Unix::dist_ci ;
! sub ExtUtils::MM_Unix::dist_core ;
! sub ExtUtils::MM_Unix::dist_dir ;
! sub ExtUtils::MM_Unix::dist_test ;
sub ExtUtils::MM_Unix::dlsyms ;
sub ExtUtils::MM_Unix::dynamic ;
sub ExtUtils::MM_Unix::dynamic_bs ;
sub ExtUtils::MM_Unix::dynamic_lib ;
! sub ExtUtils::MM_Unix::exescan ;
! sub ExtUtils::MM_Unix::extliblist ;
! sub ExtUtils::MM_Unix::file_name_is_absolute ;
! sub ExtUtils::MM_Unix::find_perl ;
! sub ExtUtils::MM_Unix::force ;
! sub ExtUtils::MM_Unix::guess_name ;
! sub ExtUtils::MM_Unix::has_link_code ;
! sub ExtUtils::MM_Unix::init_dirscan ;
! sub ExtUtils::MM_Unix::init_main ;
! sub ExtUtils::MM_Unix::init_others ;
! sub ExtUtils::MM_Unix::install ;
! sub ExtUtils::MM_Unix::installbin ;
! sub ExtUtils::MM_Unix::libscan ;
! sub ExtUtils::MM_Unix::linkext ;
! sub ExtUtils::MM_Unix::lsdir ;
! sub ExtUtils::MM_Unix::macro ;
! sub ExtUtils::MM_Unix::makeaperl ;
! sub ExtUtils::MM_Unix::makefile ;
sub ExtUtils::MM_Unix::manifypods ;
+ sub ExtUtils::MM_Unix::maybe_command ;
+ sub ExtUtils::MM_Unix::maybe_command_in_dirs ;
+ sub ExtUtils::MM_Unix::needs_linking ;
+ sub ExtUtils::MM_Unix::nicetext ;
+ sub ExtUtils::MM_Unix::parse_version ;
+ sub ExtUtils::MM_Unix::pasthru ;
+ sub ExtUtils::MM_Unix::path ;
+ sub ExtUtils::MM_Unix::perl_script ;
+ sub ExtUtils::MM_Unix::perldepend ;
+ sub ExtUtils::MM_Unix::pm_to_blib ;
+ sub ExtUtils::MM_Unix::post_constants ;
+ sub ExtUtils::MM_Unix::post_initialize ;
+ sub ExtUtils::MM_Unix::postamble ;
+ sub ExtUtils::MM_Unix::prefixify ;
sub ExtUtils::MM_Unix::processPL ;
sub ExtUtils::MM_Unix::realclean ;
! sub ExtUtils::MM_Unix::replace_manpage_separator ;
! sub ExtUtils::MM_Unix::static ;
! sub ExtUtils::MM_Unix::static_lib ;
sub ExtUtils::MM_Unix::staticmake ;
+ sub ExtUtils::MM_Unix::subdir_x ;
+ sub ExtUtils::MM_Unix::subdirs ;
sub ExtUtils::MM_Unix::test ;
sub ExtUtils::MM_Unix::test_via_harness ;
sub ExtUtils::MM_Unix::test_via_script ;
! sub ExtUtils::MM_Unix::tool_autosplit ;
! sub ExtUtils::MM_Unix::tool_xsubpp ;
! sub ExtUtils::MM_Unix::tools_other ;
! sub ExtUtils::MM_Unix::top_targets ;
sub ExtUtils::MM_Unix::writedoc ;
! sub ExtUtils::MM_Unix::xs_c ;
! sub ExtUtils::MM_Unix::xs_o ;
! sub ExtUtils::MM_Unix::xsubpp_version ;
package ExtUtils::MM_Unix;
! #use SelfLoader;
1;
! #__DATA__
=head2 SelfLoaded methods
! =item c_o (o)
! Defines the suffix rules to compile different flavors of C files to
! object files.
=cut
! sub c_o {
! # --- Translation Sections ---
! my($self) = shift;
! return '' unless $self->needs_linking();
! my(@m);
! push @m, '
! .c$(OBJ_EXT):
! $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
! .C$(OBJ_EXT):
! $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.C
! .cpp$(OBJ_EXT):
! $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cpp
! .cxx$(OBJ_EXT):
! $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cxx
! .cc$(OBJ_EXT):
! $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cc
! ';
! join "", @m;
}
! =item cflags (o)
! Does very much the same as the cflags script in the perl
! distribution. It doesn't return the whole compiler command line, but
! initializes all of its parts. The const_cccmd method then actually
! returns the definition of the CCCMD macro which uses these parts.
=cut
! #'
! sub cflags {
! my($self,$libperl)=@_;
! return $self->{CFLAGS} if $self->{CFLAGS};
! return '' unless $self->needs_linking();
! my($prog, $uc, $perltype, %cflags);
! $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
! $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
! @cflags{qw(cc ccflags optimize large split shellflags)}
! = @Config{qw(cc ccflags optimize large split shellflags)};
! my($optdebug) = "";
! $cflags{shellflags} ||= '';
! my(%map) = (
! D => '-DDEBUGGING',
! E => '-DEMBED',
! DE => '-DDEBUGGING -DEMBED',
! M => '-DEMBED -DMULTIPLICITY',
! DM => '-DDEBUGGING -DEMBED -DMULTIPLICITY',
! );
! if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){
! $uc = uc($1);
! } else {
! $uc = ""; # avoid warning
! }
! $perltype = $map{$uc} ? $map{$uc} : "";
! if ($uc =~ /^D/) {
! $optdebug = "-g";
! }
! my($name);
! ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
! if ($prog = $Config::Config{$name}) {
! # Expand hints for this extension via the shell
! print STDOUT "Processing $name hint:\n" if $Verbose;
! my(@o)=`cc=\"$cflags{cc}\"
! ccflags=\"$cflags{ccflags}\"
! optimize=\"$cflags{optimize}\"
! perltype=\"$cflags{perltype}\"
! optdebug=\"$cflags{optdebug}\"
! large=\"$cflags{large}\"
! split=\"$cflags{'split'}\"
! eval '$prog'
! echo cc=\$cc
! echo ccflags=\$ccflags
! echo optimize=\$optimize
! echo perltype=\$perltype
! echo optdebug=\$optdebug
! echo large=\$large
! echo split=\$split
! `;
! my($line);
! foreach $line (@o){
! chomp $line;
! if ($line =~ /(.*?)=\s*(.*)\s*$/){
! $cflags{$1} = $2;
! print STDOUT " $1 = $2\n" if $Verbose;
! } else {
! print STDOUT "Unrecognised result from hint: '$line'\n";
! }
! }
! }
! if ($optdebug) {
! $cflags{optimize} = $optdebug;
! }
! for (qw(ccflags optimize perltype large split)) {
! $cflags{$_} =~ s/^\s+//;
! $cflags{$_} =~ s/\s+/ /g;
! $cflags{$_} =~ s/\s+$//;
! $self->{uc $_} ||= $cflags{$_}
! }
! return $self->{CFLAGS} = qq{
! CCFLAGS = $self->{CCFLAGS}
! OPTIMIZE = $self->{OPTIMIZE}
! PERLTYPE = $self->{PERLTYPE}
! LARGE = $self->{LARGE}
! SPLIT = $self->{SPLIT}
! };
}
! =item clean (o)
! Defines the clean target.
=cut
! sub clean {
! # --- Cleanup and Distribution Sections ---
! my($self, %attribs) = @_;
! my(@m,$dir);
! push(@m, '
! # Delete temporary files but do not touch installed files. We don\'t delete
! # the Makefile here so a later make realclean still has a makefile to use.
! clean ::
! ');
! # clean subdirectories first
! for $dir (@{$self->{DIR}}) {
! push @m, "\t-cd $dir && test -f $self->{MAKEFILE} && \$(MAKE) clean\n";
}
+
+ my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
+ push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
+ push(@otherfiles, qw[./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all
+ perlmain.c mon.out core so_locations pm_to_blib
+ *~ */*~ */*/*~ *$(OBJ_EXT) *$(LIB_EXT) perl.exe
+ $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def
+ $(BASEEXT).exp
+ ]);
+ push @m, "\t-$self->{RM_RF} @otherfiles\n";
+ # See realclean and ext/utils/make_ext for usage of Makefile.old
+ push(@m,
+ "\t-$self->{MV} $self->{MAKEFILE} $self->{MAKEFILE}.old 2>/dev/null\n");
+ push(@m,
+ "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
+ join("", @m);
}
! =item const_cccmd (o)
! Returns the full compiler call for C programs and stores the
! definition in CONST_CCCMD.
=cut
! sub const_cccmd {
! my($self,$libperl)=@_;
! return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
! return '' unless $self->needs_linking();
! return $self->{CONST_CCCMD} =
! q{CCCMD = $(CC) -c $(INC) $(CCFLAGS) $(OPTIMIZE) \\
! $(PERLTYPE) $(LARGE) $(SPLIT) $(DEFINE_VERSION) \\
! $(XS_DEFINE_VERSION)};
}
! =item const_config (o)
! Defines a couple of constants in the Makefile that are imported from
! %Config.
=cut
! sub const_config {
! # --- Constants Sections ---
!
! my($self) = shift;
! my(@m,$m);
! push(@m,"\n# These definitions are from config.sh (via $INC{'Config.pm'})\n");
! push(@m,"\n# They may have been overridden via Makefile.PL or on the command line\n");
! my(%once_only);
! foreach $m (@{$self->{CONFIG}}){
! # SITE*EXP macros are defined in &constants; avoid duplicates here
! next if $once_only{$m} or $m eq 'sitelibexp' or $m eq 'sitearchexp';
! push @m, "\U$m\E = ".$self->{uc $m}."\n";
! $once_only{$m} = 1;
! }
! join('', @m);
}
! =item const_loadlibs (o)
! Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See
! L<ExtUtils::Liblist> for details.
=cut
! sub const_loadlibs {
! my($self) = shift;
! return "" unless $self->needs_linking;
! my @m;
! push @m, qq{
! # $self->{NAME} might depend on some other libraries:
! # See ExtUtils::Liblist for details
! #
! };
! my($tmp);
! for $tmp (qw/
! EXTRALIBS LDLOADLIBS BSLOADLIBS LD_RUN_PATH
! /) {
! next unless defined $self->{$tmp};
! push @m, "$tmp = $self->{$tmp}\n";
! }
! return join "", @m;
}
! =item constants (o)
! Initializes lots of constants and .SUFFIXES and .PHONY
=cut
! sub constants {
my($self) = @_;
! my(@m,$tmp);
! for $tmp (qw/
! AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
! VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB
! INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS
! INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
! INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
! PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
! FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
! PERL_INC PERL FULLPERL
! / ) {
! next unless defined $self->{$tmp};
! push @m, "$tmp = $self->{$tmp}\n";
}
+ push @m, qq{
+ VERSION_MACRO = VERSION
+ DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
+ XS_VERSION_MACRO = XS_VERSION
+ XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
+ };
! push @m, qq{
! MAKEMAKER = $INC{'ExtUtils/MakeMaker.pm'}
! MM_VERSION = $ExtUtils::MakeMaker::VERSION
! };
! push @m, q{
! # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
! # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
! # ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD) !!! Deprecated from MM 5.32 !!!
! # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
! # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
! };
+ for $tmp (qw/
+ FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
+ LDFROM LINKTYPE
+ / ) {
+ next unless defined $self->{$tmp};
+ push @m, "$tmp = $self->{$tmp}\n";
+ }
! push @m, "
! # Handy lists of source code files:
! XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
! C_FILES = ".join(" \\\n\t", @{$self->{C}})."
! O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
! H_FILES = ".join(" \\\n\t", @{$self->{H}})."
! MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
! MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
! ";
! for $tmp (qw/
! INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
! /) {
! next unless defined $self->{$tmp};
! push @m, "$tmp = $self->{$tmp}\n";
}
! push @m, q{
! .NO_CONFIG_REC: Makefile
! } if $ENV{CLEARCASE_ROOT};
! # why not q{} ? -- emacs
! push @m, qq{
! # work around a famous dec-osf make(1) feature(?):
! makemakerdflt: all
! .SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
! # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that
! # some make implementations will delete the Makefile when we rebuild it. Because
! # we call false(1) when we rebuild it. So make(1) is not completely wrong when it
! # does so. Our milage may vary.
! # .PRECIOUS: Makefile # seems to be not necessary anymore
! .PHONY: all config static dynamic test linkext manifest
! # Where is the Config information that we are using/depend on
! CONFIGDEP = \$(PERL_ARCHLIB)/Config.pm \$(PERL_INC)/config.h
! };
! my @parentdir = split(/::/, $self->{PARENT_NAME});
! push @m, q{
! # Where to put things:
! INST_LIBDIR = }. $self->catdir('$(INST_LIB)',@parentdir) .q{
! INST_ARCHLIBDIR = }. $self->catdir('$(INST_ARCHLIB)',@parentdir) .q{
! INST_AUTODIR = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{
! INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{
! };
+ if ($self->has_link_code()) {
+ push @m, '
+ INST_STATIC = $(INST_ARCHAUTODIR)/$(BASEEXT)$(LIB_EXT)
+ INST_DYNAMIC = $(INST_ARCHAUTODIR)/$(DLBASE).$(DLEXT)
+ INST_BOOT = $(INST_ARCHAUTODIR)/$(BASEEXT).bs
+ ';
+ } else {
+ push @m, '
+ INST_STATIC =
+ INST_DYNAMIC =
+ INST_BOOT =
+ ';
+ }
! if ($Is_OS2) {
! $tmp = "$self->{BASEEXT}.def";
! } else {
! $tmp = "";
! }
! push @m, "
! EXPORT_LIST = $tmp
! ";
! if ($Is_OS2) {
! $tmp = "\$(PERL_INC)/libperl\$(LIB_EXT)";
! } else {
! $tmp = "";
}
! push @m, "
! PERL_ARCHIVE = $tmp
! ";
! # push @m, q{
! #INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
! #
! #PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
! #};
! push @m, q{
! TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
! PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
! };
! join('',@m);
! }
+ =item depend (o)
! Same as macro for the depend attribute.
! =cut
!
! sub depend {
! my($self,%attribs) = @_;
! my(@m,$key,$val);
! while (($key,$val) = each %attribs){
! last unless defined $key;
! push @m, "$key: $val\n";
}
! join "", @m;
! }
+ =item dir_target (o)
! Takes an array of directories that need to exist and returns a
! Makefile entry for a .exists file in these directories. Returns
! nothing, if the entry has already been processed. We're helpless
! though, if the same directory comes as $(FOO) _and_ as "bar". Both of
! them get an entry, that's why we use "::".
! =cut
! sub dir_target {
! # --- Make-Directories section (internal method) ---
! # dir_target(@array) returns a Makefile entry for the file .exists in each
! # named directory. Returns nothing, if the entry has already been processed.
! # We're helpless though, if the same directory comes as $(FOO) _and_ as "bar".
! # Both of them get an entry, that's why we use "::". I chose '$(PERL)' as the
! # prerequisite, because there has to be one, something that doesn't change
! # too often :)
! my($self,@dirs) = @_;
! my(@m,$dir);
! foreach $dir (@dirs) {
! my($src) = $self->catfile($self->{PERL_INC},'perl.h');
! my($targ) = $self->catfile($dir,'.exists');
! my($targdir) = $targ; # Necessary because catfile may have
! $targdir =~ s:/?.exists$::; # adapted syntax of $dir to target OS
! next if $self->{DIR_TARGET}{$self}{$targdir}++;
! push @m, qq{
! $targ :: $src
! $self->{NOECHO}\$(MKPATH) $targdir
! $self->{NOECHO}\$(EQUALIZE_TIMESTAMP) $src $targ
! };
! push(@m,qq{
! -$self->{NOECHO}\$(CHMOD) 755 $targdir
! }) unless $Is_VMS;
! }
! join "", @m;
! }
! =item dist (o)
! Defines a lot of macros for distribution support.
! =cut
+ sub dist {
+ my($self, %attribs) = @_;
! my(@m);
! # VERSION should be sanitised before use as a file name
! my($version) = $attribs{VERSION} || '$(VERSION)';
! my($name) = $attribs{NAME} || '$(DISTNAME)';
! my($tar) = $attribs{TAR} || 'tar'; # eg /usr/bin/gnutar
! my($tarflags) = $attribs{TARFLAGS} || 'cvf';
! my($zip) = $attribs{ZIP} || 'zip'; # eg pkzip Yuck!
! my($zipflags) = $attribs{ZIPFLAGS} || '-r';
! my($compress) = $attribs{COMPRESS} || 'compress'; # eg gzip
! my($suffix) = $attribs{SUFFIX} || '.Z'; # eg .gz
! my($shar) = $attribs{SHAR} || 'shar'; # eg "shar --gzip"
! my($preop) = $attribs{PREOP} || "$self->{NOECHO}\$(NOOP)"; # eg update MANIFEST
! my($postop) = $attribs{POSTOP} || "$self->{NOECHO}\$(NOOP)"; # eg remove the distdir
! my($to_unix) = $attribs{TO_UNIX} || ($Is_OS2
! ? "$self->{NOECHO}"
! . 'test -f tmp.zip && $(RM) tmp.zip;'
! . ' $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM) tmp.zip'
! : "$self->{NOECHO}\$(NOOP)");
! my($ci) = $attribs{CI} || 'ci -u';
! my($rcs_label)= $attribs{RCS_LABEL}|| 'rcs -Nv$(VERSION_SYM): -q';
! my($dist_cp) = $attribs{DIST_CP} || 'best';
! my($dist_default) = $attribs{DIST_DEFAULT} || 'tardist';
! push @m, "
! DISTVNAME = ${name}-$version
! TAR = $tar
! TARFLAGS = $tarflags
! ZIP = $zip
! ZIPFLAGS = $zipflags
! COMPRESS = $compress
! SUFFIX = $suffix
! SHAR = $shar
! PREOP = $preop
! POSTOP = $postop
! TO_UNIX = $to_unix
! CI = $ci
! RCS_LABEL = $rcs_label
! DIST_CP = $dist_cp
! DIST_DEFAULT = $dist_default
! ";
! join "", @m;
}
! =item dist_basics (o)
! Defines the targets distclean, distcheck, skipcheck, manifest.
=cut
! sub dist_basics {
! my($self) = shift;
! my @m;
! push @m, q{
! distclean :: realclean distcheck
! };
! push @m, q{
! distcheck :
! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&fullcheck";' \\
! -e 'fullcheck();'
! };
! push @m, q{
! skipcheck :
! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&skipcheck";' \\
! -e 'skipcheck();'
! };
! push @m, q{
! manifest :
! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&mkmanifest";' \\
! -e 'mkmanifest();'
! };
! join "", @m;
}
! =item dist_ci (o)
! Defines a check in target for RCS.
=cut
! sub dist_ci {
my($self) = shift;
! my @m;
! push @m, q{
! ci :
! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&maniread";' \\
! -e '@all = keys %{ maniread() };' \\
! -e 'print("Executing $(CI) @all\n"); system("$(CI) @all");' \\
! -e 'print("Executing $(RCS_LABEL) ...\n"); system("$(RCS_LABEL) @all");'
! };
! join "", @m;
! }
! =item dist_core (o)
! Defeines the targets dist, tardist, zipdist, uutardist, shdist
! =cut
! sub dist_core {
! my($self) = shift;
! my @m;
! push @m, q{
! dist : $(DIST_DEFAULT)
! }.$self->{NOECHO}.q{$(PERL) -le 'print "Warning: Makefile possibly out of date with $$vf" if ' \
! -e '-e ($$vf="$(VERSION_FROM)") and -M $$vf < -M "}.$self->{MAKEFILE}.q{";'
! tardist : $(DISTVNAME).tar$(SUFFIX)
! zipdist : $(DISTVNAME).zip
! $(DISTVNAME).tar$(SUFFIX) : distdir
! $(PREOP)
! $(TO_UNIX)
! $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
! $(RM_RF) $(DISTVNAME)
! $(COMPRESS) $(DISTVNAME).tar
! $(POSTOP)
! $(DISTVNAME).zip : distdir
! $(PREOP)
! $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
! $(RM_RF) $(DISTVNAME)
! $(POSTOP)
! uutardist : $(DISTVNAME).tar$(SUFFIX)
! uuencode $(DISTVNAME).tar$(SUFFIX) \\
! $(DISTVNAME).tar$(SUFFIX) > \\
! $(DISTVNAME).tar$(SUFFIX)_uu
! shdist : distdir
! $(PREOP)
! $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
! $(RM_RF) $(DISTVNAME)
! $(POSTOP)
! };
! join "", @m;
}
! =item dist_dir (o)
! Defines the scratch directory target that will hold the distribution
! before tar-ing (or shar-ing).
=cut
! sub dist_dir {
! my($self) = shift;
! my @m;
! push @m, q{
! distdir :
! $(RM_RF) $(DISTVNAME)
! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=manicopy,maniread \\
! -e 'manicopy(maniread(),"$(DISTVNAME)", "$(DIST_CP)");'
! };
! join "", @m;
}
! =item dist_test (o)
! Defines a target that produces the distribution in the
! scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
! subdirectory.
=cut
! sub dist_test {
my($self) = shift;
! my @m;
! push @m, q{
! disttest : distdir
! cd $(DISTVNAME) && $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) Makefile.PL
! cd $(DISTVNAME) && $(MAKE)
! cd $(DISTVNAME) && $(MAKE) test
! };
! join "", @m;
}
! =item dlsyms (o)
! Used by AIX and VMS to define DL_FUNCS and DL_VARS and write the *.exp
! files.
=cut
! sub dlsyms {
! my($self,%attribs) = @_;
! return '' unless ($^O eq 'aix' && $self->needs_linking() );
! my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
! my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
! my(@m);
! push(@m,"
! dynamic :: $self->{BASEEXT}.exp
! ") unless $self->{SKIPHASH}{'dynamic'}; # dynamic and static are subs, so...
! push(@m,"
! static :: $self->{BASEEXT}.exp
! ") unless $self->{SKIPHASH}{'static'}; # we avoid a warning if we tick them
! push(@m,"
! $self->{BASEEXT}.exp: Makefile.PL
! ",' $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\
! Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ',
! neatvalue($funcs),', "DL_VARS" => ', neatvalue($vars), ');\'
! ');
! join('',@m);
! }
! =item dynamic (o)
! Defines the dynamic target.
! =cut
! sub dynamic {
! # --- Dynamic Loading Sections ---
! my($self) = shift;
! '
! ## $(INST_PM) has been moved to the all: target.
! ## It remains here for awhile to allow for old usage: "make dynamic"
! #dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT) $(INST_PM)
! dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT)
! '.$self->{NOECHO}.'$(NOOP)
! ';
! }
! =item dynamic_bs (o)
! Defines targets for bootstrap files.
! =cut
! sub dynamic_bs {
! my($self, %attribs) = @_;
! return '
! BOOTSTRAP =
! ' unless $self->has_link_code();
! return '
! BOOTSTRAP = '."$self->{BASEEXT}.bs".'
! # As Mkbootstrap might not write a file (if none is required)
! # we use touch to prevent make continually trying to remake it.
! # The DynaLoader only reads a non-empty file.
! $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)/.exists
! '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
! '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
! -e \'use ExtUtils::Mkbootstrap;\' \
! -e \'Mkbootstrap("$(BASEEXT)","$(BSLOADLIBS)");\'
! '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
! $(CHMOD) 644 $@
! $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
! '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
! -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
! $(CHMOD) 644 $@
';
! }
! =item dynamic_lib (o)
! Defines how to produce the *.so (or equivalent) files.
!
! =cut
!
! sub dynamic_lib {
! my($self, %attribs) = @_;
! return '' unless $self->needs_linking(); #might be because of a subdir
! return '' unless $self->has_link_code;
! my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
! my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
! my($armaybe) = $attribs{ARMAYBE} || $self->{ARMAYBE} || ":";
! my($ldfrom) = '$(LDFROM)';
! $armaybe = 'ar' if ($^O eq 'dec_osf' and $armaybe eq ':');
! my(@m);
! push(@m,'
! # This section creates the dynamically loadable $(INST_DYNAMIC)
! # from $(OBJECT) and possibly $(MYEXTLIB).
! ARMAYBE = '.$armaybe.'
! OTHERLDFLAGS = '.$otherldflags.'
! INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
! $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
! ');
! if ($armaybe ne ':'){
! $ldfrom = 'tmp$(LIB_EXT)';
! push(@m,' $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
! push(@m,' $(RANLIB) '."$ldfrom\n");
! }
! $ldfrom = "-all $ldfrom -none" if ($^O eq 'dec_osf');
! push(@m,' LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) -o $@ $(LDDLFLAGS) '.$ldfrom.
! ' $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(EXPORT_LIST)');
! push @m, '
! $(CHMOD) 755 $@
! ';
+ push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
join('',@m);
}
! =item exescan
! Deprecated method. Use libscan instead.
=cut
! sub exescan {
! my($self,$path) = @_;
! $path;
}
! =item extliblist
! Called by init_others, and calls ext ExtUtils::Liblist. See
! L<ExtUtils::Liblist> for details.
=cut
! sub extliblist {
! my($self,$libs) = @_;
! require ExtUtils::Liblist;
! $self->ext($libs, $Verbose);
! }
! =item file_name_is_absolute
! Takes as argument a path and returns true, it it is an absolute path.
! =cut
! sub file_name_is_absolute {
! my($self,$file) = @_;
! $file =~ m:^/: ;
! }
! =item find_perl
! Finds the executables PERL and FULLPERL
+ =cut
! sub find_perl {
! my($self, $ver, $names, $dirs, $trace) = @_;
! my($name, $dir);
! if ($trace >= 2){
! print "Looking for perl $ver by these names:
! @$names
! in these dirs:
! @$dirs
! ";
! }
! foreach $dir (@$dirs){
! next unless defined $dir; # $self->{PERL_SRC} may be undefined
! foreach $name (@$names){
! my $abs;
! if ($self->file_name_is_absolute($name)) { # /foo/bar
! $abs = $name;
! } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
! $abs = $self->catfile($dir, $name);
! } else { # foo/bar
! $abs = $self->canonpath($self->catfile($self->curdir, $name));
! }
! print "Checking $abs\n" if ($trace >= 2);
! next unless $self->maybe_command($abs);
! print "Executing $abs\n" if ($trace >= 2);
! if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
! print "Using PERL=$abs\n" if $trace;
! return $abs;
}
}
}
+ print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
+ 0; # false and not empty
+ }
! =head2 Methods to actually produce chunks of text for the Makefile
! The methods here are called in the order specified by
! @ExtUtils::MakeMaker::MM_Sections. This manpage reflects the order as
! well as possible. Some methods call each other, so in doubt refer to
! the code.
! =item force (o)
!
! Just writes FORCE:
!
! =cut
+ sub force {
+ my($self) = shift;
+ '# Phony target to force checking subdirectories.
+ FORCE:
+ ';
}
+ =item guess_name
+ Guess the name of this package by examining the working directory's
+ name. MakeMaker calls this only if the developer has not supplied a
+ NAME attribute.
! =cut
! # ';
!
! sub guess_name {
! my($self) = @_;
! use Cwd 'cwd';
! my $name = basename(cwd());
! $name =~ s|[\-_][\d\.\-]+$||; # this is new with MM 5.00, we
! # strip minus or underline
! # followed by a float or some such
! print "Warning: Guessing NAME [$name] from current directory name.\n";
! $name;
! }
!
! =item has_link_code
!
! Returns true if C, XS, MYEXTLIB or similar objects exist within this
! object that need a compiler. Does not descend into subdirectories as
! needs_linking() does.
=cut
! sub has_link_code {
! my($self) = shift;
! return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
! if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
! $self->{HAS_LINK_CODE} = 1;
! return 1;
}
! return $self->{HAS_LINK_CODE} = 0;
}
! =item init_dirscan
! Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, MAN*PODS, EXE_FILES.
!
! =cut
!
! sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
! my($self) = @_;
! my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
! local(%pm); #the sub in find() has to see this hash
! $ignore{'test.pl'} = 1;
! $ignore{'makefile.pl'} = 1 if $Is_VMS;
! foreach $name ($self->lsdir($self->curdir)){
! next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name};
! next unless $self->libscan($name);
! if (-d $name){
! next if -l $name; # We do not support symlinks at all
! $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
! } elsif ($name =~ /\.xs$/){
! my($c); ($c = $name) =~ s/\.xs$/.c/;
! $xs{$name} = $c;
! $c{$c} = 1;
! } elsif ($name =~ /\.c(pp|xx|c)?$/i){ # .c .C .cpp .cxx .cc
! $c{$name} = 1
! unless $name =~ m/perlmain\.c/; # See MAP_TARGET
! } elsif ($name =~ /\.h$/i){
! $h{$name} = 1;
! } elsif ($name =~ /\.(p[ml]|pod)$/){
! $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
! } elsif ($name =~ /\.PL$/ && $name ne "Makefile.PL") {
! ($pl_files{$name} = $name) =~ s/\.PL$// ;
! } elsif ($Is_VMS && $name =~ /\.pl$/ && $name ne 'makefile.pl' &&
! $name ne 'test.pl') { # case-insensitive filesystem
! ($pl_files{$name} = $name) =~ s/\.pl$// ;
! }
! }
! # Some larger extensions often wish to install a number of *.pm/pl
! # files into the library in various locations.
! # The attribute PMLIBDIRS holds an array reference which lists
! # subdirectories which we should search for library files to
! # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We
! # recursively search through the named directories (skipping any
! # which don't exist or contain Makefile.PL files).
! # For each *.pm or *.pl file found $self->libscan() is called with
! # the default installation path in $_[1]. The return value of
! # libscan defines the actual installation location. The default
! # libscan function simply returns the path. The file is skipped
! # if libscan returns false.
! # The default installation location passed to libscan in $_[1] is:
! #
! # ./*.pm => $(INST_LIBDIR)/*.pm
! # ./xyz/... => $(INST_LIBDIR)/xyz/...
! # ./lib/... => $(INST_LIB)/...
! #
! # In this way the 'lib' directory is seen as the root of the actual
! # perl library whereas the others are relative to INST_LIBDIR
! # (which includes PARENT_NAME). This is a subtle distinction but one
! # that's important for nested modules.
! $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
! unless $self->{PMLIBDIRS};
! #only existing directories that aren't in $dir are allowed
! # Avoid $_ wherever possible:
! # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
! my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
! my ($pmlibdir);
! @{$self->{PMLIBDIRS}} = ();
! foreach $pmlibdir (@pmlibdirs) {
! -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
}
! if (@{$self->{PMLIBDIRS}}){
! print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
! if ($Verbose >= 2);
! require File::Find;
! File::Find::find(sub {
! if (-d $_){
! if ($_ eq "CVS" || $_ eq "RCS"){
! $File::Find::prune = 1;
! }
! return;
! }
! my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
! my($striplibpath,$striplibname);
! $prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:);
! ($striplibname,$striplibpath) = fileparse($striplibpath);
! my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
! local($_) = $inst; # for backwards compatibility
! $inst = $self->libscan($inst);
! print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
! return unless $inst;
! $pm{$path} = $inst;
! }, @{$self->{PMLIBDIRS}});
! }
! $self->{DIR} = [sort keys %dir] unless $self->{DIR};
! $self->{XS} = \%xs unless $self->{XS};
! $self->{PM} = \%pm unless $self->{PM};
! $self->{C} = [sort keys %c] unless $self->{C};
! my(@o_files) = @{$self->{C}};
! $self->{O_FILES} = [grep s/\.c(pp|xx|c)?$/$self->{OBJ_EXT}/i, @o_files] ;
! $self->{H} = [sort keys %h] unless $self->{H};
! $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
! # Set up names of manual pages to generate from pods
! if ($self->{MAN1PODS}) {
! } elsif ( $self->{INST_MAN1DIR} =~ /^(none|\s*)$/ ) {
! $self->{MAN1PODS} = {};
! } else {
! my %manifypods = ();
! if ( exists $self->{EXE_FILES} ) {
! foreach $name (@{$self->{EXE_FILES}}) {
! # use FileHandle ();
! # my $fh = new FileHandle;
! local *FH;
! my($ispod)=0;
! # one day test, if $/ can be set to '' safely (is the bug fixed that was in 5.001m?)
! # if ($fh->open("<$name")) {
! if (open(FH,"<$name")) {
! # while (<$fh>) {
! while (<FH>) {
! if (/^=head1\s+\w+/) {
! $ispod=1;
! last;
! }
! }
! # $fh->close;
! close FH;
! } else {
! # If it doesn't exist yet, we assume, it has pods in it
! $ispod = 1;
}
! if( $ispod ) {
! $manifypods{$name} = $self->catfile('$(INST_MAN1DIR)',basename($name).'.$(MAN1EXT)');
}
+ }
}
+ $self->{MAN1PODS} = \%manifypods;
}
! if ($self->{MAN3PODS}) {
! } elsif ( $self->{INST_MAN3DIR} =~ /^(none|\s*)$/ ) {
! $self->{MAN3PODS} = {};
} else {
! my %manifypods = (); # we collect the keys first, i.e. the files
! # we have to convert to pod
! foreach $name (keys %{$self->{PM}}) {
! if ($name =~ /\.pod$/ ) {
! $manifypods{$name} = $self->{PM}{$name};
! } elsif ($name =~ /\.p[ml]$/ ) {
! # use FileHandle ();
! # my $fh = new FileHandle;
! local *FH;
! my($ispod)=0;
! # $fh->open("<$name");
! if (open(FH,"<$name")) {
! # while (<$fh>) {
! while (<FH>) {
! if (/^=head1\s+\w+/) {
! $ispod=1;
! last;
! }
! }
! # $fh->close;
! close FH;
! } else {
! $ispod = 1;
! }
! if( $ispod ) {
! $manifypods{$name} = $self->{PM}{$name};
! }
! }
}
! # Remove "Configure.pm" and similar, if it's not the only pod listed
! # To force inclusion, just name it "Configure.pod", or override MAN3PODS
! foreach $name (keys %manifypods) {
! if ($name =~ /(config|setup).*\.pm/i) {
! delete $manifypods{$name};
! next;
! }
! my($manpagename) = $name;
! unless ($manpagename =~ s!^\W*lib\W+!!) { # everything below lib is ok
! $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
! }
! $manpagename =~ s/\.p(od|m|l)$//;
! $manpagename = $self->replace_manpage_separator($manpagename);
! $manifypods{$name} = $self->catfile("\$(INST_MAN3DIR)","$manpagename.\$(MAN3EXT)");
! }
! $self->{MAN3PODS} = \%manifypods;
! }
! }
! =item init_main
! Initializes NAME, FULLEXT, BASEEXT, PARENT_NAME, DLBASE, PERL_SRC,
! PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
! PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, MAP_TARGET,
! LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
! =cut
! sub init_main {
! my($self) = @_;
! # --- Initialize Module Name and Paths
! # NAME = Foo::Bar::Oracle
! # FULLEXT = Foo/Bar/Oracle
! # BASEEXT = Oracle
! # ROOTEXT = Directory part of FULLEXT with leading /. !!! Deprecated from MM 5.32 !!!
! # PARENT_NAME = Foo::Bar
! ### Only UNIX:
! ### ($self->{FULLEXT} =
! ### $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
! $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
! # Copied from DynaLoader:
! my(@modparts) = split(/::/,$self->{NAME});
! my($modfname) = $modparts[-1];
! # Some systems have restrictions on files names for DLL's etc.
! # mod2fname returns appropriate file base name (typically truncated)
! # It may also edit @modparts if required.
! if (defined &DynaLoader::mod2fname) {
! $modfname = &DynaLoader::mod2fname(\@modparts);
! } elsif ($Is_OS2) { # Need manual correction if run with miniperl:-(
! $modfname = substr($modfname, 0, 7) . '_';
! }
! ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!([\w:]+::)?(\w+)$! ;
! if (defined &DynaLoader::mod2fname or $Is_OS2) {
! # As of 5.001m, dl_os2 appends '_'
! $self->{DLBASE} = $modfname;
! } else {
! $self->{DLBASE} = '$(BASEEXT)';
! }
! ### ROOTEXT deprecated from MM 5.32
! ### ($self->{ROOTEXT} =
! ### $self->{FULLEXT}) =~ s#/?\Q$self->{BASEEXT}\E$## ; #eg. /BSD/Foo
! ### $self->{ROOTEXT} = ($Is_VMS ? '' : '/') . $self->{ROOTEXT} if $self->{ROOTEXT};
! # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
! # *Real* information: where did we get these two from? ...
! my $inc_config_dir = dirname($INC{'Config.pm'});
! my $inc_carp_dir = dirname($INC{'Carp.pm'});
! unless ($self->{PERL_SRC}){
! my($dir);
! foreach $dir ($self->updir(),$self->catdir($self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir())){
! if (
! -f $self->catfile($dir,"config.sh")
! &&
! -f $self->catfile($dir,"perl.h")
! &&
! -f $self->catfile($dir,"lib","Exporter.pm")
! ) {
! $self->{PERL_SRC}=$dir ;
! last;
! }
! }
! }
! if ($self->{PERL_SRC}){
! $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib");
! $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
! $self->{PERL_INC} = $self->{PERL_SRC};
! # catch a situation that has occurred a few times in the past:
! warn <<EOM unless (-s $self->catfile($self->{PERL_SRC},'cflags') or $Is_VMS && -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt') or $Is_Mac);
! You cannot build extensions below the perl source tree after executing
! a 'make clean' in the perl source tree.
! To rebuild extensions distributed with the perl source you should
! simply Configure (to include those extensions) and then build perl as
! normal. After installing perl the source tree can be deleted. It is
! not needed for building extensions by running 'perl Makefile.PL'
! usually without extra arguments.
! It is recommended that you unpack and build additional extensions away
! from the perl source tree.
! EOM
! } else {
! # we should also consider $ENV{PERL5LIB} here
! $self->{PERL_LIB} ||= $Config::Config{privlibexp};
! $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp};
! $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
! my $perl_h;
! die <<EOM unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h")));
! Error: Unable to locate installed Perl libraries or Perl source code.
! It is recommended that you install perl in a standard location before
! building extensions. You can say:
! $^X Makefile.PL PERL_SRC=/path/to/perl/source/directory
! if you have not yet installed perl but still want to build this
! extension now.
! (You get this message, because MakeMaker could not find "$perl_h")
! EOM
! # print STDOUT "Using header files found in $self->{PERL_INC}\n"
! # if $Verbose && $self->needs_linking();
! }
! # We get SITELIBEXP and SITEARCHEXP directly via
! # Get_from_Config. When we are running standard modules, these
! # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
! # set it to "site". I prefer that INSTALLDIRS be set from outside
! # MakeMaker.
! $self->{INSTALLDIRS} ||= "site";
! # INST_LIB typically pre-set if building an extension after
! # perl has been built and installed. Setting INST_LIB allows
! # you to build directly into, say $Config::Config{privlibexp}.
! unless ($self->{INST_LIB}){
! ##### XXXXX We have to change this nonsense
! if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
! $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
! } else {
! $self->{INST_LIB} = $self->catdir($self->curdir,"blib","lib");
! }
! }
! $self->{INST_ARCHLIB} ||= $self->catdir($self->curdir,"blib","arch");
! $self->{INST_BIN} ||= $self->catdir($self->curdir,'blib','bin');
! # INST_EXE is deprecated, should go away March '97
! $self->{INST_EXE} ||= $self->catdir($self->curdir,'blib','script');
! $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script');
! # The user who requests an installation directory explicitly
! # should not have to tell us a architecture installation directory
! # as well We look if a directory exists that is named after the
! # architecture. If not we take it as a sign that it should be the
! # same as the requested installation directory. Otherwise we take
! # the found one.
! # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
! my($libpair);
! for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) {
! my $lib = "install$libpair->{l}";
! my $Lib = uc $lib;
! my $Arch = uc "install$libpair->{a}";
! if( $self->{$Lib} && ! $self->{$Arch} ){
! my($ilib) = $Config{$lib};
! $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS;
! $self->prefixify($Arch,$ilib,$self->{$Lib});
! unless (-d $self->{$Arch}) {
! print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose;
! $self->{$Arch} = $self->{$Lib};
! }
! print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
! }
}
!
! # we have to look at the relation between $Config{prefix} and the
! # requested values. We're going to set the $Config{prefix} part of
! # all the installation path variables to literally $(PREFIX), so
! # the user can still say make PREFIX=foo
! my($prefix) = $Config{'prefix'};
! $prefix = VMS::Filespec::unixify($prefix) if $Is_VMS;
! unless ($self->{PREFIX}){
! $self->{PREFIX} = $prefix;
}
! my($install_variable);
! for $install_variable (qw/
! INSTALLPRIVLIB INSTALLARCHLIB INSTALLBIN
! INSTALLMAN1DIR INSTALLMAN3DIR INSTALLSCRIPT
! INSTALLSITELIB INSTALLSITEARCH
! /) {
! $self->prefixify($install_variable,$prefix,q[$(PREFIX)]);
! }
! # Now we head at the manpages. Maybe they DO NOT want manpages
! # installed
! $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
! unless defined $self->{INSTALLMAN1DIR};
! unless (defined $self->{INST_MAN1DIR}){
! if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
! $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
! } else {
! $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1');
! }
}
! $self->{MAN1EXT} ||= $Config::Config{man1ext};
!
! $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
! unless defined $self->{INSTALLMAN3DIR};
! unless (defined $self->{INST_MAN3DIR}){
! if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
! $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
! } else {
! $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3');
! }
}
! $self->{MAN3EXT} ||= $Config::Config{man3ext};
! # Get some stuff out of %Config if we haven't yet done so
! print STDOUT "CONFIG must be an array ref\n"
! if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
! $self->{CONFIG} = [] unless (ref $self->{CONFIG});
! push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
! push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
! my(%once_only,$m);
! foreach $m (@{$self->{CONFIG}}){
! next if $once_only{$m};
! print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
! unless exists $Config::Config{$m};
! $self->{uc $m} ||= $Config::Config{$m};
! $once_only{$m} = 1;
! }
! # This is too dangerous:
! # if ($^O eq "next") {
! # $self->{AR} = "libtool";
! # $self->{AR_STATIC_ARGS} = "-o";
! # }
! # But I leave it as a placeholder
!
! $self->{AR_STATIC_ARGS} ||= "cr";
!
! # These should never be needed
! $self->{LD} ||= 'ld';
! $self->{OBJ_EXT} ||= '.o';
! $self->{LIB_EXT} ||= '.a';
! $self->{MAP_TARGET} ||= "perl";
! $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
! # make a simple check if we find Exporter
! warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
! (Exporter.pm not found)"
! unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
! $self->{NAME} eq "ExtUtils::MakeMaker";
! # Determine VERSION and VERSION_FROM
! ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
! if ($self->{VERSION_FROM}){
! $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}) or
! Carp::carp "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n"
! }
! # strip blanks
! if ($self->{VERSION}) {
! $self->{VERSION} =~ s/^\s+//;
! $self->{VERSION} =~ s/\s+$//;
}
! $self->{VERSION} ||= "0.10";
! ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
! # Graham Barr and Paul Marquess had some ideas how to ensure
! # version compatibility between the *.pm file and the
! # corresponding *.xs file. The bottomline was, that we need an
! # XS_VERSION macro that defaults to VERSION:
! $self->{XS_VERSION} ||= $self->{VERSION};
! # --- Initialize Perl Binary Locations
!
! # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
! # will be working versions of perl 5. miniperl has priority over perl
! # for PERL to ensure that $(PERL) is usable while building ./ext/*
! my ($component,@defpath);
! foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
! push @defpath, $component if defined $component;
}
+ $self->{PERL} =
+ $self->find_perl(5.0, [ $^X, 'miniperl','perl','perl5',"perl$]" ],
+ \@defpath, $Verbose ) unless ($self->{PERL});
+ # don't check if perl is executable, maybe they have decided to
+ # supply switches with perl
! # Define 'FULLPERL' to be a non-miniperl (used in test: target)
! ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
! unless ($self->{FULLPERL});
}
! =item init_others
! Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
! OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
! MAKEFILE, NOECHO, RM_F, RM_RF, TOUCH, CP, MV, CHMOD, UMASK_NULL
=cut
! sub init_others { # --- Initialize Other Attributes
my($self) = shift;
! # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
! # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
! # undefined. In any case we turn it into an anon array:
! # May check $Config{libs} too, thus not empty.
! $self->{LIBS}=[''] unless $self->{LIBS};
! $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq SCALAR;
! $self->{LD_RUN_PATH} = "";
! my($libs);
! foreach $libs ( @{$self->{LIBS}} ){
! $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
! my(@libs) = $self->extliblist($libs);
! if ($libs[0] or $libs[1] or $libs[2]){
! # LD_RUN_PATH now computed by ExtUtils::Liblist
! ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
! last;
! }
! }
! if ( $self->{OBJECT} ) {
! $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
! } else {
! # init_dirscan should have found out, if we have C files
! $self->{OBJECT} = "";
! $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
! }
! $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
! $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
! $self->{PERLMAINCC} ||= '$(CC)';
! $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
!
! # Sanity check: don't define LINKTYPE = dynamic if we're skipping
! # the 'dynamic' section of MM. We don't have this problem with
! # 'static', since we either must use it (%Config says we can't
! # use dynamic loading) or the caller asked for it explicitly.
! if (!$self->{LINKTYPE}) {
! $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
! ? 'static'
! : ($Config::Config{usedl} ? 'dynamic' : 'static');
! };
!
! # These get overridden for VMS and maybe some other systems
! $self->{NOOP} ||= "sh -c true";
! $self->{FIRST_MAKEFILE} ||= "Makefile";
! $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
! $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
! $self->{NOECHO} = '@' unless defined $self->{NOECHO};
! $self->{RM_F} ||= "rm -f";
! $self->{RM_RF} ||= "rm -rf";
! $self->{TOUCH} ||= "touch";
! $self->{CP} ||= "cp";
! $self->{MV} ||= "mv";
! $self->{CHMOD} ||= "chmod";
! $self->{UMASK_NULL} ||= "umask 0";
}
! =item install (o)
! Defines the install target.
=cut
! sub install {
! my($self, %attribs) = @_;
! my(@m);
! push @m, q{
! install :: all pure_install doc_install
! install_perl :: all pure_perl_install doc_perl_install
! install_site :: all pure_site_install doc_site_install
! install_ :: install_site
! @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
! pure_install :: pure_$(INSTALLDIRS)_install
! doc_install :: doc_$(INSTALLDIRS)_install
! }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
! pure__install : pure_site_install
! @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
! doc__install : doc_site_install
! @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
! pure_perl_install ::
! }.$self->{NOECHO}.q{$(MOD_INSTALL) \
! read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
! write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
! $(INST_LIB) $(INSTALLPRIVLIB) \
! $(INST_ARCHLIB) $(INSTALLARCHLIB) \
! $(INST_BIN) $(INSTALLBIN) \
! $(INST_SCRIPT) $(INSTALLSCRIPT) \
! $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
! $(INST_MAN3DIR) $(INSTALLMAN3DIR)
! }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
! }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
! pure_site_install ::
! }.$self->{NOECHO}.q{$(MOD_INSTALL) \
! read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
! write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
! $(INST_LIB) $(INSTALLSITELIB) \
! $(INST_ARCHLIB) $(INSTALLSITEARCH) \
! $(INST_BIN) $(INSTALLBIN) \
! $(INST_SCRIPT) $(INSTALLSCRIPT) \
! $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
! $(INST_MAN3DIR) $(INSTALLMAN3DIR)
! }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
! }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
! doc_perl_install ::
! }.$self->{NOECHO}.q{$(DOC_INSTALL) \
! "$(NAME)" \
! "installed into" "$(INSTALLPRIVLIB)" \
! LINKTYPE "$(LINKTYPE)" \
! VERSION "$(VERSION)" \
! EXE_FILES "$(EXE_FILES)" \
! >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
! doc_site_install ::
! }.$self->{NOECHO}.q{$(DOC_INSTALL) \
! "Module $(NAME)" \
! "installed into" "$(INSTALLSITELIB)" \
! LINKTYPE "$(LINKTYPE)" \
! VERSION "$(VERSION)" \
! EXE_FILES "$(EXE_FILES)" \
! >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
! };
! push @m, q{
! uninstall :: uninstall_from_$(INSTALLDIRS)dirs
! uninstall_from_perldirs ::
! }.$self->{NOECHO}.
! q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
! uninstall_from_sitedirs ::
! }.$self->{NOECHO}.
! q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
! };
!
! join("",@m);
! }
!
! =item installbin (o)
! Defines targets to install EXE_FILES.
! =cut
! sub installbin {
! my($self) = shift;
! return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
! return "" unless @{$self->{EXE_FILES}};
! my(@m, $from, $to, %fromto, @to);
! push @m, $self->dir_target(qw[$(INST_SCRIPT)]);
! for $from (@{$self->{EXE_FILES}}) {
! my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
! local($_) = $path; # for backwards compatibility
! $to = $self->libscan($path);
! print "libscan($from) => '$to'\n" if ($Verbose >=2);
! $fromto{$from}=$to;
}
! @to = values %fromto;
! push(@m, "
! EXE_FILES = @{$self->{EXE_FILES}}
! all :: @to
!
! realclean ::
! $self->{RM_F} @to
! ");
!
! while (($from,$to) = each %fromto) {
! last unless defined $from;
! my $todir = dirname($to);
! push @m, "
! $to: $from $self->{MAKEFILE} $todir/.exists
! $self->{NOECHO}$self->{RM_F} $to
! $self->{CP} $from $to
! ";
}
+ join "", @m;
+ }
! =item libscan (o)
! Takes a path to a file that is found by init_dirscan and returns false
! if we don't want to include this file in the library. Mainly used to
! exclude RCS, CVS, and SCCS directories from installation.
! =cut
! # ';
!
! sub libscan {
! my($self,$path) = @_;
! return '' if $path =~ m:\b(RCS|CVS|SCCS)\b: ;
! $path;
}
=item linkext (o)
***************
*** 1941,1950 ****
sub linkext {
my($self, %attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
# LINKTYPE => static or dynamic or ''
my($linktype) = defined $attribs{LINKTYPE} ?
$attribs{LINKTYPE} : '$(LINKTYPE)';
--- 1860,1865 ----
***************
*** 1954,2231 ****
";
}
! =item dlsyms (o)
! Used by AIX and VMS to define DL_FUNCS and DL_VARS and write the *.exp
! files.
=cut
! sub dlsyms {
my($self,%attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
}
! return '' unless ($^O eq 'aix' && $self->needs_linking() );
! my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
! my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
my(@m);
! push(@m,"
! dynamic :: $self->{BASEEXT}.exp
! ") unless $self->{SKIPHASH}{'dynamic'}; # dynamic and static are subs, so...
! push(@m,"
! static :: $self->{BASEEXT}.exp
! ") unless $self->{SKIPHASH}{'static'}; # we avoid a warning if we tick them
! push(@m,"
! $self->{BASEEXT}.exp: Makefile.PL
! ",' $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\
! Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ',
! neatvalue($funcs),', "DL_VARS" => ', neatvalue($vars), ');\'
! ');
- join('',@m);
- }
- =item dynamic (o)
! Defines the dynamic target.
- =cut
! sub dynamic {
! # --- Dynamic Loading Sections ---
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! '
! ## $(INST_PM) has been moved to the all: target.
! ## It remains here for awhile to allow for old usage: "make dynamic"
! #dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT) $(INST_PM)
! dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT)
! '.$self->{NOECHO}.'$(NOOP)
! ';
! }
! =item dynamic_bs (o)
! Defines targets for bootstrap files.
! =cut
! sub dynamic_bs {
! my($self, %attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
}
- return '
- BOOTSTRAP =
- ' unless $self->has_link_code();
! return '
! BOOTSTRAP = '."$self->{BASEEXT}.bs".'
! # As Mkbootstrap might not write a file (if none is required)
! # we use touch to prevent make continually trying to remake it.
! # The DynaLoader only reads a non-empty file.
! $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)/.exists
! '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
! '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
! -e \'use ExtUtils::Mkbootstrap;\' \
! -e \'Mkbootstrap("$(BASEEXT)","$(BSLOADLIBS)");\'
! '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
! $(CHMOD) 644 $@
! $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
! '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
! -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
! $(CHMOD) 644 $@
! ';
! }
! =item dynamic_lib (o)
! Defines how to produce the *.so (or equivalent) files.
! =cut
! sub dynamic_lib {
! my($self, %attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
}
- return '' unless $self->needs_linking(); #might be because of a subdir
! return '' unless $self->has_link_code;
! my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
! my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
! my($armaybe) = $attribs{ARMAYBE} || $self->{ARMAYBE} || ":";
! my($ldfrom) = '$(LDFROM)';
! $armaybe = 'ar' if ($^O eq 'dec_osf' and $armaybe eq ':');
! my(@m);
! push(@m,'
! # This section creates the dynamically loadable $(INST_DYNAMIC)
! # from $(OBJECT) and possibly $(MYEXTLIB).
! ARMAYBE = '.$armaybe.'
! OTHERLDFLAGS = '.$otherldflags.'
! INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
! $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
! ');
! if ($armaybe ne ':'){
! $ldfrom = 'tmp$(LIB_EXT)';
! push(@m,' $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
! push(@m,' $(RANLIB) '."$ldfrom\n");
! }
! $ldfrom = "-all $ldfrom -none" if ($^O eq 'dec_osf');
! push(@m,' LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) -o $@ $(LDDLFLAGS) '.$ldfrom.
! ' $(OTHERLDFLAGS) $(MYEXTLIB) $(LDLOADLIBS) $(EXPORT_LIST) $(PERL_ARCHIVE)');
! push @m, '
! $(CHMOD) 755 $@
! ';
! push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
! join('',@m);
! }
! =item static (o)
! Defines the static target.
! =cut
! sub static {
! # --- Static Loading Sections ---
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! '
! ## $(INST_PM) has been moved to the all: target.
! ## It remains here for awhile to allow for old usage: "make static"
! #static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
! static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
! '.$self->{NOECHO}.'$(NOOP)
! ';
}
! =item static_lib (o)
! Defines how to produce the *.a (or equivalent) files.
=cut
! sub static_lib {
! my($self) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
! # return '' unless $self->needs_linking(); #might be because of a subdir
!
! return '' unless $self->has_link_code;
! my(@m);
! push(@m, <<'END');
! $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
! END
! # If this extension has it's own library (eg SDBM_File)
! # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
! push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
! push @m,
! q{ $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
! }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
! $(CHMOD) 755 $@
};
! # Old mechanism - still available:
!
! push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs}."\n\n"
! if $self->{PERL_SRC};
!
! push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
! join('', "\n",@m);
}
- # =item installpm
- #
- # Cares for copying and autosplitting the files in PM (which may be more
- # than just *.pm files) into the INST_* directories.
- #
- # =cut
- #
- # sub installpm {
- # my($self, %attribs) = @_;
- # unless (ref $self){
- # ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- # $self = $ExtUtils::MakeMaker::Parent[-1];
- # }
- # # By default .pm files are split into the architecture independent
- # # library. This is a good thing. If a specific module requires that
- # # its .pm files are split into the architecture specific library
- # # then it should use: installpm => {SPLITLIB=>'$(INST_ARCHLIB)'}
- # # Note that installperl currently interferes with this (Config.pm)
- # # User can disable split by saying: installpm => {SPLITLIB=>''}
- # my($splitlib) = '$(INST_LIB)'; # NOT arch specific by default
- # $splitlib = $attribs{SPLITLIB} if exists $attribs{SPLITLIB};
- # my(@m, $dist);
- # push @m, "inst_pm :: \$(INST_PM)\n\n";
- # foreach $dist (sort keys %{$self->{PM}}){
- # my($inst) = $self->{PM}->{$dist};
- # push(@m, "\n# installpm: $dist => $inst, splitlib=$splitlib\n");
- # push(@m, $self->installpm_x($dist, $inst, $splitlib));
- # push(@m, "\n");
- # }
- # join('', @m);
- # }
- #
- # =item installpm_x
- #
- # Helper subroutine to installpm.
- #
- # =cut
- #
- # sub installpm_x { # called by installpm per file
- # my($self, $dist, $inst, $splitlib) = @_;
- # unless (ref $self){
- # ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- # $self = $ExtUtils::MakeMaker::Parent[-1];
- # }
- # if ($inst =~ m,[:\#],){
- # warn "Warning: 'make' would have problems processing this file: '$inst', SKIPPED\n";
- # return '';
- # }
- # my($instdir) = $inst =~ m|(.*)/|;
- # my(@m);
- # push(@m,"
- # $inst: $dist $self->{FIRST_MAKEFILE} $instdir/.exists \$(INST_ARCHAUTODIR)/.exists
- # $self->{NOECHO}$self->{RM_F}".' $@
- # $(UMASK_NULL) && '."$self->{CP} $dist".' $@
- # ');
- # push(@m, "\t$self->{NOECHO}\$(AUTOSPLITFILE) \$@ $splitlib/auto\n")
- # if ($splitlib and $inst =~ m/\.pm$/);
- #
- # push @m, $self->dir_target($instdir);
- # join('', @m);
- # }
-
=item manifypods (o)
Defines targets and routines to translate the pods into manpages and
--- 1869,2165 ----
";
}
! =item lsdir
! Takes as arguments a directory name and a regular expression. Returns
! all entries in the directory that match the regular expression.
=cut
! sub lsdir {
! my($self) = shift;
! my($dir, $regex) = @_;
! my(@ls);
! my $dh = new DirHandle;
! $dh->open($dir || ".") or return ();
! @ls = $dh->read;
! $dh->close;
! @ls = grep(/$regex/, @ls) if $regex;
! @ls;
! }
!
! =item macro (o)
!
! Simple subroutine to insert the macros defined by the macro attribute
! into the Makefile.
!
! =cut
!
! sub macro {
my($self,%attribs) = @_;
! my(@m,$key,$val);
! while (($key,$val) = each %attribs){
! last unless defined $key;
! push @m, "$key = $val\n";
}
+ join "", @m;
+ }
! =item makeaperl (o)
! Called by staticmake. Defines how to write the Makefile to produce a
! static new perl.
!
! =cut
!
! sub makeaperl {
! my($self, %attribs) = @_;
! my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
! @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
my(@m);
+ push @m, "
+ # --- MakeMaker makeaperl section ---
+ MAP_TARGET = $target
+ FULLPERL = $self->{FULLPERL}
+ ";
+ return join '', @m if $self->{PARENT};
! my($dir) = join ":", @{$self->{DIR}};
! unless ($self->{MAKEAPERL}) {
! push @m, q{
! $(MAP_TARGET) :: static $(MAKE_APERL_FILE)
! $(MAKE) -f $(MAKE_APERL_FILE) $@
! $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
! }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
! }.$self->{NOECHO}.q{$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
! Makefile.PL DIR=}, $dir, q{ \
! MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
! MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
! foreach (@ARGV){
! if( /\s/ ){
! s/=(.*)/='$1'/;
! }
! push @m, " \\\n\t\t$_";
! }
! # push @m, map( " \\\n\t\t$_", @ARGV );
! push @m, "\n";
! return join '', @m;
! }
! my($cccmd, $linkcmd, $lperl);
! $cccmd = $self->const_cccmd($libperl);
! $cccmd =~ s/^CCCMD\s*=\s*//;
! $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
! $cccmd .= " $Config::Config{cccdlflags}" if ($Config::Config{d_shrplib});
! $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
! # The front matter of the linkcommand...
! $linkcmd = join ' ', "\$(CC)",
! grep($_, @Config{qw(large split ldflags ccdlflags)});
! $linkcmd =~ s/\s+/ /g;
! # Which *.a files could we make use of...
! local(%static);
! require File::Find;
! File::Find::find(sub {
! return unless m/\Q$self->{LIB_EXT}\E$/;
! return if m/^libperl/;
! if( exists $self->{INCLUDE_EXT} ){
! my $found = 0;
! my $incl;
! my $xx;
!
! ($xx = $File::Find::name) =~ s,.*?/auto/,,;
! $xx =~ s,/?$_,,;
! $xx =~ s,/,::,g;
!
! # Throw away anything not explicitly marked for inclusion.
! # DynaLoader is implied.
! foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
! if( $xx eq $incl ){
! $found++;
! last;
! }
! }
! return unless $found;
! }
! elsif( exists $self->{EXCLUDE_EXT} ){
! my $excl;
! my $xx;
!
! ($xx = $File::Find::name) =~ s,.*?/auto/,,;
! $xx =~ s,/?$_,,;
! $xx =~ s,/,::,g;
!
! # Throw away anything explicitly marked for exclusion
! foreach $excl (@{$self->{EXCLUDE_EXT}}){
! return if( $xx eq $excl );
! }
! }
! # don't include the installed version of this extension. I
! # leave this line here, although it is not necessary anymore:
! # I patched minimod.PL instead, so that Miniperl.pm won't
! # enclude duplicates
! # Once the patch to minimod.PL is in the distribution, I can
! # drop it
! return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}$:;
! use Cwd 'cwd';
! $static{cwd() . "/" . $_}++;
! }, grep( -d $_, @{$searchdirs || []}) );
!
! # We trust that what has been handed in as argument, will be buildable
! $static = [] unless $static;
! @static{@{$static}} = (1) x @{$static};
!
! $extra = [] unless $extra && ref $extra eq 'ARRAY';
! for (sort keys %static) {
! next unless /\Q$self->{LIB_EXT}\E$/;
! $_ = dirname($_) . "/extralibs.ld";
! push @$extra, $_;
}
! grep(s/^/-I/, @{$perlinc || []});
! $target = "perl" unless $target;
! $tmp = "." unless $tmp;
! # MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
! # regenerate the Makefiles, MAP_STATIC and the dependencies for
! # extralibs.all are computed correctly
! push @m, "
! MAP_LINKCMD = $linkcmd
! MAP_PERLINC = @{$perlinc || []}
! MAP_STATIC = ",
! join(" \\\n\t", reverse sort keys %static), "
! MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib}
! ";
!
! if (defined $libperl) {
! ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
! }
! unless ($libperl && -f $lperl) { # Ilya's code...
! my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
! $libperl ||= "libperl$self->{LIB_EXT}";
! $libperl = "$dir/$libperl";
! $lperl ||= "libperl$self->{LIB_EXT}";
! $lperl = "$dir/$lperl";
! print STDOUT "Warning: $libperl not found
! If you're going to build a static perl binary, make sure perl is installed
! otherwise ignore this warning\n"
! unless (-f $lperl || defined($self->{PERL_SRC}));
! }
! push @m, "
! MAP_LIBPERL = $libperl
! ";
! push @m, "
! \$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
! $self->{NOECHO}$self->{RM_F} \$\@
! $self->{NOECHO}\$(TOUCH) \$\@
! ";
! my $catfile;
! foreach $catfile (@$extra){
! push @m, "\tcat $catfile >> \$\@\n";
}
! push @m, "
! \$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
! \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
! $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
! $self->{NOECHO}echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
! $self->{NOECHO}echo 'To remove the intermediate files say'
! $self->{NOECHO}echo ' make -f $makefilename map_clean'
! $tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
! ";
! push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
! push @m, qq{
! $tmp/perlmain.c: $makefilename}, q{
! }.$self->{NOECHO}.q{echo Writing $@
! }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -e 'use ExtUtils::Miniperl; \\
! writemain(grep s#.*/auto/##, qw|$(MAP_STATIC)|)' > $@.tmp && mv $@.tmp $@
! };
! push @m, q{
! doc_inst_perl:
! }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
! }.$self->{NOECHO}.q{$(DOC_INSTALL) \
! "Perl binary $(MAP_TARGET)" \
! MAP_STATIC "$(MAP_STATIC)" \
! MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
! MAP_LIBPERL "$(MAP_LIBPERL)" \
! >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
! };
! push @m, q{
! inst_perl: pure_inst_perl doc_inst_perl
! pure_inst_perl: $(MAP_TARGET)
! }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
! clean :: map_clean
!
! map_clean :
! }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
! };
!
! join '', @m;
}
! =item makefile (o)
! Defines how to rewrite the Makefile.
=cut
! sub makefile {
! my($self) = shift;
! my @m;
! # We do not know what target was originally specified so we
! # must force a manual rerun to be sure. But as it should only
! # happen very rarely it is not a significant problem.
! push @m, '
! $(OBJECT) : $(FIRST_MAKEFILE)
! ' if $self->{OBJECT};
! push @m, q{
! # We take a very conservative approach here, but it\'s worth it.
! # We move Makefile to Makefile.old here to avoid gnu make looping.
! }.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP)
! }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?"
! }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..."
! -}.$self->{NOECHO}.q{mv }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
! -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean >/dev/null 2>&1 || true
! $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
! }.$self->{NOECHO}.q{echo ">>> Your Makefile has been rebuilt. <<<"
! }.$self->{NOECHO}.q{echo ">>> Please rerun the make command. <<<"; false
! # To change behavior to :: would be nice, but would break Tk b9.02
! # so you find such a warning below the dist target.
! #}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
! # }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
};
! join "", @m;
}
=item manifypods (o)
Defines targets and routines to translate the pods into manpages and
***************
*** 2235,2251 ****
sub manifypods {
my($self, %attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! return "\nmanifypods :\n" unless %{$self->{MAN3PODS}};
my($dist);
my($pod2man_exe);
if (defined $self->{PERL_SRC}) {
$pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
} else {
! $pod2man_exe = $self->catfile($Config{bin},'pod2man');
}
unless ($self->perl_script($pod2man_exe)) {
# No pod2man but some MAN3PODS to be installed
--- 2169,2181 ----
sub manifypods {
my($self, %attribs) = @_;
! return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
my($dist);
my($pod2man_exe);
if (defined $self->{PERL_SRC}) {
$pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
} else {
! $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
}
unless ($self->perl_script($pod2man_exe)) {
# No pod2man but some MAN3PODS to be installed
***************
*** 2263,2835 ****
q[POD2MAN = $(PERL) -we '%m=@ARGV;for (keys %m){' \\
-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "].$self->{MAKEFILE}.q[";' \\
-e 'print "Manifying $$m{$$_}\n";' \\
! -e 'system("$$^X \\"-I$(PERL_ARCHLIB)\\" \\"-I$(PERL_LIB)\\" $(POD2MAN_EXE) $$_>$$m{$$_}")==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
-e 'chmod 0644, $$m{$$_} or warn "chmod 644 $$m{$$_}: $$!\n";}'
];
push @m, "\nmanifypods : ";
push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
!
! push(@m,"\n");
! if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
! push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
! push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
! }
! join('', @m);
! }
!
! =item processPL (o)
!
! Defines targets to run *.PL files.
!
! =cut
!
! sub processPL {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! return "" unless $self->{PL_FILES};
! my(@m, $plfile);
! foreach $plfile (sort keys %{$self->{PL_FILES}}) {
! push @m, "
! all :: $self->{PL_FILES}->{$plfile}
!
! $self->{PL_FILES}->{$plfile} :: $plfile
! \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile
! ";
! }
! join "", @m;
! }
!
! =item installbin (o)
!
! Defines targets to install EXE_FILES.
!
! =cut
!
! sub installbin {
! my($self) = shift;
! return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
! return "" unless @{$self->{EXE_FILES}};
! my(@m, $from, $to, %fromto, @to);
! push @m, $self->dir_target(qw[$(INST_EXE)]);
! for $from (@{$self->{EXE_FILES}}) {
! my($path)= '$(INST_EXE)/' . basename($from);
! local($_) = $path; # for backwards compatibility
! $to = $self->libscan($path);
! print "libscan($from) => '$to'\n" if ($Verbose >=2);
! $fromto{$from}=$to;
! }
! @to = values %fromto;
! push(@m, "
! EXE_FILES = @{$self->{EXE_FILES}}
!
! all :: @to
!
! realclean ::
! $self->{RM_F} @to
! ");
!
! while (($from,$to) = each %fromto) {
! last unless defined $from;
! my $todir = dirname($to);
! push @m, "
! $to: $from $self->{MAKEFILE} $todir/.exists
! $self->{NOECHO}$self->{RM_F} $to
! $self->{CP} $from $to
! ";
! }
! join "", @m;
! }
!
! =item subdirs (o)
!
! Defines targets to process subdirectories.
!
! =cut
!
! sub subdirs {
! # --- Sub-directory Sections ---
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my(@m,$dir);
! # This method provides a mechanism to automatically deal with
! # subdirectories containing further Makefile.PL scripts.
! # It calls the subdir_x() method for each subdirectory.
! foreach $dir (@{$self->{DIR}}){
! push(@m, $self->subdir_x($dir));
! #### print "Including $dir subdirectory\n";
! }
! if (@m){
! unshift(@m, "
! # The default clean, realclean and test targets in this Makefile
! # have automatically been given entries for each subdir.
!
! ");
! } else {
! push(@m, "\n# none")
}
! join('',@m);
}
! =item subdir_x (o)
! Helper subroutine for subdirs
=cut
! sub subdir_x {
! my($self, $subdir) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my(@m);
! qq{
!
! subdirs ::
! $self->{NOECHO}-cd $subdir && \$(MAKE) all \$(PASTHRU)
!
! };
}
! =item clean (o)
! Defines the clean target.
=cut
! sub clean {
! # --- Cleanup and Distribution Sections ---
!
! my($self, %attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my(@m,$dir);
! push(@m, '
! # Delete temporary files but do not touch installed files. We don\'t delete
! # the Makefile here so a later make realclean still has a makefile to use.
!
! clean ::
! ');
! # clean subdirectories first
! for $dir (@{$self->{DIR}}) {
! push @m, "\t-cd $dir && test -f $self->{MAKEFILE} && \$(MAKE) clean\n";
}
-
- my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
- push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
- push(@otherfiles, qw[./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all
- perlmain.c mon.out core so_locations pm_to_blib
- *~ */*~ */*/*~ *$(OBJ_EXT) *$(LIB_EXT) perl.exe
- $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def
- $(BASEEXT).exp
- ]);
- push @m, "\t-$self->{RM_RF} @otherfiles\n";
- # See realclean and ext/utils/make_ext for usage of Makefile.old
- push(@m,
- "\t-$self->{MV} $self->{MAKEFILE} $self->{MAKEFILE}.old 2>/dev/null\n");
- push(@m,
- "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
- join("", @m);
}
! =item realclean (o)
! Defines the realclean target.
=cut
! sub realclean {
! my($self, %attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
}
! my(@m);
! push(@m,'
! # Delete temporary files (via clean) and also delete installed files
! realclean purge :: clean
! ');
! # realclean subdirectories first (already cleaned)
! my $sub = "\t-cd %s && test -f %s && \$(MAKE) %s realclean\n";
! foreach(@{$self->{DIR}}){
! push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
! push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
}
! push(@m, " $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
! push(@m, " $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
! # push(@m, " $self->{RM_F} \$(INST_STATIC) \$(INST_PM)\n");
! push(@m, " $self->{RM_F} \$(INST_STATIC)\n");
! my(@otherfiles) = ($self->{MAKEFILE},
! "$self->{MAKEFILE}.old"); # Makefiles last
! push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
! push(@m, " $self->{RM_RF} @otherfiles\n") if @otherfiles;
! push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
! join("", @m);
}
! =item dist_basics (o)
! Defines the targets distclean, distcheck, skipcheck, manifest.
=cut
! sub dist_basics {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my @m;
! push @m, q{
! distclean :: realclean distcheck
! };
! push @m, q{
! distcheck :
! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&fullcheck";' \\
! -e 'fullcheck();'
! };
! push @m, q{
! skipcheck :
! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&skipcheck";' \\
! -e 'skipcheck();'
! };
! push @m, q{
! manifest :
! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&mkmanifest";' \\
! -e 'mkmanifest();'
! };
! join "", @m;
}
- =item dist_core (o)
! Defeines the targets dist, tardist, zipdist, uutardist, shdist
=cut
! sub dist_core {
my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my @m;
! push @m, q{
! dist : $(DIST_DEFAULT)
! }.$self->{NOECHO}.q{$(PERL) -le 'print "Warning: Makefile possibly out of date with $$vf" if ' \
! -e '-e ($$vf="$(VERSION_FROM)") and -M $$vf < -M "}.$self->{MAKEFILE}.q{";'
! tardist : $(DISTVNAME).tar$(SUFFIX)
! zipdist : $(DISTVNAME).zip
! $(DISTVNAME).tar$(SUFFIX) : distdir
! $(PREOP)
! $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
! $(RM_RF) $(DISTVNAME)
! $(COMPRESS) $(DISTVNAME).tar
! $(POSTOP)
! $(DISTVNAME).zip : distdir
! $(PREOP)
! $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
! $(POSTOP)
! uutardist : $(DISTVNAME).tar$(SUFFIX)
! uuencode $(DISTVNAME).tar$(SUFFIX) \\
! $(DISTVNAME).tar$(SUFFIX) > \\
! $(DISTVNAME).tar$(SUFFIX)_uu
! shdist : distdir
! $(PREOP)
! $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
! $(RM_RF) $(DISTVNAME)
! $(POSTOP)
! };
! join "", @m;
}
! =item dist_dir (o)
! Defines the scratch directory target that will hold the distribution
! before tar-ing (or shar-ing).
=cut
! sub dist_dir {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my @m;
! push @m, q{
! distdir :
! $(RM_RF) $(DISTVNAME)
! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "/mani/";' \\
! -e 'manicopy(maniread(),"$(DISTVNAME)", "$(DIST_CP)");'
! };
! join "", @m;
}
! =item dist_test (o)
! Defines a target that produces the distribution in the
! scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
! subdirectory.
=cut
! sub dist_test {
my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my @m;
push @m, q{
! disttest : distdir
! cd $(DISTVNAME) && $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) Makefile.PL
! cd $(DISTVNAME) && $(MAKE)
! cd $(DISTVNAME) && $(MAKE) test
! };
! join "", @m;
}
! =item dist_ci (o)
! Defines a check in target for RCS.
=cut
! sub dist_ci {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my @m;
! push @m, q{
! ci :
! $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&maniread";' \\
! -e '@all = keys %{ maniread() };' \\
! -e 'print("Executing $(CI) @all\n"); system("$(CI) @all");' \\
! -e 'print("Executing $(RCS_LABEL) ...\n"); system("$(RCS_LABEL) @all");'
};
- join "", @m;
}
! =item install (o)
! Defines the install target.
=cut
! sub install {
! my($self, %attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my(@m);
! push @m, q{
! install :: all pure_install doc_install
! install_perl :: all pure_perl_install doc_perl_install
! install_site :: all pure_site_install doc_site_install
! install_ :: install_site
! @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
! pure_install :: pure_$(INSTALLDIRS)_install
! doc_install :: doc_$(INSTALLDIRS)_install
! }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
! pure__install : pure_site_install
! @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
! doc__install : doc_site_install
! @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
! pure_perl_install ::
! }.$self->{NOECHO}.q{$(MOD_INSTALL) \
! read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
! write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
! $(INST_LIB) $(INSTALLPRIVLIB) \
! $(INST_ARCHLIB) $(INSTALLARCHLIB) \
! $(INST_EXE) $(INSTALLBIN) \
! $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
! $(INST_MAN3DIR) $(INSTALLMAN3DIR)
! }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
! }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
! pure_site_install ::
! }.$self->{NOECHO}.q{$(MOD_INSTALL) \
! read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
! write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
! $(INST_LIB) $(INSTALLSITELIB) \
! $(INST_ARCHLIB) $(INSTALLSITEARCH) \
! $(INST_EXE) $(INSTALLBIN) \
! $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
! $(INST_MAN3DIR) $(INSTALLMAN3DIR)
! }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
! }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
! doc_perl_install ::
! }.$self->{NOECHO}.q{$(DOC_INSTALL) \
! "$(NAME)" \
! "installed into" "$(INSTALLPRIVLIB)" \
! LINKTYPE "$(LINKTYPE)" \
! VERSION "$(VERSION)" \
! EXE_FILES "$(EXE_FILES)" \
! >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
! doc_site_install ::
! }.$self->{NOECHO}.q{$(DOC_INSTALL) \
! "Module $(NAME)" \
! "installed into" "$(INSTALLSITELIB)" \
! LINKTYPE "$(LINKTYPE)" \
! VERSION "$(VERSION)" \
! EXE_FILES "$(EXE_FILES)" \
! >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
! };
! push @m, q{
! uninstall :: uninstall_from_$(INSTALLDIRS)dirs
! uninstall_from_perldirs ::
! }.$self->{NOECHO}.
! q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
! uninstall_from_sitedirs ::
! }.$self->{NOECHO}.
! q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
! };
! join("",@m);
}
! =item force (o)
! Just writes FORCE:
=cut
! sub force {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
}
! '# Phony target to force checking subdirectories.
! FORCE:
! ';
}
! =item perldepend (o)
! Defines the dependency from all *.h files that come with the perl
! distribution.
=cut
! sub perldepend {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my(@m);
! push(@m,'
! PERL_HDRS = $(PERL_INC)/EXTERN.h $(PERL_INC)/INTERN.h \
! $(PERL_INC)/XSUB.h $(PERL_INC)/av.h $(PERL_INC)/cop.h \
! $(PERL_INC)/cv.h $(PERL_INC)/dosish.h $(PERL_INC)/embed.h \
! $(PERL_INC)/form.h $(PERL_INC)/gv.h $(PERL_INC)/handy.h \
! $(PERL_INC)/hv.h $(PERL_INC)/keywords.h $(PERL_INC)/mg.h \
! $(PERL_INC)/op.h $(PERL_INC)/opcode.h $(PERL_INC)/patchlevel.h \
! $(PERL_INC)/perl.h $(PERL_INC)/perly.h $(PERL_INC)/pp.h \
! $(PERL_INC)/proto.h $(PERL_INC)/regcomp.h $(PERL_INC)/regexp.h \
! $(PERL_INC)/scope.h $(PERL_INC)/sv.h $(PERL_INC)/unixish.h \
! $(PERL_INC)/util.h $(PERL_INC)/config.h
! ');
! push @m, '
! $(OBJECT) : $(PERL_HDRS)
! ' if $self->{OBJECT};
! push(@m,'
! # Check for unpropogated config.sh changes. Should never happen.
! # We do NOT just update config.h because that is not sufficient.
! # An out of date config.h is not fatal but complains loudly!
! $(PERL_INC)/config.h: $(PERL_SRC)/config.sh
! -'.$self->{NOECHO}.'echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
! $(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
! '.$self->{NOECHO}.'echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
! cd $(PERL_SRC) && $(MAKE) lib/Config.pm
! ') if $self->{PERL_SRC};
! push(@m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n")
! if %{$self->{XS}};
! join("\n",@m);
}
! =item makefile (o)
! Defines how to rewrite the Makefile.
=cut
! sub makefile {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my @m;
! # We do not know what target was originally specified so we
! # must force a manual rerun to be sure. But as it should only
! # happen very rarely it is not a significant problem.
! push @m, '
! $(OBJECT) : $(FIRST_MAKEFILE)
! ' if $self->{OBJECT};
! push @m, q{
! # We take a very conservative approach here, but it\'s worth it.
! # We move Makefile to Makefile.old here to avoid gnu make looping.
! }.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP)
! }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?"
! }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..."
! -}.$self->{NOECHO}.q{mv }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
! -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean >/dev/null 2>&1 || true
! $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
! }.$self->{NOECHO}.q{echo ">>> Your Makefile has been rebuilt. <<<"
! }.$self->{NOECHO}.q{echo ">>> Please rerun the make command. <<<"; false
! # To change behavior to :: would be nice, but would break Tk b9.02
! # so you find such a warning below the dist target.
! #}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
! # }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
};
! join "", @m;
}
=item staticmake (o)
--- 2193,2625 ----
q[POD2MAN = $(PERL) -we '%m=@ARGV;for (keys %m){' \\
-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "].$self->{MAKEFILE}.q[";' \\
-e 'print "Manifying $$m{$$_}\n";' \\
! -e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
-e 'chmod 0644, $$m{$$_} or warn "chmod 644 $$m{$$_}: $$!\n";}'
];
push @m, "\nmanifypods : ";
push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
!
! push(@m,"\n");
! if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
! push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
! push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
}
! join('', @m);
}
! =item maybe_command
! Returns true, if the argument is likely to be a command.
=cut
! sub maybe_command {
! my($self,$file) = @_;
! return $file if -x $file && ! -d $file;
! return;
}
! =item maybe_command_in_dirs
! method under development. Not yet used. Ask Ilya :-)
=cut
! sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
! # Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
! my($self, $names, $dirs, $trace, $ver) = @_;
! my($name, $dir);
! foreach $dir (@$dirs){
! next unless defined $dir; # $self->{PERL_SRC} may be undefined
! foreach $name (@$names){
! my($abs,$tryabs);
! if ($self->file_name_is_absolute($name)) { # /foo/bar
! $abs = $name;
! } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar
! $abs = $self->catfile($dir, $name);
! } else { # foo/bar
! $abs = $self->catfile($self->curdir, $name);
! }
! print "Checking $abs for $name\n" if ($trace >= 2);
! next unless $tryabs = $self->maybe_command($abs);
! print "Substituting $tryabs instead of $abs\n"
! if ($trace >= 2 and $tryabs ne $abs);
! $abs = $tryabs;
! if (defined $ver) {
! print "Executing $abs\n" if ($trace >= 2);
! if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
! print "Using PERL=$abs\n" if $trace;
! return $abs;
! }
! } else { # Do not look for perl
! return $abs;
! }
! }
}
}
! =item needs_linking (o)
! Does this module need linking? Looks into subdirectory objects (see
! also has_link_code())
=cut
! sub needs_linking {
! my($self) = shift;
! my($child,$caller);
! $caller = (caller(0))[3];
! Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
! return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
! if ($self->has_link_code or $self->{MAKEAPERL}){
! $self->{NEEDS_LINKING} = 1;
! return 1;
}
! foreach $child (keys %{$self->{CHILDREN}}) {
! if ($self->{CHILDREN}->{$child}->needs_linking) {
! $self->{NEEDS_LINKING} = 1;
! return 1;
! }
}
! return $self->{NEEDS_LINKING} = 0;
}
! =item nicetext
! misnamed method (will have to be changed). The MM_Unix method just
! returns the argument without further processing.
!
! On VMS used to insure that colons marking targets are preceded by
! space - most Unix Makes don't need this, but it's necessary under VMS
! to distinguish the target delimiter from a colon appearing as part of
! a filespec.
=cut
! sub nicetext {
! my($self,$text) = @_;
! $text;
! }
! =item parse_version
! parse a file and return what you think is $VERSION in this file set to
! =cut
!
! sub parse_version {
! my($self,$parsefile) = @_;
! my $result;
! local *FH;
! local $/ = "\n";
! open(FH,$parsefile) or die "Could not open '$parsefile': $!";
! my $inpod = 0;
! while (<FH>) {
! $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
! next if $inpod;
! chop;
! next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
! local $ExtUtils::MakeMaker::module_version_variable = $1;
! my($thispackage) = $2 || $current_package;
! $thispackage =~ s/:+$//;
! my($eval) = "$_;";
! eval $eval;
! die "Could not eval '$eval' in $parsefile: $@" if $@;
! $result = $ {$ExtUtils::MakeMaker::module_version_variable} || 0;
! last;
! }
! close FH;
! return $result;
}
! =item pasthru (o)
!
! Defines the string that is passed to recursive make calls in
! subdirectories.
=cut
! sub pasthru {
my($self) = shift;
! my(@m,$key);
! my(@pasthru);
! foreach $key (qw(LIBPERL_A LINKTYPE PREFIX OPTIMIZE)){
! push @pasthru, "$key=\"\$($key)\"";
! }
! push @m, "\nPASTHRU = ", join ("\\\n\t", @pasthru), "\n";
! join "", @m;
! }
! =item path
! Takes no argument, returns the environment variable PATH as an array.
! =cut
!
! sub path {
! my($self) = @_;
! my $path_sep = $Is_OS2 ? ";" : ":";
! my $path = $ENV{PATH};
! $path =~ s:\\:/:g if $Is_OS2;
! my @path = split $path_sep, $path;
}
! =item perl_script
! Takes one argument, a file name, and returns the file name, if the
! argument is likely to be a perl script. On MM_Unix this is true for
! any ordinary, readable file.
=cut
! sub perl_script {
! my($self,$file) = @_;
! return $file if -r $file && -f _;
! return;
}
! =item perldepend (o)
! Defines the dependency from all *.h files that come with the perl
! distribution.
=cut
! sub perldepend {
my($self) = shift;
! my(@m);
! push @m, q{
! # Check for unpropogated config.sh changes. Should never happen.
! # We do NOT just update config.h because that is not sufficient.
! # An out of date config.h is not fatal but complains loudly!
! $(PERL_INC)/config.h: $(PERL_SRC)/config.sh
! -}.$self->{NOECHO}.q{echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
!
! $(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
! }.$self->{NOECHO}.q{echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
! cd $(PERL_SRC) && $(MAKE) lib/Config.pm
! } if $self->{PERL_SRC};
!
! return join "", @m unless $self->needs_linking;
!
push @m, q{
! PERL_HDRS = \
! $(PERL_INC)/EXTERN.h $(PERL_INC)/gv.h $(PERL_INC)/pp.h \
! $(PERL_INC)/INTERN.h $(PERL_INC)/handy.h $(PERL_INC)/proto.h \
! $(PERL_INC)/XSUB.h $(PERL_INC)/hv.h $(PERL_INC)/regcomp.h \
! $(PERL_INC)/av.h $(PERL_INC)/keywords.h $(PERL_INC)/regexp.h \
! $(PERL_INC)/config.h $(PERL_INC)/mg.h $(PERL_INC)/scope.h \
! $(PERL_INC)/cop.h $(PERL_INC)/op.h $(PERL_INC)/sv.h \
! $(PERL_INC)/cv.h $(PERL_INC)/opcode.h $(PERL_INC)/unixish.h \
! $(PERL_INC)/dosish.h $(PERL_INC)/patchlevel.h $(PERL_INC)/util.h \
! $(PERL_INC)/embed.h $(PERL_INC)/perl.h \
! $(PERL_INC)/form.h $(PERL_INC)/perly.h
!
! $(OBJECT) : $(PERL_HDRS)
! } if $self->{OBJECT};
!
! push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n" if %{$self->{XS}};
!
! join "\n", @m;
}
! =item pm_to_blib
! Defines target that copies all files in the hash PM to their
! destination and autosplits them. See L<ExtUtils::Install/pm_to_blib>
=cut
! sub pm_to_blib {
! my $self = shift;
! my($autodir) = $self->catdir('$(INST_LIB)','auto');
! return q{
! pm_to_blib: $(TO_INST_PM)
! }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
! "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
! -e 'pm_to_blib({qw{$(PM_TO_BLIB)}},"}.$autodir.q{")'
! }.$self->{NOECHO}.q{$(TOUCH) $@
};
}
! =item post_constants (o)
! Returns an empty string per default. Dedicated to overrides from
! within Makefile.PL after all constants have been defined.
=cut
! sub post_constants{
! my($self) = shift;
! "";
! }
! =item post_initialize (o)
! Returns an ampty string per default. Used in Makefile.PLs to add some
! chunk of text to the Makefile after the object is initialized.
! =cut
! sub post_initialize {
! my($self) = shift;
! "";
! }
! =item postamble (o)
! Returns an empty string. Can be used in Makefile.PLs to write some
! text to the Makefile at the end.
! =cut
! sub postamble {
! my($self) = shift;
! "";
! }
! =item prefixify
+ Check a path variable in $self from %Config, if it contains a prefix,
+ and replace it with another one.
! Takes as arguments an attribute name, a search prefix and a
! replacement prefix. Changes the attribute in the object.
! =cut
! sub prefixify {
! my($self,$var,$sprefix,$rprefix) = @_;
! $self->{uc $var} ||= $Config{lc $var};
! $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
! $self->{uc $var} =~ s/\Q$sprefix\E/$rprefix/;
! }
! =item processPL (o)
! Defines targets to run *.PL files.
! =cut
! sub processPL {
! my($self) = shift;
! return "" unless $self->{PL_FILES};
! my(@m, $plfile);
! foreach $plfile (sort keys %{$self->{PL_FILES}}) {
! push @m, "
! all :: $self->{PL_FILES}->{$plfile}
! $self->{PL_FILES}->{$plfile} :: $plfile
! \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile
! ";
! }
! join "", @m;
}
! =item realclean (o)
! Defines the realclean target.
=cut
! sub realclean {
! my($self, %attribs) = @_;
! my(@m);
! push(@m,'
! # Delete temporary files (via clean) and also delete installed files
! realclean purge :: clean
! ');
! # realclean subdirectories first (already cleaned)
! my $sub = "\t-cd %s && test -f %s && \$(MAKE) %s realclean\n";
! foreach(@{$self->{DIR}}){
! push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
! push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
}
! push(@m, " $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
! if( $self->has_link_code ){
! push(@m, " $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
! push(@m, " $self->{RM_F} \$(INST_STATIC)\n");
! }
! push(@m, " $self->{RM_F} " . join(" ", values %{$self->{PM}}) . "\n");
! my(@otherfiles) = ($self->{MAKEFILE},
! "$self->{MAKEFILE}.old"); # Makefiles last
! push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
! push(@m, " $self->{RM_RF} @otherfiles\n") if @otherfiles;
! push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
! join("", @m);
}
! =item replace_manpage_separator
! Takes the name of a package, which may be a nested package, in the
! form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
=cut
! sub replace_manpage_separator {
! my($self,$man) = @_;
! $man =~ s,/+,::,g;
! $man;
! }
! =item static (o)
! Defines the static target.
! =cut
! sub static {
! # --- Static Loading Sections ---
! my($self) = shift;
! '
! ## $(INST_PM) has been moved to the all: target.
! ## It remains here for awhile to allow for old usage: "make static"
! #static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
! static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
! '.$self->{NOECHO}.'$(NOOP)
! ';
}
! =item static_lib (o)
! Defines how to produce the *.a (or equivalent) files.
=cut
! sub static_lib {
! my($self) = @_;
! # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
! # return '' unless $self->needs_linking(); #might be because of a subdir
! return '' unless $self->has_link_code;
!
! my(@m);
! push(@m, <<'END');
! $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
! $(RM_RF) $@
! END
! # If this extension has it's own library (eg SDBM_File)
! # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
! push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
! push @m,
! q{ $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
! }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
! $(CHMOD) 755 $@
};
! # Old mechanism - still available:
!
! push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs}."\n\n"
! if $self->{PERL_SRC};
!
! push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
! join('', "\n",@m);
}
=item staticmake (o)
***************
*** 2840,2849 ****
sub staticmake {
my($self, %attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my(@static);
my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP}, $self->{INST_ARCHLIB});
--- 2630,2635 ----
***************
*** 2878,2883 ****
--- 2664,2715 ----
);
}
+ =item subdir_x (o)
+
+ Helper subroutine for subdirs
+
+ =cut
+
+ sub subdir_x {
+ my($self, $subdir) = @_;
+ my(@m);
+ qq{
+
+ subdirs ::
+ $self->{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU)
+
+ };
+ }
+
+ =item subdirs (o)
+
+ Defines targets to process subdirectories.
+
+ =cut
+
+ sub subdirs {
+ # --- Sub-directory Sections ---
+ my($self) = shift;
+ my(@m,$dir);
+ # This method provides a mechanism to automatically deal with
+ # subdirectories containing further Makefile.PL scripts.
+ # It calls the subdir_x() method for each subdirectory.
+ foreach $dir (@{$self->{DIR}}){
+ push(@m, $self->subdir_x($dir));
+ #### print "Including $dir subdirectory\n";
+ }
+ if (@m){
+ unshift(@m, "
+ # The default clean, realclean and test targets in this Makefile
+ # have automatically been given entries for each subdir.
+
+ ");
+ } else {
+ push(@m, "\n# none")
+ }
+ join('',@m);
+ }
+
=item test (o)
Defines the test targets.
***************
*** 2888,2905 ****
# --- Test and Installation Sections ---
my($self, %attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my($tests) = $attribs{TESTS} || (-d "t" ? "t/*.t" : "");
my(@m);
push(@m,"
TEST_VERBOSE=0
TEST_TYPE=test_\$(LINKTYPE)
- test :: \$(TEST_TYPE)
testdb :: testdb_\$(LINKTYPE)
");
push(@m, map("\t$self->{NOECHO}cd $_ && test -f $self->{MAKEFILE} && \$(MAKE) test \$(PASTHRU)\n",
@{$self->{DIR}}));
--- 2720,2736 ----
# --- Test and Installation Sections ---
my($self, %attribs) = @_;
my($tests) = $attribs{TESTS} || (-d "t" ? "t/*.t" : "");
my(@m);
push(@m,"
TEST_VERBOSE=0
TEST_TYPE=test_\$(LINKTYPE)
+ TEST_FILE = test.pl
+ TESTDB_SW = -d
testdb :: testdb_\$(LINKTYPE)
+
+ test :: \$(TEST_TYPE)
");
push(@m, map("\t$self->{NOECHO}cd $_ && test -f $self->{MAKEFILE} && \$(MAKE) test \$(PASTHRU)\n",
@{$self->{DIR}}));
***************
*** 2912,2922 ****
push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
push(@m, "\n");
! if (-f "test.pl") {
! push(@m, "testdb_dynamic :: pure_all\n");
! push(@m, $self->test_via_script('$(FULLPERL) -d', 'test.pl'));
! push(@m, "\n");
! }
# Occasionally we may face this degenerate target:
push @m, "test_ : test_dynamic\n\n";
--- 2743,2751 ----
push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
push(@m, "\n");
! push(@m, "testdb_dynamic :: pure_all\n");
! push(@m, $self->test_via_script('$(FULLPERL) $(TESTDB_SW)', '$(TEST_FILE)'));
! push(@m, "\n");
# Occasionally we may face this degenerate target:
push @m, "test_ : test_dynamic\n\n";
***************
*** 2926,2936 ****
push(@m, $self->test_via_harness('./$(MAP_TARGET)', $tests)) if $tests;
push(@m, $self->test_via_script('./$(MAP_TARGET)', 'test.pl')) if -f "test.pl";
push(@m, "\n");
! if (-f "test.pl") {
! push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
! push(@m, $self->test_via_script('./$(MAP_TARGET) -d', 'test.pl'));
! push(@m, "\n");
! }
} else {
push @m, "test_static :: test_dynamic\n";
push @m, "testdb_static :: testdb_dynamic\n";
--- 2755,2763 ----
push(@m, $self->test_via_harness('./$(MAP_TARGET)', $tests)) if $tests;
push(@m, $self->test_via_script('./$(MAP_TARGET)', 'test.pl')) if -f "test.pl";
push(@m, "\n");
! push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
! push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
! push(@m, "\n");
} else {
push @m, "test_static :: test_dynamic\n";
push @m, "testdb_static :: testdb_dynamic\n";
***************
*** 2946,2955 ****
sub test_via_harness {
my($self, $perl, $tests) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
"\tPERL_DL_NONLAZY=1 $perl".q! -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;' !."$tests\n";
}
--- 2773,2778 ----
***************
*** 2961,3261 ****
sub test_via_script {
my($self, $perl, $script) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
qq{\tPERL_DL_NONLAZY=1 $perl}.q{ -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) }.qq{$script
};
}
! =item postamble (o)
! Returns an empty string. Can be used in Makefile.PLs to write some
! text to the Makefile at the end.
=cut
! sub postamble {
! my($self) = shift;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! "";
}
! =item makeaperl (o)
! Called by staticmake. Defines how to write the Makefile to produce a
! static new perl.
=cut
! sub makeaperl {
! my($self, %attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
}
- my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
- @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
- my(@m);
- push @m, "
- # --- MakeMaker makeaperl section ---
- MAP_TARGET = $target
- FULLPERL = $self->{FULLPERL}
- ";
- return join '', @m if $self->{PARENT};
- my($dir) = join ":", @{$self->{DIR}};
! unless ($self->{MAKEAPERL}) {
! push @m, q{
! $(MAP_TARGET) :: $(MAKE_APERL_FILE)
! $(MAKE) -f $(MAKE_APERL_FILE) static $@
! $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
! }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
! }.$self->{NOECHO}.q{$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
! Makefile.PL DIR=}, $dir, q{ \
! MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
! MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
! push @m, map( " \\\n\t\t$_", @ARGV );
! push @m, "\n";
! return join '', @m;
! }
! my($cccmd, $linkcmd, $lperl);
! $cccmd = $self->const_cccmd($libperl);
! $cccmd =~ s/^CCCMD\s*=\s*//;
! $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
! $cccmd .= " $Config::Config{cccdlflags}" if ($Config::Config{d_shrplib});
! $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
! # The front matter of the linkcommand...
! $linkcmd = join ' ', "\$(CC)",
! grep($_, @Config{qw(large split ldflags ccdlflags)});
! $linkcmd =~ s/\s+/ /g;
! # Which *.a files could we make use of...
! local(%static);
! require File::Find;
! File::Find::find(sub {
! return unless m/\Q$self->{LIB_EXT}\E$/;
! return if m/^libperl/;
! # don't include the installed version of this extension. I
! # leave this line here, although it is not necessary anymore:
! # I patched minimod.PL instead, so that Miniperl.pm won't
! # enclude duplicates
! # Once the patch to minimod.PL is in the distribution, I can
! # drop it
! return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}$:;
! use Cwd 'cwd';
! $static{cwd() . "/" . $_}++;
! }, grep( -d $_, @{$searchdirs || []}) );
! # We trust that what has been handed in as argument, will be buildable
! $static = [] unless $static;
! @static{@{$static}} = (1) x @{$static};
! $extra = [] unless $extra && ref $extra eq 'ARRAY';
! for (sort keys %static) {
! next unless /\Q$self->{LIB_EXT}\E$/;
! $_ = dirname($_) . "/extralibs.ld";
! push @$extra, $_;
}
- grep(s/^/-I/, @{$perlinc || []});
-
- $target = "perl" unless $target;
- $tmp = "." unless $tmp;
-
- # MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
- # regenerate the Makefiles, MAP_STATIC and the dependencies for
- # extralibs.all are computed correctly
- push @m, "
- MAP_LINKCMD = $linkcmd
- MAP_PERLINC = @{$perlinc || []}
- MAP_STATIC = ",
- join(" \\\n\t", reverse sort keys %static), "
! MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib}
! ";
! if (defined $libperl) {
! ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
! }
! unless ($libperl && -f $lperl) { # Ilya's code...
! my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
! $libperl ||= "libperl$self->{LIB_EXT}";
! $libperl = "$dir/$libperl";
! $lperl ||= "libperl$self->{LIB_EXT}";
! $lperl = "$dir/$lperl";
! print STDOUT "Warning: $libperl not found
! If you're going to build a static perl binary, make sure perl is installed
! otherwise ignore this warning\n"
! unless (-f $lperl || defined($self->{PERL_SRC}));
}
! push @m, "
! MAP_LIBPERL = $libperl
! ";
! push @m, "
! \$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
! $self->{NOECHO}$self->{RM_F} \$\@
! $self->{NOECHO}\$(TOUCH) \$\@
! ";
! my $catfile;
! foreach $catfile (@$extra){
! push @m, "\tcat $catfile >> \$\@\n";
! }
! push @m, "
! \$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
! \$(MAP_LINKCMD) -o \$\@ $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
! $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
! $self->{NOECHO}echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
! $self->{NOECHO}echo 'To remove the intermediate files say'
! $self->{NOECHO}echo ' make -f $makefilename map_clean'
! $tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
! ";
! push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
! push @m, qq{
! $tmp/perlmain.c: $makefilename}, q{
! }.$self->{NOECHO}.q{echo Writing $@
! }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -e 'use ExtUtils::Miniperl; \\
! writemain(grep s#.*/auto/##, qw|$(MAP_STATIC)|)' > $@.tmp && mv $@.tmp $@
! };
! push @m, q{
! doc_inst_perl:
! }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
! }.$self->{NOECHO}.q{$(DOC_INSTALL) \
! "Perl binary $(MAP_TARGET)" \
! MAP_STATIC "$(MAP_STATIC)" \
! MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
! MAP_LIBPERL "$(MAP_LIBPERL)" \
! >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
! };
! push @m, qq{
! inst_perl: pure_inst_perl doc_inst_perl
! pure_inst_perl: \$(MAP_TARGET)
! $self->{CP} \$(MAP_TARGET) \$(INSTALLBIN)/\$(MAP_TARGET)
! clean :: map_clean
! map_clean :
! $self->{RM_F} $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
! };
! join '', @m;
}
! =item dir_target (o)
! Takes an array of directories that need to exist and returns a
! Makefile entry for a .exists file in these directories. Returns
! nothing, if the entry has already been processed. We're helpless
! though, if the same directory comes as $(FOO) _and_ as "bar". Both of
! them get an entry, that's why we use "::".
=cut
! sub dir_target {
! # --- Make-Directories section (internal method) ---
! # dir_target(@array) returns a Makefile entry for the file .exists in each
! # named directory. Returns nothing, if the entry has already been processed.
! # We're helpless though, if the same directory comes as $(FOO) _and_ as "bar".
! # Both of them get an entry, that's why we use "::". I chose '$(PERL)' as the
! # prerequisite, because there has to be one, something that doesn't change
! # too often :)
! my($self,@dirs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! my(@m,$dir);
! foreach $dir (@dirs) {
! my($src) = $self->catfile($self->{PERL_INC},'perl.h');
! my($targ) = $self->catfile($dir,'.exists');
! my($targdir) = $targ; # Necessary because catfile may have
! $targdir =~ s:/?.exists$::; # adapted syntax of $dir to target OS
! next if $self->{DIR_TARGET}{$self}{$targdir}++;
! push @m, qq{
! $targ :: $src
! $self->{NOECHO}\$(MKPATH) $targdir
! $self->{NOECHO}\$(EQUALIZE_TIMESTAMP) $src $targ
! };
! push(@m,qq{
! -$self->{NOECHO}\$(CHMOD) 755 $targdir
! }) unless $Is_VMS;
! }
! join "", @m;
! }
! =item needs_linking (o)
! Does this module need linking? Looks into subdirectory objects (see
! also has_link_code())
! =cut
! sub needs_linking {
! my($self) = shift;
! my($child,$caller);
! $caller = (caller(0))[3];
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse($caller);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
! return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
! if ($self->has_link_code or $self->{MAKEAPERL}){
! $self->{NEEDS_LINKING} = 1;
! return 1;
}
! foreach $child (keys %{$self->{CHILDREN}}) {
! if ($self->{CHILDREN}->{$child}->needs_linking) {
! $self->{NEEDS_LINKING} = 1;
! return 1;
! }
}
- return $self->{NEEDS_LINKING} = 0;
- }
! =item has_link_code
! Returns true if C, XS, MYEXTLIB or similar objects exist within this
! object that need a compiler. Does not descend into subdirectories as
! needs_linking() does.
! =cut
! sub has_link_code {
! my($self) = shift;
! return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
! if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
! $self->{HAS_LINK_CODE} = 1;
! return 1;
! }
! return $self->{HAS_LINK_CODE} = 0;
}
=item writedoc
--- 2784,3062 ----
sub test_via_script {
my($self, $perl, $script) = @_;
qq{\tPERL_DL_NONLAZY=1 $perl}.q{ -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) }.qq{$script
};
}
! =item tool_autosplit (o)
! Defines a simple perl call that runs autosplit. May be deprecated by
! pm_to_blib soon.
=cut
! sub tool_autosplit {
! # --- Tool Sections ---
!
! my($self, %attribs) = @_;
! my($asl) = "";
! $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
! q{
! # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
! AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
! };
}
! =item tools_other (o)
! Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
! the Makefile. Also defines the perl programs MKPATH,
! WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
=cut
! sub tools_other {
! my($self) = shift;
! my @m;
! my $bin_sh = $Config{sh} || '/bin/sh';
! push @m, qq{
! SHELL = $bin_sh
! };
!
! for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TOUCH UMASK_NULL / ) {
! push @m, "$_ = $self->{$_}\n";
}
! push @m, q{
! # The following is a portable way to say mkdir -p
! # To see which directories are created, change the if 0 to if 1
! MKPATH = $(PERL) -wle '$$"="/"; foreach $$p (@ARGV){' \\
! -e 'next if -d $$p; my(@p); foreach(split(/\//,$$p)){' \\
! -e 'push(@p,$$_); next if -d "@p/"; print "mkdir @p" if 0;' \\
! -e 'mkdir("@p",0777)||die $$! } } exit 0;'
! # This helps us to minimize the effect of the .exists files A yet
! # better solution would be to have a stable file in the perl
! # distribution with a timestamp of zero. But this solution doesn't
! # need any changes to the core distribution and works with older perls
! EQUALIZE_TIMESTAMP = $(PERL) -we 'open F, ">$$ARGV[1]"; close F;' \\
! -e 'utime ((stat("$$ARGV[0]"))[8,9], $$ARGV[1])'
! };
! return join "", @m if $self->{PARENT};
! push @m, q{
! # Here we warn users that an old packlist file was found somewhere,
! # and that they should call some uninstall routine
! WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
! -e 'print "WARNING: I have found an old package in\n";' \\
! -e 'print "\t$$ARGV[0].\n";' \\
! -e 'print "Please make sure the two installations are not conflicting\n";'
+ UNINST=0
+ VERBINST=1
+ MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
+ -e 'install({@ARGV},"$(VERBINST)",0,"$(UNINST)");'
! DOC_INSTALL = $(PERL) -e '$$\="\n\n";print "=head3 ", scalar(localtime), ": C<", shift, ">";' \
! -e 'print "=over 4";' \
! -e 'while (defined($$key = shift) and defined($$val = shift)){print "=item *";print "C<$$key: $$val>";}' \
! -e 'print "=back";'
+ UNINSTALL = $(PERL) -MExtUtils::Install \
+ -e 'uninstall($$ARGV[0],1);'
! };
! return join "", @m;
! }
! =item tool_xsubpp (o)
! Determines typemaps, xsubpp version, prototype behaviour.
! =cut
! sub tool_xsubpp {
! my($self) = shift;
! return "" unless $self->needs_linking;
! my($xsdir) = $self->catdir($self->{PERL_LIB},"ExtUtils");
! my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
! if( $self->{TYPEMAPS} ){
! my $typemap;
! foreach $typemap (@{$self->{TYPEMAPS}}){
! if( ! -f $typemap ){
! warn "Typemap $typemap not found.\n";
! }
! else{
! push(@tmdeps, $typemap);
! }
! }
! }
! push(@tmdeps, "typemap") if -f "typemap";
! my(@tmargs) = map("-typemap $_", @tmdeps);
! if( exists $self->{XSOPT} ){
! unshift( @tmargs, $self->{XSOPT} );
}
! my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,"xsubpp"));
! # What are the correct thresholds for version 1 && 2 Paul?
! if ( $xsubpp_version > 1.923 ){
! $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
! } else {
! if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
! print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
! Your version of xsubpp is $xsubpp_version and cannot handle this.
! Please upgrade to a more recent version of xsubpp.
! };
! } else {
! $self->{XSPROTOARG} = "";
! }
}
! return qq{
! XSUBPPDIR = $xsdir
! XSUBPP = \$(XSUBPPDIR)/xsubpp
! XSPROTOARG = $self->{XSPROTOARG}
! XSUBPPDEPS = @tmdeps
! XSUBPPARGS = @tmargs
! };
! };
! sub xsubpp_version
! {
! my($self,$xsubpp) = @_;
! return $Xsubpp_Version if defined $Xsubpp_Version; # global variable
! my ($version) ;
! # try to figure out the version number of the xsubpp on the system
! # first try the -v flag, introduced in 1.921 & 2.000a2
! return "" unless $self->needs_linking;
! my $command = "$self->{PERL} -I$self->{PERL_LIB} $xsubpp -v 2>&1";
! print "Running $command\n" if $Verbose >= 2;
! $version = `$command` ;
! warn "Running '$command' exits with status " . ($?>>8) if $?;
! chop $version ;
! return $Xsubpp_Version = $1 if $version =~ /^xsubpp version (.*)/ ;
! # nope, then try something else
! my $counter = '000';
! my ($file) = 'temp' ;
! $counter++ while -e "$file$counter"; # don't overwrite anything
! $file .= $counter;
! open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
! print F <<EOM ;
! MODULE = fred PACKAGE = fred
! int
! fred(a)
! int a;
! EOM
! close F ;
! $command = "$self->{PERL} $xsubpp $file 2>&1";
! print "Running $command\n" if $Verbose >= 2;
! my $text = `$command` ;
! warn "Running '$command' exits with status " . ($?>>8) if $?;
! unlink $file ;
!
! # gets 1.2 -> 1.92 and 2.000a1
! return $Xsubpp_Version = $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
!
! # it is either 1.0 or 1.1
! return $Xsubpp_Version = 1.1 if $text =~ /^Warning: ignored semicolon/ ;
!
! # none of the above, so 1.0
! return $Xsubpp_Version = "1.0" ;
}
! =item top_targets (o)
! Defines the targets all, subdirs, config, and O_FILES
=cut
! sub top_targets {
! # --- Target Sections ---
! my($self) = shift;
! my(@m);
! push @m, '
! #all :: config $(INST_PM) subdirs linkext manifypods
! all :: pure_all manifypods
! '.$self->{NOECHO}.'$(NOOP)
! pure_all :: config pm_to_blib subdirs linkext
! '.$self->{NOECHO}.'$(NOOP)
! subdirs :: $(MYEXTLIB)
! '.$self->{NOECHO}.'$(NOOP)
! config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)/.exists
! '.$self->{NOECHO}.'$(NOOP)
!
! config :: $(INST_ARCHAUTODIR)/.exists
! '.$self->{NOECHO}.'$(NOOP)
!
! config :: $(INST_AUTODIR)/.exists
! '.$self->{NOECHO}.'$(NOOP)
! ';
!
! push @m, qq{
! config :: Version_check
! $self->{NOECHO}\$(NOOP)
!
! } unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
!
! push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
!
! if (%{$self->{MAN1PODS}}) {
! push @m, qq[
! config :: \$(INST_MAN1DIR)/.exists
! $self->{NOECHO}\$(NOOP)
!
! ];
! push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
}
! if (%{$self->{MAN3PODS}}) {
! push @m, qq[
! config :: \$(INST_MAN3DIR)/.exists
! $self->{NOECHO}\$(NOOP)
!
! ];
! push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
}
! push @m, '
! $(O_FILES): $(H_FILES)
! ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
! push @m, q{
! help:
! perldoc ExtUtils::MakeMaker
! };
! push @m, q{
! Version_check:
! }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
! -MExtUtils::MakeMaker=Version_check \
! -e 'Version_check("$(MM_VERSION)")'
! };
! join('',@m);
}
=item writedoc
***************
*** 3267,3280 ****
sub writedoc {
# --- perllocal.pod section ---
my($self,$what,$name,@attribs)=@_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my $time = localtime;
print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
print join "\n\n=item *\n\n", map("C<$_>",@attribs);
print "\n\n=back\n\n";
}
1;
--- 3068,3109 ----
sub writedoc {
# --- perllocal.pod section ---
my($self,$what,$name,@attribs)=@_;
my $time = localtime;
print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
print join "\n\n=item *\n\n", map("C<$_>",@attribs);
print "\n\n=back\n\n";
+ }
+
+ =item xs_c (o)
+
+ Defines the suffix rules to compile XS files to C.
+
+ =cut
+
+ sub xs_c {
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+ .xs.c:
+ $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >$*.tc && mv $*.tc $@
+ ';
+ }
+
+ =item xs_o (o)
+
+ Defines suffix rules to go from XS to object files directly. This is
+ only intended for broken make implementations.
+
+ =cut
+
+ sub xs_o { # many makes are too dumb to use xs_c then c_o
+ my($self) = shift;
+ return '' unless $self->needs_linking();
+ '
+ .xs$(OBJ_EXT):
+ $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && mv xstmp.c $*.c
+ $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
+ ';
}
1;
#: lib/ExtUtils/MM_VMS.pm
#: Update to MakeMaker 5.34
diff -crN perl5.002_01/lib/ExtUtils/MM_VMS.pm perl5.003/lib/ExtUtils/MM_VMS.pm
*** perl5.002_01/lib/ExtUtils/MM_VMS.pm Mon Mar 25 01:04:31 1996
--- perl5.003/lib/ExtUtils/MM_VMS.pm Mon Jun 24 17:56:22 1996
***************
*** 6,12 ****
# Author: Charles Bailey bailey@genetics.upenn.edu
package ExtUtils::MM_VMS;
! $ExtUtils::MM_VMS::Revision=$ExtUtils::MM_VMS::Revision = '5.26 (17-Mar-1996)';
unshift @MM::ISA, 'ExtUtils::MM_VMS';
use Config;
--- 6,12 ----
# Author: Charles Bailey bailey@genetics.upenn.edu
package ExtUtils::MM_VMS;
! $ExtUtils::MM_VMS::Revision=$ExtUtils::MM_VMS::Revision = '5.35 (23-Jun-1996)';
unshift @MM::ISA, 'ExtUtils::MM_VMS';
use Config;
***************
*** 42,51 ****
sub eliminate_macros {
my($self,$path) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
unless ($path) {
print "eliminate_macros('') = ||\n" if $Verbose >= 3;
return '';
--- 42,47 ----
***************
*** 81,90 ****
sub fixpath {
my($self,$path,$force_path) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
unless ($path) {
print "eliminate_macros('') = ||\n" if $Verbose >= 3;
return '';
--- 77,82 ----
***************
*** 123,132 ****
sub catdir {
my($self,@dirs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my($dir) = pop @dirs;
@dirs = grep($_,@dirs);
my($rslt);
--- 115,120 ----
***************
*** 151,160 ****
sub catfile {
my($self,@files) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my($file) = pop @files;
@files = grep($_,@files);
my($rslt);
--- 139,144 ----
***************
*** 173,178 ****
--- 157,192 ----
$rslt;
}
+ =item curdir (override)
+
+ Returns a string representing of the current directory.
+
+ =cut
+
+ sub curdir {
+ return '[]';
+ }
+
+ =item rootdir (override)
+
+ Returns a string representing of the root directory.
+
+ =cut
+
+ sub rootdir {
+ return '';
+ }
+
+ =item updir (override)
+
+ Returns a string representing of the parent directory.
+
+ =cut
+
+ sub updir {
+ return '[-]';
+ }
+
package ExtUtils::MM_VMS;
sub ExtUtils::MM_VMS::guess_name;
***************
*** 226,235 ****
sub AUTOLOAD {
my $code;
if (defined fileno(DATA)) {
! while (<DATA>) {
! last if /^__END__/;
! $code .= $_;
! }
close DATA;
eval $code;
if ($@) {
--- 240,251 ----
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 ($@) {
***************
*** 245,251 ****
1;
! __DATA__
=head2 SelfLoaded methods
--- 261,267 ----
1;
! #__DATA__
=head2 SelfLoaded methods
***************
*** 268,285 ****
sub guess_name {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my($defname,$defpm);
local *PM;
! $defname = $ENV{'DEFAULT'};
! $defname =~ s:.*?([^.\]]+)\]:$1:
! unless ($defname =~ s:.*[.\[]ext\.(.*)\]:$1:i);
! $defname =~ s#[.\]]#::#g;
! ($defpm = $defname) =~ s/.*:://;
if (open(PM,"${defpm}.pm")){
while (<PM>) {
if (/^\s*package\s+([^;]+)/i) {
--- 284,295 ----
sub guess_name {
my($self) = @_;
my($defname,$defpm);
local *PM;
! $defname = basename(fileify($ENV{'DEFAULT'}));
! $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
! $defpm = $defname;
if (open(PM,"${defpm}.pm")){
while (<PM>) {
if (/^\s*package\s+([^;]+)/i) {
***************
*** 296,302 ****
print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
"defaulting package name to $defname\n";
}
! $defname =~ s#[\-_][\d.\-]+$##;
$defname;
}
--- 306,312 ----
print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
"defaulting package name to $defname\n";
}
! $defname =~ s#[\d.\-_]+$##;
$defname;
}
***************
*** 309,318 ****
sub find_perl{
my($self, $ver, $names, $dirs, $trace) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
# Check in relative directories first, so we pick up the current
# version of Perl if we're running MakeMaker as part of the main build.
--- 319,324 ----
***************
*** 344,349 ****
--- 350,356 ----
foreach $name (@cand) {
print "Checking $name\n" if ($trace >= 2);
next unless $vmsfile = $self->maybe_command($name);
+ $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
print "Executing $vmsfile\n" if ($trace >= 2);
if (`MCR $vmsfile -e "require $ver; print ""VER_OK\n"""` =~ /VER_OK/) {
print "Using PERL=MCR $vmsfile\n" if $trace;
***************
*** 475,484 ****
sub init_others {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
$self->{NOOP} = "\t@ Continue";
$self->{FIRST_MAKEFILE} ||= 'Descrip.MMS';
--- 482,487 ----
***************
*** 505,514 ****
sub constants {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my(@m,$def,$macro);
if ($self->{DEFINE} ne '') {
--- 508,513 ----
***************
*** 543,552 ****
$self->{ROOTEXT} = $self->{ROOTEXT} ? $self->fixpath($self->{ROOTEXT},1)
: '[]';
foreach $macro ( qw [
! INST_LIB INST_ARCHLIB INST_EXE INSTALLPRIVLIB INSTALLARCHLIB
! INSTALLBIN PERL_LIB PERL_ARCHLIB PERL_INC PERL_SRC FULLEXT
! INST_MAN1DIR INSTALLMAN1DIR INST_MAN3DIR INSTALLMAN3DIR
! INSTALLSITELIB INSTALLSITEARCH SITELIBEXP SITEARCHEXP ] ) {
next unless defined $self->{$macro};
$self->{$macro} = $self->fixpath($self->{$macro},1);
}
--- 542,552 ----
$self->{ROOTEXT} = $self->{ROOTEXT} ? $self->fixpath($self->{ROOTEXT},1)
: '[]';
foreach $macro ( qw [
! INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INST_EXE INSTALLPRIVLIB
! INSTALLARCHLIB INSTALLSCRIPT INSTALLBIN PERL_LIB PERL_ARCHLIB
! PERL_INC PERL_SRC FULLEXT INST_MAN1DIR INSTALLMAN1DIR
! INST_MAN3DIR INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH
! SITELIBEXP SITEARCHEXP ] ) {
next unless defined $self->{$macro};
$self->{$macro} = $self->fixpath($self->{$macro},1);
}
***************
*** 561,576 ****
$self->{$macro} = $self->fixpath($self->{$macro});
}
! for $tmp (qw/
AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
! INST_LIB INST_ARCHLIB INST_EXE PREFIX INSTALLDIRS INSTALLPRIVLIB
! INSTALLARCHLIB INSTALLSITELIB INSTALLSITEARCH INSTALLBIN PERL_LIB
PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
PERL_INC PERL FULLPERL
/ ) {
! next unless defined $self->{$tmp};
! push @m, "$tmp = $self->{$tmp}\n";
}
--- 561,577 ----
$self->{$macro} = $self->fixpath($self->{$macro});
}
! foreach $macro (qw/
AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
! INST_BIN INST_EXE INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX
! INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
! INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
PERL_INC PERL FULLPERL
/ ) {
! next unless defined $self->{$macro};
! push @m, "$macro = $self->{$macro}\n";
}
***************
*** 587,604 ****
# 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)
# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
];
for $tmp (qw/
! FULLEXT BASEEXT ROOTEXT DLBASE VERSION_FROM INC DEFINE OBJECT
LDFROM LINKTYPE
/ ) {
next unless defined $self->{$tmp};
push @m, "$tmp = $self->{$tmp}\n";
}
push @m,'
# Handy lists of source code files:
--- 588,623 ----
# FULLEXT = Pathname for extension directory (eg DBD/Oracle).
# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
! # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
];
for $tmp (qw/
! FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
LDFROM LINKTYPE
/ ) {
next unless defined $self->{$tmp};
push @m, "$tmp = $self->{$tmp}\n";
}
+ for $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
+ next unless defined $self->{$tmp};
+ my(%tmp,$key);
+ for $key (keys %{$self->{$tmp}}) {
+ $tmp{$self->fixpath($key)} = $self->fixpath($self->{$tmp}{$key});
+ }
+ $self->{$tmp} = \%tmp;
+ }
+
+ for $tmp (qw/ C O_FILES H /) {
+ next unless defined $self->{$tmp};
+ my(@tmp,$val);
+ for $val (@{$self->{$tmp}}) {
+ push(@tmp,$self->fixpath($val));
+ }
+ $self->{$tmp} = \@tmp;
+ }
+
push @m,'
# Handy lists of source code files:
***************
*** 619,625 ****
}
push @m,"
! .SUFFIXES : .xs .c .cpp .cxx \$(OBJ_EXT)
# Here is the Config.pm that we are using/depend on
CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
--- 638,644 ----
}
push @m,"
! .SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
# Here is the Config.pm that we are using/depend on
CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
***************
*** 648,655 ****
';
}
! $self->{TO_INST_PM} = [ map($self->fixpath($_),sort keys %{$self->{PM}}) ];
! $self->{PM_TO_BLIB} = [ map($self->fixpath($_),%{$self->{PM}}) ];
push @m,'
TO_INST_PM = ',join(', ',@{$self->{TO_INST_PM}}),'
--- 667,674 ----
';
}
! $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
! $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
push @m,'
TO_INST_PM = ',join(', ',@{$self->{TO_INST_PM}}),'
***************
*** 669,678 ****
sub const_loadlibs{
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my (@m);
push @m, "
# $self->{NAME} might depend on some other libraries.
--- 688,693 ----
***************
*** 726,735 ****
sub cflags {
my($self,$libperl) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my($quals) = $Config{'ccflags'};
my($name,$sys,@m);
my($optimize) = '/Optimize';
--- 741,746 ----
***************
*** 796,805 ****
sub const_cccmd {
my($self,$libperl) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my(@m);
return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
--- 807,812 ----
***************
*** 839,848 ****
sub pm_to_blib {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my($line,$from,$to,@m);
my($autodir) = $self->catdir('$(INST_LIB)','auto');
my(@files) = @{$self->{PM_TO_BLIB}};
--- 846,851 ----
***************
*** 861,866 ****
--- 864,870 ----
$line = '';
}
}
+ push(@m,"\t$self->{NOECHO}\$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[')" <.MM_tmp]);
push(@m,qq[
***************
*** 879,888 ****
sub tool_autosplit{
my($self, %attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my($asl) = "";
$asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
q{
--- 883,888 ----
***************
*** 897,908 ****
=cut
! sub tool_xsubpp{
my($self) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils');
# drop back to old location if xsubpp is not in new location yet
$xsdir = $self->catdir($self->{PERL_SRC},'ext') unless (-f $self->catfile($xsdir,'xsubpp'));
--- 897,905 ----
=cut
! sub tool_xsubpp {
my($self) = @_;
! return '' unless $self->needs_linking;
my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils');
# drop back to old location if xsubpp is not in new location yet
$xsdir = $self->catdir($self->{PERL_SRC},'ext') unless (-f $self->catfile($xsdir,'xsubpp'));
***************
*** 960,965 ****
--- 957,963 ----
{
my($self,$xsubpp) = @_;
my ($version) ;
+ return '' unless $self->needs_linking;
# try to figure out the version number of the xsubpp on the system
***************
*** 1021,1030 ****
sub tools_other {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
qq!
# Assumes \$(MMS) invokes MMS or MMK
# (It is assumed in some cases later that the default makefile name
--- 1019,1024 ----
***************
*** 1041,1052 ****
RM_F = $self->{RM_F}
RM_RF = $self->{RM_RF}
UMASK_NULL = $self->{UMASK_NULL}
MKPATH = Create/Directory
EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
!. ($self->{PARENT} ? '' :
! q!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
! DOC_INSTALL = \$(PERL) -e "@ARGV=split('|',<STDIN>);print '=head3 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];while(\$key=shift && \$val=shift){print qq[=item *\\n\\nC<\$key: \$val>\\n\\n];}print qq[=back\\n\\n]"
UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1);"
!);
}
--- 1035,1047 ----
RM_F = $self->{RM_F}
RM_RF = $self->{RM_RF}
UMASK_NULL = $self->{UMASK_NULL}
+ NOOP = $self->{NOOP}
MKPATH = Create/Directory
EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
!. ($self->{PARENT} ? '' :
! qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
! DOC_INSTALL = \$(PERL) -e "\@ARGV=split('|',<STDIN>);print '=head3 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];while(\$key=shift && \$val=shift){print qq[=item *\\n\\nC<\$key: \$val>\\n\\n];}print qq[=back\\n\\n]"
UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1);"
!);
}
***************
*** 1060,1069 ****
sub dist {
my($self, %attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
$attribs{ZIPFLAGS} ||= '-Vu';
$attribs{COMPRESS} ||= 'gzip';
$attribs{SUFFIX} ||= '-gz';
--- 1055,1061 ----
sub dist {
my($self, %attribs) = @_;
! $attribs{VERSION} ||= $self->{VERSION_SYM};
$attribs{ZIPFLAGS} ||= '-Vu';
$attribs{COMPRESS} ||= 'gzip';
$attribs{SUFFIX} ||= '-gz';
***************
*** 1082,1091 ****
sub c_o {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
return '' unless $self->needs_linking();
'
.c$(OBJ_EXT) :
--- 1074,1079 ----
***************
*** 1108,1117 ****
sub xs_c {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
return '' unless $self->needs_linking();
'
.xs.c :
--- 1096,1101 ----
***************
*** 1127,1136 ****
sub xs_o { # many makes are too dumb to use xs_c then c_o
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
return '' unless $self->needs_linking();
'
.xs$(OBJ_EXT) :
--- 1111,1116 ----
***************
*** 1147,1156 ****
sub top_targets {
my($self) = shift;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my(@m);
push @m, '
all :: pure_all manifypods
--- 1127,1132 ----
***************
*** 1223,1232 ****
sub dlsyms {
my($self,%attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
return '' unless $self->needs_linking();
--- 1199,1204 ----
***************
*** 1285,1294 ****
sub dynamic_lib {
my($self, %attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
return '' unless $self->needs_linking(); #might be because of a subdir
return '' unless $self->has_link_code();
--- 1257,1262 ----
***************
*** 1320,1329 ****
sub dynamic_bs {
my($self, %attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
return '
BOOTSTRAP =
' unless $self->has_link_code();
--- 1288,1293 ----
***************
*** 1353,1362 ****
sub static_lib {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
return '' unless $self->needs_linking();
return '
--- 1317,1322 ----
***************
*** 1387,1396 ****
# sub installpm_x { # called by installpm perl file
# my($self, $dist, $inst, $splitlib) = @_;
- # unless (ref $self){
- # ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- # $self = $ExtUtils::MakeMaker::Parent[-1];
- # }
# if ($inst =~ m!#!) {
# warn "Warning: MM[SK] would have problems processing this file: $inst, SKIPPED\n";
# return '';
--- 1347,1352 ----
***************
*** 1421,1439 ****
=cut
sub manifypods {
my($self, %attribs) = @_;
! unless (ref $self){
! ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
! $self = $ExtUtils::MakeMaker::Parent[-1];
! }
! return "\nmanifypods :\n\t\$(NOOP)\n" unless %{$self->{MAN3PODS}};
my($dist);
! my($pod2man_exe,$found_pod2man);
if (defined $self->{PERL_SRC}) {
$pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
} else {
! $pod2man_exe = $self->catfile($Config{bin},'pod2man');
}
if ($pod2man_exe = $self->perl_script($pod2man_exe)) { $found_pod2man = 1; }
else {
--- 1377,1392 ----
=cut
+
sub manifypods {
my($self, %attribs) = @_;
! return "\nmanifypods :\n\t\$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
my($dist);
! my($pod2man_exe);
if (defined $self->{PERL_SRC}) {
$pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
} else {
! $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
}
if ($pod2man_exe = $self->perl_script($pod2man_exe)) { $found_pod2man = 1; }
else {
***************
*** 1478,1487 ****
sub processPL {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
return "" unless $self->{PL_FILES};
my(@m, $plfile);
foreach $plfile (sort keys %{$self->{PL_FILES}}) {
--- 1431,1436 ----
***************
*** 1506,1520 ****
sub installbin {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
return '' unless @{$self->{EXE_FILES}};
my(@m, $from, $to, %fromto, @to, $line);
for $from (@{$self->{EXE_FILES}}) {
! my($path) = '$(INST_EXE)' . basename($from);
local($_) = $path; # backward compatibility
$to = $self->libscan($path);
print "libscan($from) => '$to'\n" if ($Verbose >=2);
--- 1455,1465 ----
sub installbin {
my($self) = @_;
return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
return '' unless @{$self->{EXE_FILES}};
my(@m, $from, $to, %fromto, @to, $line);
for $from (@{$self->{EXE_FILES}}) {
! my($path) = '$(INST_SCRIPT)' . basename($from);
local($_) = $path; # backward compatibility
$to = $self->libscan($path);
print "libscan($from) => '$to'\n" if ($Verbose >=2);
***************
*** 1537,1543 ****
}
else { $line .= " $to"; }
}
! push @m, "\t\$(RM_F) $line\n\n";
while (($from,$to) = each %fromto) {
last unless defined $from;
--- 1482,1488 ----
}
else { $line .= " $to"; }
}
! push @m, "\t\$(RM_F) $line\n\n" if $line;
while (($from,$to) = each %fromto) {
last unless defined $from;
***************
*** 1562,1571 ****
sub subdir_x {
my($self, $subdir) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my(@m,$key);
$subdir = $self->fixpath($subdir,1);
push @m, '
--- 1507,1512 ----
***************
*** 1589,1598 ****
sub clean {
my($self, %attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my(@m,$dir);
push @m, '
# Delete temporary files but do not touch installed files. We don\'t delete
--- 1530,1535 ----
***************
*** 1621,1627 ****
}
else { $line .= " $file"; }
}
! push @m, "\t\$(RM_RF) $line\n\n";
push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
join('', @m);
}
--- 1558,1564 ----
}
else { $line .= " $file"; }
}
! push @m, "\t\$(RM_RF) $line\n" if line;
push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
join('', @m);
}
***************
*** 1634,1643 ****
sub realclean {
my($self, %attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my(@m);
push(@m,'
# Delete temporary files (via clean) and also delete installed files
--- 1571,1576 ----
***************
*** 1655,1661 ****
# combination of macros). In order to stay below DCL's 255 char limit,
# we put only 2 on a line.
my($file,$line,$fcnt);
! my(@files) = qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) $(MAKEFILE) $(MAKEFILE)_old };
push(@files, values %{$self->{PM}});
$line = ''; #avoid unitialized var warning
foreach $file (@files) {
--- 1588,1597 ----
# combination of macros). In order to stay below DCL's 255 char limit,
# we put only 2 on a line.
my($file,$line,$fcnt);
! my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
! if ($self->has_link_code) {
! push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
! }
push(@files, values %{$self->{PM}});
$line = ''; #avoid unitialized var warning
foreach $file (@files) {
***************
*** 1667,1673 ****
}
else { $line .= " $file"; }
}
! push @m, "\t\$(RM_F) $line\n";
if ($attribs{FILES} && ref $attribs{FILES} eq 'ARRAY') {
$line = '';
foreach $file (@{$attribs{'FILES'}}) {
--- 1603,1609 ----
}
else { $line .= " $file"; }
}
! push @m, "\t\$(RM_F) $line\n" if $line;
if ($attribs{FILES} && ref $attribs{FILES} eq 'ARRAY') {
$line = '';
foreach $file (@{$attribs{'FILES'}}) {
***************
*** 1678,1684 ****
}
else { $line .= " $file"; }
}
! push @m, "\t\$(RM_RF) $line\n";
}
push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
join('', @m);
--- 1614,1620 ----
}
else { $line .= " $file"; }
}
! push @m, "\t\$(RM_RF) $line\n" if $line;
}
push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
join('', @m);
***************
*** 1692,1701 ****
sub dist_basics {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
'
distclean :: realclean distcheck
$(NOOP)
--- 1628,1633 ----
***************
*** 1711,1717 ****
';
}
! =sub dist_core (override)
Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
so C<shdist> target actions are VMS-specific.
--- 1643,1649 ----
';
}
! =item dist_core (override)
Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
so C<shdist> target actions are VMS-specific.
***************
*** 1720,1729 ****
sub dist_core {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
q[
dist : $(DIST_DEFAULT)
].$self->{NOECHO}.q[$(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)'"
--- 1652,1657 ----
***************
*** 1737,1742 ****
--- 1665,1678 ----
$(RM_RF) $(DISTVNAME)
$(POSTOP)
+ $(DISTVNAME).tar$(SUFFIX) : distdir
+ $(PREOP)
+ $(TO_UNIX)
+ $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar $(SRC)
+ $(RM_RF) $(DISTVNAME)
+ $(COMPRESS) $(DISTVNAME).tar
+ $(POSTOP)
+
shdist : distdir
$(PREOP)
$(SHARE) $(SRC) $(DISTVNAME).share
***************
*** 1753,1762 ****
sub dist_dir {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
q{
distdir :
$(RM_RF) $(DISTVNAME)
--- 1689,1694 ----
***************
*** 1774,1783 ****
sub dist_test {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
q{
disttest : distdir
startdir = F$Environment("Default")
--- 1706,1711 ----
***************
*** 1800,1809 ****
sub install {
my($self, %attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my(@m,@docfiles);
if ($self->{EXE_FILES}) {
--- 1728,1733 ----
***************
*** 1849,1855 ****
].$self->{NOECHO}.q[$(PERL) -e "print 'write ].$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
! ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_EXE) $(INSTALLBIN) '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
$(MOD_INSTALL) <.MM_tmp
--- 1773,1780 ----
].$self->{NOECHO}.q[$(PERL) -e "print 'write ].$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
! ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
! ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
$(MOD_INSTALL) <.MM_tmp
***************
*** 1862,1868 ****
].$self->{NOECHO}.q[$(PERL) -e "print 'write ].$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
! ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_EXE) $(INSTALLBIN) '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
$(MOD_INSTALL) <.MM_tmp
--- 1787,1794 ----
].$self->{NOECHO}.q[$(PERL) -e "print 'write ].$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
! ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
! ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
$(MOD_INSTALL) <.MM_tmp
***************
*** 1912,1921 ****
sub perldepend {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my(@m);
push @m, '
--- 1838,1843 ----
***************
*** 1970,1979 ****
sub makefile {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my(@m,@cmd);
# We do not know what target was originally specified so we
# must force a manual rerun to be sure. But as it should only
--- 1892,1897 ----
***************
*** 2006,2020 ****
sub test {
my($self, %attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
my(@m);
push @m,"
TEST_VERBOSE = 0
TEST_TYPE = test_\$(LINKTYPE)
test :: \$(TEST_TYPE)
\$(NOOP)
--- 1924,1936 ----
sub test {
my($self, %attribs) = @_;
my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
my(@m);
push @m,"
TEST_VERBOSE = 0
TEST_TYPE = test_\$(LINKTYPE)
+ TEST_FILE = test.pl
+ TESTDB_SW = -d
test :: \$(TEST_TYPE)
\$(NOOP)
***************
*** 2038,2048 ****
push(@m, " \$(NOOP)\n") if (!$tests && ! -f "test.pl");
push(@m, "\n");
! if (-f 'test.pl') {
! push(@m, "testdb_dynamic :: pure_all\n");
! push(@m, $self->test_via_script('$(FULLPERL) -d', 'test.pl'));
! push(@m, "\n");
! }
# Occasionally we may face this degenerate target:
push @m, "test_ : test_dynamic\n\n";
--- 1954,1962 ----
push(@m, " \$(NOOP)\n") if (!$tests && ! -f "test.pl");
push(@m, "\n");
! push(@m, "testdb_dynamic :: pure_all\n");
! push(@m, $self->test_via_script('$(FULLPERL) "$(TESTDB_SW)"', '$(TEST_FILE)'));
! push(@m, "\n");
# Occasionally we may face this degenerate target:
push @m, "test_ : test_dynamic\n\n";
***************
*** 2050,2062 ****
if ($self->needs_linking()) {
push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
! if (-f 'test.pl') {
! push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl'));
! push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
! push(@m, $self->test_via_script('$(MAP_TARGET) -d', 'test.pl'));
! push(@m, "\n");
! }
! push(@m, "\t$self->{NOECHO}\$(NOOP)\n") if (!$tests && ! -f "test.pl");
push(@m, "\n");
}
else {
--- 1964,1973 ----
if ($self->needs_linking()) {
push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
! push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
! push(@m, "\n");
! push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
! push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
push(@m, "\n");
}
else {
***************
*** 2075,2084 ****
sub test_via_harness {
my($self,$perl,$tests) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
" $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)" \\'."\n\t".
'-e "use Test::Harness qw(&runtests $verbose); $verbose=$(TEST_VERBOSE); runtests @ARGV;" \\'."\n\t$tests\n";
}
--- 1986,1991 ----
***************
*** 2091,2100 ****
sub test_via_script {
my($self,$perl,$script) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
" $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '.$script.'
';
}
--- 1998,2003 ----
***************
*** 2110,2119 ****
sub makeaperl {
my($self, %attribs) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
@attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
my(@m);
--- 2013,2018 ----
***************
*** 2158,2163 ****
--- 2057,2096 ----
File::Find::find(sub {
return unless m/\Q$self->{LIB_EXT}\E$/;
return if m/^libperl/;
+
+ if( exists $self->{INCLUDE_EXT} ){
+ my $found = 0;
+ my $incl;
+ my $xx;
+
+ ($xx = $File::Find::name) =~ s,.*?/auto/,,;
+ $xx =~ s,/?$_,,;
+ $xx =~ s,/,::,g;
+
+ # Throw away anything not explicitly marked for inclusion.
+ # DynaLoader is implied.
+ foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
+ if( $xx eq $incl ){
+ $found++;
+ last;
+ }
+ }
+ return unless $found;
+ }
+ elsif( exists $self->{EXCLUDE_EXT} ){
+ my $excl;
+ my $xx;
+
+ ($xx = $File::Find::name) =~ s,.*?/auto/,,;
+ $xx =~ s,/?$_,,;
+ $xx =~ s,/,::,g;
+
+ # Throw away anything explicitly marked for exclusion
+ foreach $excl (@{$self->{EXCLUDE_EXT}}){
+ return if( $xx eq $excl );
+ }
+ }
+
$olbs{$ENV{DEFAULT}} = $_;
}, grep( -d $_, @{$searchdirs || []}));
***************
*** 2295,2304 ****
sub ext {
my($self) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
'','','';
}
--- 2228,2233 ----
***************
*** 2315,2324 ****
sub nicetext {
my($self,$text) = @_;
- unless (ref $self){
- ExtUtils::MakeMaker::TieAtt::warndirectuse((caller(0))[3]);
- $self = $ExtUtils::MakeMaker::Parent[-1];
- }
$text =~ s/([^\s:])(:+\s)/$1 $2/gs;
$text;
}
--- 2244,2249 ----
***************
*** 2326,2328 ****
--- 2251,2254 ----
1;
__END__
+
#: lib/ExtUtils/MakeMaker.pm
#: Update to MakeMaker 5.34
diff -crN perl5.002_01/lib/ExtUtils/MakeMaker.pm perl5.003/lib/ExtUtils/MakeMaker.pm
*** perl5.002_01/lib/ExtUtils/MakeMaker.pm Mon Mar 25 01:04:16 1996
--- perl5.003/lib/ExtUtils/MakeMaker.pm Sun Jun 23 20:52:43 1996
***************
*** 1,25 ****
! require 5.002; # MakeMaker 5.17 was the last MakeMaker that was compatible with perl5.001m
!
! package main;
! use vars qw(%att);
!
! 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;
package ExtUtils::MakeMaker;
! $Version = $VERSION = "5.26";
! $Version_OK = "5.05"; # Makefiles older than $Version_OK will die
# (Will be checked from MakeMaker version 4.13 onwards)
! ($Revision = substr(q$Revision: 1.187 $, 10)) =~ s/\s+$//;
--- 1,11 ----
! BEGIN {require 5.002;} # MakeMaker 5.17 was the last MakeMaker that was compatible with perl5.001m
package ExtUtils::MakeMaker;
! $Version = $VERSION = "5.34";
! $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.202 $, 10)) =~ s/\s+$//;
***************
*** 29,42 ****
#use FileHandle ();
use vars qw(
! $VERSION $Version_OK $Revision
! $Verbose %MM_Sections $ISA_TTY
! @MM_Sections %Recognized_Att_Keys @Get_from_Config
! %Prepend_dot_dot %Config @Parent %NORMAL_INC
! $Setup_done %Keep_after_flush
! @Overridable
);
! #use strict qw(refs);
eval {require DynaLoader;}; # Get mod2fname, if defined. Will fail
# with miniperl.
--- 15,29 ----
#use FileHandle ();
use vars qw(
!
! @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;
eval {require DynaLoader;}; # Get mod2fname, if defined. Will fail
# with miniperl.
***************
*** 48,54 ****
@ISA = qw(Exporter);
@EXPORT = qw(&WriteMakefile &writeMakefile $Verbose &prompt);
@EXPORT_OK = qw($VERSION &Version_check &neatvalue &mkbootstrap &mksymlists
! $Version %att); ## Import of %att is deprecated, please use OO features!
# $Version in mixed case will go away!
#
--- 35,41 ----
@ISA = qw(Exporter);
@EXPORT = qw(&WriteMakefile &writeMakefile $Verbose &prompt);
@EXPORT_OK = qw($VERSION &Version_check &neatvalue &mkbootstrap &mksymlists
! $Version);
# $Version in mixed case will go away!
#
***************
*** 66,72 ****
#
{
package MY;
! @ISA = qw(MM);
package MM;
sub DESTROY {}
}
--- 53,60 ----
#
{
package MY;
! @MY::ISA = qw(MM);
! ### sub AUTOLOAD { use Devel::Symdump; print Devel::Symdump->rnew->as_string; Carp::confess "hey why? $AUTOLOAD" }
package MM;
sub DESTROY {}
}
***************
*** 80,107 ****
# Now we can can pull in the friends
#
$Is_VMS = $^O eq 'VMS';
! $Is_OS2 = $^O eq 'os2';
require ExtUtils::MM_Unix;
if ($Is_VMS) {
require ExtUtils::MM_VMS;
}
if ($Is_OS2) {
require ExtUtils::MM_OS2;
}
!
! %NORMAL_INC = %INC;
! @NORMAL_INC{qw|File/Find.pm Cwd.pm ExtUtils/Manifest.pm ExtUtils/Liblist.pm|} = (1) x 4;
!
!
! # This has to go one day...
! $SIG{__WARN__} = sub {
! $_[0] =~ /^Use of uninitialized value/ && return;
! $_[0] =~ /used only once/ && return;
! $_[0] =~ /^Subroutine\s+[\w:]+\s+redefined/ && return;
! warn @_;
! };
# The SelfLoader would bring a lot of overhead for MakeMaker, because
# we know for sure we will use most of the autoloaded functions once
--- 68,88 ----
# Now we can can pull in the friends
#
$Is_VMS = $^O eq 'VMS';
! $Is_OS2 = $^O =~ m|^os/?2$|i;
! $Is_Mac = $^O eq 'MacOS';
require ExtUtils::MM_Unix;
if ($Is_VMS) {
require ExtUtils::MM_VMS;
+ require VMS::Filespec; # is a noop as long as we require it within MM_VMS
}
if ($Is_OS2) {
require ExtUtils::MM_OS2;
}
! if ($Is_Mac) {
! require ExtUtils::MM_Mac;
! }
# The SelfLoader would bring a lot of overhead for MakeMaker, because
# we know for sure we will use most of the autoloaded functions once
***************
*** 110,119 ****
sub AUTOLOAD {
my $code;
if (defined fileno(DATA)) {
! while (<DATA>) {
! last if /^__END__/;
! $code .= $_;
! }
close DATA;
eval $code;
if ($@) {
--- 91,102 ----
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 ($@) {
***************
*** 143,148 ****
--- 126,138 ----
unless $checkversion == $VERSION;
}
+ 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 ;
***************
*** 160,178 ****
sub ExtUtils::MakeMaker::selfdocument ;
sub ExtUtils::MakeMaker::WriteMakefile ;
sub ExtUtils::MakeMaker::prompt ;
- sub ExtUtils::MakeMaker::TieAtt::TIEHASH ;
- sub ExtUtils::MakeMaker::TieAtt::FETCH ;
- sub ExtUtils::MakeMaker::TieAtt::STORE ;
- sub ExtUtils::MakeMaker::TieAtt::FIRSTKEY ;
- sub ExtUtils::MakeMaker::TieAtt::NEXTKEY ;
- sub ExtUtils::MakeMaker::TieAtt::DESTROY ;
- sub ExtUtils::MakeMaker::TieAtt::warndirectuse ;
! __DATA__
package ExtUtils::MakeMaker;
sub WriteMakefile {
Carp::croak "WriteMakefile: Need even number of args" if @_ % 2;
unless ($Setup_done++){
full_setup();
undef &ExtUtils::MakeMaker::full_setup; #safe memory
--- 150,164 ----
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
***************
*** 181,200 ****
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;
! $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;
}
sub eval_in_subdirs {
--- 167,185 ----
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 {
***************
*** 224,285 ****
# $fh->close;
close FH;
eval $eval;
! warn "WARNING from evaluation of $dir/Makefile.PL: $@" if $@;
}
sub full_setup {
$Verbose ||= 0;
$^W=1;
! # package name for the classes into which the first object will be blessed
$PACKNAME = "PACK000";
@Attrib_help = qw/
C CONFIG CONFIGURE DEFINE DIR DISTNAME DL_FUNCS DL_VARS EXE_FILES
! NO_VC FIRST_MAKEFILE FULLPERL H INC INSTALLARCHLIB INSTALLBIN
! INSTALLDIRS INSTALLMAN1DIR INSTALLMAN3DIR INSTALLPRIVLIB
! INSTALLSITEARCH INSTALLSITELIB INST_ARCHLIB INST_EXE INST_LIB
! INST_MAN1DIR INST_MAN3DIR LDFROM LIBPERL_A 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 SKIP
! TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG XS_VERSION clean
! depend dist dynamic_lib linkext macro realclean tool_autosplit
installpm
/;
- # @Overridable is close to MM_Sections
@MM_Sections =
qw(
! post_initialize const_config constants 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 manifypods processPL
! installbin subdirs clean realclean dist_basics dist_core
! dist_dir dist_test dist_ci install force perldepend makefile
! staticmake test postamble
); # loses section ordering
@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 cflags const_loadlibs
! const_cccmd
];
! #### Can we drop this?
! #### @MM_Sections{@MM_Sections} = {} x @MM_Sections;
# All sections are valid keys.
@Recognized_Att_Keys{@MM_Sections} = (1) x @MM_Sections;
--- 209,294 ----
# $fh->close;
close FH;
eval $eval;
! if ($@) {
! # if ($@ =~ /prerequisites/) {
! # die "MakeMaker WARNING: $@";
! # } else {
! # warn "WARNING from evaluation of $dir/Makefile.PL: $@";
! # }
! warn "WARNING from evaluation of $dir/Makefile.PL: $@";
! }
}
sub full_setup {
$Verbose ||= 0;
$^W=1;
! # package name for the classes into which the first object will be blessed
$PACKNAME = "PACK000";
@Attrib_help = qw/
C 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 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
installpm
/;
+ # ^^^ 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 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
); # loses section ordering
@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} = (1) x @MM_Sections;
***************
*** 308,315 ****
#
%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
);
my @keep = qw/
--- 317,327 ----
#
%Prepend_dot_dot =
qw(
!
! 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
!
);
my @keep = qw/
***************
*** 353,358 ****
--- 365,400 ----
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";
+ } 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}}}};
***************
*** 457,463 ****
$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);
--- 499,504 ----
***************
*** 551,562 ****
--- 592,612 ----
# 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 {
***************
*** 567,573 ****
# First we look for the best hintsfile we have
my(@goodhints);
! my($hint)="$Config{osname}_$Config{osvers}";
$hint =~ s/\./_/g;
$hint =~ s/_$//;
return unless $hint;
--- 617,623 ----
# First we look for the best hintsfile we have
my(@goodhints);
! my($hint)="${^O}_$Config{osvers}";
$hint =~ s/\./_/g;
$hint =~ s/_$//;
return unless $hint;
***************
*** 630,636 ****
# %MY:: being intact, we have to fill the hole with an
# inheriting method:
! eval "package MY; sub $method {local *$method; shift->MY::$method(\@_); }";
}
# We have to clean out %INC also, because the current directory is
--- 680,686 ----
# %MY:: being intact, we have to fill the hole with an
# inheriting method:
! eval "package MY; sub $method { shift->SUPER::$method(\@_); }";
}
# We have to clean out %INC also, because the current directory is
***************
*** 638,650 ****
# 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 skipcheck {
--- 688,705 ----
# out of a History.pl file which is "required" so woudn't get
# loaded again in another extension requiring a History.pl
! # 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 skipcheck {
***************
*** 764,816 ****
join "\n", @m;
}
- package ExtUtils::MakeMaker::TieAtt;
-
- 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;
- }
-
package ExtUtils::MakeMaker;
1;
--- 819,824 ----
***************
*** 840,929 ****
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.
!
! 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 What's new in version 5 of MakeMaker
! 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.
! Multi directory extensions have an immediately visible speed
! advantage, because there's no startup penalty for any single
! subdirectory Makefile.
! 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.
! =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 :)
!
! Do not use exit() in your Makefile.PL. MakeMaker tries hard to enable
! multi-module builds in one go.
!
! 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. If you see no way to avoid your own subroutine
! solution, please let us know about the problem.
=head2 Default Makefile Behaviour
! The automatically generated Makefile enables the user of the extension
! to invoke
perl Makefile.PL # optionally "perl Makefile.PL verbose"
make
--- 848,876 ----
that can be individually overridden. Each subroutine returns the text
it wishes to have written to the Makefile.
! 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().
! =head2 How To Write A Makefile.PL
! The short answer is: Don't. 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 very useful C<-X> switch. This will
! generate dummy files of all kinds that are useful for the module
! developer.
! The medium answer is:
! use ExtUtils::MakeMaker;
! WriteMakefile( NAME => "Foo::Bar" );
+ The long answer is below.
=head2 Default Makefile Behaviour
! The generated Makefile enables the user of the extension to invoke
perl Makefile.PL # optionally "perl Makefile.PL verbose"
make
***************
*** 958,968 ****
=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>
building below the perl source, INST_LIB and INST_ARCHLIB default to
! ../../lib, and INST_EXE is not defined.
The I<install> target of the generated Makefile copies the files found
below each of the INST_* directories to their INSTALL*
--- 905,915 ----
=head2 make install
make alone puts all relevant files into directories that are named by
! 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_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*
***************
*** 974,980 ****
INST_ARCHLIB INSTALLARCHLIB INSTALLSITEARCH
INST_LIB INSTALLPRIVLIB INSTALLSITELIB
! INST_EXE INSTALLBIN
INST_MAN1DIR INSTALLMAN1DIR
INST_MAN3DIR INSTALLMAN3DIR
--- 921,928 ----
INST_ARCHLIB INSTALLARCHLIB INSTALLSITEARCH
INST_LIB INSTALLPRIVLIB INSTALLSITELIB
! INST_BIN INSTALLBIN
! INST_SCRIPT INSTALLSCRIPT
INST_MAN1DIR INSTALLMAN1DIR
INST_MAN3DIR INSTALLMAN3DIR
***************
*** 987,1012 ****
sprintf("%20s: %s", $_, $Config{$_}),
grep /^install/, keys %Config'
! 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.
! 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).
- =cut
-
- #'
=head2 PREFIX attribute
--- 935,945 ----
sprintf("%20s: %s", $_, $Config{$_}),
grep /^install/, keys %Config'
! And to check the sequence in which the library directories are
! searched by perl, run
! perl -le 'print join $/, @INC'
=head2 PREFIX attribute
***************
*** 1023,1029 ****
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,
and this incantation will be the best:
perl Makefile.PL; make; make test
--- 956,962 ----
If the user has superuser privileges, and is not working on AFS
(Andrew File System) or relatives, then the defaults for
! INSTALLPRIVLIB, INSTALLARCHLIB, INSTALLSCRIPT, etc. will be appropriate,
and this incantation will be the best:
perl Makefile.PL; make; make test
***************
*** 1040,1046 ****
have to do this by calling
perl Makefile.PL INSTALLSITELIB=/afs/here/today \
! INSTALLBIN=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages
make
Be careful to repeat this procedure every time you recompile an
--- 973,979 ----
have to do this by calling
perl Makefile.PL INSTALLSITELIB=/afs/here/today \
! INSTALLSCRIPT=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages
make
Be careful to repeat this procedure every time you recompile an
***************
*** 1142,1160 ****
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)>
!
! INST_AUTODIR = C<$(INST_LIB)/auto/$(FULLEXT)>
! INST_ARCHAUTODIR = C<$(INST_ARCHLIB)/auto/$(FULLEXT)>
=head2 Using Attributes and Parameters
--- 1075,1099 ----
If perl has not yet been installed then PERL_SRC can be defined on the
command line as shown in the previous section.
! =head2 Which architecture dependent directory?
! 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.
! 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
***************
*** 1238,1247 ****
(linker options) at present. Defaults to []. (e.g. [ qw(
Foo_version Foo_numstreams Foo_tree ) ])
=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
again.
=item NO_VC
--- 1177,1195 ----
(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_SCRIPT directory. Make realclean will delete them from there
again.
=item NO_VC
***************
*** 1269,1274 ****
--- 1217,1237 ----
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
***************
*** 1276,1283 ****
=item INSTALLBIN
! Used by 'make install' which copies files from INST_EXE to this
! directory.
=item INSTALLDIRS
--- 1239,1245 ----
=item INSTALLBIN
! Directory to install binary files (e.g. tkperl) into.
=item INSTALLDIRS
***************
*** 1301,1306 ****
--- 1263,1273 ----
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
***************
*** 1315,1325 ****
Same as INST_LIB for architecture dependent files.
=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.
=item INST_LIB
--- 1282,1296 ----
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
! Old name for INST_SCRIPT. Deprecated. Please use INST_SCRIPT if you
! need to use it.
=item INST_LIB
***************
*** 1334,1339 ****
--- 1305,1317 ----
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
***************
*** 1421,1427 ****
=item NOECHO
! Defaults the C<@>. By setting it to an empty string you can generate a
Makefile that echos all commands. Mainly used in debugging MakeMaker
itself.
--- 1399,1405 ----
=item NOECHO
! 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.
***************
*** 1501,1518 ****
decided at the build time of your perl (unless you override one of
them, of course).
! =item PREREQ
! 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.
=item SKIP
Arryref. E.g. [qw(name1 name2)] skip (do not write) sections of the
! Makefile
=item TYPEMAPS
--- 1479,1497 ----
decided at the build time of your perl (unless you override one of
them, of course).
! =item PREREQ_PM
! 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. 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
***************
*** 1543,1549 ****
MakeMaker object. The following lines will be parsed o.k.:
$VERSION = '1.00';
! ( $VERSION ) = '$Revision: 1.187 $ ' =~ /\$Revision:\s+([^\s]+)/;
$FOO::VERSION = '1.10';
but these will fail:
--- 1522,1528 ----
MakeMaker object. The following lines will be parsed o.k.:
$VERSION = '1.00';
! ( $VERSION ) = '$Revision: 1.201 $ ' =~ /\$Revision:\s+([^\s]+)/;
$FOO::VERSION = '1.10';
but these will fail:
***************
*** 1587,1593 ****
=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:
=over 2
--- 1566,1572 ----
=head2 Additional lowercase attributes
can be used to pass parameters to the methods which implement that
! part of the Makefile.
=over 2
***************
*** 1603,1609 ****
{TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => 'gz',
SHAR => 'shar -m', DIST_CP => 'ln', ZIP => '/bin/zip',
! ZIPFLAGS => '-rl'}
If you specify COMPRESS, then SUFFIX should also be altered, as it is
needed to tell make the target file of the compression. Setting
--- 1582,1588 ----
{TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => 'gz',
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
***************
*** 1665,1679 ****
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/;
! $_;
}
! Both methods above are available for backwards compatibility with
! older Makefile.PLs.
If you still need a different solution, try to develop another
subroutine, that fits your needs and submit the diffs to
--- 1644,1658 ----
or you can edit the default by saying something like:
sub MY::c_o {
! my($inherited) = shift->SUPER::c_o(@_);
! $inherited =~ s/old text/new text/;
! $inherited;
}
! 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
***************
*** 1692,1697 ****
--- 1671,1694 ----
}
+ =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
***************
*** 1737,1743 ****
=item make tardist
First does a distdir. Then a command $(PREOP) which defaults to a null
! command. 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.
--- 1734,1742 ----
=item make tardist
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.
***************
*** 1778,1783 ****
--- 1777,1783 ----
COMPRESS ('compress')
POSTOP ('@ :')
PREOP ('@ :')
+ TO_UNIX (depends on the system)
RCS_LABEL ('rcs -q -Nv$(VERSION_SYM):')
SHAR ('shar')
SUFFIX ('Z')
***************
*** 1790,1795 ****
--- 1790,1799 ----
WriteMakefile( 'dist' => { COMPRESS=>"gzip", SUFFIX=>"gz" })
+ =head1 SEE ALSO
+
+ ExtUtils::MM_Unix, ExtUtils::Manifest, ExtUtils::testlib,
+ ExtUtils::Install, ExtUtils::embed
=head1 AUTHORS
***************
*** 1800,1813 ****
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.
-
- =head1 MODIFICATION HISTORY
-
- For a more complete documentation see the file Changes in the
- MakeMaker distribution package.
-
- =head1 TODO
-
- See the file Todo in the MakeMaker distribution package.
=cut
--- 1804,1808 ----
#: lib/ExtUtils/Manifest.pm
#: Update to MakeMaker 5.34
diff -crN perl5.002_01/lib/ExtUtils/Manifest.pm perl5.003/lib/ExtUtils/Manifest.pm
*** perl5.002_01/lib/ExtUtils/Manifest.pm Mon Mar 25 01:04:20 1996
--- perl5.003/lib/ExtUtils/Manifest.pm Sun Jun 23 20:52:52 1996
***************
*** 15,21 ****
$Verbose = 1;
$Is_VMS = $^O eq 'VMS';
! $VERSION = $VERSION = substr(q$Revision: 1.23 $,10,4);
$Quiet = 0;
--- 15,21 ----
$Verbose = 1;
$Is_VMS = $^O eq 'VMS';
! $VERSION = $VERSION = substr(q$Revision: 1.24 $,10,4);
$Quiet = 0;
***************
*** 36,42 ****
my $matches = _maniskip();
my $found = manifind();
my($key,$val,$file,%all);
! my %all = (%$found, %$read);
$all{$MANIFEST} = ($Is_VMS ? "$MANIFEST\t\t" : '') . 'This list of files'
if $manimiss; # add new MANIFEST to known file list
foreach $file (sort keys %all) {
--- 36,42 ----
my $matches = _maniskip();
my $found = manifind();
my($key,$val,$file,%all);
! %all = (%$found, %$read);
$all{$MANIFEST} = ($Is_VMS ? "$MANIFEST\t\t" : '') . 'This list of files'
if $manimiss; # add new MANIFEST to known file list
foreach $file (sort keys %all) {
***************
*** 138,144 ****
my ($mfile) = @_;
my $matches = sub {0};
my @skip ;
! my $mfile = "$MANIFEST.SKIP" unless defined $mfile;
local *M;
return $matches unless -f $mfile;
open M, $mfile or return $matches;
--- 138,144 ----
my ($mfile) = @_;
my $matches = sub {0};
my @skip ;
! $mfile = "$MANIFEST.SKIP" unless defined $mfile;
local *M;
return $matches unless -f $mfile;
open M, $mfile or return $matches;
***************
*** 290,297 ****
output. All files that match any regular expression in a file
C<MANIFEST.SKIP> (if such a file exists) are ignored.
! Manicheck() checks if all the files within a C<MANIFEST> in the current
! directory really do exist.
Filecheck() finds files below the current directory that are not
mentioned in the C<MANIFEST> file. An optional file C<MANIFEST.SKIP>
--- 290,299 ----
output. All files that match any regular expression in a file
C<MANIFEST.SKIP> (if such a file exists) are ignored.
! Manicheck() checks if all the files within a C<MANIFEST> in the
! current directory really do exist. It only reports discrepancies and
! exits silently if MANIFEST and the tree below the current directory
! are in sync.
Filecheck() finds files below the current directory that are not
mentioned in the C<MANIFEST> file. An optional file C<MANIFEST.SKIP>
#: lib/ExtUtils/Mksymlists.pm
#: Update to MakeMaker 5.34
diff -crN perl5.002_01/lib/ExtUtils/Mksymlists.pm perl5.003/lib/ExtUtils/Mksymlists.pm
*** perl5.002_01/lib/ExtUtils/Mksymlists.pm Mon Mar 25 01:04:20 1996
--- perl5.003/lib/ExtUtils/Mksymlists.pm Sun Jun 23 20:52:59 1996
***************
*** 4,16 ****
use Carp;
use Exporter;
! # mention vars twice to prevent single-use warnings
! @ExtUtils::Mksymlists::ISA = @ExtUtils::Mksymlists::ISA = 'Exporter';
! @ExtUtils::Mksymlists::EXPORT = @ExtUtils::Mksymlists::EXPORT = '&Mksymlists';
! $ExtUtils::Mksymlists::VERSION = $ExtUtils::Mksymlists::VERSION = '1.00';
sub Mksymlists {
my(%spec) = @_;
croak("Insufficient information specified to Mksymlists")
unless ( $spec{NAME} or
--- 4,17 ----
use Carp;
use Exporter;
! use vars qw( @ISA @EXPORT $VERSION );
! @ISA = 'Exporter';
! @EXPORT = '&Mksymlists';
! $VERSION = '1.03';
sub Mksymlists {
my(%spec) = @_;
+ my($osname) = $^O;
croak("Insufficient information specified to Mksymlists")
unless ( $spec{NAME} or
***************
*** 44,53 ****
$spec{DLBASE} = DynaLoader::mod2fname([ split(/::/,$spec{NAME}) ]);
}
! if ($^O eq 'aix') { _write_aix(\%spec); }
! elsif ($^O eq 'VMS') { _write_vms(\%spec) }
! elsif ($^O eq 'os2') { _write_os2(\%spec) }
! else { croak("Don't know how to create linker option file for $^O\n"); }
}
--- 45,54 ----
$spec{DLBASE} = DynaLoader::mod2fname([ split(/::/,$spec{NAME}) ]);
}
! if ($osname eq 'aix') { _write_aix(\%spec); }
! elsif ($osname eq 'VMS') { _write_vms(\%spec) }
! elsif ($osname =~ m|^os/?2$|i) { _write_os2(\%spec) }
! else { croak("Don't know how to create linker option file for $osname\n"); }
}
***************
*** 95,101 ****
sub _write_vms {
my($data) = @_;
! require Config;
my($isvax) = $Config::Config{'arch'} =~ /VAX/i;
my($sym);
--- 96,102 ----
sub _write_vms {
my($data) = @_;
! require Config; # a reminder for once we do $^O
my($isvax) = $Config::Config{'arch'} =~ /VAX/i;
my($sym);
#: lib/Symbol.pm
#: Do Perl version check at compile time, so that user gets a
#: clear error message instead of syntax errors during compilation
diff -crN perl5.002_01/lib/Symbol.pm perl5.003/lib/Symbol.pm
*** perl5.002_01/lib/Symbol.pm Mon Mar 25 01:04:47 1996
--- perl5.003/lib/Symbol.pm Mon Jun 24 16:07:54 1996
***************
*** 46,52 ****
=cut
! require 5.002;
require Exporter;
@ISA = qw(Exporter);
--- 46,52 ----
=cut
! BEGIN { require 5.002; }
require Exporter;
@ISA = qw(Exporter);
#: op.c
#: Fix overeager integer optimization
diff -crN perl5.002_01/op.c perl5.003/op.c
*** perl5.002_01/op.c Mon Mar 25 01:05:00 1996
--- perl5.003/op.c Sun Jun 23 20:35:03 1996
***************
*** 1413,1419 ****
for (curop = ((UNOP*)o)->op_first; curop; curop = curop->op_sibling) {
if (curop->op_type == OP_CONST) {
if (SvIOK(((SVOP*)curop)->op_sv)) {
! if (SvIVX(((SVOP*)curop)->op_sv) < 0 && vars++)
return o; /* negatives truncate wrong way, alas */
continue;
}
--- 1413,1419 ----
for (curop = ((UNOP*)o)->op_first; curop; curop = curop->op_sibling) {
if (curop->op_type == OP_CONST) {
if (SvIOK(((SVOP*)curop)->op_sv)) {
! if (SvIVX(((SVOP*)curop)->op_sv) <= 0 && vars++)
return o; /* negatives truncate wrong way, alas */
continue;
}
#: patchlevel.h
#: Update to reflect new version
diff -crN perl5.002_01/patchlevel.h perl5.003/patchlevel.h
*** perl5.002_01/patchlevel.h Mon Mar 25 01:05:05 1996
--- perl5.003/patchlevel.h Sun Jun 23 13:57:18 1996
***************
*** 1,5 ****
! #define PATCHLEVEL 2
! #define SUBVERSION 1
/*
local_patches -- list of locally applied less-than-subversion patches.
--- 1,5 ----
! #define PATCHLEVEL 3
! #define SUBVERSION 0
/*
local_patches -- list of locally applied less-than-subversion patches.
#: perl.c
#: suidperl security patch
diff -crN perl5.002_01/perl.c perl5.003/perl.c
*** perl5.002_01/perl.c Mon Mar 25 01:05:05 1996
--- perl5.003/perl.c Mon Jun 24 17:06:37 1996
***************
*** 47,53 ****
static void init_stacks _((void));
static void open_script _((char *, bool, SV *));
static void usage _((char *));
! static void validate_suid _((char *));
PerlInterpreter *
perl_alloc()
--- 47,55 ----
static void init_stacks _((void));
static void open_script _((char *, bool, SV *));
static void usage _((char *));
! static void validate_suid _((char *, char*));
!
! static int fdscript = -1;
PerlInterpreter *
perl_alloc()
***************
*** 427,433 ****
open_script(scriptname,dosearch,sv);
! validate_suid(validarg);
if (doextract)
find_beginning();
--- 429,435 ----
open_script(scriptname,dosearch,sv);
! validate_suid(validarg, scriptname);
if (doextract)
find_beginning();
***************
*** 1209,1214 ****
--- 1211,1217 ----
printf(" on %s",__DATE__);
# endif
#endif
+ fputs("\n\t+ suidperl security patch", stdout);
fputs("\n\nCopyright 1987-1996, Larry Wall\n",stdout);
#ifdef MSDOS
fputs("MS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n",
***************
*** 1399,1409 ****
scriptname = xfound;
}
origfilename = savepv(e_tmpname ? "-e" : scriptname);
curcop->cop_filegv = gv_fetchfile(origfilename);
if (strEQ(origfilename,"-"))
scriptname = "";
! if (preprocess) {
char *cpp = CPPSTDIN;
if (strEQ(cpp,"cppstdin"))
--- 1402,1428 ----
scriptname = xfound;
}
+ if (strnEQ(scriptname, "/dev/fd/", 8) && isDIGIT(scriptname[8]) ) {
+ char *s = scriptname + 8;
+ fdscript = atoi(s);
+ while (isDIGIT(*s))
+ s++;
+ if (*s)
+ scriptname = s + 1;
+ }
+ else
+ fdscript = -1;
origfilename = savepv(e_tmpname ? "-e" : scriptname);
curcop->cop_filegv = gv_fetchfile(origfilename);
if (strEQ(origfilename,"-"))
scriptname = "";
! if (fdscript >= 0) {
! rsfp = fdopen(fdscript,"r");
! #if defined(HAS_FCNTL) && defined(F_SETFD)
! fcntl(fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
! #endif
! }
! else if (preprocess) {
char *cpp = CPPSTDIN;
if (strEQ(cpp,"cppstdin"))
***************
*** 1475,1482 ****
taint_not("program input from stdin");
rsfp = stdin;
}
! else
rsfp = fopen(scriptname,"r");
if ((FILE*)rsfp == Nullfp) {
#ifdef DOSUID
#ifndef IAMSUID /* in case script is not readable before setuid */
--- 1494,1505 ----
taint_not("program input from stdin");
rsfp = stdin;
}
! else {
rsfp = fopen(scriptname,"r");
+ #if defined(HAS_FCNTL) && defined(F_SETFD)
+ fcntl(fileno(rsfp),F_SETFD,1); /* ensure close-on-exec */
+ #endif
+ }
if ((FILE*)rsfp == Nullfp) {
#ifdef DOSUID
#ifndef IAMSUID /* in case script is not readable before setuid */
***************
*** 1494,1502 ****
}
static void
! validate_suid(validarg)
char *validarg;
{
/* do we need to emulate setuid on scripts? */
/* This code is for those BSD systems that have setuid #! scripts disabled
--- 1517,1528 ----
}
static void
! validate_suid(validarg, scriptname)
char *validarg;
+ char *scriptname;
{
+ int which;
+
/* do we need to emulate setuid on scripts? */
/* This code is for those BSD systems that have setuid #! scripts disabled
***************
*** 1522,1528 ****
if (Fstat(fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
croak("Can't stat script \"%s\"",origfilename);
! if (statbuf.st_mode & (S_ISUID|S_ISGID)) {
I32 len;
#ifdef IAMSUID
--- 1548,1554 ----
if (Fstat(fileno(rsfp),&statbuf) < 0) /* normal stat is insecure */
croak("Can't stat script \"%s\"",origfilename);
! if (fdscript < 0 && statbuf.st_mode & (S_ISUID|S_ISGID)) {
I32 len;
#ifdef IAMSUID
***************
*** 1690,1697 ****
--- 1716,1743 ----
#ifdef IAMSUID
else if (preprocess)
croak("-P not allowed for setuid/setgid script\n");
+ else if (fdscript >= 0)
+ croak("fd script not allowed in suidperl\n");
else
croak("Script is not setuid/setgid in suidperl\n");
+
+ /* We absolutely must clear out any saved ids here, so we */
+ /* exec the real perl, substituting fd script for scriptname. */
+ /* (We pass script name as "subdir" of fd, which perl will grok.) */
+ rewind(rsfp);
+ for (which = 1; origargv[which] && origargv[which] != scriptname; which++) ;
+ if (!origargv[which])
+ croak("Permission denied");
+ (void)sprintf(buf, "/dev/fd/%d/%.127s", fileno(rsfp), origargv[which]);
+ origargv[which] = buf;
+
+ #if defined(HAS_FCNTL) && defined(F_SETFD)
+ fcntl(fileno(rsfp),F_SETFD,0); /* ensure no close-on-exec */
+ #endif
+
+ (void)sprintf(tokenbuf, "%s/perl%s", BIN, patchlevel);
+ execv(tokenbuf, origargv); /* try again */
+ croak("Can't do setuid\n");
#endif /* IAMSUID */
#else /* !DOSUID */
if (euid != uid || egid != gid) { /* (suidperl doesn't exist, in fact) */
#: t/op/stat.t
#: MachTen considers /dev/null to be a terminal, so don't
#: count this as a Perl test failure
diff -crN perl5.002_01/t/op/stat.t perl5.003/t/op/stat.t
*** perl5.002_01/t/op/stat.t Mon Feb 12 15:01:45 1996
--- perl5.003/t/op/stat.t Mon Jun 24 16:07:55 1996
***************
*** 1,7 ****
#!./perl
# $RCSfile: stat.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:28 $
!
print "1..56\n";
chop($cwd = `pwd`);
--- 1,8 ----
#!./perl
# $RCSfile: stat.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:28 $
! # 950521 DFD This version hacked to make test 39 succeed on MachTen
! # though the O.S. wrongly thinks /dev/null is a terminal
print "1..56\n";
chop($cwd = `pwd`);
***************
*** 140,146 ****
close(tty);
if (! -t tty) {print "ok 38\n";} else {print "not ok 38\n";}
open(null,"/dev/null");
! if (! -t null || -e '/xenix') {print "ok 39\n";} else {print "not ok 39\n";}
close(null);
if (-t) {print "ok 40\n";} else {print "not ok 40\n";}
--- 141,148 ----
close(tty);
if (! -t tty) {print "ok 38\n";} else {print "not ok 38\n";}
open(null,"/dev/null");
! if (! -t null || -e '/xenix' || -e '/MachTen')
! {print "ok 39\n";} else {print "not ok 39\n";}
close(null);
if (-t) {print "ok 40\n";} else {print "not ok 40\n";}
#: vms/Makefile
#: Update to reflect new Perl version
diff -crN perl5.002_01/vms/Makefile perl5.003/vms/Makefile
*** perl5.002_01/vms/Makefile Mon Mar 25 01:06:02 1996
--- perl5.003/vms/Makefile Sun Jun 23 22:54:44 1996
***************
*** 35,41 ****
@ $$@[.vms]fndvers.com "" "" "[.vms]Makefile"
# Updated by fndvers.com -- do not edit by hand
! PERL_VERSION = 5_00201#
ARCHDIR = [.lib.$(ARCH).$(PERL_VERSION)]
--- 35,41 ----
@ $$@[.vms]fndvers.com "" "" "[.vms]Makefile"
# Updated by fndvers.com -- do not edit by hand
! PERL_VERSION = 5_003 #
ARCHDIR = [.lib.$(ARCH).$(PERL_VERSION)]
#: vms/config.vms
#: Remove string concatenation on which VAXC chokes
#: Update to reflect new version
diff -crN perl5.002_01/vms/config.vms perl5.003/vms/config.vms
*** perl5.002_01/vms/config.vms Mon Mar 25 01:05:51 1996
--- perl5.003/vms/config.vms Sun Jun 23 22:54:20 1996
***************
*** 44,56 ****
#define STRINGIFY(a)"a"
#endif
- /* Default value for version token in ARCHLIB_EXP;
- * updated during build by FndVers.Com -- do not edit
- */
- #ifndef _PVERS
- # define _PVERS "5_00201" /**/
- #endif
-
/* config-start */
/* MEM_ALIGNBYTES:
--- 44,49 ----
***************
*** 74,84 ****
* same as PRIVLIB_EXP, it is not defined, since presumably the
* program already searches PRIVLIB_EXP.
*/
! #ifdef __ALPHA
! #define ARCHLIB_EXP CAT2("/perl_root/lib/VMS_AXP/",_PVERS) /* config-skip */
! #else
! #define ARCHLIB_EXP CAT2("/perl_root/lib/VMS_VAX/",_PVERS) /* config-skip */
! #endif
/* CPPSTDIN:
* This symbol contains the first part of the string which will invoke
--- 67,78 ----
* same as PRIVLIB_EXP, it is not defined, since presumably the
* program already searches PRIVLIB_EXP.
*/
! /* ==> NOTE <==
! * This value is automatically updated by FndVers.Com
! * when Perl is built. Please do not change it by hand; make
! * any changes to FndVers.Com instead.
! */
! #define ARCHLIB_EXP "/perl_root/lib/VMS_VAX/5_003" /**/
/* CPPSTDIN:
* This symbol contains the first part of the string which will invoke
***************
*** 1318,1328 ****
* used in programs that are not prepared to deal with ~ expansion at
* run-time.
*/
! #ifdef __ALPHA
! #define OLDARCHLIB_EXP "/perl_root/lib/VMS_AXP" /* config-skip */
! #else
! #define OLDARCHLIB_EXP "/perl_root/lib/VMS_VAX" /* config-skip */
! #endif
/* PRIVLIB_EXP:
* This symbol contains the name of the private library for this package.
--- 1312,1323 ----
* used in programs that are not prepared to deal with ~ expansion at
* run-time.
*/
! /* ==> NOTE <==
! * This value is automatically updated by FndVers.Com
! * when Perl is built. Please do not change it by hand; make
! * any changes to FndVers.Com instead.
! */
! #define OLDARCHLIB_EXP "/perl_root/lib/VMS_VAX" /**/
/* PRIVLIB_EXP:
* This symbol contains the name of the private library for this package.
***************
*** 1342,1352 ****
* This symbol contains the ~name expanded version of SITEARCH, to be used
* in programs that are not prepared to deal with ~ expansion at run-time.
*/
! #ifdef __ALPHA
! #define SITEARCH_EXP "/perl_root/lib/site_perl/VMS_AXP" /* config-skip */
! #else
! #define SITEARCH_EXP "/perl_root/lib/site_perl/VMS_VAX" /* config-skip */
! #endif
/* SCRIPTDIR:
* This symbol holds the name of the directory in which the user wants
--- 1337,1348 ----
* This symbol contains the ~name expanded version of SITEARCH, to be used
* in programs that are not prepared to deal with ~ expansion at run-time.
*/
! /* ==> NOTE <==
! * This value is automatically updated by FndVers.Com
! * when Perl is built. Please do not change it by hand; make
! * any changes to FndVers.Com instead.
! */
! #define SITEARCH_EXP "/perl_root/lib/site_perl/VMS_VAX" /**/
/* SCRIPTDIR:
* This symbol holds the name of the directory in which the user wants
#: vms/descrip.mms
#: Update to reflect new Perl version
diff -crN perl5.002_01/vms/descrip.mms perl5.003/vms/descrip.mms
*** perl5.002_01/vms/descrip.mms Mon Mar 25 01:05:52 1996
--- perl5.003/vms/descrip.mms Sun Jun 23 22:53:30 1996
***************
*** 68,74 ****
@ @[.vms]fndvers.com "" "" "[.vms]descrip.mms"
# Updated by fndvers.com -- do not edit by hand
! PERL_VERSION = 5_00201#
ARCHDIR = [.lib.$(ARCH).$(PERL_VERSION)]
--- 68,74 ----
@ @[.vms]fndvers.com "" "" "[.vms]descrip.mms"
# Updated by fndvers.com -- do not edit by hand
! PERL_VERSION = 5_003 #
ARCHDIR = [.lib.$(ARCH).$(PERL_VERSION)]
#: vms/fndvers.com
#: Update generation of ARCHLIB_EXP in config.h to use a
#: method which keeps VAXC happy
diff -crN perl5.002_01/vms/fndvers.com perl5.003/vms/fndvers.com
*** perl5.002_01/vms/fndvers.com Mon Mar 25 01:05:59 1996
--- perl5.003/vms/fndvers.com Sun Jun 23 13:58:49 1996
***************
*** 37,53 ****
$!
$ If sublevel.eq.0 Then sublevel = ""
$ perl_version = "5_" + plevel + sublevel
$ If p2.eqs."#NOFILE#"
$ Then
$ Write Sys$Output "Perl version directory name is ""''perl_version'"""
$ Exit
$ EndIf
$!
! $ token = """""""""''perl_version'"""""""""
$ If sublevel.eqs."" Then token = token + " "
$ token = token + " /**/"
! $ Call update_file "''p2'" "# define _PVERS" "''token'"
! $ If .not.$Status Then Exit $Status
$!
$ token = "''perl_version'"
$ If sublevel.eqs."" Then token = token + " "
--- 37,71 ----
$!
$ If sublevel.eq.0 Then sublevel = ""
$ perl_version = "5_" + plevel + sublevel
+ $ If F$GetSyi("HW_MODEL").gt.1024
+ $ Then
+ $ arch = "AXP"
+ $ Else
+ $ arch = "VAX"
+ $ EndIf
$ If p2.eqs."#NOFILE#"
$ Then
$ Write Sys$Output "Perl version directory name is ""''perl_version'"""
$ Exit
$ EndIf
$!
! $ token = """""""""/perl_root/lib/VMS_''arch'/''perl_version'"""""""""
$ If sublevel.eqs."" Then token = token + " "
$ token = token + " /**/"
! $ Call update_file "''p2'" "#define ARCHLIB_EXP" "''token'"
! $ teststs = $Status
! $ If .not.teststs Then Exit teststs
! $!
! $ If teststs.ne.1 ! current values in config.vms are appropriate
! $ Then
! $ token = """""""""/perl_root/lib/VMS_''arch'"""""""" /**/"
! $ Call update_file "''p2'" "#define OLDARCHLIB_EXP" "''token'"
! $ If .not.$Status Then Exit $Status
! $!
! $ token = """""""""/perl_root/lib/site_perl/VMS_''arch'"""""""" /**/"
! $ Call update_file "''p2'" "#define SITEARCH_EXP" "''token'"
! $ If .not.$Status Then Exit $Status
! $EndIf
$!
$ token = "''perl_version'"
$ If sublevel.eqs."" Then token = token + " "
#: vms/vms.c
#: Fix bugs in VMS <--> Unix filespec translation
#: Clarify copyright notices
#: Downcase VMS filespecs translated from Unix paths with
#: lowercase characters
#: Add rmsexpand routine to expand filespecs
diff -crN perl5.002_01/vms/vms.c perl5.003/vms/vms.c
*** perl5.002_01/vms/vms.c Mon Mar 25 01:06:07 1996
--- perl5.003/vms/vms.c Mon Jun 24 15:46:32 1996
***************
*** 2,9 ****
*
* VMS-specific routines for perl5
*
! * Last revised: 20-Mar-1996 by Charles Bailey bailey@genetics.upenn.edu
! * Version: 5.2.1
*/
#include <acedef.h>
--- 2,9 ----
*
* VMS-specific routines for perl5
*
! * Last revised: 24-Jun-1996 by Charles Bailey bailey@genetics.upenn.edu
! * Version: 5.3.0
*/
#include <acedef.h>
***************
*** 57,62 ****
--- 57,68 ----
unsigned short int *retlen;
};
+ static char *__mystrtolower(char *str)
+ {
+ if (str) for (; *str; ++str) *str= tolower(*str);
+ return str;
+ }
+
int
my_trnlnm(char *lnm, char *eqv, unsigned long int idx)
{
***************
*** 768,778 ****
** tovmsspec() - convert any file spec into a VMS-style spec.
**
** Copyright 1996 by Charles Bailey <bailey@genetics.upenn.edu>
! ** Permission is given for non-commercial use of this code according
! ** to the terms of the GNU General Public License or the Perl
! ** Artistic License. Copies of each may be found in the Perl
! ** standard distribution. This software is supplied without any
! ** warranty whatsoever.
*/
static char *do_tounixspec(char *, char *, int);
--- 774,783 ----
** tovmsspec() - convert any file spec into a VMS-style spec.
**
** Copyright 1996 by Charles Bailey <bailey@genetics.upenn.edu>
! ** Permission is given to distribute this code as part of the Perl
! ** standard distribution under the terms of the GNU General Public
! ** License or the Perl Artistic License. Copies of each may be
! ** found in the Perl standard distribution.
*/
static char *do_tounixspec(char *, char *, int);
***************
*** 789,795 ****
set_errno(EINVAL); set_vaxc_errno(SS$_BADPARAM); return NULL;
}
dirlen = strlen(dir);
! if (dir[dirlen-1] == '/') dir[--dirlen] = '\0';
if (!dirlen) {
set_errno(ENOTDIR);
set_vaxc_errno(RMS$_DIR);
--- 794,800 ----
set_errno(EINVAL); set_vaxc_errno(SS$_BADPARAM); return NULL;
}
dirlen = strlen(dir);
! if (dir[dirlen-1] == '/') --dirlen;
if (!dirlen) {
set_errno(ENOTDIR);
set_vaxc_errno(RMS$_DIR);
***************
*** 801,806 ****
--- 806,816 ----
dir = trndir;
dirlen = strlen(dir);
}
+ else {
+ strncpy(trndir,dir,dirlen);
+ trndir[dirlen] = '\0';
+ dir = trndir;
+ }
/* If we were handed a rooted logical name or spec, treat it like a
* simple directory, so that
* $ Define myroot dev:[dir.]
***************
*** 824,845 ****
dirlen -= 1; /* to last element */
lastdir = strrchr(dir,'/');
}
! else if ((cp1 = strstr(trndir,"/.")) != NULL) {
do {
if (*(cp1+2) == '.') cp1++;
if (*(cp1+2) == '/' || *(cp1+2) == '\0') {
! addmfd = 1;
! break;
}
cp1++;
} while ((cp1 = strstr(cp1,"/.")) != NULL);
- /* If we have a relative path, VMSify it and let the VMS code
- * below expand it, rather than repeating the code here */
- if (addmfd) {
- if (do_tovmsspec(trndir,vmsdir,0) == NULL) return NULL;
- if (do_fileify_dirspec(vmsdir,trndir,0) == NULL) return NULL;
- return do_tounixspec(trndir,buf,ts);
- }
}
else {
if (!(lastdir = cp1 = strrchr(dir,'/'))) cp1 = dir;
--- 834,852 ----
dirlen -= 1; /* to last element */
lastdir = strrchr(dir,'/');
}
! else if ((cp1 = strstr(dir,"/.")) != NULL) {
! /* If we have "/." or "/..", VMSify it and let the VMS code
! * below expand it, rather than repeating the code to handle
! * relative components of a filespec here */
do {
if (*(cp1+2) == '.') cp1++;
if (*(cp1+2) == '/' || *(cp1+2) == '\0') {
! if (do_tovmsspec(dir,vmsdir,0) == NULL) return NULL;
! if (do_fileify_dirspec(vmsdir,trndir,0) == NULL) return NULL;
! return do_tounixspec(trndir,buf,ts);
}
cp1++;
} while ((cp1 = strstr(cp1,"/.")) != NULL);
}
else {
if (!(lastdir = cp1 = strrchr(dir,'/'))) cp1 = dir;
***************
*** 856,863 ****
}
dirlen = cp2 - dir;
}
! else { /* There's a type, and it's not .dir. Bzzt. */
! set_errno(ENOTDIR);
set_vaxc_errno(RMS$_DIR);
return NULL;
}
--- 863,870 ----
}
dirlen = cp2 - dir;
}
! else { /* There's a type, and it's not .dir. Bzzt. */
! set_errno(ENOTDIR);
set_vaxc_errno(RMS$_DIR);
return NULL;
}
***************
*** 894,901 ****
return retspec;
}
else { /* VMS-style directory spec */
! char esa[NAM$C_MAXRSS+1], term;
! unsigned long int sts, cmplen, hasdev, hasdir, hastype, hasver;
struct FAB dirfab = cc$rms_fab;
struct NAM savnam, dirnam = cc$rms_nam;
--- 901,908 ----
return retspec;
}
else { /* VMS-style directory spec */
! char esa[NAM$C_MAXRSS+1], term, *cp;
! unsigned long int sts, cmplen, haslower = 0;
struct FAB dirfab = cc$rms_fab;
struct NAM savnam, dirnam = cc$rms_nam;
***************
*** 906,911 ****
--- 913,921 ----
dirfab.fab$b_dns = 6;
dirnam.nam$b_ess = NAM$C_MAXRSS;
dirnam.nam$l_esa = esa;
+
+ for (cp = dir; *cp; cp++)
+ if (islower(*cp)) { haslower = 1; break; }
if (!((sts = sys$parse(&dirfab))&1)) {
if (dirfab.fab$l_sts == RMS$_DIR) {
dirnam.nam$b_nop |= NAM$M_SYNCHK;
***************
*** 1029,1034 ****
--- 1039,1048 ----
/* We've set up the string up through the filename. Add the
type and version, and we're done. */
strcat(retspec,".DIR;1");
+
+ /* $PARSE may have upcased filespec, so convert output to lower
+ * case if input contained any lowercase characters. */
+ if (haslower) __mystrtolower(retspec);
return retspec;
}
} /* end of do_fileify_dirspec() */
***************
*** 1074,1080 ****
retlen = 2 + (*(dir+1) != '\0');
else {
if (!(cp1 = strrchr(dir,'/'))) cp1 = dir;
! if ((cp2 = strchr(cp1,'.')) && *(cp2+1) != '.') {
if (toupper(*(cp2+1)) == 'D' && /* They specified .dir. */
toupper(*(cp2+2)) == 'I' && /* Trim it off. */
toupper(*(cp2+3)) == 'R') {
--- 1088,1094 ----
retlen = 2 + (*(dir+1) != '\0');
else {
if (!(cp1 = strrchr(dir,'/'))) cp1 = dir;
! if ((cp2 = strchr(cp1,'.')) && (*(cp2+1) != '.' && *(cp2+1) != '\0')) {
if (toupper(*(cp2+1)) == 'D' && /* They specified .dir. */
toupper(*(cp2+2)) == 'I' && /* Trim it off. */
toupper(*(cp2+3)) == 'R') {
***************
*** 1101,1108 ****
else retpath[retlen-1] = '\0';
}
else { /* VMS-style directory spec */
! char esa[NAM$C_MAXRSS+1];
! unsigned long int sts, cmplen;
struct FAB dirfab = cc$rms_fab;
struct NAM savnam, dirnam = cc$rms_nam;
--- 1115,1122 ----
else retpath[retlen-1] = '\0';
}
else { /* VMS-style directory spec */
! char esa[NAM$C_MAXRSS+1], *cp;
! unsigned long int sts, cmplen, haslower;
struct FAB dirfab = cc$rms_fab;
struct NAM savnam, dirnam = cc$rms_nam;
***************
*** 1122,1128 ****
dirfab.fab$l_nam = &dirnam;
dirnam.nam$b_ess = (unsigned char) sizeof esa - 1;
dirnam.nam$l_esa = esa;
! if (!((sts = sys$parse(&dirfab))&1)) {
if (dirfab.fab$l_sts == RMS$_DIR) {
dirnam.nam$b_nop |= NAM$M_SYNCHK;
sts = sys$parse(&dirfab) & 1;
--- 1136,1146 ----
dirfab.fab$l_nam = &dirnam;
dirnam.nam$b_ess = (unsigned char) sizeof esa - 1;
dirnam.nam$l_esa = esa;
!
! for (cp = dir; *cp; cp++)
! if (islower(*cp)) { haslower = 1; break; }
!
! if (!(sts = (sys$parse(&dirfab)&1))) {
if (dirfab.fab$l_sts == RMS$_DIR) {
dirnam.nam$b_nop |= NAM$M_SYNCHK;
sts = sys$parse(&dirfab) & 1;
***************
*** 1168,1173 ****
--- 1186,1194 ----
else if (ts) New(7014,retpath,retlen,char);
else retpath = __pathify_retbuf;
strcpy(retpath,esa);
+ /* $PARSE may have upcased filespec, so convert output to lower
+ * case if input contained any lowercase characters. */
+ if (haslower) __mystrtolower(retpath);
}
return retpath;
***************
*** 1222,1241 ****
strcpy(rslt,"./");
return rslt;
}
! else if (*cp2 == '-') {
! while (*cp2 == '-') {
! *(cp1++) = '.'; *(cp1++) = '.'; *(cp1++) = '/';
! cp2++;
! }
! if (*cp2 != '.' && *cp2 != ']' && *cp2 != '>') { /* we don't allow */
! if (ts) Safefree(rslt); /* filespecs like */
! set_errno(EINVAL); set_vaxc_errno(RMS$_SYN); /* [--foo.bar] */
! return NULL;
! }
! cp2++;
! }
! else if ( *(cp2) != '.') { /* add the implied device into the Unix spec */
! *(cp1++) = '/';
if (getcwd(tmp,sizeof tmp,1) == NULL) {
if (ts) Safefree(rslt);
return NULL;
--- 1243,1250 ----
strcpy(rslt,"./");
return rslt;
}
! else if ( *cp2 != '.' && *cp2 != '-') {
! *(cp1++) = '/'; /* add the implied device into the Unix spec */
if (getcwd(tmp,sizeof tmp,1) == NULL) {
if (ts) Safefree(rslt);
return NULL;
***************
*** 1258,1264 ****
cp1 = rslt + offset;
}
}
! else cp2++;
}
for (; cp2 <= dirend; cp2++) {
if (*cp2 == ':') {
--- 1267,1273 ----
cp1 = rslt + offset;
}
}
! else if (*cp2 == '.') cp2++;
}
for (; cp2 <= dirend; cp2++) {
if (*cp2 == ':') {
***************
*** 1283,1292 ****
}
if (*cp2 != '.' && *cp2 != ']' && *cp2 != '>') { /* we don't allow */
if (ts) Safefree(rslt); /* filespecs like */
! set_errno(EINVAL); set_vaxc_errno(RMS$_SYN); /* [--foo.bar] */
return NULL;
}
- cp2++;
}
else *(cp1++) = *cp2;
}
--- 1292,1300 ----
}
if (*cp2 != '.' && *cp2 != ']' && *cp2 != '>') { /* we don't allow */
if (ts) Safefree(rslt); /* filespecs like */
! set_errno(EINVAL); set_vaxc_errno(RMS$_SYN); /* [fred.--foo.bar] */
return NULL;
}
}
else *(cp1++) = *cp2;
}
***************
*** 1335,1340 ****
--- 1343,1349 ----
int islnm, rooted;
STRLEN trnend;
+ while (*(++cp2) == '/') ; /* Skip multiple /s */
while (*(++cp2) != '/' && *cp2) *(cp1++) = *cp2;
*cp1 = '\0';
islnm = my_trnlnm(rslt,trndev,0);
***************
*** 1380,1391 ****
}
for (; cp2 < dirend; cp2++) {
if (*cp2 == '/') {
if (*(cp1-1) != '.') *(cp1++) = '.';
infront = 0;
}
else if (!infront && *cp2 == '.') {
! if (*(cp2+1) == '/') cp2++; /* skip over "./" - it's redundant */
! else if (*(cp2+1) == '\0') { cp2++; break; }
else if (*(cp2+1) == '.' && (*(cp2+2) == '/' || *(cp2+2) == '\0')) {
if (*(cp1-1) == '-' || *(cp1-1) == '[') *(cp1++) = '-'; /* handle "../" */
else if (*(cp1-2) == '[') *(cp1-1) = '-';
--- 1389,1401 ----
}
for (; cp2 < dirend; cp2++) {
if (*cp2 == '/') {
+ if (*(cp2-1) == '/') continue;
if (*(cp1-1) != '.') *(cp1++) = '.';
infront = 0;
}
else if (!infront && *cp2 == '.') {
! if (cp2+1 == dirend || *(cp2+1) == '\0') { cp2++; break; }
! else if (*(cp2+1) == '/') cp2++; /* skip over "./" - it's redundant */
else if (*(cp2+1) == '.' && (*(cp2+2) == '/' || *(cp2+2) == '\0')) {
if (*(cp1-1) == '-' || *(cp1-1) == '[') *(cp1++) = '-'; /* handle "../" */
else if (*(cp1-2) == '[') *(cp1-1) = '-';
***************
*** 1398,1414 ****
}
}
cp2 += 2;
! if (cp2 == dirend) {
! if (*(cp1-1) == '.') cp1--;
! break;
! }
}
else *(cp1++) = '_'; /* fix up syntax - '.' in name not allowed */
}
else {
if (!infront && *(cp1-1) == '-') *(cp1++) = '.';
! if (*cp2 == '/') *(cp1++) = '.';
! else if (*cp2 == '.') *(cp1++) = '_';
else *(cp1++) = *cp2;
infront = 1;
}
--- 1408,1420 ----
}
}
cp2 += 2;
! if (cp2 == dirend) break;
}
else *(cp1++) = '_'; /* fix up syntax - '.' in name not allowed */
}
else {
if (!infront && *(cp1-1) == '-') *(cp1++) = '.';
! if (*cp2 == '.') *(cp1++) = '_';
else *(cp1++) = *cp2;
infront = 1;
}
***************
*** 2655,2666 ****
static struct passwd __pwdcache;
static char __pw_namecache[UAI$S_IDENT+1];
- static char *_mystrtolower(char *str)
- {
- if (str) for (; *str; ++str) *str= tolower(*str);
- return str;
- }
-
/*
* This routine does most of the work extracting the user information.
*/
--- 2661,2666 ----
***************
*** 2737,2743 ****
}
else
strcpy(pwd->pw_unixdir, pwd->pw_dir);
! _mystrtolower(pwd->pw_unixdir);
return 1;
}
--- 2737,2743 ----
}
else
strcpy(pwd->pw_unixdir, pwd->pw_dir);
! __mystrtolower(pwd->pw_unixdir);
return 1;
}
***************
*** 2817,2823 ****
else { _ckvmssts(status); }
}
__pw_namecache[lname]= '\0';
! _mystrtolower(__pw_namecache);
__pwdcache = __passwd_empty;
__pwdcache.pw_name = __pw_namecache;
--- 2817,2823 ----
else { _ckvmssts(status); }
}
__pw_namecache[lname]= '\0';
! __mystrtolower(__pw_namecache);
__pwdcache = __passwd_empty;
__pwdcache.pw_name = __pw_namecache;
***************
*** 3067,3072 ****
--- 3067,3078 ----
{0,0,0,0}};
if (!fname || !*fname) return FALSE;
+ /* Make sure we expand logical names, since sys$check_access doesn't */
+ if (!strpbrk(fname,"/]>:")) {
+ strcpy(fileified,fname);
+ while (!strpbrk(fileified,"/]>:>") && my_trnlnm(fileified,fileified,0)) ;
+ fname = fileified;
+ }
if (!do_tovmsspec(fname,vmsname,1)) return FALSE;
retlen = namdsc.dsc$w_length = strlen(vmsname);
namdsc.dsc$a_pointer = vmsname;
***************
*** 3231,3240 ****
*
* Copyright 1996 by Charles Bailey <bailey@genetics.upenn.edu>.
* Incorporates, with permission, some code from EZCOPY by Tim Adye
! * <T.J.Adye@rl.ac.uk>. Permission is given to use and distribute this
! * code under the same terms as Perl itself. (See the GNU General Public
! * License or the Perl Artistic License supplied as part of the Perl
! * distribution.)
*/
/*{{{int rmscopy(char *src, char *dst, int preserve_dates)*/
int
--- 3237,3246 ----
*
* Copyright 1996 by Charles Bailey <bailey@genetics.upenn.edu>.
* Incorporates, with permission, some code from EZCOPY by Tim Adye
! * <T.J.Adye@rl.ac.uk>. Permission is given to distribute this code
! * as part of the Perl standard distribution under the terms of the
! * GNU General Public License or the Perl Artistic License. Copies
! * of each may be found in the Perl standard distribution.
*/
/*{{{int rmscopy(char *src, char *dst, int preserve_dates)*/
int
***************
*** 3403,3408 ****
--- 3409,3463 ----
*/
void
+ rmsexpand_fromperl(CV *cv)
+ {
+ dXSARGS;
+ char esa[NAM$C_MAXRSS], rsa[NAM$C_MAXRSS], *cp, *out;
+ struct FAB myfab = cc$rms_fab;
+ struct NAM mynam = cc$rms_nam;
+ STRLEN speclen;
+ unsigned long int retsts, haslower = 0;
+
+ myfab.fab$l_fna = SvPV(ST(0),speclen);
+ myfab.fab$b_fns = speclen;
+ myfab.fab$l_nam = &mynam;
+
+ mynam.nam$l_esa = esa;
+ mynam.nam$b_ess = sizeof esa;
+ mynam.nam$l_rsa = rsa;
+ mynam.nam$b_rss = sizeof rsa;
+
+ retsts = sys$parse(&myfab,0,0);
+ if (!(retsts & 1)) {
+ set_vaxc_errno(retsts);
+ if (retsts == RMS$_PRV) set_errno(EACCES);
+ else if (retsts == RMS$_DEV) set_errno(ENODEV);
+ else if (retsts == RMS$_DIR) set_errno(ENOTDIR);
+ else set_errno(EVMSERR);
+ XSRETURN_UNDEF;
+ }
+ retsts = sys$search(&myfab,0,0);
+ if (!(retsts & 1) && retsts != RMS$_FNF) {
+ set_vaxc_errno(retsts);
+ if (retsts == RMS$_PRV) set_errno(EACCES);
+ else set_errno(EVMSERR);
+ XSRETURN_UNDEF;
+ }
+ /* If the input filespec contained any lowercase characters,
+ * downcase the result for compatibility with Unix-minded code. */
+ for (out = myfab.fab$l_fna; *out; out++)
+ if (islower(*out)) { haslower = 1; break; }
+ if (mynam.nam$b_rsl) { out = rsa; speclen = mynam.nam$b_rsl; }
+ else { out = esa; speclen = mynam.nam$b_esl; }
+ if (!(mynam.nam$l_fnb & NAM$M_EXP_VER))
+ speclen = mynam.nam$l_type - out;
+ out[speclen] = '\0';
+ if (haslower) __mystrtolower(out);
+
+ ST(0) = sv_2mortal(newSVpv(out, speclen));
+ }
+
+ void
vmsify_fromperl(CV *cv)
{
dXSARGS;
***************
*** 3569,3574 ****
--- 3624,3630 ----
{
char* file = __FILE__;
+ newXSproto("VMS::Filespec::rmsexpand",rmsexpand_fromperl,file,"$");
newXSproto("VMS::Filespec::vmsify",vmsify_fromperl,file,"$");
newXSproto("VMS::Filespec::unixify",unixify_fromperl,file,"$");
newXSproto("VMS::Filespec::pathify",pathify_fromperl,file,"$");
#: End of patch :#