# Visual C++ 2.x and 4.0 makefile
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
# 
# Copyright (c) 1993-1998 Lucent Technologies, Inc.
# RCS: $Id: makefile.vc,v 1.4 1999/05/25 17:28:58 redman Exp $

# Does not depend on the presence of any environment variables in
# order to compile itcl; all needed information is derived from 
# location of the compiler directories.
#
# NOTE: Be sure to modify the "makefile.vc" file in the toplevel directory
#   for the itcl distribution.  Include the location of your VC++ development
#   tools and the installation directory.

!include "..\..\makefile.vc"


# ROOT    = top of source tree
# TMPDIR  = location where .obj files should be stored during build

ROOT        = ..

######################################################################
# Do not modify below this line
######################################################################

NAMEPREFIX = itcl
DOTVERSION = 3.1
VERSION = 31
STUBPREFIX = $(NAMEPREFIX)stub

BINROOT        = .
!IF "$(NODEBUG)" == "1"
TMPNAME       = Release
DBGX        =
!ELSE
TMPNAME       = Debug
DBGX        = d
!ENDIF
TMPDIR        = $(BINROOT)\$(TMPNAME)
OUTDIR        = $(TMPDIR)

PKGINDEX       = $(TMPDIR)\pkgIndex.tcl

ITCLLIB        = $(OUTDIR)\$(NAMEPREFIX)$(VERSION)$(DBGX).lib
ITCLDLLNAME    = $(NAMEPREFIX)$(VERSION)$(DBGX).dll
ITCLDLL        = $(OUTDIR)\$(ITCLDLLNAME)
ITCLSH        = $(OUTDIR)\$(NAMEPREFIX)sh$(VERSION)$(DBGX).exe
DUMPEXTS     = $(TMPDIR)\dumpexts.exe

TCLLIB        = $(TCLDIR)\win\$(OUTDIR)\tcl81$(DBGX).lib
TCLSTUBLIB    = $(TCLDIR)\win\$(OUTDIR)\tclstub81$(DBGX).lib
TCLDLL        = $(TCLDIR)\win\$(OUTDIR)\tcl81$(DBGX).dll

ITCLSTUBLIBNAME = $(STUBPREFIX)$(VERSION)$(DBGX).lib
ITCLSTUBLIB     = $(OUTDIR)\$(ITCLSTUBLIBNAME)

LIB_INSTALL_DIR    = $(INSTALLDIR)\lib
BIN_INSTALL_DIR    = $(INSTALLDIR)\bin
SCRIPT_INSTALL_DIR    = $(INSTALLDIR)\lib\itcl$(DOTVERSION)
INCLUDE_INSTALL_DIR    = $(INSTALLDIR)\include

ITCLSHOBJS = \
    $(TMPDIR)\tclAppInit.obj

ITCLOBJS = \
    $(TMPDIR)\itclStubInit.obj \
    $(TMPDIR)\itcl_bicmds.obj \
    $(TMPDIR)\itcl_class.obj \
    $(TMPDIR)\itcl_cmds.obj \
    $(TMPDIR)\itcl_ensemble.obj \
    $(TMPDIR)\itcl_linkage.obj \
    $(TMPDIR)\itcl_migrate.obj \
    $(TMPDIR)\itcl_methods.obj \
    $(TMPDIR)\itcl_objects.obj \
    $(TMPDIR)\itcl_obsolete.obj \
    $(TMPDIR)\itcl_parse.obj \
    $(TMPDIR)\itcl_util.obj \
    $(TMPDIR)\dllEntryPoint.obj

ITCLSTUBOBJS = \
    $(TMPDIR)\itclStubLib.obj

cc32        = $(TOOLS32)\bin\cl.exe
link32      = $(TOOLS32)\bin\link.exe
rc32        = $(TOOLS32_rc)\bin\rc.exe
include32   = -I$(TOOLS32)\include
lib32       = "$(TOOLS32)\bin\lib.exe"

WINDIR          = $(ROOT)\win
GENERICDIR    = $(ROOT)\generic

ITCL_INCLUDES    = -I$(WINDIR) -I$(GENERICDIR) -I$(TCLDIR)\generic
ITCL_DEFINES    = -D__WIN32__ -DBUILD_itcl $(DEBUGDEFINES)

ITCL_EXE_CFLAGS    = $(cdebug) $(cflags) $(cvarsdll) $(include32) \
            $(ITCL_INCLUDES) $(ITCL_DEFINES)

