# makefile.top
#
# This is part of the flight simulator 'fly8'.
# Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).

# top level makefile for msdos, c8 (vc)
# Note that some modules are compiled with special options due to compiler bugs.

CC=	cl

SYSTEM= MSDOS

# If you have assembly support, define:
#	-DUSE_ASM
# If you want to use C support with debuging enabled define:
#	-DDEBUG_MULDIV

# common options.
#
OFLAGSX=	-f- -Gs -AL -W4

# no optimization at all.
#
OFLAGSD=	-Od

# enable debug/profiling.
#
OFLAGSP=	#-Zi

# size optimization.
# this is -O1 without the -Gf. Use it to reduce size by about 60k.
#
OFLAGS1=	-Owes -G2y

# speed optimization.
# -O2 screws up near strings, so the following is -O2 without the -Gf.
#
OFLAGS2=	-Owcegilnot -G2y

# options for inlining. Add this to time-critical modules.
# high inlining is '-Ob2 -OV4', low inlining is '-Ob1 -OV0'.
OFLAGSI=

OFLAGS=	$(OFLAGSX) $(OFLAGS2) -Ob2 -OV4 $(OFLAGSP)

SHFLAGS=
YFLAGS= -D$(SYSTEM) $(OFLAGS) $(SHFLAGS)
XFLAGS= $(YFLAGS) -DUSE_ASM		# general purpose options
#XFLAGS= $(YFLAGS) -DDEBUG_MULDIV
CFLAGS= -I$(SYSTEM) $(XFLAGS)		# local general purpose options
IFLAGS= -I$(SYSTEM) $(YFLAGS)		# ifuncsm special options
TFLAGS=	$(CFLAGS) $(OFLAGSI)		# Time critical options
ZFLAGS=	$(CFLAGS) $(OFLAGSI) -DINLINE	# inline Time critical options

NFLAGS=	$(OFLAGSX) -Od -G0 $(SHFLAGS) -DUSE_ASM -I$(SYSTEM) -D$(SYSTEM)

RSP=	$(TMP)\libfly8.rsp
FLIB=	$(TMP)\fly8.lib
THISDIR=c:\c\flynew\fly			# This is where we run 'make'
INSTDIR=c:\games\fly8
RELDIR=	c:\upload\fly8
VERNAME=fly8102

LL=	c:\c\l
GLIB=	$(LL)\gr.lib
SLIB=	$(LL)\com.lib
PLIB=	$(LL)\pktdrvr.lib

# IMPORTANT NOTE: check_stack() in fly8.c allocates a large automatic
# array to measure stack usage. On systems where the stack size in fixed
# in advance you MUST ensure that this array does not violate the stack
# size. MSDOS is an example of a system where this is the case so that
# the following /ST:4000 allocates enough stack for the chunk[3000] array
# used.

LCFLAGS= -AL $(OFLAGSP)
LFLAGS= /ST:5000 /SE:256 /PACKCODE /F

MAKE=	nmake

#	objects
#
OOBJS=	object.obj oground.obj obox.obj orunway.obj om61.obj otarget.obj \
	obroken.obj oviewer.obj opaddoc.obj ochute.obj ohouse.obj oplane.obj \
	oclassic.obj obasic.obj oxplane.obj otower.obj olow.obj ogtarget.obj \
	omk82.obj ocrater.obj osmoke.obj oyplane.obj ofplane.obj

#	Portable programs
#
COBJS=	loop.obj show.obj objects.obj log.obj pointer.obj device.obj \
	debug.obj remote.obj ifuncs.obj autop.obj mat.obj hud.obj info.obj \
	stroke.obj cockpit.obj tunes.obj command.obj body.obj keypad.obj \
	land.obj sky.obj random.obj sound.obj keyboard.obj macros.obj nav.obj \
	menu.obj menus.obj player.obj netport.obj memory.obj pid.obj \
	stfont1.obj stfont2.obj vmodes.obj colors.obj getstr.obj window.obj \
	message.obj radar.obj heading.obj altitude.obj speed.obj pitch.obj \
	init.obj term.obj util.obj piper.obj views.obj hudmenu.obj system.obj \
	nosound.obj stack.obj need.obj max.obj nosystem.obj notimer.obj \
	engine.obj sixdof.obj gear.obj panel.obj prm.obj symbols.obj field.obj \
	compass.obj airdata.obj nokbd.obj stores.obj \
	$(OOBJS)

