make PPPort/harness build on VMS
[p5sagit/p5-mst-13.2.git] / Makefile.SH
old mode 100755 (executable)
new mode 100644 (file)
index f69f58a..8092bf5
@@ -1,10 +1,8 @@
-case $CONFIG in
+#! /bin/sh
+case $PERL_CONFIG_SH in
 '')
-       if test -f config.sh; then TOP=.;
-       elif test -f ../config.sh; then TOP=..;
-       elif test -f ../../config.sh; then TOP=../..;
-       elif test -f ../../../config.sh; then TOP=../../..;
-       elif test -f ../../../../config.sh; then TOP=../../../..;
+       if test -f config.sh
+               then TOP=.
        else
                echo "Can't find config.sh."; exit 1
        fi
@@ -22,36 +20,84 @@ case "$d_dosuid" in
 *) suidperl='';;
 esac
 
-shrpenv=""
-case "$d_shrplib" in
-*define*)
-    pldlflags="$cccdlflags"
-    patchlevel=`egrep '^#define[       ]+PATCHLEVEL' patchlevel.h \
-       | awk '{print $3}'`
-    if test -z "$isnext_4"
-    then
-       case "$patchlevel" in
-           *[0-9]) plibsuf=.$so.$patchlevel;;
-           *)      plibsuf=.$so;;
+linklibperl='$(LIBPERL)'
+shrpldflags='$(LDDLFLAGS)'
+ldlibpth=''
+DPERL_EXTERNAL_GLOB='-DPERL_EXTERNAL_GLOB'
+case "$useshrplib" in
+true)
+       # Prefix all runs of 'miniperl' and 'perl' with
+       # $ldlibpth so that ./perl finds *this* shared libperl.
+       case "$LD_LIBRARY_PATH" in
+       '')
+               ldlibpth="LD_LIBRARY_PATH=`pwd`";;
+       *)
+               ldlibpth="LD_LIBRARY_PATH=`pwd`:${LD_LIBRARY_PATH}";;
        esac
-       case "$shrpdir" in
-           /usr/lib)   ;;
-           "") ;;
-           *)          shrpenv="env LD_RUN_PATH=$shrpdir";;
+
+       pldlflags="$cccdlflags"
+       case "${osname}${osvers}" in
+       next4*)
+               ld=libtool
+               lddlflags="-dynamic -undefined warning -framework System \
+               -compatibility_version 1 -current_version $patchlevel \
+               -prebind -seg1addr 0x27000000 -install_name \$(shrpdir)/\$@"
+               ;;
+       rhapsody*|darwin*)
+               shrpldflags="${ldflags} -dynamiclib \
+                            -compatibility_version \
+                               ${api_revision}.${api_version}.${api_subversion} \
+                            -current_version \
+                               ${revision}.${patchlevel}.${subversion} \
+                            -install_name \$(shrpdir)/\$@"
+               ;;
+       cygwin*)
+               linklibperl="-lperl"
+               ;;
+       sunos*)
+               linklibperl="-lperl"
+               ;;
+       netbsd*|freebsd[234]*|openbsd*)
+               linklibperl="-L. -lperl"
+               ;;
+       aix*)
+               shrpldflags="-H512 -T512 -bhalt:4 -bM:SRE -bE:perl.exp"
+               case "$osvers" in
+               3*)     shrpldflags="$shrpldflags -e _nostart"
+                       ;;
+               *)      shrpldflags="$shrpldflags -b noentry"
+                       ;;
+               esac
+               shrpldflags="$shrpldflags $ldflags $perllibs $cryptlib"
+               linklibperl="-L $archlibexp/CORE -L `pwd | sed 's/\/UU$//'` -lperl"
+               ;;
+       hpux*)
+               linklibperl="-L `pwd | sed 's/\/UU$//'` -Wl,+s -Wl,+b$archlibexp/CORE -lperl"
+               ;;
+       os390*)
+            shrpldflags='-W l,dll'
+           linklibperl='libperl.x'
+           DPERL_EXTERNAL_GLOB=''
+           ;;
        esac
-    else
-        # NeXT uses $patchlevel to set the current version of the dynamic
-       # library produced later. And the Major release number in the name
-       plibsuf=.5.$so
-    fi
-    if test "$osname" = "os2" ; then
-       d_shrplib=custom; 
-       shrpenv=
-       plibsuf=$plibext
-    fi
-    ;;
-*)  plibsuf=$lib_ext
-    pldlflags="";;
+       case "$ldlibpthname" in
+       '') ;;
+       *)
+           case "$osname" in
+           os2)
+               ldlibpth=''
+               ;;
+           *)
+               eval "ldlibpth=\"$ldlibpthname=`pwd`:\$$ldlibpthname\""
+               ;;
+           esac
+           # Strip off any trailing :'s
+           ldlibpth=`echo $ldlibpth | sed 's/:*$//'`
+           ;;
+        esac
+       ;;
+*)     pldlflags=''
+       ;;
 esac
 
 : Prepare dependency lists for Makefile.
@@ -68,10 +114,22 @@ for f in $static_ext; do
        static_list="$static_list lib/auto/$f/$base\$(LIB_EXT)"
 done
 
-: ${bin_sh=/bin/sh}
+nonxs_list=' '
+for f in $nonxs_ext; do
+    base=`echo "$f" | sed 's/.*\///'`
+    nonxs_list="$nonxs_list ext/$f/pm_to_blib"
+done
+
+# Handle the usage of different yaccs in posix-bc (During Configure we
+# us yacc for perly.y and byacc for a2p.y.  The makefiles must use the
+# same configuration for run_byacc!):
+case "$osname" in
+    posix-bc)
+       byacc=$yacc
+       ;;
+esac
 
 echo "Extracting Makefile (with variable substitutions)"
-rm -f Makefile
 $spitshell >Makefile <<!GROK!THIS!
 # Makefile.SH
 # This file is derived from Makefile.SH.  Any changes made here will
@@ -88,12 +146,11 @@ LD = $ld
 LDFLAGS = $ldflags
 CLDFLAGS = $ldflags
 
-SMALL = $small
-LARGE = $large $split
-MAB = $mab
 mallocsrc = $mallocsrc
 mallocobj = $mallocobj
 LNS = $lns
+# NOTE: some systems don't grok "cp -f". XXX Configure test needed?
+CPS = $cp
 RMS = rm -f
 ranlib = $ranlib
 
@@ -103,7 +160,7 @@ ranlib = $ranlib
 # installman commandline.
 bin = $installbin
 scriptdir = $scriptdir
-shrpdir = $shrpdir
+shrpdir = $archlibexp/CORE
 privlib = $installprivlib
 man1dir = $man1dir
 man1ext = $man1ext
@@ -113,111 +170,171 @@ man3ext = $man3ext
 # The following are used to build and install shared libraries for
 # dynamic loading.
 LDDLFLAGS = $lddlflags
+SHRPLDFLAGS = $shrpldflags
 CCDLFLAGS = $ccdlflags
 DLSUFFIX = .$dlext
 PLDLFLAGS = $pldlflags
-PLIBSUF = $plibsuf
+LIBPERL = $libperl
+LLIBPERL= $linklibperl
 SHRPENV = $shrpenv
 
+# The following is used to include the current directory in
+# the dynamic loader path you are building a shared libperl.
+LDLIBPTH = $ldlibpth
+
 dynamic_ext = $dynamic_list
 static_ext = $static_list
-ext = \$(dynamic_ext) \$(static_ext)
+nonxs_ext = $nonxs_list
+ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext)
 DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT)
 
-libs = $libs $cryptlib
+libs = $perllibs $cryptlib
 
 public = perl $suidperl utilities translators
 
 shellflags = $shellflags
 
-## To use an alternate make, set \$altmake in config.sh.
-MAKE = ${altmake-make}
+# This is set to  MAKE=$make if your $make command doesn't
+# do it for you.
+$make_set_make
 
