summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--make_ext.pl46
-rw-r--r--mg.c2
-rw-r--r--win32/Makefile.ce47
-rw-r--r--win32/win32.h3
-rw-r--r--win32/win32iop.h153
5 files changed, 219 insertions, 32 deletions
diff --git a/make_ext.pl b/make_ext.pl
index 6c2caf0302..55fa5aec87 100644
--- a/make_ext.pl
+++ b/make_ext.pl
@@ -1,6 +1,7 @@
#!./miniperl
use strict;
use warnings;
+use constant IS_CROSS => defined $::Cross::platform ? 1 : 0;
use Config;
my $is_Win32 = $^O eq 'MSWin32';
@@ -155,7 +156,7 @@ if ($is_Win32) {
unless (-f "$pl2bat.bat") {
my @args = ($perl, "-I$topdir\\lib", ("$pl2bat.pl") x 2);
print "@args\n";
- system(@args) unless defined $::Cross::platform;
+ system(@args) unless IS_CROSS;
}
print "In $build";
@@ -299,12 +300,43 @@ sub build_extension {
require ExtUtils::MM_Unix;
defined (my $newv = parse_version MM $vmod) or last;
if ($newv ne $oldv) {
- 1 while unlink $makefile
+ close $mfh or die "close $makefile: $!";
+ _unlink($makefile);
+ {
+ no warnings 'deprecated';
+ goto NO_MAKEFILE;
+ }
}
}
+ if(IS_CROSS){
+ seek($mfh, 0, 0) or die "Cannot seek $makefile: $!";
+ while (<$mfh>) {
+ #this is used to stop the while loop early for efficiency when
+ #the line is reached, and possibly match a cross build
+ my $header = quotemeta '# These definitions are from config.sh (via ';
+ if(/^$header.+?
+ (xlib[\/\\]
+ $::Cross::platform\Q\/Config.pm\E)?\)\./x) {
+ unless (defined $1){
+ print "Deleting non-Cross makefile\n";
+ close $mfh or die "close $makefile: $!";
+ _unlink($makefile);
+ {
+ no warnings 'deprecated';
+ goto NO_MAKEFILE;
+ }
+ } else { #have a cross makefile
+ goto CROSS_OK_MF;
+ }
+ }
+ } #catch breakage from future changes
+ die "non-standard makefile found in $mname";
+ CROSS_OK_MF:
+ }
}
if (!-f $makefile) {
+ NO_MAKEFILE:
if (!-f 'Makefile.PL') {
print "\nCreating Makefile.PL in $ext_dir for $mname\n";
my ($fromname, $key, $value);
@@ -408,7 +440,7 @@ EOM
# Presumably this can be simplified
my @cross;
- if (defined $::Cross::platform) {
+ if (IS_CROSS) {
# Inherited from win32/buildext.pl
@cross = "-MCross=$::Cross::platform";
} elsif ($opts{cross}) {
@@ -504,3 +536,11 @@ sub _quote_args {
} @{$args}
;
}
+
+#guarentee that a file is deleted or die, void _unlink($filename)
+#xxx replace with _unlink_or_rename from EU::Install?
+sub _unlink {
+ 1 while unlink $_[0];
+ my $err = $!;
+ die "Can't unlink $_[0]: $err" if -f $_[0];
+}
diff --git a/mg.c b/mg.c
index 93048ecfda..f88428a925 100644
--- a/mg.c
+++ b/mg.c
@@ -2755,7 +2755,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
#else
# define PERL_VMS_BANG 0
#endif
-#ifdef WIN32
+#if defined(WIN32) && ! defined(UNDER_CE)
SETERRNO(win32_get_errno(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0),
(SvIV(sv) == EVMSERR) ? 4 : PERL_VMS_BANG);
#else
diff --git a/win32/Makefile.ce b/win32/Makefile.ce
index 1df3bb6768..4ac1e495d0 100644
--- a/win32/Makefile.ce
+++ b/win32/Makefile.ce
@@ -354,10 +354,10 @@ STARTOBJS = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
CEDEFS = -D_WINDOWS -D_WIN32_WCE=$(CEVersion) -DUNDER_CE=$(CEVersion) \
$(MCFLAGS) -D PERL -GS-
-CECFLAGS = $(CEDEFS)
+CECFLAGS = $(CEDEFS) -Zi
!if "$(CFG)" == "DEBUG"
-CECFLAGS = $(CECFLAGS) -Zi -Od
+CECFLAGS = $(CECFLAGS) -Od
!endif
!if "$(CFG)" == "RELEASE"
@@ -365,7 +365,7 @@ CECFLAGS = $(CECFLAGS) -Zi -Od
# Also the dll cannot be loaded by perl.exe...
!if "$(CPU)" == "SH3"
!else
-CECFLAGS = $(CECFLAGS) -O2 -Ot
+CECFLAGS = $(CECFLAGS) -O1 -GL
!endif
!endif
@@ -373,7 +373,7 @@ CECFLAGS = $(CECFLAGS) -O2 -Ot
RCDEFS = /l 0x407 /r /d "UNICODE" /d UNDER_CE=$(CEVersion) \
/d _WIN32_WCE=$(CEVersion)
-PATH=$(CEPATH);$(PATH)
+#PATH=$(CEPATH);$(PATH)
# attention, for eVC 4, these paths are not generated correctly since the
# WinCE SDK is organized differently from eVC 3, replace the next 2 macros
@@ -506,13 +506,7 @@ LIBFILES = $(LIBBASEFILES) $(LIBC)
CFLAGS = -nologo -GF -W3 $(INCLUDES) $(DEFINES) $(LOCDEFS) \
$(PCHFLAGS) $(OPTIMIZE)
-LINK_FLAGS = -nologo -opt:ref,icf -machine:$(PROCESSOR_ARCHITECTURE)
-
-!if "$(CFG)" == "DEBUG"
-LINK_FLAGS = $(LINK_FLAGS) -debug
-!else
-LINK_FLAGS = $(LINK_FLAGS) -release
-!endif
+LINK_FLAGS = -nologo -debug -opt:ref,icf -machine:$(PROCESSOR_ARCHITECTURE)
OBJOUT_FLAG = -Fo
EXEOUT_FLAG = -Fe
@@ -553,7 +547,6 @@ DLLDIR = $(MACHINE)\dll
PERLEXE = $(MACHINE)\perl.exe
CONFIGPM = ..\xlib\$(CROSS_NAME)\Config.pm
-MINIMOD = ..\lib\ExtUtils\Miniperl.pm
# Unicode data files generated by mktables
FIRSTUNIFILE = ..\lib\unicore\Decomposition.pl
@@ -732,13 +725,10 @@ CFG_VARS = \
"optimize=$(OPTIMIZE)" \
"WIN64=$(WIN64)"
-ICWD = -I..\dist\Cwd -I..\dist\Cwd\lib
-ICWD1 = -I..\..\dist\Cwd -I..\..\dist\Cwd\lib
-
#
# filenames given to xsubpp must have forward slashes (since it puts
# full pathnames in #line strings)
-XSUBPP = $(HPERL) -I..\..\lib $(ICWD1) -MCross=$(CROSS_NAME) ..\$(EXTUTILSDIR)\xsubpp \
+XSUBPP = $(HPERL) -I..\..\lib -MCross=$(CROSS_NAME) ..\$(EXTUTILSDIR)\xsubpp \
-C++ -prototypes
@@ -746,14 +736,14 @@ XSUBPP = $(HPERL) -I..\..\lib $(ICWD1) -MCross=$(CROSS_NAME) ..\$(EXTUTILSDIR)\
# Top targets
#
-all: hostminiperl $(MINIMOD) $(CONFIGPM) $(UNIDATAFILES) $(PERLEXE) MakePPPort Extensions
+all: hostminiperl $(CONFIGPM) $(UNIDATAFILES) $(PERLEXE) MakePPPort Extensions
$(DYNALOADER)$(o) : $(DYNALOADER).c xconfig.h $(EXTDIR)\DynaLoader\dlutils.c
#convenience target
configpm_targ : $(CONFIGPM)
-$(CONFIGPM) : $(HPERL) ..\Cross\config-$(MACHINE).sh config_h.PL ..\minimod.pl
+$(CONFIGPM) : $(HPERL) ..\Cross\config-$(MACHINE).sh config_h.PL
cd .. && $(HPERL) -Ilib configpm --cross=$(CROSS_NAME) --no-glossary
-mkdir $(XCOREDIR)
$(XCOPY) ..\*.h $(XCOREDIR)\*.*
@@ -764,16 +754,16 @@ $(CONFIGPM) : $(HPERL) ..\Cross\config-$(MACHINE).sh config_h.PL ..\minimod.pl
.\xconfig.h:
-del /f xconfig.h
-mkdir $(XCOREDIR)
- -$(HPERL) -I..\lib $(ICWD) -MCross=$(CROSS_NAME) config_h.PL "INST_VER=$(INST_VER)" "CORE_DIR=$(XCOREDIR)" "CONFIG_H=xconfig.h"
- $(XCOPY) xconfig.h $(XCOREDIR)\config.h
+ -$(HPERL) -I..\lib -MCross=$(CROSS_NAME) config_h.PL "INST_VER=$(INST_VER)" "CORE_DIR=$(XCOREDIR)" "CONFIG_H=xconfig.h"
+#prevent accidents where the desktop config.h is used
+ $(DEL) $(XCOREDIR)\config.h
+ echo "#error This is a cross build. Use xconfig.h. \
+" > $(XCOREDIR)\config.h
..\Cross\config-$(MACHINE).sh: config.ce config_sh.PL
$(HPERL) -I..\lib -I. config_sh.PL $(CFG_VARS) config.ce > ..\Cross\config-$(MACHINE).sh
-$(MINIMOD) : ..\minimod.pl
- cd .. && $(HPERL) minimod.pl > lib\ExtUtils\Miniperl.pm
-
-MakePPPort: $(MINIPERL) $(CONFIGPM)
+MakePPPort: $(HPERL) $(CONFIGPM)
$(HPERL) -I..\lib -MCross=$(CROSS_NAME) ..\mkppport
MakePPPort_clean:
@@ -790,17 +780,17 @@ NOT_COMPILE_EXT = $(NOT_COMPILE_EXT) !XS/Typemap
Extensions: ..\make_ext.pl $(CONFIGPM)
$(HPERL) -I..\lib -I. -MCross=$(CROSS_NAME) ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all \
- !POSIX !Errno !Win32 !Win32API/File !Socket !Time/HiRes !Time/Piece !re $(NOT_COMPILE_EXT)
+ !POSIX !Errno !Win32 !Win32API/File !Time/HiRes !Time/Piece !re !SDBM_File $(NOT_COMPILE_EXT)
Extensions_clean:
- -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --all --target=clean
+ -if exist $(HPERL) $(HPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --all --target=clean
#----------------------------------------------------------------------------------
$(PERLEXE_RES): perlexe.rc perl.rc $(PERLEXE_MANIFEST) $(PERLEXE_ICO)
rc $(RCDEFS) perlexe.rc
-clean:
+clean: Extensions_clean
-if exist .\$(MACHINE)\dll rmdir /s /q .\$(MACHINE)\dll
-@$(DEL) .\$(MACHINE)\*.obj
-@$(DEL) .\$(MACHINE)\*.exe
@@ -810,6 +800,7 @@ clean:
-@$(DEL) .\$(MACHINE)\*.pdb
-@$(DEL) ..\Cross\config-$(MACHINE).sh ..\lib\Config.pm
-if exist ..\xlib rmdir /s /q ..\xlib
+ -if exist .\$(MACHINE) rmdir /s /q .\$(MACHINE)
-@$(DEL) config.h xconfig.h perl.res
-@$(DEL) ..\t\test_state
@@ -955,7 +946,7 @@ install: all
$(UNIDATAFILES) : $(HPERL) $(CONFIGPM) ..\lib\unicore\mktables
cd ..\lib\unicore && \
- $(HPERL) -I.. -I..\..\lib $(ICWD1) -MCross=$(CROSS_NAME) mktables -P ..\..\pod -maketest -makelist -p -check $@ $(FIRSTUNIFILE)
+ $(HPERL) -I.. -I..\..\lib -MCross=$(CROSS_NAME) mktables -P ..\..\pod -maketest -makelist -p -check $@ $(FIRSTUNIFILE)
dist: all
$(HPERL) -I..\lib -MCross=$(CROSS_NAME) ce-helpers\makedist.pl --distdir=dist-$(CROSS_NAME) --cross-name=$(CROSS_NAME)
diff --git a/win32/win32.h b/win32/win32.h
index 79fe071351..832ebda866 100644
--- a/win32/win32.h
+++ b/win32/win32.h
@@ -243,6 +243,9 @@ typedef unsigned short mode_t;
#pragma warning(disable: 4102) /* "unreferenced label" */
#define isnan _isnan
+#ifdef UNDER_CE /* revisit what function this becomes celib vs corelibc, prv warning here*/
+# undef snprintf
+#endif
#define snprintf _snprintf
#define vsnprintf _vsnprintf
diff --git a/win32/win32iop.h b/win32/win32iop.h
index 207c9176e5..11d4219fc2 100644
--- a/win32/win32iop.h
+++ b/win32/win32iop.h
@@ -207,75 +207,210 @@ END_EXTERN_C
*/
#undef fprintf
#define fprintf win32_fprintf
+#ifdef UNDER_CE /* celib also makes these be macros to celib's x* symbols */
+# undef vfprintf
+#endif
#define vfprintf win32_vfprintf
+#ifdef UNDER_CE
+# undef printf
+#endif
#define printf win32_printf
+#ifdef UNDER_CE
+# undef vprintf
+#endif
#define vprintf win32_vprintf
+#ifdef UNDER_CE
+# undef fread
+#endif
#define fread(buf,size,count,f) win32_fread(buf,size,count,f)
+#ifdef UNDER_CE
+# undef fwrite
+#endif
#define fwrite(buf,size,count,f) win32_fwrite(buf,size,count,f)
+#ifdef UNDER_CE
+# undef fopen
+#endif
#define fopen win32_fopen
#undef fdopen
#define fdopen win32_fdopen
+#ifdef UNDER_CE
+# undef freopen
+#endif
#define freopen win32_freopen
#define fclose(f) win32_fclose(f)
+#ifdef UNDER_CE
+# undef fputs
+#endif
#define fputs(s,f) win32_fputs(s,f)
+#ifdef UNDER_CE
+# undef fputc
+#endif
#define fputc(c,f) win32_fputc(c,f)
+#ifdef UNDER_CE
+# undef ungetc
+#endif
#define ungetc(c,f) win32_ungetc(c,f)
#undef getc
#define getc(f) win32_getc(f)
+#ifdef UNDER_CE
+# undef fileno
+#endif
#define fileno(f) win32_fileno(f)
+#ifdef UNDER_CE
+# undef clearerr
+#endif
#define clearerr(f) win32_clearerr(f)
+#ifdef UNDER_CE
+# undef fflush
+#endif
#define fflush(f) win32_fflush(f)
+#ifdef UNDER_CE
+# undef ftell
+#endif
#define ftell(f) win32_ftell(f)
+#ifdef UNDER_CE
+# undef fseek
+#endif
#define fseek(f,o,w) win32_fseek(f,o,w)
+#ifdef UNDER_CE
+# undef fgetpos
+#endif
#define fgetpos(f,p) win32_fgetpos(f,p)
+#ifdef UNDER_CE
+# undef fsetpos
+#endif
#define fsetpos(f,p) win32_fsetpos(f,p)
+#ifdef UNDER_CE
+# undef rewind
+#endif
#define rewind(f) win32_rewind(f)
#define tmpfile() win32_tmpfile()
+#ifdef UNDER_CE
+# undef abort
+#endif
#define abort() win32_abort()
+#ifdef UNDER_CE
+# undef fstat
+#endif
#define fstat(fd,bufptr) win32_fstat(fd,bufptr)
+#ifdef UNDER_CE
+# undef stat
+#endif
#define stat(pth,bufptr) win32_stat(pth,bufptr)
#define longpath(pth) win32_longpath(pth)
#define ansipath(pth) win32_ansipath(pth)
+#ifdef UNDER_CE
+# undef rename
+#endif
#define rename(old,new) win32_rename(old,new)
+#ifdef UNDER_CE
+# undef setmode
+#endif
#define setmode(fd,mode) win32_setmode(fd,mode)
#define chsize(fd,sz) win32_chsize(fd,sz)
+#ifdef UNDER_CE
+# undef lseek
+#endif
#define lseek(fd,offset,orig) win32_lseek(fd,offset,orig)
#define tell(fd) win32_tell(fd)
+#ifdef UNDER_CE
+# undef dup
+#endif
#define dup(fd) win32_dup(fd)
+#ifdef UNDER_CE
+# undef dup2
+#endif
#define dup2(fd1,fd2) win32_dup2(fd1,fd2)
+#ifdef UNDER_CE
+# undef open
+#endif
#define open win32_open
+#ifdef UNDER_CE
+# undef close
+#endif
#define close(fd) win32_close(fd)
#define eof(fd) win32_eof(fd)
+#ifdef UNDER_CE
+# undef isatty
+#endif
#define isatty(fd) win32_isatty(fd)
+#ifdef UNDER_CE
+# undef read
+#endif
#define read(fd,b,s) win32_read(fd,b,s)
+#ifdef UNDER_CE
+# undef write
+#endif
#define write(fd,b,s) win32_write(fd,b,s)
#define _open_osfhandle win32_open_osfhandle
+#ifdef UNDER_CE
+# undef _get_osfhandle
+#endif
#define _get_osfhandle win32_get_osfhandle
#define spawnvp win32_spawnvp
+#ifdef UNDER_CE
+# undef mkdir
+#endif
#define mkdir win32_mkdir
+#ifdef UNDER_CE
+# undef rmdir
+#endif
#define rmdir win32_rmdir
+#ifdef UNDER_CE
+# undef chdir
+#endif
#define chdir win32_chdir
#define flock(fd,o) win32_flock(fd,o)
+#ifdef UNDER_CE
+# undef execv
+#endif
#define execv win32_execv
+#ifdef UNDER_CE
+# undef execvp
+#endif
#define execvp win32_execvp
+#ifdef UNDER_CE
+# undef perror
+#endif
#define perror win32_perror
#define setbuf win32_setbuf
+#ifdef UNDER_CE
+# undef setvbuf
+#endif
#define setvbuf win32_setvbuf
#undef flushall
#define flushall win32_flushall
#undef fcloseall
#define fcloseall win32_fcloseall
+#ifdef UNDER_CE
+# undef fgets
+#endif
#define fgets win32_fgets
+#ifdef UNDER_CE
+# undef gets
+#endif
#define gets win32_gets
+#ifdef UNDER_CE
+# undef fgetc
+#endif
#define fgetc win32_fgetc
#undef putc
#define putc win32_putc
+#ifdef UNDER_CE
+# undef puts
+#endif
#define puts win32_puts
#undef getchar
#define getchar win32_getchar
#undef putchar
#define putchar win32_putchar
+#ifdef UNDER_CE
+# undef access
+#endif
#define access(p,m) win32_access(p,m)
+#ifdef UNDER_CE
+# undef chmod
+#endif
#define chmod(p,m) win32_chmod(p,m)
@@ -302,19 +437,37 @@ END_EXTERN_C
#define link win32_link
#define unlink win32_unlink
#define utime win32_utime
+#ifdef UNDER_CE
+# undef gettimeofday
+#endif
#define gettimeofday win32_gettimeofday
#define uname win32_uname
#define wait win32_wait
#define waitpid win32_waitpid
+#ifdef UNDER_CE
+# undef kill
+#endif
#define kill win32_kill
+#ifdef UNDER_CE
+# undef opendir
+#endif
#define opendir win32_opendir
+#ifdef UNDER_CE
+# undef readdir
+#endif
#define readdir win32_readdir
#define telldir win32_telldir
#define seekdir win32_seekdir
#define rewinddir win32_rewinddir
+#ifdef UNDER_CE
+# undef closedir
+#endif
#define closedir win32_closedir
#define os_id win32_os_id
+#ifdef UNDER_CE
+# undef getpid
+#endif
#define getpid win32_getpid
#undef crypt