--- ./makedef.pl-pre	Tue Sep  9 08:48:18 2003
+++ ./makedef.pl	Tue Oct  7 12:02:30 2003
@@ -1340,7 +1340,10 @@ foreach my $symbol (sort keys %export) {
 }
 
 if ($PLATFORM eq 'os2') {
-	print "; LAST_ORDINAL=$sym_ord\n";
+	print <<EOP;
+    dll_perlmain=main
+; LAST_ORDINAL=$sym_ord
+EOP
 }
 
 sub emit_symbol {
--- ./os2/Makefile.SHs-pre	Mon Mar 31 22:23:12 2003
+++ ./os2/Makefile.SHs	Tue Oct  7 15:55:40 2003
@@ -43,7 +43,7 @@ AOUT_CLDFLAGS_DLL	= -Zexe -Zmt -Zcrtdll 
 SO_CCCMD	= \$(CC) $ccflags \$(OPTIMIZE)
 
 LD_OPT		= \$(OPTIMIZE)
-PERL_DLL_LD_OPT = -Zmap -Zlinker /map
+PERL_DLL_LD_OPT = -Zmap -Zlinker /map/li
 
 PERL_DLL_BASE	= perl$dll_post
 PERL_DLL	= \$(PERL_DLL_BASE)\$(DLSUFFIX)
@@ -55,7 +55,7 @@ AOUT_EXTRA_LIBS	= $aout_extra_libs
 
 $spitshell >>Makefile <<'!NO!SUBS!'
 PREPLIBRARY_LIBPERL = $(LIBPERL)
-$(LIBPERL): perl.imp $(PERL_DLL) perl5.def libperl_override.lib
+$(LIBPERL): perl.imp perl5.def libperl_override.lib
 	emximp -o $(LIBPERL) perl.imp
 	cp $(LIBPERL) perl.lib
 
@@ -68,6 +68,16 @@ libperl_override.imp: os2/os2add.sym min
 libperl_override.lib: libperl_override.imp
 	emximp -o $@ libperl_override.imp
 
+libperl_dllmain.imp:
+	echo	'main	$(PERL_DLL_BASE)	dll_perlmain	?' >> tmpdll.imp
+	sh mv-if-diff tmpdll.imp $@
+
+libperl_dllmain.lib: libperl_dllmain.imp
+	emximp -o $@ libperl_dllmain.imp
+
+libperl_dllmain.a: libperl_dllmain.imp
+	emximp -o $@ libperl_dllmain.imp
+
 $(AOUT_LIBPERL_DLL): perl.imp $(PERL_DLL) perl5.def
 	emximp -o $(AOUT_LIBPERL_DLL) perl.imp
 
@@ -91,8 +101,8 @@ perl_dll_t: t/$(PERL_DLL)
 t/$(PERL_DLL): $(PERL_DLL)
 	$(LNS) $(PERL_DLL) t/$(PERL_DLL)
 
-$(PERL_DLL): $(obj) perl5.def perl$(OBJ_EXT)
-	$(LD) $(LD_OPT) $(LDDLFLAGS) $(PERL_DLL_LD_OPT) -o $@ perl$(OBJ_EXT) $(obj) $(libs) perl5.def || ( rm $(PERL_DLL) && sh -c false )
+$(PERL_DLL): $(obj) perl5.def perl$(OBJ_EXT) perlmain$(OBJ_EXT) $(DYNALOADER)
+	$(LD) $(LD_OPT) $(LDDLFLAGS) $(PERL_DLL_LD_OPT) -o $@ perl$(OBJ_EXT) $(obj) perlmain$(OBJ_EXT) $(DYNALOADER) $(libs) perl5.def || ( rm $(PERL_DLL) && sh -c false )
 
 perl5.olddef: perl.linkexp
 	echo "LIBRARY '$(PERL_DLL_BASE)' INITINSTANCE TERMINSTANCE"	> $@
@@ -156,8 +166,8 @@ dlfcn.h: os2/dlfcn.h
 
 # Non-Forking dynamically loaded perl
 
-perl___$(EXE_EXT) perl___: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-	$(SHRPENV) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl___ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs) -Zlinker /map/PM:VIO
+perl___$(EXE_EXT) perl___: $& libperl_dllmain$(LIB_EXT)
+	$(SHRPENV) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl___ libperl_dllmain$(LIB_EXT) -Zlinker /map/PM:VIO
 
 # This one is compiled -Zsys, so cannot do many things:
 
@@ -166,16 +176,16 @@ STAT_CLDFLAGS = -Zexe -Zomf -Zmt -Zstack
 
 # Non-forking dynamically loaded perl with a wrong CRT library:
 
-perl_stat: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-	$(SHRPENV) $(CC) $(STAT_CLDFLAGS) $(CCDLFLAGS) -o $@ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs) -Zlinker /map/PM:VIO
+perl_stat: $& libperl_dllmain$(LIB_EXT)
+	$(SHRPENV) $(CC) $(STAT_CLDFLAGS) $(CCDLFLAGS) -o $@ libperl_dllmain$(LIB_EXT) -Zlinker /map/PM:VIO
 
 # Remove -Zcrtdll, add -Zsys
 SYS_CLDFLAGS = $(STAT_CLDFLAGS) -Zsys
 
 # Non-Forking dynamically loaded perl without EMX - so with wrong CRT library
 
