The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#
# perl makefile for wince
# During the cross-compilation, it first uses Makefile file to build
# miniperl on HOST and then build required platform
#

SRCDIR     = ..
PV         = 526

# INSTALL_ROOT specifies a path where this perl will be installed on CE device
INSTALL_ROOT=/netzwerk/sprache/perl
INST_TOP=$(INSTALL_ROOT)
INST_VER=

# PERLCEDIR shoud be set to current directory
PERLCEDIR  = $(MAKEDIR)

# WCEROOT is a directory where Windows CE Tools was installed
WCEROOT    = D:\Windows CE Tools

# HPERL stands for host perl, which is perl on local desktop machine
# which is usually ..\miniperl.exe
#HPERL     = N:\Programme\perl\bin\perl.exe
HPERL = $(MAKEDIR)\..\miniperl.exe

CEPATH     = D:\Programme\Microsoft eMbedded Tools\EVC\WCE211\BIN
CELIBDLLDIR  = h:\src\wince\celib-palm-3.0
CECONSOLEDIR = h:\src\wince\w32console

# specify following options to build perl on local machine, by MSVC
MSVCDIR         = D:\MSVStudio\VC98
CCHOME		= $(MSVCDIR)
CCINCDIR	= $(CCHOME)\include
CCLIBDIR	= $(CCHOME)\lib

# cecopy program. Make shure it is in your path, as well as cemkdir, cedel
CECOPY     = cecopy

#
# comment this out if you want the legacy default behavior of including '.' at
# the end of @INC.
#
DEFAULT_INC_EXCLUDES_DOT = define

#
# set this if you wish to use perl's malloc
# This will make perl run few times faster
# WARNING: Turning this on/off WILL break binary compatibility with extensions
# you may have compiled with/without it.
#
PERL_MALLOC	= define


NOOP	   = @echo
# keep this untouched!
NULL	   =

#
# uncomment exactly one of the following
#
# Embedded Visual C++ 4 and older
CCTYPE		= MSVC60
# Smart Devices for Visual C++ 2005 (aka Visual C++ 8.x) (full version)
#CCTYPE		= MSVC80
# Smart Devices for Visual C++ 2008 (aka Visual C++ 9.x) (full version)
#CCTYPE		= MSVC90

#CFG=DEBUG
CFG=RELEASE

!if "$(MACHINE)" == ""
MACHINE=wince-arm-hpc-wce300
#MACHINE=wince-arm-hpc-wce211
#MACHINE=wince-sh3-hpc-wce211
#MACHINE=wince-mips-hpc-wce211
#MACHINE=wince-sh3-hpc-wce200
#MACHINE=wince-mips-hpc-wce200
#MACHINE=wince-arm-pocket-wce300
#MACHINE=wince-mips-pocket-wce300
#MACHINE=wince-sh3-pocket-wce300
#MACHINE=wince-x86em-pocket-wce300
#MACHINE=wince-mips-palm-wce211
#MACHINE=wince-sh3-palm-wce211
#MACHINE=wince-x86em-palm-wce211
#MACHINE=wince-x86-hpc-wce300
#MACHINE=wince-arm-pocket-wce400
!endif

# set this to your email address
#
#EMAIL		=

##################### CHANGE THESE ONLY IF YOU MUST #####################

######################################################################
# machines

!if "$(MACHINE)" == "wince-sh3-hpc-wce211"
CC         = shcl.exe
ARCH       = SH3
CPU        = SH3
TARGETCPU  = SH3
CEVersion  = 211
OSVERSION  = WCE211
PLATFORM   = MS HPC Pro
MCFLAGS    = -MDd -DSH3 -D_SH3_ -DSHx -DPROCESSOR_SH3 -DPALM_SIZE \
             -I $(CELIBDLLDIR)\inc
SUBSYS	   = -subsystem:windowsce,2.11
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-mips-hpc-wce211"
CC         = clmips.exe
ARCH       = MIPS
CPU        = MIPS
TARGETCPU  = MIPS
CEVersion  = 211
OSVERSION  = WCE211
PLATFORM   = MS HPC Pro
MCFLAGS    = -D _MT -D _DLL \
             -D MIPS -D mips -D _MIPS_ -D _mips_ -DPROCESSOR_MIPS \
             -D PALM_SIZE \
             -I $(CELIBDLLDIR)\inc
SUBSYS	   = -subsystem:windowsce,2.11
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-mips-hpc-wce200"
CC         = clmips.exe
ARCH       = MIPS
CPU        = MIPS
TARGETCPU  = MIPS
CEVersion  = 200
OSVERSION  = WCE200
PLATFORM   = MS HPC
# MUST USE -MD to get the right FPE stuff...
MCFLAGS    = -D _MT -D _DLL -MD \
             -D MIPS -D mips -D _MIPS_ -D _mips_ -DPROCESSOR_MIPS \
             -D PALM_SIZE \
             -I $(CELIBDLLDIR)\inc
SUBSYS	   = -subsystem:windowsce,2.00
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-sh3-hpc-wce200"
CC         = shcl.exe
ARCH       = SH3
CPU        = SH3
TARGETCPU  = SH3
CEVersion  = 200
OSVERSION  = WCE200
PLATFORM   = MS HPC
# MUST USE -MD to get the right FPE stuff...
MCFLAGS    = -D _MT -D _DLL -MD \
             -D SH3 -D sh3 -D _SH3_ -D _sh3_ -D SHx -DPROCESSOR_SH3 \
             -D PALM_SIZE \
             -I $(CELIBDLLDIR)\inc