-# These variables will be used in a future version to make
-# the make file more portable to non-unix systems.
-AR = $ar
-EXE_EXT = $exe_ext
-LIB_EXT = $lib_ext
-OBJ_EXT = $obj_ext
-PATH_SEP = $path_sep
+# These variables may need to be manually set for non-Unix systems.
+AR = $full_ar
+EXE_EXT = $_exe
+LIB_EXT = $_a
+OBJ_EXT = $_o
+PATH_SEP = $p_
 
 FIRSTMAKEFILE = $firstmakefile
 
 # Any special object files needed by this architecture, e.g. os2/os2.obj
 ARCHOBJS = $archobjs
 
-.SUFFIXES: .c \$(OBJ_EXT)
+.SUFFIXES: .c \$(OBJ_EXT) .i .s
+
+# grrr
+SHELL = $sh
 
-SHELL = $bin_sh
+# how to tr(anslate) newlines
+TRNL = '$trnl'
+
+OPTIMIZE = $optimize
+
+EXTRAS = $extras
+
+INSTALLPREFIXEXP = $prefix
 
 !GROK!THIS!
+# not used by Makefile but by installperl;
+# mentioned here so that metaconfig picks these up
+# $installusrbinperl
+# $versiononly
+
+case "${osname}:${osvers}" in
+darwin:*)
+$spitshell >>Makefile <<EOF
+
+# Your locales are broken (osname $osname, osvers $osvers)
+# and to avoid the numerous
+# perl: warning: Setting locale failed.
+# warnings during the build process we reset the locale variables.
+
+LC_ALL=C
+LANG=C
+LANGUAGE=C
+EOF
+       ;;
+esac
 
 ## In the following dollars and backticks do not need the extra backslash.
 $spitshell >>Makefile <<'!NO!SUBS!'
 
-CCCMD = `sh $(shellflags) cflags $(perllib) $@`
+CCCMD    = `sh $(shellflags) cflags "optimize='$(OPTIMIZE)'" $(LIBPERL) $@`
+
+CCCMDSRC = `sh $(shellflags) cflags "optimize='$(OPTIMIZE)'" $(LIBPERL) $<`
 
-private = preplibrary lib/ExtUtils/Miniperl.pm lib/Config.pm
+private = preplibrary lib/Config.pm lib/ExtUtils/Miniperl.pm
 
 # Files to be built with variable substitution before miniperl
 # is available.
 sh = Makefile.SH cflags.SH config_h.SH makeaperl.SH makedepend.SH \
-       makedir.SH perl_exp.SH writemain.SH
+       makedir.SH myconfig.SH writemain.SH pod/Makefile.SH
 
 shextract = Makefile cflags config.h makeaperl makedepend \
-       makedir perl.exp writemain
+       makedir myconfig writemain pod/Makefile
 
 # Files to be built with variable substitution after miniperl is
 # available.  Dependencies handled manually below (for now).
 
-pl = pod/pod2html.PL pod/pod2latex.PL pod/pod2man.PL pod/pod2text.PL
+pl = pod/pod2html.PL pod/pod2latex.PL pod/pod2man.PL pod/pod2text.PL \
+       pod/pod2usage.PL pod/podchecker.PL pod/podselect.PL \
+       pod/buildtoc.PL
 
-plextract = pod/pod2html pod/pod2latex pod/pod2man pod/pod2text
+# lib/lib.pm is not listed here because it has a rule of its own.
+plextract = pod/pod2html pod/pod2latex pod/pod2man pod/pod2text \
+       pod/pod2usage pod/podchecker pod/podselect \
+       pod/buildtoc
 
-addedbyconf = UU $(shextract) $(plextract) pstruct
+addedbyconf = UU $(shextract) $(plextract) lib/lib.pm pstruct
 
 h1 = EXTERN.h INTERN.h XSUB.h av.h config.h cop.h cv.h dosish.h
 h2 = embed.h form.h gv.h handy.h hv.h keywords.h mg.h op.h
-h3 = opcode.h patchlevel.h perl.h perly.h pp.h proto.h regcomp.h
-h4 = regexp.h scope.h sv.h unixish.h util.h perlio.h 
-h = $(h1) $(h2) $(h3) $(h4)
+h3 = opcode.h patchlevel.h perl.h perlapi.h perly.h pp.h proto.h regcomp.h
+h4 = regexp.h scope.h sv.h unixish.h util.h iperlsys.h thread.h
+h5 = utf8.h warnings.h sharedsv.h
+h = $(h1) $(h2) $(h3) $(h4) $(h5)
 
 c1 = $(mallocsrc) av.c scope.c op.c doop.c doio.c dump.c hv.c mg.c
-c2 = perl.c perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c
-c3 = gv.c sv.c taint.c toke.c util.c deb.c run.c universal.c globals.c perlio.c
+c2 = perl.c perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c
+c3 = gv.c sv.c taint.c toke.c util.c deb.c run.c universal.c xsutils.c
+c4 = globals.c perlio.c perlapi.c numeric.c locale.c pp_pack.c pp_sort.c sharedsv.c
 
-c = $(c1) $(c2) $(c3) miniperlmain.c perlmain.c
+c = $(c1) $(c2) $(c3) $(c4) miniperlmain.c perlmain.c
 
 obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) op$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT)
 obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
-obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT)
+obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) xsutils$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT) sharedsv$(OBJ_EXT)
 
 obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
 
 # Once perl has been Configure'd and built ok you build different
 # perl variants (Debugging, Embedded, Multiplicity etc) by saying:
-#      make clean; make perllib=libperl<type>.a
+#      make clean; make LIBPERL=libperl<type>.a
 # where <type> is some combination of 'd' and(or) 'e' or 'm'.
 # See cflags to understand how this works.
 #
-# Eventually some form of 'make-a-perl' script will automate this
-# together with linking a perl executable with any desired
-# static modules.
-perllib = libperl$(PLIBSUF)
+# This mechanism is getting clunky and might not even work any more.
+# EMBEDDING is on by default, and MULTIPLICITY doesn't work.
+#
 
 lintflags = -hbvxac
 
 .c$(OBJ_EXT):
-       $(CCCMD) $(MAB) $(PLDLFLAGS) $*.c
+       $(CCCMD) $(PLDLFLAGS) $*.c
 
-all: $(FIRSTMAKEFILE) miniperl $(private) $(plextract) $(public) $(dynamic_ext)
-       @echo " "; echo "       Everything is up to date."
+.c.i:
+       $(CCCMDSRC) -E $*.c > $*.i
+
+.c.s:
+       $(CCCMDSRC) -S $*.c
+
+.PHONY: all compile translators utilities
+
+all: $(FIRSTMAKEFILE) miniperl extra.pods $(private) $(public) $(dynamic_ext) $(nonxs_ext) extras.make
+       @echo " ";
+       @echo " Everything is up to date. 'make test' to run test suite."
+
+compile: all
+       echo "testing compilation" > testcompile;
+       cd utils;  $(MAKE) compile;
+       cd x2p; $(MAKE) compile;
+       cd pod; $(MAKE) compile;
 
 translators:   miniperl lib/Config.pm FORCE
-       @echo " "; echo "       Making x2p stuff"; cd x2p; $(MAKE) all
+       @echo " "; echo "       Making x2p stuff"; cd x2p; $(LDLIBPTH) $(MAKE) all
 
-utilities:     miniperl lib/Config.pm FORCE
-       @echo " "; echo "       Making utilities"; cd utils; $(MAKE) all
+utilities:     miniperl lib/Config.pm $(plextract) lib/lib.pm FORCE
+       @echo " "; echo "       Making utilities"; cd utils; $(LDLIBPTH) $(MAKE) all
 
 
 # This is now done by installman only if you actually want the man pages.
@@ -225,30 +342,33 @@ utilities:        miniperl lib/Config.pm FORCE
 
 # Phony target to force checking subdirectories.
 # Apparently some makes require an action for the FORCE target.
+.PHONY: FORCE
 FORCE:
        @sh -c true
+!NO!SUBS!
+$spitshell >>Makefile <<!GROK!THIS!
 