-perl_sys: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-	$(SHRPENV) $(CC) $(SYS_CLDFLAGS) $(CCDLFLAGS) -o $@ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs) -Zlinker /map/PM:VIO
+perl_sys: $& libperl_dllmain$(LIB_EXT)
+	$(SHRPENV) $(CC) $(SYS_CLDFLAGS) $(CCDLFLAGS) -o $@ libperl_dllmain$(LIB_EXT) -Zlinker /map/PM:VIO
 
 installcmd : 
 	@perl -e 'die qq{Give the option INSTALLCMDDIR=... to make!} if $$ARGV[0] eq ""' $(INSTALLCMDDIR)
@@ -203,7 +213,7 @@ $(DYNALOADER_OBJ) : $(DYNALOADER)
 $(AOUT_LIBPERL) : $(aout_obj) perl$(AOUT_OBJ_EXT)
 	rm -f $@
 	$(AOUT_AR) rcu $@ perl$(AOUT_OBJ_EXT) $(aout_obj)
-	cp $@ perl.a
+	cp $@ perl$(AOUT_LIB_EXT)
 
 .c$(AOUT_OBJ_EXT):
 	$(AOUT_CCCMD) $(PLDLFLAGS) -c $*.c
@@ -214,9 +224,14 @@ opmini$(AOUT_OBJ_EXT): op.c
 perlmain(AOUT_OBJ_EXT): perlmain.c
 	$(AOUT_CCCMD_DLL) $(PLDLFLAGS) -c perlmain.c
 
-aout_perlmain.c: miniperlmain.c config.sh makefile $(static_ext_autoinit)
-	sh writemain $(DYNALOADER) $(aout_static_lib) > tmp
-	sh mv-if-diff tmp aout_perlmain.c
+# Assume that extensions are at most 4 deep (this is so with 5.8.1)
+aout_extlist: $(aout_static_ext)
+	echo lib/auto/*.a lib/auto/*/*.a lib/auto/*/*/*.a lib/auto/*/*/*/*.a | tr ' ' '\n' | grep -v '\*' > $@.tmp
+	sh mv-if-diff $@.tmp $@
+
+aout_perlmain.c: miniperlmain.c config.sh makefile $(static_ext_autoinit) $(aout_static_ext) writemain aout_extlist
+	sh writemain `cat aout_extlist` > aout_perlmain.tmp
+	sh mv-if-diff aout_perlmain.tmp aout_perlmain.c
 
 _preplibrary = miniperl lib/Config.pm lib/lib.pm lib/re.pm
 
@@ -228,35 +243,35 @@ miniperl_: $& miniperlmain$(AOUT_OBJ_EXT
 # Need a miniperl_ dependency, since $(AOUT_DYNALOADER) is build via implicit
 # rules, thus would not rebuild miniperl_ via an explicit rule
 
-perl_$(EXE_EXT) perl_: $& miniperl_ aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) $(AOUT_DYNALOADER) $(aout_static_ext) ext.libs
-	$(CC) $(AOUT_CLDFLAGS) $(CCDLFLAGS) -o perl_ aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER) $(aout_static_ext) $(AOUT_LIBPERL) `cat ext.libs` $(libs)
+perl_$(EXE_EXT) perl_: $& miniperl_ aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) $(AOUT_DYNALOADER) $(aout_static_ext) ext.libs aout_extlist
+	$(CC) $(AOUT_CLDFLAGS) $(CCDLFLAGS) $(OPTIMIZE) -o perl_ aout_perlmain$(AOUT_OBJ_EXT) `cat aout_extlist` $(AOUT_LIBPERL) `cat ext.libs` $(libs)
 
 # Remove -Zcrtdll
 STAT_AOUT_CLDFLAGS = -Zexe -Zmt -Zstack 32000
 
 # Forking dynamically loaded perl with a wrong CRT library:
 
-perl_stat_aout$(EXE_EXT) perl_stat_aout: $& perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER_OBJ) $(aout_static_ext_dll) $(AOUT_LIBPERL_DLL) ext.libs
-	$(SHRPENV) $(CC) $(STAT_AOUT_CLDFLAGS) $(CCDLFLAGS) -o $@ perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER_OBJ) $(aout_static_ext_dll) $(AOUT_LIBPERL_DLL) `cat ext.libs` $(libs)
+perl_stat_aout$(EXE_EXT) perl_stat_aout: $& libperl_dllmain$(AOUT_LIB_EXT)
+	$(SHRPENV) $(CC) $(STAT_AOUT_CLDFLAGS) $(CCDLFLAGS) $(OPTIMIZE) -o $@ libperl_dllmain$(AOUT_LIB_EXT)
 
 PERLREXX_DLL = perlrexx.dll
 
-perl : perl__ perl___ $(PERLREXX_DLL)
+perl perl$(EXE_EXT) : perl__ perl___ $(PERLREXX_DLL) $(PERL_DLL)
 
 # Dynamically loaded PM-application perl:
 
-perl__$(EXE_EXT) perl__: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-	$(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl__ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs) -Zlinker /PM:PM
+perl__$(EXE_EXT) perl__: $& libperl_dllmain$(LIB_EXT)
+	$(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl__ libperl_dllmain$(LIB_EXT) -Zlinker /PM:PM
 
 # Forking dynamically loaded perl:
 
-perl$(EXE_EXT) perl: $& perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER_OBJ) $(aout_static_ext_dll) $(AOUT_LIBPERL_DLL) ext.libs
-	$(CC) $(AOUT_CLDFLAGS_DLL) $(CCDLFLAGS) -o perl perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER_OBJ) $(aout_static_ext_dll) $(AOUT_LIBPERL_DLL) `cat ext.libs` $(libs)
+perl$(EXE_EXT) perl: $& libperl_dllmain$(AOUT_LIB_EXT)
+	$(CC) $(AOUT_CLDFLAGS_DLL) $(CCDLFLAGS) -o perl libperl_dllmain$(AOUT_LIB_EXT)
 
 clean: aout_clean
 
 aout_clean:
-	-rm *perl_.* *.o *.a lib/auto/*/*.a ext/*/Makefile.aout
+	-rm *perl_.* *.o *.a lib/auto/*/*.a lib/auto/*/*/*.a lib/auto/*/*/*/*.a ext/*/Makefile.aout ext/*/*/Makefile.aout  ext/*/*/*/Makefile.aout
 
 aout_install: perl_ aout_install.perl
 