SUBSYS	   = -subsystem:windowsce,2.00
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-arm-hpc-wce211"
CC         = clarm.exe
ARCH       = ARM
CPU        = ARM
TARGETCPU  = ARM
CEVersion  = 211
OSVERSION  = WCE211
PLATFORM   = MS HPC Pro
MCFLAGS    = -D _MT -D _DLL -D ARM -D arm -D _arm_ -D _ARM_ \
             -DPROCESSOR_ARM -DPALM_SIZE \
             -I $(CELIBDLLDIR)\inc
SUBSYS	   = -subsystem:windowsce,2.11
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-arm-hpc-wce300"
CC         = clarm.exe
ARCH       = ARM
CPU        = ARM
TARGETCPU  = ARM
CEVersion  = 300
OSVERSION  = WCE300
#PLATFORM   = HPC2000
MCFLAGS    = -D _MT -D _DLL -D ARM -D arm -D _arm_ -D _ARM_ \
             -DPROCESSOR_ARM -DPALM_SIZE \
             -I $(CELIBDLLDIR)\inc
SUBSYS	   = -subsystem:windowsce,3.00
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-mips-palm-wce211"
CC         = clmips.exe
ARCH       = MIPS
CPU        = MIPS
TARGETCPU  = MIPS
CEVersion  = 211
OSVERSION  = WCE211
PLATFORM   = MS Palm Size PC
MCFLAGS    = -DMIPS -D_MIPS_ -DPROCESSOR_MIPS -D PALM_SIZE -D _DLL -D _MT \
             -I $(CELIBDLLDIR)\inc
SUBSYS	   = -subsystem:windowsce,2.11
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-sh3-palm-wce211"
CC         = shcl.exe
ARCH       = SH3
CPU        = SH3
TARGETCPU  = SH3
CEVersion  = 211
OSVERSION  = WCE211
PLATFORM   = MS Palm Size PC
MCFLAGS    = -D _MT -D _DLL -DSH3 -D_SH3_ -DSHx -DPROCESSOR_SH3 -DPALM_SIZE \
             -I $(CELIBDLLDIR)\inc
SUBSYS	   = -subsystem:windowsce,2.11
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-x86em-palm-wce211"
CC         = cl.exe
ARCH       = X86EM
CPU        = X86
TARGETCPU  = X86
CEVersion  = 211
OSVERSION  = WCE211
PLATFORM   = MS Palm Size PC
MCFLAGS    = -MDd -DX86 -D_X86_ -DPROCESSOR_X86 \
             -D_WIN32_WCE_EMULATION -DPALM_SIZE \
             -I $(CELIBDLLDIR)\inc
MACH       = -machine:x86
SUBSYS     = -subsystem:windows
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-x86em-pocket-wce300"
CC         = cl.exe
ARCH       = X86EM
CPU        = X86
TARGETCPU  = X86
CEVersion  = 300
OSVERSION  = WCE300
PLATFORM   = MS Pocket PC
MCFLAGS    = -DX86 -D_X86_ -DPROCESSOR_X86 -D _MT -D _DLL \
             -D_WIN32_WCE_EMULATION -DPALM_SIZE -DPOCKET_SIZE \
             -I $(CELIBDLLDIR)\inc
MACH       = -machine:x86
SUBSYS     = -subsystem:windows
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-mips-pocket-wce300"
CC         = clmips.exe
ARCH       = MIPS
CPU        = MIPS
TARGETCPU  = MIPS
CEVersion  = 300
OSVERSION  = WCE300
PLATFORM   = MS Pocket PC
MCFLAGS    = -D MIPS -D mips -D _MIPS_ -D _mips_ -DPROCESSOR_MIPS \
             -D _MT -D _DLL -DPALM_SIZE -DPOCKET_SIZE \
             -I $(CELIBDLLDIR)\inc
MACH       = -machine:mips
SUBSYS     = -subsystem:windowsce,3.00
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
#STDLIBPATH = $(WCEROOT)\$(OSVERSION)\$(PLATFORM)\lib\$(CPU)
LDLIBPATH  = -libpath:$(CELIBPATH)
#"-libpath:$(STDLIBPATH)"
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-sh3-pocket-wce300"
CC         = shcl.exe
ARCH       = SH3
CPU        = SH3
TARGETCPU  = SH3
CEVersion  = 300
OSVERSION  = WCE300
PLATFORM   = MS Pocket PC
MCFLAGS    = -D _MT -D _DLL -DSH3 -D_SH3_ -DSHx -DPROCESSOR_SH3 \
             -DPALM_SIZE -DPOCKET_SIZE \
             -I $(CELIBDLLDIR)\inc
MACH       = -machine:sh3
SUBSYS     = -subsystem:windowsce,3.00
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-arm-pocket-wce300"
CC         = clarm.exe
ARCH       = ARM
CPU        = ARM
TARGETCPU  = ARM
CEVersion  = 300
OSVERSION  = WCE300
PLATFORM   = MS Pocket PC
MCFLAGS    = -D ARM -D arm -D _ARM_ -D _arm_ -DPROCESSOR_ARM \
             -D _MT -D _DLL -DPALM_SIZE -DPOCKET_SIZE \
             -I $(CELIBDLLDIR)\inc
