applied somewhat modified version of suggested patch
Benjamin Stuhl [Thu, 18 Nov 1999 18:45:27 +0000 (10:45 -0800)]
Message-ID: <19991119024527.72749.qmail@hotmail.com>
Subject: [PATCH 5.005_62] Perl on Win95, Mark IIB

p4raw-id: //depot/perl@4653

MANIFEST
ext/SDBM_File/Makefile.PL
lib/ExtUtils/MM_Unix.pm
lib/ExtUtils/MM_Win32.pm
win32/PerlCRT.def [new file with mode: 0644]
win32/config_sh.PL
win32/genmk95.pl
win32/gstartup.c [new file with mode: 0644]
win32/makefile.mk
win32/oldnames.def [new file with mode: 0644]
win32/win32.h

index 919d178..29ce7b6 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1542,11 +1542,14 @@ win32/config_sh.PL      Perl code to update Win32 config.sh from Makefile
 win32/des_fcrypt.patch Win32 port
 win32/dl_win32.xs      Win32 port
 win32/genmk95.pl       Perl code to generate command.com-usable makew95.mk
+win32/gstartup.c        GCC/Mingw32 runtime startup code
 win32/include/arpa/inet.h      Win32 port
 win32/include/dirent.h         Win32 port
 win32/include/netdb.h          Win32 port
 win32/include/sys/socket.h     Win32 port
-win32/makefile.mk      Win32 makefile for DMAKE (BC++, VC++ builds)
+win32/makefile.mk       Win32 makefile for DMAKE (BC++, VC++ builds)
+win32/oldnames.def      Win32 DLL definition file for GCC-specific implib
+win32/PerlCRT.def       Win32 DLL definition file for PerlCRT.dll
 win32/perlglob.c       Win32 port
 win32/perlhost.h       Perl "host" implementation
 win32/perllib.c                Win32 port