@@ -385,7 +400,7 @@ do
 		else
 		    # Need to treat subsubdirectories manually
 		    dd_treated=''
-		    for ddd in $dd/*
+		    for ddd in $dd/*		# ext/*/*/*/Makefile.PL
 		    do
 			if test ! -d $ddd; then
 			    continue
@@ -403,6 +418,12 @@ do
 	   done
 	fi
 done
+
+# ext/threads is marked as NORECURS, so we need to specialcase it
+if echo "$static_ext" | grep -q threads/shared ; then
+   preci="$preci ext/threads/%/Makefile.aout"
+   dirs="$dirs ext/threads"
+fi
 
 $spitshell >>Makefile <<!GROK!THIS!
 .PRECIOUS : $preci
--- ./lib/ExtUtils/MakeMaker.pm-pre	Tue Sep 16 01:00:36 2003
+++ ./lib/ExtUtils/MakeMaker.pm	Mon Oct  6 22:50:38 2003
@@ -617,15 +617,15 @@ sub WriteEmptyMakefile {
 
     my %att = @_;
     my $self = MM->new(\%att);
-    if (-f $self->{MAKEFILE_OLD}) {
-      _unlink($self->{MAKEFILE_OLD}) or 
-        warn "unlink $self->{MAKEFILE_OLD}: $!";
-    }
-    if ( -f $self->{MAKEFILE} ) {
-        _rename($self->{MAKEFILE}, $self->{MAKEFILE_OLD}) or
-          warn "rename $self->{MAKEFILE} => $self->{MAKEFILE_OLD}: $!"
+    my $new = $self->{FIRST_MAKEFILE};
+    my $old = $self->{MAKEFILE_OLD};
+    if (-f $old) {
+      _unlink($old) or warn "unlink $old: $!";
     }
-    open MF, '>'.$self->{MAKEFILE} or die "open $self->{MAKEFILE} for write: $!";
+    if ( -f $new ) {
+        _rename($new, $old) or warn "rename $new => $old: $!"
+    }
+    open MF, '>'.$new or die "open $new for write: $!";
     print MF <<'EOP';
 all:
 
@@ -638,7 +638,7 @@ makemakerdflt:
 test:
 
 EOP
-    close MF or die "close $self->{MAKEFILE} for write: $!";
+    close MF or die "close $new for write: $!";
 }
 
 sub check_manifest {
@@ -863,9 +863,10 @@ sub flush {
     my $self = shift;
     my($chunk);
     local *FH;
-    print STDOUT "Writing $self->{MAKEFILE} for $self->{NAME}\n";
+    my($finalname) = $self->{FIRST_MAKEFILE};
+    print STDOUT "Writing $finalname for $self->{NAME}\n";
 
-    unlink($self->{MAKEFILE}, "MakeMaker.tmp", $Is_VMS ? 'Descrip.MMS' : '');
+    unlink($finalname, "MakeMaker.tmp", $Is_VMS ? 'Descrip.MMS' : ());
     open(FH,">MakeMaker.tmp") or die "Unable to open MakeMaker.tmp: $!";
 
     for $chunk (@{$self->{RESULT}}) {
@@ -873,7 +874,6 @@ sub flush {
     }
 
     close FH;
-    my($finalname) = $self->{MAKEFILE};
     _rename("MakeMaker.tmp", $finalname) or
       warn "rename MakeMaker.tmp => $finalname: $!";
     chmod 0644, $finalname unless $Is_VMS;