MACH       = -machine:arm
SUBSYS     = -subsystem:windowsce,3.00
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-x86-hpc-wce300"
CC         = cl.exe
ARCH       = X86EM
CPU        = X86
TARGETCPU  = X86
CEVersion  = 400
OSVERSION  = WCE400
PLATFORM   = MS Pocket PC
MCFLAGS    = -DX86 -D_X86_ -Dx86 -DPROCESSOR_X86 -D _MT -D _DLL \
             -DPALM_SIZE -DPOCKET_SIZE -I $(CELIBDLLDIR)\inc
MACH       = -machine:IX86
SUBSYS     = -subsystem:windowsce,2.0
CELIBPATH  = $(CELIBDLLDIR)\wince-x86-hpc-wce300-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif

!if "$(MACHINE)" == "wince-arm-pocket-wce400"
#CC         = clarm.exe #set in WCEARMV4.BAT
ARCH       = ARM
CPU        = ARM
TARGETCPU  = ARM
CEVersion  = 400
#OSVERSION  = WCE300 #set in WCEARMV4.BAT
PLATFORM   = MS Pocket PC
MCFLAGS    = -D ARM -D arm -D _ARM_ -D _arm_ -DPROCESSOR_ARM \
             -D _MT -D _DLL -DPALM_SIZE -DPOCKET_SIZE \
             -I $(CELIBDLLDIR)\inc
MACH       = -machine:arm
SUBSYS     = -subsystem:windowsce,4.00
CELIBPATH  = $(CELIBDLLDIR)\$(MACHINE)-release
LDLIBPATH  = -libpath:$(CELIBPATH)
STARTOBJS  = $(CECONSOLEDIR)/$(MACHINE)/wmain.obj \
             $(CECONSOLEDIR)/$(MACHINE)/w32console.obj
!endif


######################################################################
# common section

CEDEFS    = -D_WINDOWS -D_WIN32_WCE=$(CEVersion) -DUNDER_CE=$(CEVersion) \
            $(MCFLAGS) -D PERL

CECFLAGS  = $(CEDEFS) -Zi

!if "$(CFG)" == "DEBUG"
CECFLAGS  = $(CECFLAGS) -Od
!endif

!if "$(CFG)" == "RELEASE"
# -O2 and -Ot give internal compiler error in perl.c and lexer.
# Also the dll cannot be loaded by perl.exe...
!if "$(CPU)" == "SH3"
!else
CECFLAGS  = $(CECFLAGS) -O1
!endif
!  IF "$(CCTYPE)" != "MSVC60"
#turn on LTCG optimization for CCs that have it
CECFLAGS	= $(CECFLAGS) -GL
!  ENDIF
!  IF "$(CCTYPE)" == "MSVC80" || "$(CCTYPE)" == "MSVC90"
#no stack security cookie for CCs where its on by default
CECFLAGS	= $(CECFLAGS) -GS-
!  ENDIF
!endif

RCDEFS    = /l 0x407 /r /d "UNICODE" /d UNDER_CE=$(CEVersion) \
            /d _WIN32_WCE=$(CEVersion)

#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
# with absolute paths to the correct directories on your system
#INCLUDE=$(WCEROOT)\$(OSVERSION)\$(PLATFORM)\include
#LIB=$(WCEROOT)\$(OSVERSION)\$(PLATFORM)\lib\$(ARCH)

######################################################################

!message
!message Compiling for $(MACHINE)
!message LIB=$(LIB)
!message INCLUDE=$(INCLUDE)
!message PATH=$(CEPATH)
!message

######################################################################
#
# Additional compiler flags can be specified here.
#

BUILDOPT	= $(BUILDOPT) $(CECFLAGS) -DUSE_CROSS_COMPILE


!IF "$(CRYPT_SRC)$(CRYPT_LIB)" == ""
D_CRYPT		= undef
!ELSE
D_CRYPT		= define
CRYPT_FLAG	= -DHAVE_DES_FCRYPT
!ENDIF

!IF "$(PERL_MALLOC)" == ""
PERL_MALLOC	= undef
!ENDIF

!IF "$(DEFAULT_INC_EXCLUDES_DOT)" == ""
DEFAULT_INC_EXCLUDES_DOT = undef
!ENDIF

!IF "$(USE_MULTI)" == ""
USE_MULTI	= undef
!ENDIF

!IF "$(USE_ITHREADS)" == ""
USE_ITHREADS	= undef
!ENDIF

!IF "$(USE_IMP_SYS)" == ""
USE_IMP_SYS	= undef
!ENDIF

!IF "$(USE_PERLCRT)" == ""
USE_PERLCRT	= undef
!ENDIF

!IF "$(USE_IMP_SYS)$(USE_MULTI)" == "defineundef"
USE_MULTI	= define
!ENDIF

!IF "$(USE_ITHREADS)$(USE_MULTI)" == "defineundef"
USE_MULTI	= define
!ENDIF

!IF "$(USE_MULTI)" != "undef"
BUILDOPT	= $(BUILDOPT) -DPERL_IMPLICIT_CONTEXT
!ENDIF

!IF "$(USE_IMP_SYS)" != "undef"
BUILDOPT	= $(BUILDOPT) -DPERL_IMPLICIT_SYS
!ENDIF

!IF "$(CROSS_NAME)" == ""
CROSS_NAME	= $(MACHINE)
!ENDIF

