#
# Makefile for compiling Tcl for OS/2 with EMX/GCC
#

#
# Project directories
#
# ROOT = top of source tree
# TMPDIR = location where .obj files should be stored during build
# TCLDIR = location of top of Tcl source heirarchy
#

ROOT	= e:/tcl7.6
GENERIC_DIR = $(ROOT)/generic
UNIX_DIR = $(ROOT)/unix
XLIB_DIR = $(ROOT)/xlib
TMPDIR	= .

# uncomment the following line to compile with symbols
#DEBUGGING=1

# Choosing EXEPACK:2 makes the executable run on Warp 3 and higher only
# Warp 3 and higher
#EXEPACKING=/EXEPACK:2
#RESPACKING=-x2
#LXLITE=lxlite /ML1
# All 32 bit OS/2 versions
EXEPACKING=/EXEPACK
RESPACKING=-x1
LXLITE=lxlite /MR3

# uncomment the following two lines to compile with TCL_MEM_DEBUG
#DEBUGDEFINES = -DTCL_MEM_DEBUG

#

TCLVER = 76
FULLVERSION = 7.6
SHORTVERSION = 76
TKVERSION = 4.2

BASE = tcl$(TCLVER)
TCLLIB = $(BASE).lib
TCLDLL = $(BASE).dll
TCLSHPM = tclshpm$(TCLVER)
TCLSH = tclsh$(TCLVER)
TCLTEST = tcltest$(TCLVER)

GENTCLSH = tclsh76
IMPLIB  = emximp
CC      = gcc
RC	= rc -p $(RESPACKING)
CP      = copy
RM      = del /f
EMX     = d:/emx

#DEFINES =       $(DEBUGDEFINES) -DHAS_DIRENT -DHAS_STDARG -DDEBUG -D"wchar_t=unsigned short" -D_WCHAR_T
DEFINES =       -DHAS_DIRENT -DHAS_STDARG -D"wchar_t=unsigned short" -D_WCHAR_T
STD_INCLUDES =  -I. -I$(EMX)/include
TCL_INCLUDES =  -I$(ROOT)/os2 -I$(ROOT)/generic
INCLUDES =	$(STD_INCLUDES) $(TCL_INCLUDES)
LIBDIRS =       -L$(ROOT)/os2 -L$(EMX)/lib
SOCKLIB =       $(EMX)/lib/socket.lib

TCLSHPMDEF = $(TCLSHPM).def
TCLSHDEF = $(TCLSH).def
ifndef DEBUGGING
  # these macros cause maximum optimization and no symbols
  CFLAGS =	-O -Wall -mprobe -m486 -mno-epilogue \
  		-Zomf -Zmtd -s -fhandle-exceptions $(DEFINES) $(INCLUDES)
else
  # these macros enable debugging
  CFLAGS =	-g -mprobe -m486 -Zomf -Zmtd -fhandle-exceptions \
  		$(DEFINES) $(DEBUGDEFINES) $(INCLUDES) -DDEBUG
endif
CC_SWITCHES =   $(CFLAGS)

ifndef DEBUGGING
  LNFLAGS_exe = -Zexe -Zomf -Zmtd -Zstack 32 -Zlinker /BASE:0x10000 \
	       -Zlinker /ALIGN:2 -Zlinker /FARCALLTRANSLATION \
	       -Zlinker /RUNFROMVDM -Zlinker $(EXEPACKING) -lwrap -s
  LNFLAGS_dll = -mprobe -Zcrtdll -Zdll -Zomf -Zmt -Zstack 32 -Zlinker /ALIGN:2 \
		-Zlinker /FARCALLTRANSLATION -Zlinker /RUNFROMVDM \
		-Zlinker $(EXEPACKING) $(SOCKLIB) -lm  -lwrap -s
else
  LNFLAGS_exe = -Zexe -Zomf -Zmtd -Zstack 32 -Zlinker /BASE:0x10000 \
	       -Zlinker /ALIGN:2 -Zlinker /FARCALLTRANSLATION \
	       -Zlinker /RUNFROMVDM -Zlinker $(EXEPACKING)
  LNFLAGS_dll = -mprobe -Zcrtdll -Zdll -Zomf -Zmt -Zstack 32 -Zlinker /ALIGN:2 \
		-Zlinker /FARCALLTRANSLATION -Zlinker /RUNFROMVDM \
		-Zlinker $(EXEPACKING) -lm $(SOCKLIB)