-# The $& notation tells Sequent machines that it can do a parallel make,
-# and is harmless otherwise.
-# The miniperl -w -MExporter line is a basic cheap test to catch errors
-# before make goes on to run preplibrary and then MakeMaker on extensions.
-# This is very handy because later errors are often caused by miniperl
-# build problems but that's not obvious to the novice.
-# The Module used here must not depend on Config or any extensions.
+# We do a copy of the op.c instead of a symlink because gcc gets huffy
+# if we have a symlink forest to another disk (it complains about too many
+# levels of symbolic links, even if we have only two)
 
-miniperl: $& miniperlmain$(OBJ_EXT) $(perllib)
-       $(CC) $(LARGE) $(MAB) $(CLDFLAGS) -o miniperl miniperlmain$(OBJ_EXT) $(perllib) $(libs)
-       @./miniperl -w -Ilib -MExporter -e 0 || $(MAKE) minitest
+opmini\$(OBJ_EXT): op.c config.h
+       \$(RMS) opmini.c
+       \$(CPS) op.c opmini.c
+       \$(CCCMD) \$(PLDLFLAGS) $DPERL_EXTERNAL_GLOB opmini.c
+       \$(RMS) opmini.c
 
-miniperlmain$(OBJ_EXT): miniperlmain.c
-       $(CCCMD) $(MAB) $(PLDLFLAGS) $*.c
+!GROK!THIS!
+$spitshell >>Makefile <<'!NO!SUBS!'
+miniperlmain$(OBJ_EXT): miniperlmain.c patchlevel.h
+       $(CCCMD) $(PLDLFLAGS) $*.c
 
 perlmain.c: miniperlmain.c config.sh $(FIRSTMAKEFILE)
-       sh writemain $(DYNALOADER) $(static_ext) > tmp
-       sh mv-if-diff tmp perlmain.c
+       sh writemain $(DYNALOADER) $(static_ext) > writemain.tmp
+       sh mv-if-diff writemain.tmp perlmain.c
 
 perlmain$(OBJ_EXT): perlmain.c
-       $(CCCMD) $(MAB) $(PLDLFLAGS) $*.c
+       $(CCCMD) $(PLDLFLAGS) $*.c
 
 # The file ext.libs is a list of libraries that must be linked in
 # for static extensions, e.g. -lm -lgdbm, etc.  The individual
@@ -256,110 +376,367 @@ perlmain$(OBJ_EXT): perlmain.c
 ext.libs: $(static_ext)
        -@test -f ext.libs || touch ext.libs
 
-perl: $& perlmain$(OBJ_EXT) $(perllib) $(DYNALOADER) $(static_ext) ext.libs
-       $(SHRPENV) $(CC) $(LARGE) $(MAB) $(CLDFLAGS) $(CCDLFLAGS) -o perl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(perllib) `cat ext.libs` $(libs)
+!NO!SUBS!
 
-pureperl: $& perlmain$(OBJ_EXT) $(perllib) $(DYNALOADER) $(static_ext) ext.libs
-       purify $(CC) $(LARGE) $(MAB) $(CLDFLAGS) $(CCDLFLAGS) -o pureperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(perllib) `cat ext.libs` $(libs)
+# How to build libperl.  This is still rather convoluted.
+# Load up custom Makefile.SH fragment for shared loading and executables:
+case "$osname" in
+*)
+       Makefile_s="$osname/Makefile.SHs"
+       ;;
+esac
 
-quantperl: $& perlmain$(OBJ_EXT) $(perllib) $(DYNALOADER) $(static_ext) ext.libs
-       quantify $(CC) $(LARGE) $(MAB) $(CLDFLAGS) $(CCDLFLAGS) -o quantperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(perllib) `cat ext.libs` $(libs)
+case "$osname" in
+aix)
+       $spitshell >>Makefile <<!GROK!THIS!
+LIBS                   = $perllibs
+# In AIX we need to change this for building Perl itself from
+# its earlier definition (which is for building external
+# extensions *after* Perl has been built and installed)
+CCDLFLAGS              = `echo $ccdlflags|sed -e 's@-bE:.*/perl\.exp@-bE:perl.exp@'`
+
+!GROK!THIS!
+       case "$useshrplib" in
+       define|true|[yY]*)
+               $spitshell >>Makefile <<'!NO!SUBS!'
+
+LIBPERL_NONSHR         = libperl_nonshr$(LIB_EXT)
+MINIPERL_NONSHR                = miniperl_nonshr$(EXE_EXT)
+
+$(LIBPERL_NONSHR): perl$(OBJ_EXT) $(obj)
+       $(RMS) $(LIBPERL_NONSHR)
+       $(AR) rcu $(LIBPERL_NONSHR) perl$(OBJ_EXT) $(obj)
+
+$(MINIPERL_NONSHR): $(LIBPERL_NONSHR) miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT)
+       $(CC) $(LDFLAGS) -o $(MINIPERL_NONSHR) miniperlmain$(OBJ_EXT) \
+           opmini$(OBJ_EXT) $(LIBPERL_NONSHR) $(LIBS)
+
+MINIPERLEXP            = $(MINIPERL_NONSHR)
+
+LIBPERLEXPORT          = perl.exp
 
-$(perllib): $& perl$(OBJ_EXT) $(obj)
 !NO!SUBS!
+               
+               ;;
+       *)      
+               $spitshell >>Makefile <<'!NO!SUBS!'
+MINIPERLEXP            = miniperl$(EXE_EXT)
+
+PERLEXPORT             = perl.exp
 
-case "$d_shrplib" in
-*define*)
-if test -z "$isnext_4"
-then
-$spitshell >>Makefile <<'!NO!SUBS!'
-       $(LD) $(LDDLFLAGS) -o $@ perl$(OBJ_EXT) $(obj)
 !NO!SUBS!
-else
-$spitshell >>Makefile <<!GROK!THIS!
-       version=$patchlevel; \\
-       libtool -dynamic -undefined warning -framework System \\
-           -compatibility_version 1 -current_version \$\$version \\
-           -prebind -seg1addr 0x27000000 -install_name \$(shrpdir)/\$@ \\
-           -o \$@ perl.o \$(obj)
-!GROK!THIS!
-fi
-;;
-custom)
-if test -r $osname/Makefile.SHs ; then 
-  . $osname/Makefile.SHs
-  $spitshell >>Makefile <<!GROK!THIS!
+       ;;
+       esac
+       $spitshell >>Makefile <<'!NO!SUBS!'
+perl.exp: $(MINIPERLEXP) makedef.pl config.sh $(SYM) $(SYMH)
+       ./$(MINIPERLEXP) makedef.pl PLATFORM=aix | sort -u | sort -f > perl.exp.tmp
+       sh mv-if-diff perl.exp.tmp perl.exp
+
+!NO!SUBS!
+       ;;
+os2)
+       $spitshell >>Makefile <<'!NO!SUBS!'
+MINIPERLEXP            = miniperl
+
+perl5.def: $(MINIPERLEXP) makedef.pl config.sh $(SYM) $(SYMH) miniperl.map
+       ./$(MINIPERLEXP) makedef.pl PLATFORM=os2 -DPERL_DLL=$(PERL_DLL) > perl.exp.tmp
+       sh mv-if-diff perl.exp.tmp perl5.def
+
+!NO!SUBS!
+       ;;
+esac
 
-Makefile: $osname/Makefile.SHs
+if test -r $Makefile_s ; then
+       . $Makefile_s
+       $spitshell >>Makefile <<!GROK!THIS!
 
+Makefile: $Makefile_s
 !GROK!THIS!
 else
-  echo "Could not find $osname/Makefile.SH! Skipping target \$(perllib) in Makefile!"
-fi
-;;
-*)
-if test -z "$isnext_4"
-then
-$spitshell >>Makefile <<'!NO!SUBS!'
-       rm -f $(perllib)
-       $(AR) rcu $(perllib) perl$(OBJ_EXT) $(obj)
-       @$(ranlib) $(perllib)
+       $spitshell >>Makefile <<'!NO!SUBS!'
+$(LIBPERL): $& perl$(OBJ_EXT) $(obj) $(LIBPERLEXPORT)
 !NO!SUBS!