# new option - automatically defined in perl.h...
#BUILDOPT        = $(BUILDOPT) -DUSE_ENVIRON_ARRAY

PROCESSOR_ARCHITECTURE = $(TARGETCPU)
ARCHNAME	= $(PLATFORM)-$(OSVERSION)-$(PROCESSOR_ARCHITECTURE)
ARCHDIR		= ..\lib\$(ARCHNAME)
COREDIR		= ..\lib\CORE
AUTODIR		= ..\lib\auto
LIBDIR		= ..\lib
EXTDIR		= ..\ext
DISTDIR		= ..\dist
CPANDIR		= ..\cpan
PODDIR		= ..\pod
EXTUTILSDIR	= $(LIBDIR)\ExtUtils

LINK32		= link
LIB32		= $(LINK32) -lib
RSC		= rc

INCLUDES	= -I.\include -I. -I..
DEFINES		= -DWIN32 -D_CONSOLE -DNO_STRICT $(CRYPT_FLAG) $(CECFLAGS)
LOCDEFS		= -DPERLDLL -DPERL_CORE
CXX_FLAG	= -TP

PERLEXE_RES	= perl.res
PERLDLL_RES	=

!if "$(CFG)" == "RELEASE"
CELIB           = celib.lib
!endif

!if "$(CFG)" == "DEBUG"
CELIB           = celib.lib
!endif

#use ws2.lib instead of winsock.lib for WSAGetLastError
CELIBS          = -nodefaultlib \
                  ws2.lib $(CELIB) coredll.lib

#this libc's purpose is WinCE entrypoint to main wrapper, not a real C std lib
!if $(CEVersion) > 200
LIBC          = corelibc.lib
!else
LIBC          = msvcrt.lib
!endif

LIBBASEFILES	= $(CRYPT_LIB) $(CELIBS)

LIBFILES	= $(LIBBASEFILES) $(LIBC)

CFLAGS		= -nologo -GF -W3 $(INCLUDES) $(DEFINES) $(LOCDEFS) \
		$(PCHFLAGS) $(OPTIMIZE)

LINK_FLAGS	= -nologo -debug -opt:ref,icf -machine:$(PROCESSOR_ARCHITECTURE)

!if "$(CFG)" == "RELEASE" && "$(CCTYPE)" != "MSVC60"
#see matching flag in CECFLAGS
LINK_FLAGS	= $(LINK_FLAGS) -ltcg
!endif

OBJOUT_FLAG	= -Fo
EXEOUT_FLAG	= -Fe

CFLAGS_O	= $(CFLAGS) $(BUILDOPT)

o = .obj

#
# Rules
#

.SUFFIXES : .c $(o) .dll .lib .exe .rc .res

.c$(o):
	$(CC) -c -I$(<D) $(CFLAGS_O) $(OBJOUT_FLAG)$@ $<

.c.i:
	$(CC) -c -I$(<D) $(CFLAGS_O) -P $(OBJOUT_FLAG)$@ $<

.y.c:
	$(NOOP)

$(o).dll:
	$(LINK32) -dll $(SUBSYS) $(LDLIBPATH) \
            -implib:$(*B).lib -def:$(*B).def \
	    -out:$@ $(LINK_FLAGS) $(LIBFILES) $< $(LIBPERL)

.rc.res:
	$(RSC) -i.. $<

# This must be relative to ../lib/CORE, else the ext dll build fails...
PERLIMPLIB_EXP	= perl$(PV).lib
PERLIMPLIB	= $(PERLCEDIR)\$(MACHINE)\perl$(PV).lib
PERLDLL		= $(MACHINE)\perl$(PV).dll

DLLDIR          = $(MACHINE)\dll
PERLEXE		= $(MACHINE)\perl.exe

CONFIGPM	= ..\lib\Config.pm ..\lib\Config_heavy.pl
GENUUDMAP	= ..\generate_uudmap.exe

UUDMAP_H	= ..\uudmap.h
BITCOUNT_H	= ..\bitcount.h
MG_DATA_H	= ..\mg_data.h
GENERATED_HEADERS = $(UUDMAP_H) $(BITCOUNT_H) $(MG_DATA_H)

# Unicode data files generated by mktables
FIRSTUNIFILE     = ..\lib\unicore\Decomposition.pl
UNIDATAFILES	 = ..\lib\unicore\Decomposition.pl \
		   ..\lib\unicore\CombiningClass.pl ..\lib\unicore\Name.pl \
		   ..\lib\unicore\Heavy.pl ..\lib\unicore\mktables.lst \
		   ..\lib\unicore\UCD.pl ..\lib\unicore\Name.pm \
		   ..\lib\unicore\TestProp.pl

PERLEXE_MANIFEST= .\perlexe.manifest
PERLEXE_ICO	= .\perlexe.ico
PERLEXE_RES	= .\perlexe.res
PERLDLL_RES	=

# Directories of Unicode data files generated by mktables
UNIDATADIR1	= ..\lib\unicore\To
UNIDATADIR2	= ..\lib\unicore\lib

# Nominate a target which causes extensions to be re-built
# This used to be $(PERLEXE), but at worst it is the .dll that they depend
# on and really only the interface - i.e. the .def file used to export symbols
# from the .dll
PERLDEP		= perldll.def

MAKE		= nmake -nologo
MAKE_BARE	= nmake

CFGSH_TMPL	= config.ce
CFGH_TMPL	= config_H.ce