OBJS= $(COBJS)

INLINES=	loop.c ifuncs.c mat.c

LIBS= $(FLIB) $(SLIB) $(GLIB) $(PLIB)

HFILES = fly.h $(SYSTEM)\config.h

.PRECIOUS: itabs.c

now:	fly

all:	lib fly dat util

lib:	serial net gr

fly:	sys inline.h fly8.exe

dat:	parm shape

sys:
	cd $(SYSTEM)
	$(MAKE) XFLAGS="$(XFLAGS) $(OFLAGSI)" SYSTEM=$(SYSTEM) CC=$(CC)
	cd ..

parm:
	cd parms
	$(MAKE) SYSTEM=$(SYSTEM) SHFLAGS="$(SHFLAGS)" CC=$(CC)
	cd ..

shape:
	cd shapes
	$(MAKE) SYSTEM=$(SYSTEM) SHFLAGS="$(SHFLAGS)" CC=$(CC)
	cd ..

serial:
	cd ..\serial
	$(MAKE) SHFLAGS="$(SHFLAGS)"
	cd ..\fly

net:
	cd ..\net
	$(MAKE) SHFLAGS="$(SHFLAGS)"
	cd ..\fly

gr:
	cd ..\gr
	$(MAKE) SHFLAGS="$(SHFLAGS)"
	cd ..\fly

util:
	cd utils
	$(MAKE) XFLAGS="$(XFLAGS)" SYSTEM=$(SYSTEM) CC=$(CC)
	cd ..

inline.h:	$(INLINES)
	msdos\inline $(INLINES)

$(FLIB):	$(OBJS) version
	if exist $(FLIB) del $(FLIB)
	echo $(FLIB) >$(RSP)
	echo y >>$(RSP)
	echo +show +objects +object +log +pointer +device +keypad +pid &>>$(RSP)
	echo +debug +remote +keyboard +ifuncs +autop +mat +hud +info   &>>$(RSP)
	echo +stroke +cockpit +tunes +views +command +body +land +sky  &>>$(RSP)
	echo +random +sound +macros +player +netport +memory +stfont1  &>>$(RSP)
	echo +stfont2 +menu +menus +oground +obox +orunway +ochute     &>>$(RSP)
	echo +ohouse +om61 +otarget +obroken +oviewer +opaddoc +loop   &>>$(RSP)
	echo +oplane +oclassic +obasic +oxplane +vmodes +colors +omk82 &>>$(RSP)
	echo +getstr +window +message +otower +olow +radar +heading    &>>$(RSP)
	echo +altitude +speed +pitch +nav +init +term +util +ogtarget  &>>$(RSP)
	echo +piper +ocrater +osmoke +hudmenu +system +nosound +stack  &>>$(RSP)
	echo +need +max +nosystem +notimer +engine +version +oyplane   &>>$(RSP)
	echo +sixdof +gear +ofplane +panel +prm +symbols +field        &>>$(RSP)
	echo +compass +airdata +nokbd +stores; >>$(RSP)
	lib @$(RSP)
	del $(RSP)

fly8.exe:	fly8.obj $(LIBS) $(SYSTEM)\fly8sys.lib
	$(CC) $(LCFLAGS) fly8.obj -Fmf -link $(LFLAGS) $(FLIB) \
		$(SYSTEM)\fly8sys $(LL)\com $(LL)\gr $(LL)\pktdrvr
	lzexe fly8
	del fly8.old

fly8.obj:	$(HFILES)

$(COBJS):	$(HFILES)

version:	version.c
	$(CC) $(CFLAGS) -c version.c

tunes.obj:	$(HFILES) notes.h keyofc.h keyofd.h

colors.obj:	colors.h

max.obj:	keyname.h

autop.obj:	plane.h hud.h