-else
-$spitshell >>Makefile <<'!NO!SUBS!'
-       libtool -static -o $(perllib) perl.o $(obj)
+       case "$useshrplib" in
+       true)
+               $spitshell >>Makefile <<'!NO!SUBS!'
+       $(LD) -o $@ $(SHRPLDFLAGS) perl$(OBJ_EXT) $(obj)
 !NO!SUBS!
-fi
-;;
-esac
+               case "$osname" in
+               aix)
+                       $spitshell >>Makefile <<'!NO!SUBS!'
+       rm -f libperl$(OBJ_EXT)
+       mv $@ libperl$(OBJ_EXT)
+       $(AR) qv $(LIBPERL) libperl$(OBJ_EXT)
+!NO!SUBS!
+                       ;;
+               esac
+               ;;
+       *)
+               $spitshell >>Makefile <<'!NO!SUBS!'
+       rm -f $(LIBPERL)
+       $(AR) rcu $(LIBPERL) perl$(OBJ_EXT) $(obj)
+       @$(ranlib) $(LIBPERL)
+!NO!SUBS!
+               ;;
+       esac
+       $spitshell >>Makefile <<'!NO!SUBS!'
 
-$spitshell >>Makefile <<'!NO!SUBS!'
+# How to build executables.
+
+# The $& notation tells Sequent machines that it can do a parallel make,
+# and is harmless otherwise.
+# The miniperl -w -MExporter line is a basic cheap test to catch errors
+# before make goes on to run preplibrary and then MakeMaker on extensions.
+# This is very handy because later errors are often caused by miniperl
+# build problems but that's not obvious to the novice.
+# The Module used here must not depend on Config or any extensions.
+
+!NO!SUBS!
+
+       case "${osname}${osvers}" in
+       next4*)
+               $spitshell >>Makefile <<'!NO!SUBS!'
+miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL) opmini$(OBJ_EXT)
+       $(CC) -o miniperl `echo $(obj) | sed 's/ op$(OBJ_EXT) / /'` \
+           miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) perl$(OBJ_EXT) $(libs)
+       $(LDLIBPTH) ./miniperl -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
+!NO!SUBS!
+               ;;
+       aix*)
+               $spitshell >>Makefile <<'!NO!SUBS!'
+miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL) opmini$(OBJ_EXT)
+       $(CC) -o miniperl $(CLDFLAGS) \
+           `echo $(obj) | sed 's/ op$(OBJ_EXT) / /'` \
+           miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) perl$(OBJ_EXT) $(libs)
+       $(LDLIBPTH) ./miniperl -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
+!NO!SUBS!
+               ;;
+       *)
+               $spitshell >>Makefile <<'!NO!SUBS!'
+miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL) opmini$(OBJ_EXT)
+       -@rm -f miniperl.xok
+       $(LDLIBPTH) $(CC) $(CLDFLAGS) -o miniperl \
+           miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) $(LLIBPERL) $(libs)
+       $(LDLIBPTH) ./miniperl -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
+!NO!SUBS!
+               ;;
+       esac
+
+       $spitshell >>Makefile <<'!NO!SUBS!'
+
+perl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
+       -@rm -f miniperl.xok
+       $(SHRPENV) $(LDLIBPTH) $(CC) -o perl$(PERL_SUFFIX) $(PERL_PROFILE_LDFLAGS) $(CLDFLAGS) $(CCDLFLAGS) perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+
+# Purify/Quantify Perls.
+
+pureperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
+       $(SHRPENV) $(LDLIBPTH) purify $(CC) -o pureperl $(CLDFLAGS) $(CCDLFLAGS) perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+
+purecovperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
+       $(SHRPENV) $(LDLIBPTH) purecov $(CC) -o purecovperl $(CLDFLAGS) $(CCDLFLAGS) perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+
+quantperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
+       $(SHRPENV) $(LDLIBPTH) quantify $(CC) -o quantperl $(CLDFLAGS) $(CCDLFLAGS) perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+
+# Third Degree Perl (Tru64 only)
+
+perl.config.dashg:
+       @echo "Checking optimize='-g' in config.sh..."
+       @grep "^optimize="     config.sh
+       @grep "^optimize='-g'" config.sh >/dev/null || exit 1
+
+perl.third.config: config.sh
+       @echo "To build perl.third you must Configure -Doptimize=-g -Uusemymalloc, checking..."
+       @$(MAKE) perl.config.dashg
+       @echo "Checking usemymalloc='n' in config.sh..."
+       @grep "^usemymalloc="    config.sh
+       @grep "^usemymalloc='n'" config.sh >/dev/null || exit 1
+
+perl.third: /usr/bin/atom perl.third.config perl
+       atom -tool third -L. -all -gp -toolargs="-quiet -invalid -uninit heap+stack+partword+copy -min 0" perl
+       @echo "Now you may run perl.third and then study perl.3log."
+
+# Pixie Perls (Tru64 and IRIX only)
+
+perl.pixie.config: config.sh
+       @echo "To build perl.pixie you must Configure -Doptimize=-g, checking..."
+       @$(MAKE) perl.config.dashg
+
+perl.pixie.atom: /usr/bin/atom perl
+       atom -tool pixie -L. -all -toolargs="-quiet" perl
+
+perl.pixie.irix: perl
+       pixie perl
+
+perl.pixie: /usr/bin/pixie perl.pixie.config perl
+       if test -x /usr/bin/atom; then \
+         $(MAKE) perl.pixie.atom; \
+       else \
+         $(MAKE) perl.pixie.irix; \
+       fi
+       @echo "Now you may run perl.pixie and then run pixie."
+
+# Gprof Perl
+
+perl.config.dashpg:
+       @echo "Checking optimize='-pg' in config.sh..."
+       @grep "^optimize="      config.sh
+       @grep "^optimize='.*-pg.*'" config.sh >/dev/null || exit 1
+
+perl.gprof.config: config.sh
+       @echo "To build perl.gprof you must Configure -Doptimize=-pg, checking..."
+       @$(MAKE) perl.config.dashpg
+
+perl.gprof: /usr/bin/gprof perl.gprof.config
+       @-rm -f perl
+       $(MAKE) PERL_SUFFIX=.gprof PERL_PROFILE_LDFLAGS=-pg perl
+       @echo "Now you may run perl.gprof and then run gprof perl.gprof."
+
+# Gcov Perl
+
+perl.config.gcov:
+       @echo "To build perl.gcov you must use gcc 3.0 or newer, checking..."
+       @echo "Checking gccversion in config.sh..."
+       @grep "^gccversion="      config.sh
+       @grep "^gccversion='[3-9]\." config.sh >/dev/null || exit 1
+       @echo "To build perl.gcov you must Configure -Dccflags=-fprofile-arcs -ftest-coverage, checking..."
+       @echo "Checking ccflags='-fprofile-arcs -ftest-coverage' in config.sh..."
+       @grep "^ccflags="      config.sh
+       @grep "^ccflags='.*-fprofile-arcs -ftest-coverage.*'" config.sh >/dev/null || exit 1
+
+perl.gcov: perl.config.gcov
+       @-rm -f perl
+       $(MAKE) PERL_SUFFIX=.gcov PERL_PROFILE_LDFLAGS='' perl
+       @echo "Now you may run perl.gcov and then run gcov some.c."
+
+# Microperl.  This is just a convenience thing if one happens to
+# build also the full Perl and therefore the real big Makefile:
+# usually one should manually explicitly issue the below command.
+
+.PHONY: microperl
+microperl:
+       $(MAKE) -f Makefile.micro
 
 # This version, if specified in Configure, does ONLY those scripts which need
 # set-id emulation.  Suidperl must be setuid root.  It contains the "taint"
 # checks as well as the special code to validate that the script in question
 # has been invoked correctly.
 