XCOPY		= xcopy /f /r /i /d /y
RCOPY		= xcopy /f /r /i /e /d /y
NOOP		= @rem
NULL		=

DEL		= del

MICROCORE_SRC	=		\
		..\av.c		\
		..\caretx.c	\
		..\deb.c	\
		..\doio.c	\
		..\doop.c	\
		..\dquote.c	\
		..\dump.c	\
		..\globals.c	\
		..\gv.c		\
		..\mro_core.c	\
		..\hv.c		\
		..\locale.c	\
		..\keywords.c	\
		..\mathoms.c    \
		..\mg.c		\
		..\numeric.c	\
		..\op.c		\
		..\pad.c	\
		..\perl.c	\
		..\perlapi.c	\
		..\perly.c	\
		..\pp.c		\
		..\pp_ctl.c	\
		..\pp_hot.c	\
		..\pp_pack.c	\
		..\pp_sort.c	\
		..\pp_sys.c	\
		..\reentr.c	\
		..\regcomp.c	\
		..\regexec.c	\
		..\run.c	\
		..\scope.c	\
		..\sv.c		\
		..\taint.c	\
		..\time64.c	\
		..\toke.c	\
		..\universal.c	\
		..\utf8.c	\
		..\util.c

EXTRACORE_SRC	= $(EXTRACORE_SRC) perllib.c

!IF "$(PERL_MALLOC)" == "define"
EXTRACORE_SRC	= $(EXTRACORE_SRC) ..\malloc.c
!ENDIF

EXTRACORE_SRC	= $(EXTRACORE_SRC) ..\perlio.c .\win32io.c

WIN32_SRC	=		\
		.\wince.c	\
		.\wincesck.c	\
		.\win32thread.c

!IF "$(CRYPT_SRC)" != ""
WIN32_SRC	= $(WIN32_SRC) .\$(CRYPT_SRC)
!ENDIF

CORE_NOCFG_H	=		\
		..\av.h		\
		..\cop.h	\
		..\cv.h		\
		..\dosish.h	\
		..\embed.h	\
		..\form.h	\
		..\gv.h		\
		..\handy.h	\
		..\hv.h		\
		..\hv_func.h	\
		..\iperlsys.h	\
		..\mg.h		\
		..\nostdio.h	\
		..\op.h		\
		..\opcode.h	\
		..\perl.h	\
		..\perlapi.h	\
		..\perlsdio.h	\
		..\perly.h	\
		..\pp.h		\
		..\proto.h	\
		..\regexp.h	\
		..\scope.h	\
		..\sv.h		\
		..\thread.h	\
		..\unixish.h	\
		..\utf8.h	\
		..\util.h	\
		..\warnings.h	\
		..\XSUB.h	\
		..\EXTERN.h	\
		..\perlvars.h	\
		..\intrpvar.h	\
		.\include\dirent.h	\
		.\include\netdb.h	\
		.\include\sys\errno2.h	\
		.\include\sys\socket.h	\
		.\win32.h

DYNAMIC_EXT	= Socket IO Fcntl Opcode SDBM_File POSIX attributes B re \
		Data/Dumper Devel/Peek ByteLoader Devel/DProf File/Glob \
		Sys/Hostname

STATIC_EXT	= DynaLoader

DYNALOADER	= $(EXTDIR)\DynaLoader\DynaLoader

ERRNO_PM	= $(LIBDIR)\Errno.pm


EXTENSION_PM	=		\
		$(ERRNO_PM)

CFG_VARS = \
 "INST_TOP=$(INST_TOP)" \
 "INST_VER=$(INST_VER)" \
 "INST_ARCH=$(INST_ARCH)" \
 "archname=$(ARCHNAME)" \
 "cc=$(CC)" \
 "ld=$(LINK32)"	 \
 "ccflags=$(OPTIMIZE) $(DEFINES) $(BUILDOPT)" \
 "cppflags=$(OPTIMIZE) $(DEFINES) $(BUILDOPT)" \
 "cf_by=vkon" \
 "cf_email=$(EMAIL)" \
#9cef8306
 "d_mymalloc=$(PERL_MALLOC)" \
 "libs=$(LIBFILES)" \
 "incpath=$(CCINCDIR)" \
 "libperl=$(PERLIMPLIB_EXP)" \
 "libpth=$(LIBPATH)" \
 "libc=$(LIBC)" \
 "make=$(MAKE_BARE)" \
 "static_ext=$(STATIC_EXT)" \
 "dynamic_ext=$(DYNAMIC_EXT)" \
 "usethreads=$(USE_ITHREADS)" \
 "useithreads=$(USE_ITHREADS)" \
 "usemultiplicity=$(USE_MULTI)" \
 "use64bitint=undef" \
 "uselargefiles=undef" \
 "default_inc_excludes_dot=$(DEFAULT_INC_EXCLUDES_DOT)" \
 "LINK_FLAGS=$(LDLIBPATH) $(LINK_FLAGS) $(SUBSYS)" \
 "optimize=$(OPTIMIZE)" \
 "WIN64=$(WIN64)"

#
# filenames given to xsubpp must have forward slashes (since it puts
# full pathnames in #line strings)
XSUBPP		= $(HPERL) -I..\..\lib ..\$(EXTUTILSDIR)\xsubpp \
		-C++ -prototypes


#
# Top targets
#

all: hostminiperl force_config_h ..\lib\buildcustomize.pl .\config.h ..\git_version.h $(CONFIGPM) $(UNIDATAFILES) $(PERLEXE) MakePPPort Extensions