command.obj:	plane.h hud.h

engine.obj:	plane.h hud.h

gear.obj:	plane.h hud.h

hud.obj:	plane.h hud.h

obasic.obj:	plane.h hud.h

oclassic.obj:	plane.h hud.h

ofplane.obj:	plane.h hud.h

om61:		plane.h hud.h

omk82:		plane.h hud.h

oplane.obj:	plane.h hud.h

oxplane.obj:	plane.h hud.h

oyplane.obj:	plane.h hud.h

panel.obj:	plane.h hud.h

prm.obj:	plane.h hud.h

radar.obj:	plane.h hud.h

sixdof.obj:	plane.h hud.h

stores.obj:	plane.h hud.h

altitude.obj:	hud.h

compass.obj:	hud.h

heading.obj:	hud.h

hudmenu.obj:	hud.h

info.obj:	hud.h

loop.obj:	hud.h

nav.obj:	hud.h

oviewer.obj:	hud.h

piper.obj:	hud.h

pitch.obj:	hud.h

speed.obj:	hud.h

views.obj:	hud.h

# Use this to create itabs.c, then -DEXT_TAB for ifuncs.obj
#

ifuncsm.obj:	ifuncs.c $(HFILES)
	$(CC) $(IFLAGS) -DGEN_TAB -Foifuncsm -c ifuncs.c

debug.obj:	debug.c
	$(CC) $(IFLAGS) -c $*.c

ifuncsm.exe:	ifuncsm.obj debug.obj
	$(CC) $(LCFLAGS) ifuncsm.obj debug.obj

itabs.c:	ifuncsm.exe
	ifuncsm >itabs.c

ifuncs.obj:	ifuncs.c itabs.c $(HFILES)
	$(CC) $(TFLAGS) -DEXT_TABS -c $*.c


# these are needed due to compiler problems.
#
netport.obj:	netport.c
	$(CC) $(NFLAGS) -c $*.c

# this fails with OFLAGS1.
#
memory.obj:	memory.c
	$(CC) $(ZFLAGS) -c $*.c
#	$(CC) $(NFLAGS) -c $*.c

# these are used to get max speed for the 3D stuff. Use if the rest is
# compiled with size optimization (OFLAGS1).
#
show.obj:	show.c
	$(CC) $(ZFLAGS) -c $*.c

mat.obj:	mat.c
	$(CC) $(ZFLAGS) -c $*.c

loop.obj:	loop.c
	$(CC) $(TFLAGS) -c $*.c

objects.obj:	objects.c
	$(CC) $(TFLAGS) -c $*.c

stroke.obj:	stroke.c
	$(CC) $(ZFLAGS) -c $*.c

symbols.obj:	symbols.c
	$(CC) $(ZFLAGS) -c $*.c

# NOTE: init.c and term.c must NOT be compiled with -G3!
#


clean:	cleanfly cleansys cleandat cleanutl cleanlib

cleanfly:
	-del *.exe
	-del *.obj
	-del *.lib
	-del *.rsp
	-del *.map
	-del errs
	-del xxx

cleansys:
	cd $(SYSTEM)
	$(MAKE) clean
	cd ..

cleandat:
	cd shapes
	$(MAKE) clean
	cd ..\parms
	$(MAKE) clean
	cd ..

cleanutl:
	cd utils
	$(MAKE) clean
	cd ..

cleanlib:
	cd ..\serial
	$(MAKE) clean
	cd ..\net
	$(MAKE) clean
	cd ..\gr
	$(MAKE) clean
	cd ..\fly