-suidperl: $& sperl$(OBJ_EXT) perlmain$(OBJ_EXT) $(perllib) $(DYNALOADER) $(static_ext) ext.libs
-       $(CC) $(LARGE) $(MAB) $(CLDFLAGS) $(CCDLFLAGS) -o suidperl perlmain$(OBJ_EXT) sperl$(OBJ_EXT) $(perllib) $(DYNALOADER) $(static_ext) `cat ext.libs` $(libs)
+suidperl: $& sperl$(OBJ_EXT) perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
+       $(SHRPENV) $(LDLIBPTH) $(CC) -o suidperl $(CLDFLAGS) $(CCDLFLAGS) perlmain$(OBJ_EXT) sperl$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+
+!NO!SUBS!
+
+fi
 
-sperl$(OBJ_EXT): perl.c perly.h patchlevel.h $(h)
+$spitshell >>Makefile <<'!NO!SUBS!'
+
+sperl$(OBJ_EXT): perl.c $(h)
        $(RMS) sperl.c
        $(LNS) perl.c sperl.c
-       $(CCCMD) $(MAB) -DIAMSUID sperl.c
+       $(CCCMD) -DIAMSUID sperl.c
        $(RMS) sperl.c
 
 # We have to call our ./makedir because Ultrix 4.3 make can't handle the line
 #      test -d lib/auto || mkdir lib/auto
 #
-preplibrary: miniperl lib/Config.pm $(plextract)
+.PHONY: preplibrary
+preplibrary: miniperl lib/Config.pm lib/lib.pm
        @sh ./makedir lib/auto
        @echo " AutoSplitting perl library"
-       @./miniperl -Ilib -e 'use AutoSplit; \
+       $(LDLIBPTH) ./miniperl -Ilib -e 'use AutoSplit; \
                autosplit_lib_modules(@ARGV)' lib/*.pm lib/*/*.pm
+       $(MAKE) lib/re.pm
 
 # Take care to avoid modifying lib/Config.pm without reason
+# (If trying to create a new port and having problems with the configpm script,
+# try 'make minitest' and/or commenting out the tests at the end of configpm.)
 lib/Config.pm: config.sh miniperl configpm
-       ./miniperl configpm tmp
-       sh mv-if-diff tmp lib/Config.pm
+       $(LDLIBPTH) ./miniperl configpm configpm.tmp
+       sh mv-if-diff configpm.tmp $@
 
 lib/ExtUtils/Miniperl.pm: miniperlmain.c miniperl minimod.pl lib/Config.pm
-       ./miniperl minimod.pl > tmp && mv tmp $@
+       $(LDLIBPTH) ./miniperl minimod.pl > minimod.tmp
+       sh mv-if-diff minimod.tmp $@
+       -touch lib/ExtUtils/Miniperl.pm
+
+lib/re.pm: ext/re/re.pm
+       cp ext/re/re.pm ext/re/re.tmp && sh mv-if-diff ext/re/re.tmp lib/re.pm
 
 $(plextract):  miniperl lib/Config.pm
-       ./miniperl -Ilib $@.PL
+       @-rm -f $@
+       $(LDLIBPTH) ./miniperl -Ilib $@.PL
+
+lib/lib.pm:    miniperl lib/Config.pm
+       @-rm -f $@
+       $(LDLIBPTH) ./miniperl -Ilib lib/lib_pm.PL
+
+extra.pods: miniperl
+       -@test -f extra.pods && rm -f `cat extra.pods`
+       -@rm -f extra.pods
+       -@for x in `grep -l '^=[a-z]' README.* | grep -v README.vms` ; do \
+           nx=`echo $$x | sed -e "s/README\.//"`; \
+           cd pod ; $(LNS) ../$$x "perl"$$nx".pod" ; cd .. ; \
+           echo "pod/perl"$$nx".pod" >> extra.pods ; \
+       done
+       -@rm -f pod/perlvms.pod
+       -@test -f vms/perlvms.pod && cd pod && $(LNS) ../vms/perlvms.pod perlvms.pod && cd .. && echo "pod/perlvms.pod" >> extra.pods
 
-install: all install.perl install.man
+extras.make: perl
+       -@test -s extras.lst && $(LDLIBPTH) PATH=`pwd`:${PATH} PERL5LIB=`pwd`/lib ./perl -Ilib -MCPAN -e '@ARGV&&make(@ARGV)' `cat extras.lst`
+
+extras.test: perl
+       -@test -s extras.lst && $(LDLIBPTH) PATH=`pwd`:${PATH} PERL5LIB=`pwd`/lib ./perl -Ilib -MCPAN -e '@ARGV&&test(@ARGV)' `cat extras.lst`
+
+extras.install: perl
+       -@test -s extras.lst && $(LDLIBPTH) PATH=`pwd`:${PATH} PERL5LIB=`pwd`/lib ./perl -Ilib -MCPAN -e '@ARGV&&install(@ARGV)' `cat extras.lst`
+
+.PHONY: install install-strip install-all install-verbose install-silent \
+       no-install install.perl install.man installman install.html installhtml
+
+install-strip:
+       $(MAKE) STRIPFLAGS=-s install
+
+install install-all:
+       $(MAKE) install.perl install.man STRIPFLAGS=$(STRIPFLAGS)
+
+install-verbose:
+       $(MAKE) install.perl install.man STRIPFLAGS=$(STRIPFLAGS) INSTALLFLAGS=-V
+
+install-silent:
+       $(MAKE) install.perl install.man STRIPFLAGS=$(STRIPFLAGS) INSTALLFLAGS=-S
+
+no-install:
+       $(MAKE) install.perl install.man STRIPFLAGS=$(STRIPFLAGS) INSTALLFLAGS=-n
 
 install.perl:  all installperl
-       ./perl installperl
+       if [ -n "$(COMPILE)" ]; \
+       then \
+               cd utils; $(MAKE) compile; \
+               cd ../x2p; $(MAKE) compile; \
+               cd ../pod; $(MAKE) compile; \
+       else :; \
+       fi
+       $(LDLIBPTH) ./perl installperl $(INSTALLFLAGS) $(STRIPFLAGS)
+       $(MAKE) extras.install
 
 install.man:   all installman
-       ./perl installman
+       $(LDLIBPTH) ./perl installman $(INSTALLFLAGS)
+
+# XXX Experimental. Hardwired values, but useful for testing.
+# Eventually Configure could ask for some of these values.
+install.html: all installhtml
+       -@test -f README.vms && cd vms && $(LNS) ../README.vms README_vms.pod && cd ..
+       $(LDLIBPTH) ./perl installhtml                   \
+      --podroot=. --podpath=. --recurse  \
+      --htmldir=$(privlib)/html     \
+      --htmlroot=$(privlib)/html    \
+      --splithead=pod/perlipc     \
+      --splititem=pod/perlfunc    \
+      --libpods=perlfunc:perlguts:perlvar:perlrun:perlop \
+      --verbose
 
-# Not implemented yet.
-#install.html: all installhtml
-#      ./perl installhtml
 
 # I now supply perly.c with the kits, so the following section is
 # used only if you force byacc to run by saying
@@ -368,14 +745,22 @@ install.man:      all installman
 # to run with precisely the same version of byacc as I use.  You
 # normally shouldn't remake perly.[ch].
 
-run_byacc:     FORCE
-       @ echo 'Expect' 130 shift/reduce and 1 reduce/reduce conflict
+.PHONY: check_byacc run_byacc
+
+check_byacc:
+       @$(BYACC) -V 2>&1 | grep 'version 1\.8\.2'
+
+run_byacc:     FORCE check_byacc
        $(BYACC) -d perly.y
+       -chmod 664 perly.c perly.h
        sh $(shellflags) ./perly.fixer y.tab.c perly.c