$(DYNALOADER)$(o) : $(DYNALOADER).c config.h $(EXTDIR)\DynaLoader\dlutils.c

#convenience target
configpm_targ : $(CONFIGPM)

force_config_h:
	-@$(DEL) /f config.h
	-@$(DEL) /f config.sh
	-@$(DEL) /f ..\config.h
	-@$(DEL) /f ..\config.sh
	-@$(DEL) $(PERLEXE_RES)
	-@mkdir ..\host
	-@copy $(HPERL) ..\host\miniperl.exe
	-@copy $(GENUUDMAP) ..\host\generate_uudmap.exe
	-@$(MAKE) -f Makefile distclean
	-@copy ..\host\miniperl.exe $(HPERL)
	-@copy ..\host\generate_uudmap.exe $(GENUUDMAP)
	$(GENUUDMAP) $(GENERATED_HEADERS)
	type NUL > force_config_h

$(UUDMAP_H) $(MG_DATA_H) : $(BITCOUNT_H)

$(BITCOUNT_H) :
	$(GENUUDMAP) $(GENERATED_HEADERS)

$(CONFIGPM) : $(HPERL) ..\config.sh config_h.PL ..\git_version.h
	cd .. && $(HPERL) -Ilib configpm --no-glossary
	if exist lib\* $(RCOPY) lib\*.* ..\lib\$(NULL)
	$(XCOPY) ..\*.h $(COREDIR)\*.*
	$(XCOPY) *.h $(COREDIR)\*.*
	$(RCOPY) include $(COREDIR)\*.*
	if errorlevel 1 $(MAKE) /$(MAKEFLAGS) $(CONFIGPM)

.\config.h: $(CONFIGPM) ..\config.sh
	-@$(DEL) /f config.h
	-$(HPERL) -I..\lib config_h.PL "INST_VER=$(INST_VER)" "CORE_DIR=$(COREDIR)" "CONFIG_H=config.h"
	copy config.h ..\config.h

..\config.sh : config.ce config_sh.PL FindExt.pm
	-@$(DEL) /f config.sh
	$(HPERL) -I..\lib -I. config_sh.PL $(CFG_VARS) config.ce > ..\config.sh

..\git_version.h : ..\make_patchnum.pl
	cd .. && $(HPERL) -Ilib make_patchnum.pl && cd win32

# make sure that we recompile perl.c if the git version changes
$(DLLDIR)\perl.obj : ..\git_version.h

MakePPPort: $(HPERL) $(CONFIGPM) Extensions_nonxs
	$(HPERL) -I..\lib ..\mkppport

MakePPPort_clean:
	-if exist $(HPERL) $(HPERL) -I..\lib ..\mkppport --clean

#----------------------------------------------------------------------------------
NOT_COMPILE_EXT =
!if "$(MACHINE)" == "wince-sh3-palm-wce211"
NOT_COMPILE_EXT = $(NOT_COMPILE_EXT) !XS/Typemap
!endif
!if "$(MACHINE)" == "wince-mips-palm-wce211"
NOT_COMPILE_EXT = $(NOT_COMPILE_EXT) !XS/Typemap
!endif

Extensions: ..\make_ext.pl $(CONFIGPM)
	$(HPERL) -I..\lib -I. ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR)  --all \
	!POSIX !Win32 !Win32API/File !Time/HiRes !Time/Piece !re !SDBM_File $(NOT_COMPILE_EXT)