ITCL_CFLAGS    = $(ITCL_EXE_CFLAGS) -DUSE_TCL_STUBS

######################################################################
# Link flags
######################################################################

!IF "$(NODEBUG)" == "1"
ldebug = /RELEASE
!ELSE
ldebug = -debug:full -debugtype:cv
!ENDIF

# declarations common to all linker options
lcommon = /NODEFAULTLIB /RELEASE /NOLOGO

# declarations for use on Intel i386, i486, and Pentium systems
!IF "$(MACHINE)" == "IX86"
DLLENTRY = @12
lflags   = $(lcommon) /MACHINE:$(MACHINE)
!ELSE
lflags   = $(lcommon) /MACHINE:$(MACHINE)
!ENDIF

conlflags = $(lflags) -subsystem:console -entry:mainCRTStartup
guilflags = $(lflags) -subsystem:windows -entry:WinMainCRTStartup
dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll

!IF "$(MACHINE)" == "PPC"
libc = libc.lib
libcdll = crtdll.lib
!ELSE
libc = libc.lib oldnames.lib
libcdll = msvcrt.lib oldnames.lib
!ENDIF

baselibs   = kernel32.lib $(optlibs) advapi32.lib user32.lib
winlibs    = $(baselibs) gdi32.lib comdlg32.lib winspool.lib

guilibs       = $(libc) $(winlibs)
conlibs       = $(libc) $(baselibs)
guilibsdll = $(libcdll) $(winlibs)
conlibsdll = $(libcdll) $(baselibs)

######################################################################
# Compile flags
######################################################################

!IF "$(NODEBUG)" == "1"
!IF "$(MACHINE)" == "ALPHA"
# MSVC on Alpha doesn't understand -Ot
cdebug = -O2i -Gs -GD
!ELSE
cdebug = -Oti -Gs -GD
!ENDIF
!ELSE
cdebug = -Z7 -Od -WX
!ENDIF

# declarations common to all compiler options
ccommon = -c -W3 -nologo -YX -Fp$(TMPDIR)\ -Dtry=__try -Dexcept=__except

!IF "$(MACHINE)" == "IX86"
cflags = $(ccommon) -D_X86_=1
!ELSE
!IF "$(MACHINE)" == "MIPS"
cflags = $(ccommon) -D_MIPS_=1
!ELSE
!IF "$(MACHINE)" == "PPC"
cflags = $(ccommon) -D_PPC_=1
!ELSE
!IF "$(MACHINE)" == "ALPHA"
cflags = $(ccommon) -D_ALPHA_=1
!ENDIF
!ENDIF
!ENDIF
!ENDIF

cvars      = -DWIN32 -D_WIN32
cvarsmt    = $(cvars) -D_MT
cvarsdll   = $(cvarsmt) -D_DLL

!IF "$(NODEBUG)" == "1"
cvarsdll   = $(cvars) -MD
!ELSE
cvarsdll   = $(cvars) -MDd
!ENDIF

CON_CFLAGS    = $(cdebug) $(cflags) $(cvars) $(include32) -DCONSOLE

######################################################################
# Project specific targets
######################################################################

release:    setup $(ITCLDLL) $(ITCLSTUBLIB) $(ITCLSH)
all:        setup $(ITCLDLL) $(ITCLSTUBLIB) $(ITCLSH)
test:        setup $(ITCLDLL) $(ITCLSTUBLIB) $(PKGINDEX)
    -@copy $(TCLDLL) $(TMPDIR)
    $(TCLSH) <<
        cd ../tests
	lappend auto_path ../win/$(TMPNAME)
	set env(ITCL_LIBRARY) ../library
        source all
<<

$(PKGINDEX):
    -@copy pkgIndex.tcl $@

setup:
    if not exist $(TMPDIR) mkdir $(TMPDIR)
    if not exist $(OUTDIR) mkdir $(OUTDIR)

$(ITCLLIB): $(ITCLDLL)

$(ITCLDLL): $(ITCLOBJS) $(TMPDIR)\itclvc.def $(TMPDIR)\itcl.res
    set LIB=$(TOOLS32)\lib
    $(link32) $(ldebug) $(dlllflags) -def:$(TMPDIR)\itclvc.def \
        -out:$@ $(TMPDIR)\itcl.res $(guilibsdll) $(TCLSTUBLIB) @<<
		$(ITCLOBJS)
<<