endif

LNLIBS_exe =	$(TCLLIB)
LNLIBS_dll =	$(TCLLIB)

# 
# Global makefile settings
#

#.AUTODEPEND
#.CACHEAUTODEPEND

#
# Targets
#

all:  $(TCLDLL) $(TCLSHPM).exe $(TCLSH).exe
test: $(TCLDLL) $(TCLTEST).exe
doc: tcl$(SHORTVERSION).inf

.SUFFIXES: .c .dll .lib .obj .exe

TCLSHPMOBJS = \
	tclAppInit.obj \
	tclOS2Console.obj \
	tclOS2Main.obj

TCLSHOBJS = \
	tclAppInit.obj \
	tclOS2MainC.obj

# PM version
#TCLTESTOBJS = \
#	tclTest.obj \
#	tclOS2Test.obj \
#	tclOS2Console.obj \
#	tclOS2Main.obj \
#	testMain.obj
# CLI version
TCLTESTOBJS = \
	tclTest.obj \
	tclOS2Test.obj \
	tclOS2MainC.obj \
	testMain.obj

TCLCOMPATOBJS =


TCLOBJS = \
	tclOS2Chan.obj \
	tclOS2Dll.obj \
	tclOS2Env.obj \
	tclOS2Error.obj \
	tclOS2FCmd.obj \
	tclOS2File.obj \
	tclOS2FileName.obj \
	tclOS2Init.obj \
	tclOS2Load.obj \
	tclOS2Mtherr.obj \
	tclOS2Notify.obj \
	tclOS2Pipe.obj \
	tclOS2Sock.obj \
	tclOS2Time.obj \
	panic.obj \
	regexp.obj \
	tclAsync.obj \
	tclBasic.obj \
	tclCkalloc.obj \
	tclClock.obj \
	tclCmdAH.obj \
	tclCmdIL.obj \
	tclCmdMZ.obj \
	tclDate.obj \
	tclEnv.obj \
	tclEvent.obj \
	tclExpr.obj \
	tclFCmd.obj \
	tclFHandle.obj \
	tclGet.obj \
	tclHash.obj \
	tclHistory.obj \
	tclInterp.obj \
	tclIO.obj \
	tclIOCmd.obj \
	tclIOSock.obj \
	tclIOUtil.obj \
	tclLink.obj \
	tclLoad.obj \
	tclNotify.obj \
	tclParse.obj \
	tclPkg.obj \
	tclPosixStr.obj \
	tclPreserve.obj \
	tclProc.obj \
	tclUtil.obj \
	tclVar.obj

# OS/2 binaries:
tclAppInit.obj: tclAppInit.c
	$(CC) -c $(CC_SWITCHES) tclAppInit.c
tclOS2Chan.obj: tclOS2Chan.c
	$(CC) -c $(CC_SWITCHES) tclOS2Chan.c
tclOS2Console.obj: tclOS2Console.c
	$(CC) -c $(CC_SWITCHES) tclOS2Console.c
tclOS2Dll.obj: tclOS2Dll.c
	$(CC) -c $(CC_SWITCHES) tclOS2Dll.c
tclOS2Env.obj: tclOS2Env.c
	$(CC) -c $(CC_SWITCHES) tclOS2Env.c
tclOS2Error.obj: tclOS2Error.c
	$(CC) -c $(CC_SWITCHES) tclOS2Error.c
tclOS2FCmd.obj: tclOS2FCmd.c
	$(CC) -c $(CC_SWITCHES) tclOS2FCmd.c
tclOS2File.obj: tclOS2File.c
	$(CC) -c $(CC_SWITCHES) tclOS2File.c
tclOS2FileName.obj: tclOS2FileName.c
	$(CC) -c $(CC_SWITCHES) tclOS2FileName.c
tclOS2Init.obj: tclOS2Init.c
	$(CC) -c $(CC_SWITCHES) tclOS2Init.c