-       sed -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' perly.c >perly.tmp && mv perly.tmp perly.c
-       mv y.tab.h perly.h
-       echo 'extern YYSTYPE yylval;' >>perly.h
-       - perl vms/vms_yfix.pl perly.c perly.h vms/perly_c.vms vms/perly_h.vms
+       sed -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' \
+           -e 's/y\.tab/perly/g' perly.c >perly.tmp && mv perly.tmp perly.c
+       sed -e '/^extern YYSTYPE yy/D' y.tab.h >yh.tmp && mv yh.tmp y.tab.h
+       cmp -s y.tab.h perly.h && rm -f y.tab.h || mv y.tab.h perly.h
+       perl -i perlyline.pl perly.c
+       chmod 664 vms/perly_c.vms vms/perly_h.vms
+       perl vms/vms_yfix.pl perly.c perly.h vms/perly_c.vms vms/perly_h.vms
 
 # We don't want to regenerate perly.c and perly.h, but they might
 # appear out-of-date after a patch is applied or a new distribution is
@@ -386,23 +771,62 @@ perly.c: perly.y
 perly.h: perly.y
        -@sh -c true
 
-# The following three header files are generated automatically
-#      keywords.h:     keywords.pl
-#      opcode.h:       opcode.pl
-#      embed.h:        embed.pl global.sym interp.sym
+PERLYVMS = vms/perly_c.vms vms/perly_h.vms
+
+$(PERLYVMS):   perly.c perly.h vms/vms_yfix.pl
+       perl vms/vms_yfix.pl perly.c perly.h vms/perly_c.vms vms/perly_h.vms
+
+# No compat3.sym here since and including the 5.004_50.
+# No interp.sym since 5.005_03.
+SYM  = global.sym globvar.sym perlio.sym pp.sym
+
+SYMH = perlvars.h intrpvar.h thrdvar.h
+
+CHMOD_W = chmod +w
+
+# The following files are generated automatically
+#      keywords.pl:    keywords.h
+#      opcode.pl:      opcode.h opnames.h pp_proto.h pp.sym
+# [* embed.pl needs pp.sym generated by opcode.pl! *]
+#      embed.pl:       proto.h embed.h embedvar.h global.sym
+#                      perlapi.h perlapi.c pod/perlintern.pod
+#                      pod/perlapi.pod
+#      bytecode.pl:    ext/ByteLoader/byterun.h ext/ByteLoader/byterun.c
+#                      ext/B/B/Asmdata.pm
+#      regcomp.pl:     regnodes.h
+#      warnings.pl:    warnings.h lib/warnings.pm
 # The correct versions should be already supplied with the perl kit,
 # in case you don't have perl available.
-# To force them to run, type
+# To force them to be regenerated, type
 #      make regen_headers
+
+AUTOGEN_FILES = keywords.h opcode.h opnames.h pp_proto.h pp.sym proto.h \
+               embed.h embedvar.h global.sym \
+               pod/perlintern.pod pod/perlapi.pod \
+               perlapi.h perlapi.c ext/ByteLoader/byterun.h \
+               ext/ByteLoader/byterun.c ext/B/B/Asmdata.pm regnodes.h \
+               warnings.h lib/warnings.pm
+
+.PHONY: regen_headers regen_pods regen_all
+
 regen_headers: FORCE
-       perl keywords.pl
-       perl opcode.pl
-       perl embed.pl
+       -$(CHMOD_W) $(AUTOGEN_FILES)
+       -perl keywords.pl
+       -perl opcode.pl
+       -perl embed.pl
+       -perl bytecode.pl
+       -perl regcomp.pl
+       -perl warnings.pl
+
+regen_pods:    FORCE
+       -cd pod; $(LDLIBPTH) make regen_pods
+
+regen_all: $(PERLYVMS) regen_headers regen_pods
 
 # Extensions:
-# Names added to $(dynamic_ext) or $(static_ext) will automatically
-# get built.  There should ordinarily be no need to change any of
-# this part of makefile.
+# Names added to $(dynamic_ext) or $(static_ext) or $(nonxs_ext) will
+# automatically get built.  There should ordinarily be no need to change
+# any of this part of makefile.
 #
 # The dummy dependency is a place holder in case $(dynamic_ext) or
 # $(static_ext) is empty.
@@ -410,73 +834,117 @@ regen_headers:   FORCE
 # DynaLoader may be needed for extensions that use Makefile.PL.
 
 $(DYNALOADER): miniperl preplibrary FORCE
-       @sh ext/util/make_ext static $@ LIBPERL_A=$(perllib)
+       @$(LDLIBPTH) sh ext/util/make_ext static $@ MAKE=$(MAKE) LIBPERL_A=$(LIBPERL)
 
 d_dummy $(dynamic_ext):        miniperl preplibrary $(DYNALOADER) FORCE
-       @sh ext/util/make_ext dynamic $@ LIBPERL_A=$(perllib)
+       @$(LDLIBPTH) sh ext/util/make_ext dynamic $@ MAKE=$(MAKE) LIBPERL_A=$(LIBPERL)
 
 s_dummy $(static_ext): miniperl preplibrary $(DYNALOADER) FORCE
-       @sh ext/util/make_ext static $@ LIBPERL_A=$(perllib)
+       @$(LDLIBPTH) sh ext/util/make_ext static $@ MAKE=$(MAKE) LIBPERL_A=$(LIBPERL)
+
+n_dummy $(nonxs_ext):  miniperl preplibrary $(DYNALOADER) FORCE
+       @$(LDLIBPTH) sh ext/util/make_ext nonxs $@ MAKE=$(MAKE) LIBPERL_A=$(LIBPERL)
+
+.PHONY: clean _tidy _mopup _cleaner1 _cleaner2 \
+       realclean _realcleaner clobber _clobber \
+       distclean veryclean _verycleaner
+
+clean:         _tidy _mopup
+
+realclean:     _realcleaner _mopup
+       @echo "Note that make realclean does not delete config.sh or Policy.sh"
+
+_clobber:
+       -@rm -f Cross/run-* Cross/to-* Cross/from-*
+       rm -f config.sh cppstdin Policy.sh extras.lst
+
+clobber:       _realcleaner _mopup _clobber
 
-clean:
+distclean:     clobber
+
+# Like distclean but also removes emacs backups and *.orig.
+veryclean:     _verycleaner _mopup _clobber
+       -@rm -f Obsolete Wanted
+
+# Do not 'make _mopup' directly.
+_mopup:
        rm -f *$(OBJ_EXT) *$(LIB_EXT) all perlmain.c
-       rm -f perl.exp ext.libs
-       -rm perl.export perl.dll perl.libexp perl.map perl.def
-       -cd pod; $(MAKE) clean
-       -cd utils; $(MAKE) clean
-       -cd x2p; $(MAKE) clean
-       -@for x in $(DYNALOADER) $(dynamic_ext) $(static_ext) ; do \
-       sh ext/util/make_ext clean $$x ; \
+       -@test -f extra.pods && rm -f `cat extra.pods`
+       -@test -f vms/README_vms.pod && rm -f vms/README_vms.pod
+       -rm -f perl.exp ext.libs extra.pods opmini.o
+       -rm -f perl.export perl.dll perl.libexp perl.map perl.def
+       -rm -f perl.loadmap miniperl.loadmap perl.prelmap miniperl.prelmap
+       -rm -f perl.third lib*.so.perl.third perl.3log t/perl.third t/perl.3log
+       -rm -f perl.pixie lib*.so.perl.pixie lib*.so.Addrs
+       -rm -f perl.Addrs perl.Counts t/perl.Addrs t/perl.Counts *perl.xok
+       -rm -f perlld cygwin.c ld2 libperl*.def libperl*.dll
+       rm -f perl$(EXE_EXT) suidperl$(EXE_EXT) miniperl$(EXE_EXT) $(LIBPERL) libperl.* microperl
+
+# Do not 'make _tidy' directly.
+_tidy:
+       -cd pod; $(LDLIBPTH) $(MAKE) clean
+       -cd utils; $(LDLIBPTH) $(MAKE) clean
+       -cd x2p; $(LDLIBPTH) $(MAKE) clean
+       -@for x in $(DYNALOADER) $(dynamic_ext) $(static_ext) $(nonxs_ext) ; do \
+       $(LDLIBPTH) sh ext/util/make_ext clean $$x MAKE=$(MAKE) ; \
        done