$(ITCLSTUBLIB): $(ITCLSTUBOBJS)
    $(lib32) -nologo -out:$@ $(ITCLSTUBOBJS)

$(ITCLSH): $(ITCLSHOBJS) $(ITCLSTUBLIB) $(TCLSTUBLIB) $(TMPDIR)\itclsh.res
    set LIB=$(TOOLS32)\lib
    $(link32) $(ldebug) $(conlflags) $(TMPDIR)\itclsh.res -stack:2300000 \
        -out:$@ $(conlibsdll) $(ITCLLIB) $(TCLLIB) $(ITCLSHOBJS)

$(TMPDIR)\itclvc.def: $(DUMPEXTS) $(ITCLOBJS)
    $(DUMPEXTS) -o $@ $(ITCLDLLNAME) @<<
$(ITCLOBJS)
<<

$(DUMPEXTS): $(TCLDIR)\win\winDumpExts.c
    $(cc32) $(CON_CFLAGS) -Fo$(TMPDIR)\ $?
    set LIB=$(TOOLS32)\lib
    $(link32) $(ldebug) $(conlflags) $(guilibs) -out:$@ \
        $(TMPDIR)\winDumpExts.obj 

install: all
    if not exist $(INSTALLDIR) mkdir $(INSTALLDIR)
    if not exist $(BIN_INSTALL_DIR) mkdir $(BIN_INSTALL_DIR)
    if not exist $(LIB_INSTALL_DIR) mkdir $(LIB_INSTALL_DIR)
    if not exist $(SCRIPT_INSTALL_DIR) mkdir $(SCRIPT_INSTALL_DIR)
    if not exist $(INCLUDE_INSTALL_DIR) mkdir $(INCLUDE_INSTALL_DIR)
    copy $(ITCLSH) "$(BIN_INSTALL_DIR)"
    copy $(ITCLDLL) "$(BIN_INSTALL_DIR)"
    copy $(ROOT)\generic\itcl.h "$(INCLUDE_INSTALL_DIR)"
    copy $(ROOT)\library\*.* "$(SCRIPT_INSTALL_DIR)"
    copy $(ROOT)\win\*.tcl "$(SCRIPT_INSTALL_DIR)"

#
# Regenerate the stubs files.
#
genstubs:
    $(TCLSH) $(TCLDIR)\tools\genStubs.tcl $(GENERICDIR) \
        $(GENERICDIR)\itcl.decls $(GENERICDIR)\itclInt.decls

#
# Special case object file targets
#

$(TMPDIR)\tclAppInit.obj : $(WINDIR)\tclAppInit.c
    $(cc32) $(ITCL_EXE_CFLAGS) -Fo$@ $?

# The following object is part of the stub library and should not
# be built as DLL objects but none of the symbols should be exported

$(TMPDIR)\itclStubLib.obj : $(GENERICDIR)\itclStubLib.c
    $(cc32) -DSTATIC_BUILD $(ITCL_CFLAGS) -Fo$@ $?

#
# Implicit rules
#

{$(WINDIR)}.c{$(TMPDIR)}.obj:
    $(cc32) -DDLL_BUILD $(ITCL_CFLAGS) -Fo$(TMPDIR)\ $<

{$(GENERICDIR)}.c{$(TMPDIR)}.obj:
    $(cc32) -DDLL_BUILD $(ITCL_CFLAGS) -Fo$(TMPDIR)\ $<

{$(ROOT)\compat}.c{$(TMPDIR)}.obj:
    $(cc32) -DDLL_BUILD $(ITCL_CFLAGS) -Fo$(TMPDIR)\ $<

{$(WINDIR)}.rc{$(TMPDIR)}.res:
    $(rc32) -fo $@ -r -i $(GENERICDIR) -i $(WINDIR) -i $(TCLDIR)\generic -D__WIN32__ \
        $(ITCL_DEFINES) $<

clean:
    -@del $(OUTDIR)\*.exp
    -@del $(OUTDIR)\*.lib
    -@del $(OUTDIR)\*.dll
    -@del $(OUTDIR)\*.exe
    -@del $(OUTDIR)\*.pdb
    -@del $(TMPDIR)\*.pch
    -@del $(TMPDIR)\*.obj
    -@del $(TMPDIR)\*.res
    -@del $(TMPDIR)\*.def
    -@del $(TMPDIR)\*.exe
    -@rmdir $(OUTDIR)
    -@rmdir $(TMPDIR)