Extensions_nonxs: ..\make_ext.pl ..\lib\buildcustomize.pl $(CONFIGPM) ..\pod\perlfunc.pod
	$(XCOPY) ..\*.h $(COREDIR)\*.*
	$(HPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(CPANDIR) --dir=$(DISTDIR) --dir=$(EXTDIR) --nonxs

Extensions_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: Extensions_clean
        -if exist .\$(MACHINE)\dll rmdir /s /q .\$(MACHINE)\dll
  -@$(DEL) .\$(MACHINE)\*.obj
  -@$(DEL) .\$(MACHINE)\*.exe
  -@$(DEL) .\$(MACHINE)\*.dll
  -@$(DEL) .\$(MACHINE)\*.lib
        -@$(DEL) .\$(MACHINE)\*.exp
        -@$(DEL) .\$(MACHINE)\*.pdb
	-@$(DEL) ..\git_version.h
  -@$(DEL) config.h perl.res
  -@$(DEL) ..\t\test_state

XDLLOBJS = \
$(DLLDIR)\av.obj \
$(DLLDIR)\caretx.obj \
$(DLLDIR)\deb.obj \
$(DLLDIR)\doio.obj \
$(DLLDIR)\doop.obj \
$(DLLDIR)\dquote.obj \
$(DLLDIR)\dump.obj \
$(DLLDIR)\globals.obj \
$(DLLDIR)\gv.obj \
$(DLLDIR)\mro_core.obj \
$(DLLDIR)\hv.obj \
$(DLLDIR)\locale.obj \
$(DLLDIR)\keywords.obj \
$(DLLDIR)\mathoms.obj \
$(DLLDIR)\mg.obj \
$(DLLDIR)\numeric.obj \
$(DLLDIR)\op.obj \
$(DLLDIR)\pad.obj \
$(DLLDIR)\perl.obj \
$(DLLDIR)\perlapi.obj \
$(DLLDIR)\perlio.obj \
$(DLLDIR)\perly.obj \
$(DLLDIR)\pp.obj \
$(DLLDIR)\pp_ctl.obj \
$(DLLDIR)\pp_hot.obj \
$(DLLDIR)\pp_pack.obj \
$(DLLDIR)\pp_sort.obj \
$(DLLDIR)\pp_sys.obj \
$(DLLDIR)\reentr.obj \
$(DLLDIR)\regcomp.obj \
$(DLLDIR)\regexec.obj \
$(DLLDIR)\run.obj \
$(DLLDIR)\scope.obj \
$(DLLDIR)\sv.obj \
$(DLLDIR)\taint.obj \
$(DLLDIR)\time64.obj \
$(DLLDIR)\toke.obj \
$(DLLDIR)\universal.obj \
$(DLLDIR)\utf8.obj \
$(DLLDIR)\util.obj \
$(DLLDIR)\win32thread.obj \
$(DLLDIR)\wince.obj \
$(DLLDIR)\win32io.obj \
$(DLLDIR)\wincesck.obj \
$(DLLDIR)\perllib.obj \
$(DLLDIR)\DynaLoader.obj
!IF "$(PERL_MALLOC)" == "define"
XDLLOBJS	= $(XDLLOBJS) $(DLLDIR)\malloc.obj
!ENDIF
!IF "$(CRYPT_SRC)" != ""
XDLLOBJS	= $(XDLLOBJS) $(DLLDIR)\fcrypt.obj
!ENDIF

#sanity checks to make sure all our external files (celib, w32console, and
#MS CE SDK) are locatable
lib_check :
    @if not exist $(CECONSOLEDIR)\$(MACHINE)\w32console.obj cmd /k \
        "echo w32console.obj doesn't seem to exist, check your w32console directory \
        & exit 1"
    @if not exist $(CELIBDLLDIR)\$(MACHINE)-release\celib.lib cmd /k \
        "echo celib.lib doesn't seem to exist, check your celib directory \
        & exit 1"
    @for %X in ( $(LIBC) ) do @if exist %~^$LIB:X ( exit 0 ) \
        else ( echo $(LIBC) doesn't seem to exist, check your build enviroment & exit 1 )

#specific header files to check picked at random
header_check  :
    @if not exist $(CELIBDLLDIR)\inc\cewin32.h  cmd /k \
        "echo cewin32.h doesn't seem to exist, check your celib directory \
        & exit 1"
    @for %X in (ceconfig.h) do @if exist %~^$INCLUDE:X ( exit 0 ) \
        else ( echo ceconfig.h doesn't seem to exist, check your build enviroment & exit 1 )

{$(SRCDIR)}.c{$(DLLDIR)}.obj:
    $(CC) -c $(CFLAGS_O) -DPERL_EXTERNAL_GLOB -Fo$(DLLDIR)\ $<

# compiler explains that it will optimize toke.c if we'll give it an
# option -QMOb<num> with num>=4178
$(DLLDIR)\toke.obj:
    $(CC) -c $(CFLAGS_O) -QMOb9000 -DPERL_EXTERNAL_GLOB -Fo$(DLLDIR)\ ..\toke.c

{$(SRCDIR)/win32}.c{$(DLLDIR)}.obj:
    $(CC) -c $(CFLAGS_O) -DPERL_EXTERNAL_GLOB -Fo$(DLLDIR)\ $<

# -DPERL_IMPLICIT_SYS needs C++ for perllib.c
# This is the only file that depends on perlhost.h, vmem.h, and vdir.h
!IF "$(USE_IMP_SYS)" == "define"
$(DLLDIR)\perllib$(o)	: perllib.c .\perlhost.h .\vdir.h .\vmem.h
	$(CC) -c -I. $(CFLAGS_O) $(CXX_FLAG) $(OBJOUT_FLAG)$@ perllib.c
	rem (frustrated) mv perllib.obj $(DLLDIR)
!ENDIF

perldll.def : $(HPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl create_perllibst_h.pl .\config.h
	$(HPERL) -I..\lib create_perllibst_h.pl
	$(HPERL) -I..\lib -w ..\makedef.pl PLATFORM=wince $(OPTIMIZE) $(DEFINES) $(BUILDOPT) \
	    CCTYPE=$(CCTYPE) -DPERL_DLL=$(PERLDLL) TARG_DIR=..\ > perldll.def

$(PERLDLL) : header_check lib_check $(DLLDIR) perldll.def $(XDLLOBJS) $(PERLDLL_RES)
	$(LINK32) -dll -def:perldll.def -base:0x28000000 -out:$@ \
                  $(SUBSYS) $(LDLIBPATH) \
		  $(LINK_FLAGS) $(LIBFILES) \
		  $(XDLLOBJS) $(PERLDLL_RES)

$(DLLDIR) :
	if not exist "$(DLLDIR)" mkdir "$(DLLDIR)"

$(EXTDIR)\DynaLoader\DynaLoader.c :
	$(HPERL) -I..\lib -I. ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynaloader

$(DLLDIR)\DynaLoader.obj: $(EXTDIR)\DynaLoader\DynaLoader.c
    $(CC) -c $(CFLAGS_O) -DPERL_EXTERNAL_GLOB -Fo$(DLLDIR)\ \
          $(EXTDIR)\DynaLoader\DynaLoader.c

XPERLEXEOBJS = \
$(MACHINE)\perlmaince.obj

..\lib\buildcustomize.pl :
	$(HPERL) -I..\lib -f ..\write_buildcustomize.pl ..

$(PERLEXE) : $(PERLDLL) $(CONFIGPM) $(XPERLEXEOBJS) $(PERLEXE_RES) $(STARTOBJS)
	$(XCOPY) $(MACHINE)\*.lib $(COREDIR)
	$(LINK32) $(SUBSYS) $(LDLIBPATH) \
            -entry:wWinMainCRTStartup \
            -out:$(MACHINE)\perl.exe \
            -stack:0x100000 $(LINK_FLAGS) $(STARTOBJS) $(XPERLEXEOBJS) \
            $(PERLIMPLIB) $(PERLEXE_RES) $(LIBFILES)

$(MACHINE)\perlmaince.obj : perlmaince.c
	$(CC) $(CFLAGS_O) -UPERLDLL -Fo$(MACHINE)\ -c perlmaince.c

iodll:     $(IO_DLL)
socketdll: $(SOCKET_DLL)
dumperdll: $(DUMPER_DLL)

dlls: socketdll iodll dumperdll
	-xmkdir -p $(MACHINE)/lib/auto/IO
	copy ../lib/auto/IO/IO.bs $(MACHINE)/lib/auto/IO
	copy ../lib/auto/IO/IO.dll $(MACHINE)/lib/auto/IO
	-xmkdir $(MACHINE)/lib/auto/Socket
	copy ../lib/auto/Socket/Socket.bs $(MACHINE)/lib/auto/Socket
	copy ../lib/auto/Socket/Socket.dll $(MACHINE)/lib/auto/Socket
	-xmkdir -p $(MACHINE)/lib/auto/Data/Dumper
	copy ../lib/auto/Data/Dumper/Dumper.bs $(MACHINE)/lib/auto/Data/Dumper
	copy ../lib/auto/Data/Dumper/Dumper.dll $(MACHINE)/lib/auto/Data/Dumper

makedist: all dlls
	$(COPY) $(CELIBPATH)\celib.dll $(MACHINE)
	copy perl.txt $(MACHINE)
	copy registry.bat $(MACHINE)
	copy ../lib/Config.pm $(MACHINE)/lib
	cd $(MACHINE)
	-@$(DEL) perl-$(MACHINE).tar.gz
	sh -c "tar cf perl-$(MACHINE).tar *.exe *.dll *.txt *.bat lib"
	gzip -9 perl-$(MACHINE).tar
	mv perl-$(MACHINE).tar.gz h:/freenet/new
	cd ..

install: all
	-cemkdir "$(INSTALL_ROOT)"
	-cemkdir "$(INSTALL_ROOT)\bin"
	-cemkdir "$(INSTALL_ROOT)\lib"
	$(CECOPY) "pc:$(MACHINE)/perl.exe" "ce:$(INSTALL_ROOT)/bin"
	$(CECOPY) "pc:$(MACHINE)/perl$(PV).dll" "ce:$(INSTALL_ROOT)/bin"
	$(CECOPY) "pc:../lib/Config.pm" "ce:$(INSTALL_ROOT)/lib"

$(UNIDATAFILES) : $(HPERL) $(CONFIGPM) ..\lib\unicore\mktables MakePPPort
	cd ..\lib\unicore && \
	$(HPERL) -I.. -I..\..\lib mktables -P ..\..\pod -maketest -makelist -p -check $@ $(FIRSTUNIFILE)

dist: all
	$(HPERL) -I..\lib ce-helpers\makedist.pl --distdir=dist-$(CROSS_NAME) --cross-name=$(CROSS_NAME)

zipdist: all
	$(HPERL) -I..\lib ce-helpers\makedist.pl --distdir=dist-$(CROSS_NAME) --cross-name=$(CROSS_NAME)
	$(HPERL) -I..\lib ce-helpers\makedist.pl --distdir=dist-$(CROSS_NAME) --cross-name=$(CROSS_NAME) --zip

zip:
	$(HPERL) -I..\lib ce-helpers\makedist.pl --distdir=dist-$(CROSS_NAME) --cross-name=$(CROSS_NAME) --zip

hostminiperl: ..\miniperl.exe

..\miniperl.exe:
	set PATH=$(CCHOME)\bin;$(PATH)
	$(MAKE) -f Makefile "CCHOME=$(MSVCDIR)" "CCINCDIR=$(CCHOME)\include" "CCLIBDIR=$(CCHOME)\lib" "INCLUDE=$(CCHOME)\include" "LIB=$(CCHOME)\lib" "LINK_FLAGS=" .\config.h ..\miniperl.exe

host-install:
	perl -MConfig -MExtUtils::Install -we "install({'../lib/CORE', qq#$$Config{installprefixexp}/lib/CORE#},1)"
	perl -MConfig -MExtUtils::Install -we "install({'../lib', qq#$$Config{installprefixexp}/lib#},1)"
	perl -MConfig -MFile::Copy -we "copy qq#./$(MACHINE)/perl$(PV).lib#, qq#$$Config{installprefixexp}/lib/CORE#"
	perl -MConfig -we "system qq#perl -pi.bak -we \"s{((arch^|priv)libexp)='.*'}{\$$1='# . \
	 quotemeta($$Config{installprefixexp}) . \
	 qq#/lib'}\" $$Config{installprefixexp}/lib/Config.pm#"