-       rm -f perl suidperl miniperl $(perllib)
+       rm -f testcompile compilelog
 
-realclean: clean
+_cleaner1:
        -cd os2; rm -f Makefile
-       -cd pod; $(MAKE) realclean
-       -cd utils; $(MAKE) realclean
-       -cd x2p; $(MAKE) realclean
-       -@for x in $(DYNALOADER) $(dynamic_ext) $(static_ext) ; do \
-       sh ext/util/make_ext realclean $$x ; \
+       -cd pod; $(LDLIBPTH) $(MAKE) $(CLEAN)
+       -cd utils; $(LDLIBPTH) $(MAKE) $(CLEAN)
+       -cd x2p; $(LDLIBPTH) $(MAKE) $(CLEAN)
+       -@for x in $(DYNALOADER) $(dynamic_ext) $(static_ext) $(nonxs_ext) ; do \
+       $(LDLIBPTH) sh ext/util/make_ext $(CLEAN) $$x MAKE=$(MAKE) ; \
        done
-       rm -f *.orig */*.orig *~ */*~ core t/core t/c t/perl
+
+_cleaner2:
+       rm -f core core.*perl.*.? *perl.core t/core t/core.perl.*.? t/*perl.core t/misctmp* t/forktmp* t/tmp* t/c t/perl$(EXE_EXT) t/rantests .?*.c so_locations $(LIBPERL_NONSHR) $(MINIPERL_NONSHR)
        rm -rf $(addedbyconf)
        rm -f $(FIRSTMAKEFILE) $(FIRSTMAKEFILE).old
        rm -f $(private)
        rm -rf lib/auto
-       rm -f lib/.exists
+       rm -f lib/.exists lib/*/.exists lib/*/*/.exists
        rm -f h2ph.man pstruct
        rm -rf .config
-       @echo "Note that make realclean does not delete config.sh"
+       rm -f testcompile compilelog
+       -rmdir lib/B lib/Data lib/Digest lib/Encode lib/IO/Socket lib/IO lib/Filter/Util lib/List lib/MIME lib/PerlIO lib/Scalar lib/Sys lib/Thread lib/XS
 
-clobber:       realclean
-       rm -f config.sh cppstdin
+_realcleaner:
+       @$(LDLIBPTH) $(MAKE) _cleaner1 CLEAN=realclean
+       @$(LDLIBPTH) $(MAKE) _cleaner2
 
-distclean:     clobber
+_verycleaner:
+       @$(LDLIBPTH) $(MAKE) _cleaner1 CLEAN=veryclean
+       @$(LDLIBPTH) $(MAKE) _cleaner2
+       -rm -f *~ *.orig */*~ */*.orig */*/*~ */*/*.orig
 
 # The following lint has practically everything turned on.  Unfortunately,
 # you have to wade through a lot of mumbo jumbo that can't be suppressed.
 # If the source file has a /*NOSTRICT*/ somewhere, ignore the lint message
 # for that spot.
 
-lint: perly.c $(c)
+.PHONY: lint
+lint: $(c)
        lint $(lintflags) $(defs) perly.c $(c) > perl.fuzz
 
-# Need to unset during recursion to go out of loop
+# Need to unset during recursion to go out of loop.
+# The README below ensures that the dependency list is never empty and
+# that when MAKEDEPEND is empty $(FIRSTMAKEFILE) doesn't need rebuilding.
 
-MAKEDEPEND = makedepend
+MAKEDEPEND = Makefile makedepend
 
-$(FIRSTMAKEFILE):      Makefile $(MAKEDEPEND)
+$(FIRSTMAKEFILE):      README $(MAKEDEPEND)
        $(MAKE) depend MAKEDEPEND=
 
-config.h: config.sh
+config.h: config_h.SH config.sh
        $(SHELL) config_h.SH
 
-perl.exp: perl_exp.SH config.sh
-       $(SHELL) perl_exp.SH
-
 # When done, touch perlmain.c so that it doesn't get remade each time.
+.PHONY: depend
 depend: makedepend
-       sh ./makedepend
+       sh ./makedepend MAKE=$(MAKE)
        - test -s perlmain.c && touch perlmain.c
        cd x2p; $(MAKE) depend
 
@@ -484,33 +952,172 @@ depend: makedepend
 makedepend: makedepend.SH config.sh
        sh ./makedepend.SH
 
-test: miniperl perl preplibrary $(dynamic_ext)
-       - cd t && (rm -f perl$(EXE_EXT); $(LNS) ../perl$(EXE_EXT) perl$(EXE_EXT)) && ./perl TEST </dev/tty
+.PHONY: test check test_prep test_prep_nodll test_prep_pre _test_prep \
+       test_tty test-tty _test_tty test_notty test-notty _test_notty \
+       utest ucheck test.utf8 check.utf8 \
+       test.third check.third utest.third ucheck.third test_notty.third \
+       test.deparse test_notty.deparse \
+       minitest coretest
+
+# Cannot delegate rebuilding of t/perl to make
+# to allow interlaced test and minitest
+
+TESTFILE=TEST
+
+_test_prep:
+       cd t && (rm -f $(PERL)$(EXE_EXT); $(LNS) ../$(PERL)$(EXE_EXT) $(PERL)$(EXE_EXT))
+
+# Architecture-neutral stuff:
+
+test_prep_pre: preplibrary utilities $(nonxs_ext)
+
+test_prep: test_prep_pre miniperl perl$(EXE_EXT) $(dynamic_ext) $(TEST_PERL_DLL)
+       PERL=./perl $(MAKE) _test_prep
+
+_test_tty:
+       cd t && $(LDLIBPTH) $(PERL_DEBUG) $(PERL) $(TESTFILE) $(TEST_ARGS) </dev/tty
 
-minitest: miniperl lib/Config.pm
+_test_notty:
+       cd t && $(LDLIBPTH) $(PERL_DEBUG) PERL_SKIP_TTY_TEST=1 $(PERL) $(TESTFILE) $(TEST_ARGS)
+
+# The second branch is for testing without a tty or controlling terminal,
+# see t/op/stat.t
+_test:
+       if (true </dev/tty) >/dev/null 2>&1; then \
+         $(MAKE) TEST_ARGS=$(TEST_ARGS) TESTFILE=$(TESTFILE) _test_tty   ; \
+       else \
+         $(MAKE) TEST_ARGS=$(TEST_ARGS) TESTFILE=$(TESTFILE) _test_notty ; \
+       fi
+       @echo "Ran tests" > t/rantests
+
+test check: test_prep
+       PERL=./perl $(MAKE) _test
+
+test_tty: test_prep
+       PERL=./perl $(MAKE) _test_tty
+
+test_notty: test_prep
+       PERL=./perl $(MAKE) _test_notty
+
+utest ucheck test.utf8 check.utf8: test_prep
+       PERL=./perl TEST_ARGS=-utf8 $(MAKE) _test
+
+coretest: test_prep
+       PERL=./perl TEST_ARGS=-core $(MAKE) _test
+
+test-prep:     test_prep
+
+test-tty:      test_tty
+
+test-notty:    test_notty
+
+# Targets for Third Degree testing.
+
+test_prep.third: test_prep perl.third perl.third$(EXE_EXT)
+       PERL=./perl.third $(MAKE) _test_prep
+
+test.third check.third:        test_prep.third perl.third
+       PERL=./perl.third PERL_DEBUG=PERL_3LOG=1 $(MAKE) _test
+
+utest.third ucheck.third: test_prep.third perl.third
+       PERL=./perl.third PERL_DEBUG=PERL_3LOG=1 TEST_ARGS=-utf8 $(MAKE) _test
+
+test_notty.third: test_prep.third perl.third
+       PERL=./perl.third $(MAKE) PERL_DEBUG=PERL_3LOG=1 _test_notty
+
+# Targets for Deparse testing.
+
+test.deparse:  test_prep
+       PERL=./perl TEST_ARGS=-deparse $(MAKE) _test
+
+test_notty.deparse:    test_prep
+       PERL=./perl TEST_ARGS=-deparse $(MAKE) _test_notty
+
+# Can't depend on lib/Config.pm because that might be where miniperl
+# is crashing.
+minitest: miniperl lib/re.pm
+       @echo "You may see some irrelevant test failures if you have been unable"
+       @echo "to build lib/Config.pm."
        - cd t && (rm -f perl$(EXE_EXT); $(LNS) ../miniperl$(EXE_EXT) perl$(EXE_EXT)) \