install:
	-md $(INSTDIR)
	copy fly8.exe			$(INSTDIR)
	-copy f.map			$(INSTDIR)
	copy *.max			$(INSTDIR)
	copy utils\mac2max.exe		$(INSTDIR)
	copy utils\max2mac.exe		$(INSTDIR)
	copy $(SYSTEM)\fly.ini		$(INSTDIR)
	copy $(SYSTEM)\fly.bat		$(INSTDIR)
	copy $(SYSTEM)\*.vmd		$(INSTDIR)
	copy $(SYSTEM)\*.exe		$(INSTDIR)
	copy $(SYSTEM)\*.fnt		$(INSTDIR)
	copy $(SYSTEM)\find.*		$(INSTDIR)
	copy $(SYSTEM)\readme.*		$(INSTDIR)
	copy $(SYSTEM)\*.zip		$(INSTDIR)
	copy shapes\*.vxx		$(INSTDIR)
	copy shapes\wf16.vxx		$(INSTDIR)\plane.vxx
	copy parms\*.prm		$(INSTDIR)
	copy parms\*.nav		$(INSTDIR)
	copy parms\*.lnd		$(INSTDIR)
	copy docs\*.doc			$(INSTDIR)
	copy docs\history		$(INSTDIR)
	copy docs\bugs			$(INSTDIR)
	-md $(INSTDIR)\data
	copy parms.h			$(INSTDIR)\data
	copy shape.h			$(INSTDIR)\data
	copy colors.h			$(INSTDIR)\data
	copy parms\expr.awk		$(INSTDIR)\data
	copy parms\*.prc		$(INSTDIR)\data
	copy parms\*.lnc		$(INSTDIR)\data
	copy parms\*.nac		$(INSTDIR)\data
	copy $(SYSTEM)\build.bat	$(INSTDIR)\data
	copy c:\bin\awk.exe		$(INSTDIR)\data
	copy c:\bin\cpp.exe		$(INSTDIR)\data
	copy c:\bin\ted.com		$(INSTDIR)\data
	copy c:\msvc\bin\video\msherc.com	$(INSTDIR)

reinstall:
	copy fly8.exe			$(INSTDIR)
	copy f.map			$(INSTDIR)

release:	relbin reldata relsrc reldos
	copy docs\release.txt $(RELDIR)\$(VERNAME).txt

relbin:
	-del $(RELDIR)\$(VERNAME)d.zip
	cd $(INSTDIR)
	pkzip -rP $(RELDIR)\$(VERNAME)d *.exe *.map *.ini *.bat *.vmd *.fnt \
		find.* *.zip *.com
	cd $(THISDIR)

reldata:
	-del $(RELDIR)\$(VERNAME)3.zip
	cd $(INSTDIR)
	pkzip -rP $(RELDIR)\$(VERNAME)3 *.vx? *.max *.ln? *.na? *.pr? *.doc \
		expr.awk *. *.h
	cd $(THISDIR)

reldos:
	cd ..
	copy gr\subs.obj	gr\subsobj
	copy net\pkint.obj	net\pkintobj
	copy serial\intserv.obj	serial\intservo
	-del $(RELDIR)\$(VERNAME)2.zip
	pkzip -P $(RELDIR)\$(VERNAME)2 h\gr.h h\com.h h\pktdrvr.h
	pkzip -P -x*.obj -x*.exe -xmakefile $(RELDIR)\$(VERNAME)2 \
		l\gr.* l\com.* l\pkt*.* gr\*.* net\*.* serial\*.*
	cd $(THISDIR)

relsrc:	backup

backup:
	-del *.bak
	-del errs*.
	-del xxx
	cd ..
	-del $(FLIB)
	-del $(RELDIR)\$(VERNAME)1.zip
	pkzip -rP -x*.exe -x*.com -x*.obj -x*.lib -x*.map -x*.old -xmakefile\
		$(RELDIR)\$(VERNAME)1 fly\*.*
	pkzip -d $(RELDIR)\$(VERNAME)1 *.vxx *.avx *.fvx *.prm *.nav *.lnd
	cd fly

ibackup:
	-del *.bak
	-del errs*.
	-del xxx
	cd ..
	-del $(FLIB)
	-del $(RELDIR)\$(VERNAME)4.zip
	pkzip -rP -t$(DATE) -x*.exe -x*.com -x*.obj -x*.lib -x*.map -xmakefile\
		$(RELDIR)\$(VERNAME)4 fly\*.*
	pkzip -d $(RELDIR)\$(VERNAME)4 *.old *.vxx *.avx *.fvx *.prm *.nav *.lnd
	cd fly