index afce3f1..a1debb9 100644 (file)
@@ -20,13 +20,26 @@ WriteMakefile(
              );
 
 sub MY::postamble {
-  if ($^O ne 'VMS') {
+  if ($^O =~ /MSWin32/ && Win32::IsWin95()) {
+    # XXX: dmake-specific, like rest of Win95 port
+    return
+    '
+$(MYEXTLIB): sdbm/Makefile
+@[
+       cd sdbm
+       $(MAKE) all
+       cd ..
+]
+';
+  }
+  elsif ($^O ne 'VMS') {
     '
 $(MYEXTLIB): sdbm/Makefile
        cd sdbm && $(MAKE) all
 ';
-  } else {
-  '   
+  }
+  else {
+    '   
 $(MYEXTLIB) : [.sdbm]descrip.mms
        set def [.sdbm]
     $(MMS) all
index f9fdcaa..4a07185 100644 (file)
@@ -3233,11 +3233,14 @@ sub subdir_x {
     my($self, $subdir) = @_;
     my(@m);
     if ($Is_Win32 && Win32::IsWin95()) {
+       # XXX: dmake-specific, like rest of Win95 port
        return <<EOT;
 subdirs ::
+@[
        cd $subdir
        \$(MAKE) all \$(PASTHRU)
        cd ..
+]
 EOT
     }
     else {
index e1cb83b..ab8570d 100644 (file)
@@ -37,9 +37,14 @@ $PERLMAKE = 1 if $Config{'make'} =~ /^pmake/i;
 $OBJ   = 1 if $Config{'ccflags'} =~ /PERL_OBJECT/i;
 
 # a few workarounds for command.com (very basic)
-if (Win32::IsWin95()) {
+{
     package ExtUtils::MM_Win95;
-    unshift @MM::ISA, 'ExtUtils::MM_Win95';
+
+    # the $^O test may be overkill, but we want to be sure Win32::IsWin95()
+    # exists before we try it
+
+    unshift @MM::ISA, 'ExtUtils::MM_Win95'
+       if ($^O =~ /Win32/ && Win32::IsWin95());
 
     sub xs_c {
        my($self) = shift;
@@ -65,8 +70,6 @@ if (Win32::IsWin95()) {
     sub xs_o {
        my($self) = shift;
        return '' unless $self->needs_linking();
-       # Dmake gets confused with 2 ways of making things
-       return '' if $ExtUtils::MM_Win32::DMAKE;
        '
 .xs$(OBJ_EXT):
        $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
@@ -74,7 +77,7 @@ if (Win32::IsWin95()) {
        $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
        ';
     }
-}
+}      # end of command.com workarounds
 
 sub dlsyms {
     my($self,%attribs) = @_;
@@ -481,6 +484,20 @@ sub dynamic_lib {
     my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
     my($ldfrom) = '$(LDFROM)';
     my(@m);
+
+# several things for GCC/Mingw32:
+# 1. use correct CRT startup objects (possibly unnecessary)
+# 2. try to overcome non-relocateable-DLL problems by generating
+#    a (hopefully unique) image-base from the dll's name
+# -- BKS, 10-19-1999
+    if ($GCC) { 
+       $otherldflags .= ' -L$(PERL_ARCHIVE:d) -nostdlib $(PERL_ARCHIVE:d)gdllcrt0.o ';
+       my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
+       $dllname =~ /(....)(.{0,4})/;
+       my $baseaddr = unpack("n", $1 ^ $2);
+       $otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
+    }
+
     push(@m,'
 # This section creates the dynamically loadable $(INST_DYNAMIC)
 # from $(OBJECT) and possibly $(MYEXTLIB).
diff --git a/win32/PerlCRT.def b/win32/PerlCRT.def
new file mode 100644 (file)
index 0000000..6376e5a
--- /dev/null
@@ -0,0 +1,701 @@
+;
+; PerlCRT.def
+;
+; Dll export file for PerlCRT.dll
+; this is needed for GCC/Mingw32 builds of Perl, since GCC
+; can't understand MSVC-ish .lib files
+;
+; Created from the output of 'nm PerlCRT.lib | grep "00000000 T"'
+;       -- Benjamin Stuhl <sho_pi@hotmail.com> 10-17-1999
+
+EXPORTS
+  wscanf
+  wprintf
+  wctomb
+  wcsxfrm
+  wcstoul
+  wcstombs
+  wcstol
+  wcstok
+  wcstod
+  wcsstr
+  wcsspn
+  wcsrchr
+  wcspbrk
+  wcsncpy
+  wcsncmp
+  wcsncat
+  wcslen
+  wcsftime
+  wcscspn
+  wcscpy
+  wcscoll
+  wcscmp
+  wcschr
+  wcscat
+  vwprintf
+  vswprintf
+  vsprintf
+  vprintf
+  vfwprintf
+  vfprintf
+  ungetwc
+  ungetc
+  towupper
+  towlower
+  toupper
+  tolower
+  tmpnam
+  tmpfile
+  time
+  tanh
+  tan
+  system
+  swscanf
+  swprintf
+  strxfrm
+  strtoul
+  strtol
+  strtok
+  strtod
+  strstr
+  strspn
+  strrchr
+  strpbrk
+  strncpy
+  strncmp
+  strncat
+  strlen
+  strftime
+  strerror
+  strcspn
+  strcpy
+  strcoll
+  strcmp
+  strchr
+  strcat
+  sscanf
+  srand
+  sqrt
+  sprintf
+  sinh
+  sin
+  signal
+  setvbuf
+  setlocale
+  setbuf
+  scanf
+  rewind
+  rename
+  remove
+  realloc
+  rand
+  raise
+  qsort
+  putwchar
+  putwc
+  puts
+  putchar
+  putc
+  printf
+  pow
+  perror
+  modf
+  mktime
+  memset
+  memmove
+  memcpy
+  memcmp
+  memchr
+  mbtowc
+  mbstowcs
+  mblen
+  malloc
+  longjmp
+  log10
+  log
+  localtime
+  localeconv
+  ldiv
+  ldexp
+  labs
+  isxdigit
+  iswxdigit
+  iswupper
+  iswspace
+  iswpunct
+  iswprint
+  iswlower
+  iswgraph
+  iswdigit
+  iswctype
+  iswcntrl
+  iswascii
+  iswalpha
+  iswalnum
+  isupper
+  isspace
+  ispunct
+  isprint
+  islower
+  isleadbyte
+  isgraph
+  isdigit
+  iscntrl
+  isalpha
+  isalnum
+  is_wctype
+  gmtime
+  getwchar
+  getwc
+  gets
+  getenv
+  getchar
+  getc
+  fwscanf
+  fwrite
+  fwprintf
+  ftell
+  fsetpos
+  fseek
+  fscanf
+  frexp
+  freopen
+  free
+  fread
+  fputws
+  fputwc
+  fputs
+  fputc
+  fprintf
+  fopen
+  fmod
+  floor
+  fgetws
+  fgetwc
+  fgets
+  fgetpos
+  fgetc
+  fflush
+  ferror
+  feof
+  fclose
+  fabs
+  exp
+  exit
+  div
+  difftime
+  ctime
+  cosh
+  cos
+  clock
+  clearerr
+  ceil
+  calloc
+  bsearch
+  atol
+  atoi
+  atof
+  atan2
+  atan
+  asin
+  asctime
+  acos
+  abs
+  abort
+  _yn
+  _y1
+  _y0
+  _wutime
+  _wunlink
+  _wtol
+  _wtoi64
+  _wtoi
+  _wtmpnam
+  _wtempnam
+  _wsystem
+  _wstrtime
+  _wstrdate
+  _wstati64
+  _wstat
+  _wsplitpath
+  _wspawnvpe
+  _wspawnvp
+  _wspawnve
+  _wspawnv
+  _wspawnlpe
+  _wspawnlp
+  _wspawnle
+  _wspawnl
+  _wsopen
+  _wsetlocale
+  _wsearchenv
+  _wrmdir
+  _write
+  _wrename
+  _wremove
+  _wputenv
+  _wpopen
+  _wperror
+  _wopen
+  _wmktemp
+  _wmkdir
+  _wmakepath
+  _wgetenv
+  _wgetdcwd
+  _wgetcwd
+  _wfullpath
+  _wfsopen
+  _wfreopen
+  _wfopen
+  _wfindnexti64
+  _wfindnext
+  _wfindfirsti64
+  _wfindfirst
+  _wfdopen
+  _wexecvpe
+  _wexecvp
+  _wexecve
+  _wexecv
+  _wexeclpe
+  _wexeclp
+  _wexecle
+  _wexecl
+  _wctime
+  _wcsupr
+  _wcsset
+  _wcsrev
+  _wcsnset
+  _wcsnicoll
+  _wcsnicmp
+  _wcsncoll
+  _wcslwr
+  _wcsicoll
+  _wcsicmp
+  _wcsdup
+  _wcreat
+  _wchmod
+  _wchdir
+  _wasctime
+  _waccess
+  _vsnwprintf
+  _vsnprintf
+  _utime
+  _unlock
+  _unloaddll
+  _unlink
+  _ungetch
+  _umask
+  _ultow
+  _ultoa
+  _ui64tow
+  _ui64toa
+  _tzset
+  _toupper
+  _tolower
+  _tempnam
+  _telli64
+  _tell
+  _swab
+  _sys_nerr
+  _strupr
+  _strtime
+  _strset
+  _strrev
+  _strnset
+  _strnicoll
+  _strnicmp
+  _strncoll
+  _strlwr
+  _stricoll
+  _stricmp
+  _strerror
+  _strdup
+  _strdate
+  _strcmpi
+  _statusfp
+  _stati64
+  _stat
+  _splitpath
+  _spawnvpe
+  _spawnvp
+  _spawnve
+  _spawnv
+  _spawnlpe
+  _spawnlp
+  _spawnle
+  _spawnl
+  _sopen
+  _snwprintf
+  _snprintf
+  _sleep
+  _setsystime
+  _setmode
+  _setmbcp
+  _setmaxstdio
+  _setjmp3
+  _setjmp
+  _seterrormode
+  _set_sbh_threshold
+  _set_error_mode
+  _seh_longjmp_unwind@4
+  _searchenv
+  _scalb
+  _safe_fprem1
+  _safe_fprem
+  _safe_fdivr
+  _safe_fdiv
+  _rotr
+  _rotl
+  _rmtmp
+  _rmdir
+  _read
+  _putws
+  _putw
+  _putenv
+  _putch
+  _purecall
+  _popen
+  _pipe
+  _pclose
+  _outpw
+  _outpd
+  _outp
+  _open_osfhandle
+  _open
+  _nextafter
+  _msize
+  _mktemp
+  _mkdir
+  _memicmp
+  _memccpy
+  _mbsupr
+  _mbstrlen
+  _mbstok
+  _mbsstr
+  _mbsspnp
+  _mbsspn
+  _mbsset
+  _mbsrev
+  _mbsrchr
+  _mbspbrk
+  _mbsnset
+  _mbsninc
+  _mbsnicoll
+  _mbsnicmp
+  _mbsnextc
+  _mbsncpy
+  _mbsncoll
+  _mbsncmp
+  _mbsnccnt
+  _mbsncat
+  _mbsnbset
+  _mbsnbicoll
+  _mbsnbicmp
+  _mbsnbcpy
+  _mbsnbcoll
+  _mbsnbcnt
+  _mbsnbcmp
+  _mbsnbcat
+  _mbslwr
+  _mbslen
+  _mbsinc
+  _mbsicoll
+  _mbsicmp
+  _mbsdup
+  _mbsdec
+  _mbscspn
+  _mbscpy
+  _mbscoll
+  _mbscmp
+  _mbschr
+  _mbscat
+  _mbsbtype
+  _mbctoupper
+  _mbctombb
+  _mbctolower
+  _mbctokata
+  _mbctohira
+  _mbclen
+  _mbcjmstojis
+  _mbcjistojms
+  _mbccpy
+  _mbbtype
+  _mbbtombc
+  _makepath
+  _ltow
+  _ltoa
+  _lseeki64
+  _lseek
+  _lsearch
+  _lrotr
+  _lrotl
+  _longjmpex
+  _logb
+  _locking
+  _lock
+  _local_unwind2
+  _loaddll
+  _lfind
+  _kbhit
+  _jn
+  _j1
+  _j0
+  _itow
+  _itoa
+  _isnan
+  _ismbstrail
+  _ismbslead
+  _ismbcupper
+  _ismbcsymbol
+  _ismbcspace
+  _ismbcpunct
+  _ismbcprint
+  _ismbclower
+  _ismbclegal
+  _ismbcl2
+  _ismbcl1
+  _ismbcl0
+  _ismbckata
+  _ismbchira
+  _ismbcgraph
+  _ismbcdigit
+  _ismbcalpha
+  _ismbcalnum
+  _ismbbtrail
+  _ismbbpunct
+  _ismbbprint
+  _ismbblead
+  _ismbbkpunct
+  _ismbbkprint
+  _ismbbkana
+  _ismbbkalnum
+  _ismbbgraph
+  _ismbbalpha
+  _ismbbalnum
+  _isctype
+  _isatty
+  _inpw
+  _inpd
+  _inp
+  _initterm
+  _iob
+  _i64tow
+  _i64toa
+  _hypot
+  _HUGE
+  _heapwalk
+  _heapused
+  _heapset
+  _heapmin
+  _heapchk
+  _heapadd
+  _global_unwind2
+  _getws
+  _getw
+  _getsystime
+  _getpid
+  _getmbcp
+  _getmaxstdio
+  _getdrives
+  _getdrive
+  _getdllprocaddr
+  _getdiskfree
+  _getdcwd
+  _getcwd
+  _getche
+  _getch
+  _get_sbh_threshold
+  _get_osfhandle
+  _gcvt
+  _futime
+  _fullpath
+  _ftol
+  _ftime
+  _fstati64
+  _fstat
+  _fsopen
+  _free_osfhnd
+  _fputwchar
+  _fputchar
+  _fpreset
+  _fpieee_flt
+  _fpclass
+  _fmode
+  _flushall
+  _flsbuf
+  _finite
+  _findnexti64
+  _findnext
+  _findfirsti64
+  _findfirst
+  _findclose
+  _fileno
+  _filelengthi64
+  _filelength
+  _filbuf
+  _fgetwchar
+  _fgetchar
+  _fdopen
+  _fcvt
+  _fcloseall
+  _expand
+  _exit
+  _execvpe
+  _execvp
+  _execve
+  _execv
+  _execlpe
+  _execlp
+  _execle
+  _execl
+  _except_handler3
+  _except_handler2
+  _errno
+  _eof
+  _endthreadex
+  _endthread
+  _ecvt
+  _dup2
+  _dup
+  _cwait
+  _cscanf
+  _creat
+  _cputs
+  _cprintf
+  _copysign
+  _controlfp
+  _control87
+  _commit
+  _close
+  _clearfp
+  _chsize
+  _chmod
+  _chgsign
+  _chdrive
+  _chdir
+  _cgets
+  _cexit
+  _callnewh
+  _cabs
+  _c_exit
+  _beginthreadex
+  _beginthread
+  _beep
+  _atoldbl
+  _atoi64
+  _atodbl
+  _assert
+  _amsg_exit
+  _adj_fptan
+  _adj_fprem1
+  _adj_fprem
+  _adj_fpatan
+  _adj_fdivr_m64
+  _adj_fdivr_m32i
+  _adj_fdivr_m32
+  _adj_fdivr_m16i
+  _adj_fdiv_r
+  _adj_fdiv_m64
+  _adj_fdiv_m32i
+  _adj_fdiv_m32
+  _adj_fdiv_m16i
+  _access
+  _abnormal_termination
+  __wgetmainargs
+  __unDName
+  __toascii
+  __threadid
+  __threadhandle
+  __setusermatherr
+  __set_app_type
+  __pxcptinfoptrs
+  __p__wpgmptr
+  __p__winver
+  __p__winminor
+  __p__winmajor
+  __p__wenviron
+  __p__wcmdln
+  __p__tzname
+  __p__timezone
+  __p__pwctype
+  __p__pgmptr
+  __p__pctype
+  __p__osver
+  __p__mbctype
+  __p__mbcasemap
+  __p__iob
+  __p__fmode
+  __p__fileinfo
+  __p__environ
+  __p__dstbias
+  __p__daylight
+  __p__commode
+  __p__amblksiz
+  __p__acmdln
+  __p___winitenv
+  __p___wargv
+  __p___mb_cur_max
+  __p___initenv
+  __p___argv
+  __p___argc
+  __lconv_init
+  __iscsymf
+  __iscsym
+  __isascii
+  __getmainargs
+  __fpecode
+  __doserrno
+  __dllonexit
+  __crtLCMapStringA
+  __crtGetLocaleInfoW
+  __crtCompareStringA
+  __STRINGTOLD
+  __RTtypeid
+  __RTDynamicCast
+  __RTCastToVoid
+  __CxxLongjmpUnwind@4
+  __CxxFrameHandler
+  _XcptFilter
+  _Strftime
+  _Gettnames
+  _Getmonths
+  _Getdays
+  _EH_prolog
+  _CxxThrowException@8
+  _CItanh
+  _CItan
+  _CIsqrt
+  _CIsinh
+  _CIsin
+  _CIpow
+  _CIlog10
+  _CIlog
+  _CIfmod
+  _CIexp
+  _CIcosh
+  _CIcos
+  _CIatan2
+  _CIatan
+  _CIasin
+  _CIacos
+  $I10_OUTPUT
+  _aullshr
+  _aullrem
+  _aulldiv
+  _allshr
+  _allshl
+  _allrem
+  _allmul
+  _alldiv
+  _setdefaultprecision
+  _wsetargv
+  _matherr
+  _setargv
+  __setargv
+  _CRT_INIT@12
+  _DllMainCRTStartup@12
+  _onexit
+  atexit
+  _alloca_probe
+  _chkstk
index 9e53b54..b1c7b9f 100644 (file)
@@ -10,12 +10,35 @@ sub mungepath {
     return join(' ', @p);
 }
 
+# generate an array of option strings from command-line args
+# or an option file
+#    -- added by BKS, 10-17-1999 to fix command-line overflow problems
+sub loadopts {
+    if ($ARGV[0] =~ /--cfgsh-option-file/) {
+       shift @ARGV;
+       my $optfile = shift @ARGV;
+       local (*F);
+       open OPTF, $optfile or die "Can't open $optfile: $!\n";
+       my @opts;
+       chomp(my $line = <OPTF>);
+       my @vars = split(/\t+~\t+/, $line);
+       for (@vars) {
+           push(@opts, $_) unless (/^\s*$/);
+       }
+       close OPTF;
+       return \@opts;
+    }
+    else {
+       return \@ARGV;
+    }
+}
+
 my %opt;
-while (@ARGV && $ARGV[0] =~ /^([\w_]+)=(.*)$/)
- {
-  $opt{$1}=$2;
-  shift(@ARGV);
- }
+my $optref = loadopts();
+while (@{$optref} && $optref->[0] =~ /^([\w_]+)=(.*)$/) {
+    $opt{$1}=$2;
+    shift(@{$optref});
+}
 
 my $pl_h = '../patchlevel.h';
 
@@ -31,13 +54,13 @@ if (-e $pl_h) {
     close PL;
 }
 elsif ($] =~ /^(\d+)\.(\d\d\d)?(\d\d)?$/) { # should always be true
-  $opt{PERL_REVISION} = $1;
-  $opt{PERL_VERSION} = int($2 || 0);
-  $opt{PERL_SUBVERSION} = $3;
-  $opt{PERL_APIVERSION} = $];
+    $opt{PERL_REVISION} = $1;
+    $opt{PERL_VERSION} = int($2 || 0);
+    $opt{PERL_SUBVERSION} = $3;
+    $opt{PERL_APIVERSION} = $];
 }
 else {
-  die "Can't parse perl version ($])";
+    die "Can't parse perl version ($])";
 }
 
 $opt{PERL_SUBVERSION} ||= '00';
@@ -50,19 +73,19 @@ $opt{'usemymalloc'} = 'y' if $opt{'d_mymalloc'} eq 'define';
 $opt{libpth} = mungepath($opt{libpth}) if exists $opt{libpth};
 $opt{incpath} = mungepath($opt{incpath}) if exists $opt{incpath};
 
-while (<>)
- {
-  s/~([\w_]+)~/$opt{$1}/g;
-  if (/^([\w_]+)=(.*)$/) {
-    my($k,$v) = ($1,$2);
-    # this depends on cf_time being empty in the template (or we'll get a loop)
-    if ($k eq 'cf_time') {
-      $_ = "$k='" . localtime(time) . "'\n" if $v =~ /^\s*'\s*'/;
-    }
-    elsif (exists $opt{$k}) {
-      $_ = "$k='$opt{$k}'\n";
+while (<>) {
+    s/~([\w_]+)~/$opt{$1}/g;
+    if (/^([\w_]+)=(.*)$/) {
+       my($k,$v) = ($1,$2);
+       # this depends on cf_time being empty in the template (or we'll
+       # get a loop)
+       if ($k eq 'cf_time') {
+           $_ = "$k='" . localtime(time) . "'\n" if $v =~ /^\s*'\s*'/;
+       }
+       elsif (exists $opt{$k}) {
+           $_ = "$k='$opt{$k}'\n";
+       }
     }
-  }
-  print;
- }
+    print;
+}
 
index 74788ff..6137ce2 100644 (file)
@@ -1,28 +1,28 @@
-# genmk95.pl - uses miniperl to generate a makefile that command.com
-# (and dmake) will understand given one that cmd.exe will understand
+# genmk95.pl - uses miniperl to generate a makefile that command.com will
+#              understand given one that cmd.exe will understand
 
 # Author: Benjamin K. Stuhl
-# Date: 8-18-1999
+# Date: 10-16-1999
 
 # how it works:
 #    dmake supports an alternative form for its recipes, called "group
-#    recipes", in which all elements of a recipe are run with only one
-#    shell.  This program converts the standard dmake makefile.mk to
-#    one using group recipes. This is done so that lines using && or
-#    || (which command.com doesn't understand) may be split into two
-#    lines.
+#    recipes", in which all elements of a recipe are run with only one shell.
+#    This program converts the standard dmake makefile.mk to one using group
+#    recipes. This is done so that lines using && or || (which command.com
+#    doesn't understand) may be split into two lines that will still be run
+#    with one shell.
 
 my ($filein, $fileout) = @ARGV;
 
-chomp (my $loc = `cd`);
-
-open my $in, $filein or die "Error opening input file: $!";
-open my $out, "> $fileout" or die "Error opening output file: $!";
+open my $in, $filein or die "Error opening input file: $!\n";
+open my $out, "> $fileout" or die "Error opening output file: $!\n";
 
 print $out <<_EOH_;
 # *** Warning: this file is autogenerated from $filein by $0 ***
 # *** Do not edit this file - edit $filein instead           ***
 
+_HOME_DIR := \$(PWD)
+
 _EOH_
 
 my $inrec = 0;
@@ -30,12 +30,12 @@ my $inrec = 0;
 while (<$in>)
 {
  chomp;
- if (/^[^#.\t][^#=]*?:/)
+ if (/^[^#.\t][^#=]*?:(?:[^=]|$)/)
  {
     if (! $inrec)
     {
        print $out "$_\n";
-       while (/\\$/)
+       while (/\\\s*$/)
        {
           chomp($_ = <$in>);
           print $out "$_\n";
@@ -70,7 +70,7 @@ LINE_CONT:
     s/^\s*// for ($one, $two);
     print $out "\t$one\n\t$two\n" if ($sep eq "&&");
     print $out "\t$one\n\tif errorlevel 1 $two\n" if ($sep eq "||");
-    print $out "\tcd $loc\n";
+    print $out "\tcd \$(_HOME_DIR)\n";
     next;
  }
      # fall through - no need for special handling
@@ -78,4 +78,5 @@ LINE_CONT:
 }
 print $out "]\n" if ($inrec);
 
-close $in; close $out;
+close $in or warn "Error closing \$in: $!\n";
+close $out or warn "Error closing \$out: $!\n";
diff --git a/win32/gstartup.c b/win32/gstartup.c
new file mode 100644 (file)
index 0000000..fc107e2
--- /dev/null
@@ -0,0 +1,324 @@
+/*
+ * gstartup.c
+ *
+ * Startup file for GCC/Mingw32 builds
+ * (replaces gcc's default c:\egcs\...\{crt1.o,dllcrt1.o})
+ *
+ * This file is taken from the Mingw32 package.
+ *  Created by Colin Peters for Mingw32
+ *  Modified by Mumit Khan
+ *
+ * History with Perl:
+ *  Added (in modified form) to Perl standard distribution to fix
+ *    problems linking against PerlCRT or MSVCRT
+ *    -- Benjamin Stuhl <sho_pi@hotmail.com> 10-17-1999
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <io.h>
+#include <fcntl.h>
+#include <process.h>
+#include <float.h>
+#include <windows.h>
+#include <signal.h>
+
+/*
+ * Access to a standard 'main'-like argument count and list. Also included
+ * is a table of environment variables.
+ */
+int _argc;
+char **_argv;
+
+extern int _CRT_glob;
+
+#ifdef __MSVCRT__
+typedef struct {
+  int newmode;
+} _startupinfo;
+extern void __getmainargs (int *, char ***, char ***, int, _startupinfo *);
+#else
+extern void __GetMainArgs (int *, char ***, char ***, int);
+#endif
+
+/*
+ * Initialize the _argc, _argv and environ variables.
+ */
+static void
+_mingw32_init_mainargs ()
+{
+  /* The environ variable is provided directly in stdlib.h through
+   * a dll function call. */
+  char **dummy_environ;
+#ifdef __MSVCRT__
+  _startupinfo start_info;
+  start_info.newmode = 0;
+#endif
+
+  /*
+   * Microsoft's runtime provides a function for doing just that.
+   */
+#ifdef __MSVCRT__
+  (void) __getmainargs (&_argc, &_argv, &dummy_environ, _CRT_glob, 
+                        &start_info);
+#else
+  /* CRTDLL version */
+  (void) __GetMainArgs (&_argc, &_argv, &dummy_environ, _CRT_glob);
+#endif
+}
+
+#if defined(EXESTARTUP) /* gcrt0.o - startup for an executable */
+
+extern int main (int, char **, char **);
+
+/*
+ * Must have the correct app type for MSVCRT. 
+ */
+
+#ifdef __MSVCRT__
+#define __UNKNOWN_APP    0
+#define __CONSOLE_APP    1
+#define __GUI_APP        2
+__MINGW_IMPORT void __set_app_type(int);
+#endif /* __MSVCRT__ */
+
+/*
+ * Setup the default file handles to have the _CRT_fmode mode, as well as
+ * any new files created by the user.
+ */
+extern unsigned int _CRT_fmode;
+
+static void
+_mingw32_init_fmode ()
+{
+  /* Don't set the file mode if the user hasn't set any value for it. */
+  if (_CRT_fmode)
+    {
+      _fmode = _CRT_fmode;
+
+      /*
+       * This overrides the default file mode settings for stdin,
+       * stdout and stderr. At first I thought you would have to
+       * test with isatty, but it seems that the DOS console at
+       * least is smart enough to handle _O_BINARY stdout and
+       * still display correctly.
+       */
+      if (stdin)
+       {
+         _setmode (_fileno (stdin), _CRT_fmode);
+       }
+      if (stdout)
+       {
+         _setmode (_fileno (stdout), _CRT_fmode);
+       }
+      if (stderr)
+       {
+         _setmode (_fileno (stderr), _CRT_fmode);
+       }
+    }
+}
+
+/* This function will be called when a trap occurs. Thanks to Jacob
+   Navia for his contribution. */
+static CALLBACK long
+_gnu_exception_handler (EXCEPTION_POINTERS * exception_data)
+{
+  void (*old_handler) (int);
+  long action = EXCEPTION_CONTINUE_SEARCH;
+  int reset_fpu = 0;
+
+  switch (exception_data->ExceptionRecord->ExceptionCode)
+    {
+    case EXCEPTION_ACCESS_VIOLATION:
+      /* test if the user has set SIGSEGV */
+      old_handler = signal (SIGSEGV, SIG_DFL);
+      if (old_handler == SIG_IGN)
+       {
+         /* this is undefined if the signal was raised by anything other
+            than raise ().  */
+         signal (SIGSEGV, SIG_IGN);
+         action = EXCEPTION_CONTINUE_EXECUTION;
+       }
+      else if (old_handler != SIG_DFL)
+       {
+         /* This means 'old' is a user defined function. Call it */
+         (*old_handler) (SIGSEGV);
+         action = EXCEPTION_CONTINUE_EXECUTION;
+       }
+      break;
+
+    case EXCEPTION_FLT_INVALID_OPERATION:
+    case EXCEPTION_FLT_DIVIDE_BY_ZERO:
+    case EXCEPTION_FLT_DENORMAL_OPERAND:
+    case EXCEPTION_FLT_OVERFLOW:
+    case EXCEPTION_FLT_UNDERFLOW:
+    case EXCEPTION_FLT_INEXACT_RESULT:
+      reset_fpu = 1;
+      /* fall through. */
+
+    case EXCEPTION_INT_DIVIDE_BY_ZERO:
+      /* test if the user has set SIGFPE */
+      old_handler = signal (SIGFPE, SIG_DFL);
+      if (old_handler == SIG_IGN)
+       {
+         signal (SIGFPE, SIG_IGN);
+         if (reset_fpu)
+           _fpreset ();
+         action = EXCEPTION_CONTINUE_EXECUTION;
+       }
+      else if (old_handler != SIG_DFL)
+       {
+         /* This means 'old' is a user defined function. Call it */
+         (*old_handler) (SIGFPE);
+         action = EXCEPTION_CONTINUE_EXECUTION;
+       }
+      break;
+
+    default:
+      break;
+    }
+  return action;
+}
+
+/*
+ * The function mainCRTStartup is the entry point for all console programs.
+ */
+static int
+__mingw_CRTStartup ()
+{
+  int nRet;
+
+  /*
+   * Set up the top-level exception handler so that signal handling
+   * works as expected. The mapping between ANSI/POSIX signals and
+   * Win32 SE is not 1-to-1, so caveat emptore.
+   * 
+   */
+  SetUnhandledExceptionFilter (_gnu_exception_handler);
+
+  /*
+   * Initialize floating point unit.
+   */
+  _fpreset ();                 /* Supplied by the runtime library. */
+
+  /*
+   * Set up __argc, __argv and _environ.
+   */
+  _mingw32_init_mainargs ();
+
+  /*
+   * Sets the default file mode for stdin, stdout and stderr, as well
+   * as files later opened by the user, to _CRT_fmode.
+   * NOTE: DLLs don't do this because that would be rude!
+   */
+  _mingw32_init_fmode ();
+
+  /*
+   * Call the main function. If the user does not supply one
+   * the one in the 'libmingw32.a' library will be linked in, and
+   * that one calls WinMain. See main.c in the 'lib' dir
+   * for more details.
+   */
+  nRet = main (_argc, _argv, environ);
+
+  /*
+   * Perform exit processing for the C library. This means
+   * flushing output and calling 'atexit' registered functions.
+   */
+  _cexit ();
+
+  ExitProcess (nRet);
+
+  return 0;
+}
+
+/*
+ * The function mainCRTStartup is the entry point for all console programs.
+ */
+int
+mainCRTStartup ()
+{
+#ifdef __MSVCRT__
+  __set_app_type (__CONSOLE_APP);
+#endif
+  __mingw_CRTStartup ();
+  return 0;
+}
+
+/*
+ * For now the GUI startup function is the same as the console one.
+ * This simply gets rid of the annoying warning about not being able
+ * to find WinMainCRTStartup when linking GUI applications.
+ */
+int
+WinMainCRTStartup ()
+{
+#ifdef __MSVCRT__
+  __set_app_type (__GUI_APP);
+#endif
+  __mingw_CRTStartup ();
+}
+
+#elif defined(DLLSTARTUP) /* dllcrt0.o - startup for a DLL */
+
+/* Unlike normal crt1, I don't initialize the FPU, because the process
+ * should have done that already. I also don't set the file handle modes,
+ * because that would be rude. */
+
+#ifdef __GNUC__
+extern void __main ();
+extern void __do_global_dtors ();
+#endif
+
+extern BOOL WINAPI DllMain (HANDLE, DWORD, LPVOID);
+
+BOOL WINAPI
+DllMainCRTStartup (HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
+{
+  BOOL bRet;
+
+  if (dwReason == DLL_PROCESS_ATTACH)
+    {
+      _mingw32_init_mainargs ();
+
+#ifdef __GNUC__
+      /* From libgcc.a, calls global class constructors. */
+      __main ();
+#endif
+    }
+
+  /*
+   * Call the user-supplied DllMain subroutine
+   * NOTE: DllMain is optional, so libmingw32.a includes a stub
+   *       which will be used if the user does not supply one.
+   */
+  bRet = DllMain (hDll, dwReason, lpReserved);
+
+#ifdef __GNUC__
+  if (dwReason == DLL_PROCESS_DETACH)
+    {
+      /* From libgcc.a, calls global class destructors. */
+      __do_global_dtors ();
+    }
+#endif
+
+  return bRet;
+}
+
+/*
+ * For the moment a dummy atexit. Atexit causes problems in DLLs, especially
+ * if they are dynamically loaded. For now atexit inside a DLL does nothing.
+ * NOTE: We need this even if the DLL author never calls atexit because
+ *       the global constructor function __do_global_ctors called from __main
+ *       will attempt to register __do_global_dtors using atexit.
+ *       Thanks to Andrey A. Smirnov for pointing this one out.
+ */
+int
+atexit (void (*pfn) ())
+{
+  return 0;
+}
+
+#else
+#error No startup target!
+#endif /* EXESTARTUP */
index 63f01c7..5b518c2 100644 (file)
@@ -18,7 +18,7 @@
 ##
 
 #
-# Set these to wherever you want "nmake install" to put your
+# Set these to wherever you want "dmake install" to put your
 # newly built perl.
 #
 INST_DRV       *= c:
@@ -111,9 +111,10 @@ CCTYPE             *= BORLAND
 #CFG           *= Debug
 
 #
-# uncomment to enable use of PerlCRT.DLL when using the Visual C compiler.
-# Highly recommended.  It has patches that fix known bugs in MSVCRT.DLL.
-# This currently requires VC 5.0 with Service Pack 3 or later.
+# uncomment to enable use of PerlCRT.DLL when using the Visual C compiler
+# or GCC/Mingw32. Highly recommended. It has patches that fix known bugs in 
+# MSVCRT.DLL. This currently requires VC 5.0 with Service Pack 3 or later
+# or GCC/Mingw32.
 # Get it from CPAN at http://www.perl.com/CPAN/authors/id/D/DO/DOUGL/
 # and follow the directions in the package to install.
 #
@@ -344,18 +345,31 @@ a = .a
 #
 # Options
 #
-RUNTIME                =
+
+# GCC headers need to know that we're using MSVCRT (or a clone thereof)
+RUNTIME                = -D__MSVCRT__
 INCLUDES       = -I$(COREDIR) -I.\include -I. -I..
 DEFINES                = -DWIN32 $(CRYPT_FLAG)
 LOCDEFS                = -DPERLDLL -DPERL_CORE
 SUBSYS         = console
 CXX_FLAG       = -xc++
 
-# crtdll doesn't define _wopen and friends
-#LIBC          = -lcrtdll
-LIBC           = -lmsvcrt
-LIBFILES       = $(CRYPT_LIB) -ladvapi32 -luser32 -lnetapi32 -lwsock32 \
-               -lmingw32 -lgcc -lmoldname $(LIBC) -lkernel32
+.IF "$(USE_PERLCRT)" == ""
+LIBCDLL        = msvcrt.dll
+CRTIMPLIBS     = $(OLDNAMES_A)
+.ELSE
+LIBCDLL        = PerlCRT.dll
+CRTIMPLIBS     = $(PERLCRT_A) $(OLDNAMES_A)
+.ENDIF
+
+LIBC           = -l$(LIBCDLL:s/.dll//)
+GCCLIBS                = -lmingw32 -lgcc
+
+# same libs as MSVC, but no -luuid32 or -lodbccp32 yet
+LIBFILES       =  $(GCCLIBS) $(CRYPT_LIB) $(LIBC) -loldnames -lkernel32 \
+               -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 \
+               -lole32 -loleaut32 -lnetapi32 -lwsock32 -lmpr -lwinmm \
+               -lversion -lodbc32
 
 .IF  "$(CFG)" == "Debug"
 OPTIMIZE       = -g $(RUNTIME) -DDEBUGGING
@@ -371,6 +385,9 @@ OBJOUT_FLAG = -o
 EXEOUT_FLAG    = -o
 LIBOUT_FLAG    = 
 
+# tack COREDIR on for perl build
+PRIV_LINK_FLAGS = -L"$(COREDIR)"
+
 .ELSE
 
 CC             = cl
@@ -430,8 +447,8 @@ LINK_DBG    = -release
 LIBBASEFILES   = $(DELAYLOAD) $(CRYPT_LIB) \
                oldnames.lib kernel32.lib user32.lib gdi32.lib \
                winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib \
-               oleaut32.lib netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib \
-               version.lib odbc32.lib odbccp32.lib
+               oleaut32.lib netapi32.lib uuid.lib wsock32.lib mpr.lib \
+               winmm.lib version.lib odbc32.lib odbccp32.lib
 
 # we add LIBC here, since we may be using PerlCRT.dll
 LIBFILES       = $(LIBBASEFILES) $(LIBC)
@@ -452,8 +469,19 @@ OPTIMIZE   += $(CXX_FLAG)
 BUILDOPT       += -DPERL_OBJECT
 .ENDIF
 
+CRTIMPLIBS     *= __not_needed
+PERLCRT_A      *= $(COREDIR)\libPerlCRT.a
+PERLCRT_DEF    *= PerlCRT.def
+OLDNAMES_A     *= $(COREDIR)\liboldnames.a
+OLDNAMES_DEF   *= oldnames.def
+
 CFLAGS_O       = $(CFLAGS) $(BUILDOPT)
 
+# used to allow local linking flags that are not propogated into Config.pm
+#   -- BKS, 11-15-1999
+PRIV_LINK_FLAGS        *=
+BLINK_FLAGS    = $(PRIV_LINK_FLAGS) $(LINK_FLAGS)
+
 #################### do not edit below this line #######################
 ############# NO USER-SERVICEABLE PARTS BEYOND THIS POINT ##############
 
@@ -477,14 +505,14 @@ LKPOST            = )
 
 $(o).dll:
 .IF "$(CCTYPE)" == "BORLAND"
-       $(LINK32) -Tpd -ap $(LINK_FLAGS) c0d32$(o) $<,$@,,$(LIBFILES),$(*B).def
+       $(LINK32) -Tpd -ap $(BLINK_FLAGS) c0d32$(o) $<,$@,,$(LIBFILES),$(*B).def
        $(IMPLIB) $(*B).lib $@
 .ELIF "$(CCTYPE)" == "GCC"
-       $(LINK32) -o $@ $(LINK_FLAGS) $< $(LIBFILES)
+       $(LINK32) -o $@ $(BLINK_FLAGS) $< $(LIBFILES)
        $(IMPLIB) -def $(*B).def $(*B).a $@
 .ELSE
        $(LINK32) -dll -subsystem:windows -implib:$(*B).lib -def:$(*B).def \
-           -out:$@ $(LINK_FLAGS) $(LIBFILES) $< $(LIBPERL)  
+           -out:$@ $(BLINK_FLAGS) $(LIBFILES) $< $(LIBPERL)  
 .ENDIF
 
 #
@@ -697,6 +725,12 @@ X2P_OBJ            = $(X2P_SRC:db:+$(o))
 PERLDLL_OBJ    = $(CORE_OBJ)
 PERLEXE_OBJ    = perlmain$(o)
 
+.IF "$(CCTYPE)" == "GCC"
+PERLEXE_OBJ    += .\gcrt0$(o)
+MINI_OBJ       += $(MINIDIR)\gcrt0$(o)
+DLL_OBJ                += .\gdllcrt0$(o)
+.ENDIF
+
 PERLDLL_OBJ    += $(WIN32_OBJ) $(DLL_OBJ)
 
 .IF "$(USE_SETARGV)" != ""
@@ -786,68 +820,146 @@ POD2MAN          = $(PODDIR)\pod2man
 POD2LATEX      = $(PODDIR)\pod2latex
 POD2TEXT       = $(PODDIR)\pod2text
 
+# vars must be separated by "\t+~\t+", since we're using the tempfile
+# version of config_sh.pl (we were overflowing someone's buffer by
+# trying to fit them all on the command line)
+#      -- BKS 10-17-1999
 CFG_VARS       =                                       \
-               "INST_DRV=$(INST_DRV)"                  \
-               "INST_TOP=$(INST_TOP)"                  \
-               "INST_VER=$(INST_VER)"                  \
-               "INST_ARCH=$(INST_ARCH)"                \
-               "archname=$(ARCHNAME)"                  \
-               "cc=$(CC)"                              \
-               "ccflags=$(OPTIMIZE:s/"/\"/) $(DEFINES) $(BUILDOPT)"    \
-               "cf_email=$(EMAIL)"                     \
-               "d_crypt=$(D_CRYPT)"                    \
-               "d_mymalloc=$(PERL_MALLOC)"             \
-               "libs=$(LIBFILES:f)"                    \
-               "incpath=$(CCINCDIR:s/"/\"/)"           \
-               "libperl=$(PERLIMPLIB:f)"               \
-               "libpth=$(CCLIBDIR:s/"/\"/);$(EXTRALIBDIRS:s/"/\"/)"    \
-               "libc=$(LIBC)"                          \
-               "make=dmake"                            \
-               "_o=$(o)" "obj_ext=$(o)"                \
-               "_a=$(a)" "lib_ext=$(a)"                \
-               "static_ext=$(STATIC_EXT)"              \
-               "dynamic_ext=$(DYNAMIC_EXT)"            \
-               "nonxs_ext=$(NONXS_EXT)"                \
-               "usethreads=$(USE_THREADS)"             \
-               "usemultiplicity=$(USE_MULTI)"          \
-               "LINK_FLAGS=$(LINK_FLAGS:s/"/\"/)"              \
-               "optimize=$(OPTIMIZE:s/"/\"/)"
+               INST_DRV=$(INST_DRV)            ~       \
+               INST_TOP=$(INST_TOP)            ~       \
+               INST_VER=$(INST_VER:s/\/\\/)    ~       \
+               INST_ARCH=$(INST_ARCH)          ~       \
+               archname=$(ARCHNAME)            ~       \
+               cc=$(CC)                        ~       \
+               ccflags=$(OPTIMIZE) $(DEFINES) $(BUILDOPT)      ~       \
+               cf_email=$(EMAIL)               ~       \
+               d_crypt=$(D_CRYPT)              ~       \
+               d_mymalloc=$(PERL_MALLOC)       ~       \
+               libs=$(LIBFILES:f)              ~       \
+               incpath=$(CCINCDIR)             ~       \
+               libperl=$(PERLIMPLIB:f)         ~       \
+               libpth=$(CCLIBDIR);$(EXTRALIBDIRS)              ~       \
+               libc=$(LIBC)                    ~       \
+               make=dmake                      ~       \
+               _o=$(o) obj_ext=$(o)            ~       \
+               _a=$(a) lib_ext=$(a)            ~       \
+               static_ext=$(STATIC_EXT)        ~       \
+               dynamic_ext=$(DYNAMIC_EXT)      ~       \
+               nonxs_ext=$(NONXS_EXT)          ~       \
+               usethreads=$(USE_THREADS)       ~       \
+               usemultiplicity=$(USE_MULTI)    ~       \
+               LINK_FLAGS=$(LINK_FLAGS:s/\/\\/)                ~       \
+               optimize=$(OPTIMIZE)
+
+#
+# set up targets varying between Win95 and WinNT builds
+#
+
+.IF "$(IS_WIN95)" == "define"
+MK2            = .\makefile.95
+RIGHTMAKE      = __switch_makefiles
+NOOP           = @rem
+.ELSE
+MK2            = __not_needed
+RIGHTMAKE      = __not_needed
+.ENDIF
 
 #
 # Top targets
 #
 
-.IF "$(IS_WIN95)" != ""
-MK2            = .\makew95.mk
+all : $(CRTIMPLIBS) .\config.h $(GLOBEXE) $(MINIPERL) $(MK2)           \
+       $(RIGHTMAKE) $(MINIMOD) $(CONFIGPM) $(PERLEXE) $(PERL95EXE)     \
+       $(X2P) $(EXTENSION_DLL) $(EXTENSION_PM)
+
+$(DYNALOADER)$(o) : $(DYNALOADER).c $(CORE_H) $(EXTDIR)\DynaLoader\dlutils.c
+
+#----------------------------------------------------------------
+
+#-------------------- BEGIN Win95 SPECIFIC ----------------------
+
+# this target is a jump-off point for Win95
+#  1. it switches to the Win95-specific makefile if it exists
+#     (__do_switc_makefiles)
+#  2. it prints a message when the Win95-specific one finishes (__done)
+#  3. it then kills this makefile by trying to make __no_such_target
 
-all : .\config.h $(GLOBEXE) $(MINIMOD) $(MK2)
-all2 : $(CONFIGPM) $(PERLEXE) $(PERL95EXE) $(X2P) $(EXTENSION_DLL) \
-       $(EXTENSIOM_PM)
+__switch_makefiles: __do_switch_makefiles __done __no_such_target
+
+__do_switch_makefiles:
+.IF "$(NOTFIRST)" != "true"
+       if exist $(MK2) $(MAKE:s/-S//) -f $(MK2) $(MAKETARGETS) NOTFIRST=true
 .ELSE
-all : .\config.h $(GLOBEXE) $(MINIMOD) $(CONFIGPM) $(PERLEXE) $(PERL95EXE) \
-       $(X2P) $(EXTENSION_DLL) $(EXTENSION_PM)
+       $(NOOP)
 .ENDIF
 
-$(DYNALOADER)$(o) : $(DYNALOADER).c $(CORE_H) $(EXTDIR)\DynaLoader\dlutils.c
+.IF "$(NOTFIRST)" != "true"
+__done:
+       @echo Build process complete. Ignore any errors after this message.
+       @echo Run "dmake test" to test and "dmake install" to install
+
+.ELSE
+# dummy targets for Win95-specific makefile
 
-#------------------------------------------------------------
+__done:
+       $(NOOP)
+
+__no_such_target:
+       $(NOOP)
 
-# This target is used to generate the makew95.mk for Win95
-.IF "$(IS_WIN95)" != ""
-$(MK2): makefile.mk
-       $(MINIPERL) genmk95.pl makefile.mk $(MK2)
-       $(MAKE) -f $(MK2) all2
 .ENDIF
 
+# This target is used to generate the new makefile (.\makefile.95) for Win95
+
+.\makefile.95: .\makefile.mk
+       $(MINIPERL) genmk95.pl makefile.mk $(MK2)
+
+#--------------------- END Win95 SPECIFIC ---------------------
+
+#--------------------- BEGIN GCC/Mingw32 SPECIFIC -------------
+
+# make GCC-ish implib for PerlCRT.dll if needed
+$(PERLCRT_A): $(PERLCRT_DEF)
+       if not exist $(COREDIR) mkdir $(COREDIR)
+       $(IMPLIB) --def $(PERLCRT_DEF)  \
+               --dllname $(LIBCDLL)            \
+               --output-lib $(PERLCRT_A)
+
+# make GCC-ish oldnames implib for our CRT (whether it's MSVCRT or PerlCRT)
+$(OLDNAMES_A): $(OLDNAMES_DEF)
+       $(IMPLIB) --def $(OLDNAMES_DEF) \
+               --dllname $(LIBCDLL)            \
+               --output-lib $(OLDNAMES_A)      \
+               --add-underscore
+
+# MSVCRT-using runtime startup files
+$(MINIDIR)\gcrt0$(o): .\gstartup.c
+       $(CC) -c $(CFLAGS) -DEXESTARTUP $(OBJOUT_FLAG)$@ .\gstartup.c
+
+.\gcrt0$(o): .\gstartup.c
+       $(CC) -c $(CFLAGS) -DEXESTARTUP $(OBJOUT_FLAG)$@ .\gstartup.c
+
+.\gdllcrt0$(o): .\gstartup.c
+       $(CC) -c $(CFLAGS) -DDLLSTARTUP $(OBJOUT_FLAG)$@ .\gstartup.c
+       $(XCOPY) $@ $(COREDIR)
+
+
+#--------------------- END GCC/Mingw32 SPECIFIC ---------------
+
+# a blank target for when builds don't need to do certain things
+# this target added for Win95 port but used to keep the WinNT port able to 
+# use this file
+__not_needed:
+
 $(GLOBEXE) : perlglob$(o)
 .IF "$(CCTYPE)" == "BORLAND"
        $(CC) -c -w -v -tWM -I"$(CCINCDIR)" perlglob.c
-       $(LINK32) -Tpe -ap $(LINK_FLAGS) c0x32$(o) perlglob$(o) \
+       $(LINK32) -Tpe -ap $(BLINK_FLAGS) c0x32$(o) perlglob$(o) \
            "$(CCLIBDIR)\32BIT\wildargs$(o)",$@,,import32.lib cw32mt.lib,
 .ELIF "$(CCTYPE)" == "GCC"
-       $(LINK32) $(LINK_FLAGS) -o $@ perlglob$(o) $(LIBFILES)
+       $(LINK32) $(BLINK_FLAGS) -o $@ perlglob$(o) $(LIBFILES)
 .ELSE
-       $(LINK32) $(LINK_FLAGS) $(LIBFILES) -out:$@ -subsystem:$(SUBSYS) \
+       $(LINK32) $(BLINK_FLAGS) $(LIBFILES) -out:$@ -subsystem:$(SUBSYS) \
            perlglob$(o) setargv$(o) 
 .ENDIF
 
@@ -861,7 +973,8 @@ config.w32 : $(CFGSH_TMPL)
        copy $(CFGH_TMPL) config.h
 
 ..\config.sh : config.w32 $(MINIPERL) config_sh.PL
-       $(MINIPERL) -I..\lib config_sh.PL $(CFG_VARS) config.w32 > ..\config.sh
+       $(MINIPERL) -I..\lib config_sh.PL --cfgsh-option-file \
+           $(mktmp $(CFG_VARS)) config.w32 > ..\config.sh
 
 # this target is for when changes to the main config.sh happen
 # edit config.{b,v,g}c and make this target once for each supported
@@ -885,16 +998,16 @@ $(CONFIGPM) : $(MINIPERL) ..\config.sh config_h.PL ..\minimod.pl
        $(MINIPERL) -I..\lib config_h.PL "INST_VER=$(INST_VER)" \
            || $(MAKE) $(MAKEMACROS) $(CONFIGPM) $(MAKEFILE)
 
-$(MINIPERL) : $(MINIDIR) $(MINI_OBJ)
+$(MINIPERL) : $(MINIDIR) $(MINI_OBJ) $(CRTIPMLIBS)
 .IF "$(CCTYPE)" == "BORLAND"
-       $(LINK32) -Tpe -ap $(LINK_FLAGS) \
+       $(LINK32) -Tpe -ap $(BLINK_FLAGS) \
            @$(mktmp c0x32$(o) $(MINI_OBJ:s,\,\\),$(@:s,\,\\),,$(LIBFILES),)
 .ELIF "$(CCTYPE)" == "GCC"
-       $(LINK32) -v -o $@ $(LINK_FLAGS) \
-           $(mktmp $(LKPRE) $(MINI_OBJ:s,\,\\) $(LIBFILES) $(LKPOST))
+       $(LINK32) -v -nostdlib -o $@ $(BLINK_FLAGS) \
+           $(mktmp $(LKPRE) $(MINI_OBJ:s,\,\\) $(LIBFILES) $(LKPOST)) 
 .ELSE
        $(LINK32) -subsystem:console -out:$@ \
-           @$(mktmp $(LINK_FLAGS) $(LIBFILES) $(MINI_OBJ:s,\,\\))
+           @$(mktmp $(BLINK_FLAGS) $(LIBFILES) $(MINI_OBJ:s,\,\\))
 .ENDIF
 
 $(MINIDIR) :
@@ -973,14 +1086,14 @@ $(X2P) : $(MINIPERL) $(X2P_OBJ)
        $(MINIPERL) ..\x2p\find2perl.PL
        $(MINIPERL) ..\x2p\s2p.PL
 .IF "$(CCTYPE)" == "BORLAND"
-       $(LINK32) -Tpe -ap $(LINK_FLAGS) \
+       $(LINK32) -Tpe -ap $(BLINK_FLAGS) \
            @$(mktmp c0x32$(o) $(X2P_OBJ:s,\,\\),$(@:s,\,\\),,$(LIBFILES),)
 .ELIF "$(CCTYPE)" == "GCC"
-       $(LINK32) -v -o $@ $(LINK_FLAGS) \
+       $(LINK32) -v -o $@ $(BLINK_FLAGS) \
            $(mktmp $(LKPRE) $(X2P_OBJ:s,\,\\) $(LIBFILES) $(LKPOST))
 .ELSE
        $(LINK32) -subsystem:console -out:$@ \
-           @$(mktmp $(LINK_FLAGS) $(LIBFILES) $(X2P_OBJ:s,\,\\))
+           @$(mktmp $(BLINK_FLAGS) $(LIBFILES) $(X2P_OBJ:s,\,\\))
 .ENDIF
 
 perlmain.c : runperl.c 
@@ -991,15 +1104,15 @@ perlmain$(o) : perlmain.c
 
 $(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ)
 .IF "$(CCTYPE)" == "BORLAND"
-       $(LINK32) -Tpe -ap $(LINK_FLAGS) \
+       $(LINK32) -Tpe -ap $(BLINK_FLAGS) \
            @$(mktmp c0x32$(o) $(PERLEXE_OBJ:s,\,\\)\n \
            $(@:s,\,\\),\n \
            $(PERLIMPLIB) $(LIBFILES)\n)
 .ELIF "$(CCTYPE)" == "GCC"
-       $(LINK32) -o $@ $(LINK_FLAGS)  \
+       $(LINK32) -nostdlib -o $@ $(BLINK_FLAGS)  \
            $(PERLEXE_OBJ) $(PERLIMPLIB) $(LIBFILES)
 .ELSE
-       $(LINK32) -subsystem:console -out:$@ $(LINK_FLAGS) $(LIBFILES) \
+       $(LINK32) -subsystem:console -out:$@ $(BLINK_FLAGS) $(LIBFILES) \
            $(PERLEXE_OBJ) $(SETARGV_OBJ) $(PERLIMPLIB) 
        copy $(PERLEXE) $(WPERLEXE)
        editbin /subsystem:windows $(WPERLEXE)
@@ -1030,7 +1143,7 @@ DynaLoadmt$(o) : $(DYNALOADER).c
            $(OBJOUT_FLAG)DynaLoadmt$(o) $(DYNALOADER).c
 
 $(PERL95EXE): $(PERLDLL) $(CONFIGPM) $(PERL95_OBJ)
-       $(LINK32) -subsystem:console -nodefaultlib -out:$@ $(LINK_FLAGS) \
+       $(LINK32) -subsystem:console -nodefaultlib -out:$@ $(BLINK_FLAGS) \
            $(LIBBASEFILES) $(PERL95_OBJ) $(SETARGV_OBJ) $(PERLIMPLIB) \
            libcmt.lib
 
@@ -1179,7 +1292,7 @@ distclean: clean
 
 install : all installbare installhtml
 
-installbare : utils
+installbare : $(RIGHTMAKE) utils
        $(PERLEXE) ..\installperl
 .IF "$(PERL95EXE)" != ""
        $(XCOPY) $(PERL95EXE) $(INST_BIN)\*.*
@@ -1217,7 +1330,7 @@ test-prep : all utils
        $(XCOPY) $(GLOBEXE) ..\t\$(NULL)
 .ENDIF
 
-test : test-prep
+test : $(RIGHTMAKE) test-prep
        cd ..\t && $(PERLEXE) -I..\lib harness
 
 test-notty : test-prep
diff --git a/win32/oldnames.def b/win32/oldnames.def
new file mode 100644 (file)
index 0000000..a6ffd34
--- /dev/null
@@ -0,0 +1,115 @@
+;
+; oldnames.def
+;
+; oldnames versions of MSVCRT/PerlCRT functions for GCC/Mingw32
+;
+; This file is taken from the Mingw32 distribution
+;  Created by Colin Peters for Mingw32
+;
+; Added to Perl5 distrbution by Benjamin Stuhl <sho_pi@hotmail.com>
+
+EXPORTS
+access
+beep
+cabs
+chdir
+chmod
+chsize
+close
+creat
+cwait
+dup
+dup2
+ecvt
+eof
+execl
+execle
+execlp
+execlpe
+execv
+execve
+execvp
+execvpe
+fcvt
+fdopen
+fgetchar
+fgetwchar
+filelength
+fileno
+fputchar
+fputwchar
+fstat
+ftime
+gcvt
+getch
+getche
+getcwd
+getpid
+getw
+heapwalk
+hypot
+isatty
+itoa
+j0
+j1
+jn
+kbhit
+lseek
+ltoa
+memccpy
+memicmp
+mkdir
+mktemp
+open
+pclose
+popen
+putch
+putenv
+putw
+read
+rmdir
+searchenv
+seterrormode
+setmode
+sleep
+sopen
+spawnl
+spawnle
+spawnlp
+spawnlpe
+spawnv
+spawnve
+spawnvp
+spawnvpe
+stat
+strcmpi
+strdup
+stricmp
+stricoll
+strlwr
+strnicmp
+strnset
+strrev
+strset
+strupr
+swab
+tell
+tempnam
+tzset
+umask
+ungetch
+unlink
+utime
+wcsdup
+wcsicmp
+wcsicoll
+wcslwr
+wcsnicmp
+wcsnset
+wcsrev
+wcsset
+wcsupr
+write
+y0
+y1
+yn
index 28d582a..d3224f1 100644 (file)
@@ -268,13 +268,6 @@ typedef long               gid_t;
 #  endif
 #endif
 
-#ifndef _O_NOINHERIT
-#  define _O_NOINHERIT 0x0080
-#  ifndef _NO_OLDNAMES
-#    define O_NOINHERIT        _O_NOINHERIT
-#  endif
-#endif
-
 #endif /* __MINGW32__ */
 
 /* compatibility stuff for other compilers goes here */