tclOS2Load.obj: tclOS2Load.c
	$(CC) -c $(CC_SWITCHES) tclOS2Load.c
tclOS2Main.obj: tclOS2Main.c
	$(CC) -c $(CC_SWITCHES) tclOS2Main.c
tclOS2Mtherr.obj: tclOS2Mtherr.c
	$(CC) -c $(CC_SWITCHES) tclOS2Mtherr.c
tclOS2Notify.obj: tclOS2Notify.c
	$(CC) -c $(CC_SWITCHES) tclOS2Notify.c
tclOS2Pipe.obj: tclOS2Pipe.c
	$(CC) -c $(CC_SWITCHES) tclOS2Pipe.c
tclOS2Sock.obj: tclOS2Sock.c
	$(CC) -c $(CC_SWITCHES) tclOS2Sock.c
tclOS2Stubs.obj: tclOS2Stubs.c
	$(CC) -c $(CC_SWITCHES) tclOS2Stubs.c
tclOS2Test.obj: tclOS2Test.c
	$(CC) -c $(CC_SWITCHES) tclOS2Test.c
tclOS2Time.obj: tclOS2Time.c
	$(CC) -c $(CC_SWITCHES) tclOS2Time.c

# CLI version of tclOS2Main.c
tclOS2MainC.obj: tclOS2Main.c
	-$(RM) tclOS2MainC.c
	$(CP) tclOS2Main.c tclOS2MainC.c
	$(CC) -c $(CC_SWITCHES) -DCLI_VERSION tclOS2MainC.c
	-$(RM) tclOS2MainC.c


# Generic binaries:

panic.obj: $(GENERIC_DIR)/panic.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/panic.c

regexp.obj: $(GENERIC_DIR)/regexp.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/regexp.c

tclAsync.obj: $(GENERIC_DIR)/tclAsync.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclAsync.c

tclBasic.obj: $(GENERIC_DIR)/tclBasic.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclBasic.c

tclCkalloc.obj: $(GENERIC_DIR)/tclCkalloc.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclCkalloc.c

tclClock.obj: $(GENERIC_DIR)/tclClock.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclClock.c

#tclCmdAH.obj: $(GENERIC_DIR)/tclCmdAH.c
#	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclCmdAH.c
tclCmdAH.obj: tclCmdAH.c
	$(CC) -c $(CC_SWITCHES) tclCmdAH.c

tclCmdIL.obj: $(GENERIC_DIR)/tclCmdIL.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclCmdIL.c

tclCmdMZ.obj: $(GENERIC_DIR)/tclCmdMZ.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclCmdMZ.c

tclDate.obj: $(GENERIC_DIR)/tclDate.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclDate.c

tclEnv.obj: $(GENERIC_DIR)/tclEnv.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclEnv.c

tclEvent.obj: $(GENERIC_DIR)/tclEvent.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclEvent.c

tclExpr.obj: $(GENERIC_DIR)/tclExpr.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclExpr.c

tclFCmd.obj: $(GENERIC_DIR)/tclFCmd.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclFCmd.c

tclFHandle.obj: $(GENERIC_DIR)/tclFHandle.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclFHandle.c

tclFileName.obj: $(GENERIC_DIR)/tclFileName.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclFileName.c

tclGet.obj: $(GENERIC_DIR)/tclGet.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclGet.c

tclHash.obj: $(GENERIC_DIR)/tclHash.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclHash.c

tclHistory.obj: $(GENERIC_DIR)/tclHistory.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclHistory.c

tclInterp.obj: $(GENERIC_DIR)/tclInterp.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclInterp.c

tclIO.obj: $(GENERIC_DIR)/tclIO.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIO.c

tclIOCmd.obj: $(GENERIC_DIR)/tclIOCmd.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOCmd.c

tclIOSock.obj: $(GENERIC_DIR)/tclIOSock.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOSock.c

tclIOUtil.obj: $(GENERIC_DIR)/tclIOUtil.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclIOUtil.c

tclLink.obj: $(GENERIC_DIR)/tclLink.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclLink.c

tclLoad.obj: $(GENERIC_DIR)/tclLoad.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclLoad.c