-               && ./perl TEST base/*.t comp/*.t cmd/*.t io/*.t op/*.t </dev/tty
+               && $(LDLIBPTH) ./perl TEST base/*.t comp/*.t cmd/*.t run/*.t io/*.t op/*.t </dev/tty
+
+# Test via harness
+
+test_harness: test_prep
+       PERL=./perl $(MAKE) TESTFILE=harness _test
+
+# Handy way to run perlbug -ok without having to install and run the
+# installed perlbug. We don't re-run the tests here - we trust the user.
+# Please *don't* use this unless all tests pass.
+# If you want to report test failures, use "make nok" instead.
+
+.PHONY: ok okfile oknack okfilenack nok nokfile noknack nokfilenack
+
+ok:    utilities
+       $(LDLIBPTH) ./perl -Ilib utils/perlbug -ok -s '(UNINSTALLED)'
+
+okfile:        utilities
+       $(LDLIBPTH) ./perl -Ilib utils/perlbug -ok -s '(UNINSTALLED)' -F perl.ok
+
+oknack:        utilities
+       $(LDLIBPTH) ./perl -Ilib utils/perlbug -ok -s '(UNINSTALLED)' -A
+
+okfilenack:    utilities
+       $(LDLIBPTH) ./perl -Ilib utils/perlbug -ok -s '(UNINSTALLED)' -F perl.ok -A
+
+nok:   utilities
+       $(LDLIBPTH) ./perl -Ilib utils/perlbug -nok -s '(UNINSTALLED)'
+
+nokfile:       utilities
+       $(LDLIBPTH) ./perl -Ilib utils/perlbug -nok -s '(UNINSTALLED)' -F perl.nok
+
+noknack:       utilities
+       $(LDLIBPTH) ./perl -Ilib utils/perlbug -nok -s '(UNINSTALLED)' -A
+
+nokfilenack:   utilities
+       $(LDLIBPTH) ./perl -Ilib utils/perlbug -nok -s '(UNINSTALLED)' -F perl.nok -A
+
+.PHONY: clist hlist shlist pllist
 
 clist: $(c)
-       echo $(c) | tr ' ' '\012' >.clist
+       echo $(c) | tr ' ' $(TRNL) >.clist
 
 hlist:  $(h)
-       echo $(h) | tr ' ' '\012' >.hlist
+       echo $(h) | tr ' ' $(TRNL) >.hlist
 
 shlist: $(sh)
-       echo $(sh) | tr ' ' '\012' >.shlist
+       echo $(sh) | tr ' ' $(TRNL) >.shlist
 
 pllist: $(pl)
-       echo $(pl) | tr ' ' '\012' >.pllist
+       echo $(pl) | tr ' ' $(TRNL) >.pllist
 
-Makefile: Makefile.SH ./config.sh 
+Makefile: Makefile.SH ./config.sh
        $(SHELL) Makefile.SH
 
-distcheck : FORCE
+.PHONY: distcheck
+distcheck: FORCE
        perl '-MExtUtils::Manifest=&fullcheck' -e 'fullcheck()'
 
-manifest  : 
-       perl '-MExtUtils::Manifest=&mkmanifest' -e 'mkmanifest()'
+.PHONY: elc
+elc:   emacs/cperl-mode.elc
+
+emacs/cperl-mode.elc: emacs/cperl-mode.el
+       -cd emacs; emacs -batch -q -no-site-file -f batch-byte-compile cperl-mode.el
+
+.PHONY: etags ctags tags
+
+etags: TAGS
+
+TAGS: emacs/cperl-mode.elc
+       sh emacs/ptags
+
+ctags: tags
+
+# Let's hope make will not go into an infinite loop on case-unsensitive systems
+# This may also fail if . is in the head of the path, since perl will
+# require -Ilib
+tags:  TAGS
+       perl emacs/e2ctags.pl TAGS > tags
 
 # AUTOMATICALLY GENERATED MAKE DEPENDENCIES--PUT NOTHING BELOW THIS LINE
 # If this runs make out of memory, delete /usr/include lines.
@@ -524,3 +1131,97 @@ case `pwd` in
     ;;
 esac
 $rm -f $firstmakefile
+
+# Now do any special processing required before building.
+
+case "$ebcdic" in
+$define)
+    xxx=''
+    echo "This is an EBCDIC system, checking if any parser files need regenerating." >&4
+case "$osname" in
+os390|posix-bc)
+    rm -f y.tab.c y.tab.h
+    # yacc must be a reentrant ("pure") Bison in BS2000 Posix!
+    yacc -d perly.y >/dev/null 2>&1
+    if cmp -s y.tab.c perly.c; then
+        rm -f y.tab.c
+    else
+        echo "perly.y -> perly.c" >&2
+        mv -f y.tab.c perly.c
+        chmod u+w perly.c
+        sed -e '/^#include "perl\.h"/a\
+\
+#define yydebug    PL_yydebug\
+#define yynerrs    PL_yynerrs\
+#define yyerrflag  PL_yyerrflag\
+#define yychar     PL_yychar\
+#define yyval      PL_yyval\
+#define yylval     PL_yylval'                          \
+            -e '/YYSTYPE *yyval;/D'                    \
+            -e '/YYSTYPE *yylval;/D'                   \
+            -e '/int  yychar,/,/yynerrs;/D'            \
+            -e 's/int yydebug = 0;/yydebug = 0;/'      \
+            -e 's/[^_]realloc(/PerlMem_realloc(/g'     \
+            -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' \
+            -e 's/y\.tab/perly/g' perly.c >perly.tmp && mv perly.tmp perly.c
+        xxx="$xxx perly.c"
+    fi
+    if cmp -s y.tab.h perly.h; then
+        rm -f y.tab.h
+    else
+        echo "perly.y -> perly.h" >&2
+        mv -f y.tab.h perly.h
+        xxx="$xxx perly.h"
+    fi
+    if cd x2p
+    then
+        rm -f y.tab.c y.tab.h
+        case "$osname" in
+        posix-bc)
+           # we are using two different yaccs in BS2000 Posix!
+           byacc a2p.y >/dev/null 2>&1
+           ;;
+        *) # e.g. os390
+           yacc  a2p.y >/dev/null 2>&1
+           ;;
+        esac
+        if cmp -s y.tab.c a2p.c
+        then
+            rm -f y.tab.c
+        else
+            echo "a2p.y -> a2p.c" >&2
+            mv -f y.tab.c a2p.c
+            chmod u+w a2p.c
+            sed -e 's/fprintf *( *stderr *,/PerlIO_printf(Perl_debug_log,/g' \
+               -e 's|^static void __YY_YACC_MAIN.*BS2000.*|/*static main deleted*/|' \
+                -e 's/y\.tab/a2p/g' a2p.c >a2p.tmp && mv a2p.tmp a2p.c
+            xxx="$xxx a2p.c"
+        fi
+        # In case somebody yacc -d:ed the a2p.y.
+        if test -f y.tab.h
+        then
+            if cmp -s y.tab.h a2p.h
+            then
+                rm -f y.tab.h
+            else
+                echo "a2p.h -> a2p.h" >&2
+                mv -f y.tab.h a2p.h
+                xxx="$xxx a2p.h"
+            fi
+        fi
+        cd ..
+    fi
+    ;;
+vmesa)
+    # Do nothing in VM/ESA.
+    ;;
+*)
+    echo "'$osname' is an EBCDIC system I don't know that well." >&4
+    ;;
+esac
+    case "$xxx" in
+    '') echo "No parser files were regenerated.  That's okay." >&2 ;;
+    esac
+    ;;
+esac
+