tclLoadNone.obj: $(GENERIC_DIR)/tclLoadNone.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclLoadNone.c

tclMain.obj: $(GENERIC_DIR)/tclMain.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclMain.c

tclNotify.obj: $(GENERIC_DIR)/tclNotify.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclNotify.c

tclParse.obj: $(GENERIC_DIR)/tclParse.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclParse.c

tclPkg.obj: $(GENERIC_DIR)/tclPkg.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclPkg.c

tclPosixStr.obj: $(GENERIC_DIR)/tclPosixStr.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclPosixStr.c

tclPreserve.obj: $(GENERIC_DIR)/tclPreserve.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclPreserve.c

tclProc.obj: $(GENERIC_DIR)/tclProc.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclProc.c

#tclTest.obj: $(GENERIC_DIR)/tclTest.c
#	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclTest.c
tclTest.obj: tclTest.c
	$(CC) -c $(CC_SWITCHES) tclTest.c

tclUtil.obj: $(GENERIC_DIR)/tclUtil.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclUtil.c

tclVar.obj: $(GENERIC_DIR)/tclVar.c
	$(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclVar.c

# Unix objects

tclMtherr.obj: $(UNIX_DIR)/tclMtherr.c
	$(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclMtherr.c

tclUnixAZ.obj: $(UNIX_DIR)/tclUnixAZ.c
	$(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclUnixAZ.c

tclUnixFile.obj: $(UNIX_DIR)/tclUnixFile.c
	$(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclUnixFile.c

tclUnixPipe.obj: $(UNIX_DIR)/tclUnixPipe.c
	$(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclUnixPipe.c

tclUnixStr.obj: $(UNIX_DIR)/tclUnixStr.c
	$(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclUnixStr.c

tclUnixUtil.obj: $(UNIX_DIR)/tclUnixUtil.c
	$(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclUnixUtil.c

tclUnixInit.obj: $(UNIX_DIR)/tclUnixInit.c
	$(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclUnixInit.c


# compat binaries

fixstrtod.obj: $(COMPAT_DIR)/fixstrtod.c
	$(CC) -c $(CC_SWITCHES) $(COMPAT_DIR)/fixstrtod.c

gettod.obj: $(COMPAT_DIR)/gettod.c
	$(CC) -c $(CC_SWITCHES) $(COMPAT_DIR)/gettod.c

getcwd.obj: $(COMPAT_DIR)/getcwd.c
	$(CC) -c $(CC_SWITCHES) $(COMPAT_DIR)/getcwd.c

opendir.obj: $(COMPAT_DIR)/opendir.c
	$(CC) -c $(CC_SWITCHES) $(COMPAT_DIR)/opendir.c

strncasecmp.obj: $(COMPAT_DIR)/strncasecmp.c
	$(CC) -c $(CC_SWITCHES) $(COMPAT_DIR)/strncasecmp.c

strstr.obj: $(COMPAT_DIR)/strstr.c
	$(CC) -c $(CC_SWITCHES) $(COMPAT_DIR)/strstr.c

strtod.obj: $(COMPAT_DIR)/strtod.c
	$(CC) -c $(CC_SWITCHES) $(COMPAT_DIR)/strtod.c

strtol.obj: $(COMPAT_DIR)/strtol.c
	$(CC) -c $(CC_SWITCHES) $(COMPAT_DIR)/strtol.c

strtoul.obj: $(COMPAT_DIR)/strtoul.c
	$(CC) -c $(CC_SWITCHES) $(COMPAT_DIR)/strtoul.c

tmpnam.obj: $(COMPAT_DIR)/tmpnam.c
	$(CC) -c $(CC_SWITCHES) $(COMPAT_DIR)/tmpnam.c

waitpid.obj: $(COMPAT_DIR)/waitpid.c
	$(CC) -c $(CC_SWITCHES) $(COMPAT_DIR)/waitpid.c


# Implicit Targets

.c.obj:
	$(CC) -c $(CC_SWITCHES) $<

#.dll.lib:
#	$(IMPLIB) -c $@ $<

.rc.res:
	$(RC) -i$(INCLUDES) $<

#
# Special case object file targets
#

testMain.obj : tclAppInit.c
	$(CC) -c -DTCL_TEST $(CC_SWITCHES) -o $@ tclAppInit.c


#
# Executable targets
#

$(TCLDLL): $(TCLOBJS) $(BASE).def $(BASE).res
	$(CC) -o $(TCLDLL) $(LNFLAGS_dll) $(TCLOBJS) $(BASE).def
	$(RC) $(BASE).res $(TCLDLL)
ifndef DEBUGGING
	-$(LXLITE) $(TCLDLL)
endif

$(BASE).res: $(BASE).rc
	$(RC) -r $(BASE).rc


$(TCLSHPM).exe: $(TCLSHPMOBJS) $(TCLLIB) $(TCLSHPMDEF) $(TCLSHPM).res
	$(CC) -o $(TCLSHPM) $(LNFLAGS_exe) $(TCLSHPMOBJS) $(TCLLIB) $(TCLSHPMDEF)
	$(RC) $(TCLSHPM).res $(TCLSHPM).exe
ifndef DEBUGGING
	-$(LXLITE) $(TCLSHPM).exe
endif

$(TCLSH).exe: $(TCLSHOBJS) $(TCLLIB) $(TCLSHDEF) $(TCLSH).res
	$(CC) -o $(TCLSH) $(LNFLAGS_exe) $(TCLSHOBJS) $(TCLLIB) $(TCLSHDEF)
	$(RC) $(TCLSH).res $(TCLSH).exe
ifndef DEBUGGING
	-$(LXLITE) $(TCLSH).exe
endif

$(TCLSHPM).res: $(TCLSHPM).rc
	$(RC) -r $(TCLSHPM).rc

$(TCLSH).res: $(TCLSH).rc
	$(RC) -r $(TCLSH).rc

#PM version
#$(TCLTEST).exe: $(TCLTESTOBJS) $(TCLLIB) $(TCLSHPMDEF) $(TCLSHPM).res
#	$(CC) -o $(TCLTEST) $(LNFLAGS_exe) $(TCLTESTOBJS) $(TCLLIB) $(TCLSHPMDEF)
#	$(RC) $(TCLSHPM).res $(TCLTEST).exe
#CLI version
$(TCLTEST).exe: $(TCLTESTOBJS) $(TCLLIB) $(TCLSHDEF) $(TCLSH).res
	$(CC) -o $(TCLTEST) $(LNFLAGS_exe) $(TCLTESTOBJS) $(TCLLIB) $(TCLSHDEF)
	$(RC) $(TCLSH).res $(TCLTEST).exe
ifndef DEBUGGING
	-$(LXLITE) $(TCLTEST).exe
endif

$(TCLLIB): $(BASE).imp
	$(IMPLIB) -o $(TCLLIB) $(BASE).imp

$(BASE).imp: $(BASE).def
	$(IMPLIB) -o $(BASE).imp $(BASE).def

# The following rule automatically generates a tcl<versionm>.def file containing
# an export entry for every public symbol in the tcl<versionm>.dll library.

$(BASE).def: $(BASE)def.base $(TCLOBJS)
	type $(BASE)def.base > $(BASE).def
	emxexp -o $(TCLOBJS) >> $(BASE).def

# make documentation
tcl$(SHORTVERSION).inf: tcl$(SHORTVERSION).ipf
	ipfc /inf tcl$(SHORTVERSION).ipf

tcl$(SHORTVERSION).ipf: man2tcl.exe
	$(GENTCLSH) man2ipf.tcl tcl $(FULLVERSION) ../doc \
	                                           ../../tk$(TKVERSION)/doc
man2tcl.exe: man2tcl.c
	gcc -Zexe man2tcl.c -o man2tcl

# remove all generated files

clean:
	-$(RM) $(BASE).def $(BASE) $(TCLLIB) $(TCLDLL) $(BASE).res
	-$(RM) $(TCLSHPM) $(TCLSHPM).exe $(TCLSHPM).map $(TCLSHPM).res
	-$(RM) $(TCLSH) $(TCLSH).exe $(TCLSH).map $(TCLSH).res
	-$(RM) $(TCLTEST) $(TCLTEST).exe
	-$(RM) *.obj *.imp $(BASE).inf $(BASE).ipf
