# UQLX Makefile
#  Targets:
#	all: build uqlx according to ~/.uqlx_cprefs
#	xaw: 		athena widget interface version, override prefs
#       noaw:	  	without xaw interface, override prefs

# Compile Preferences File:
#  ~/.uqlx_cprefs
#
#  you may set this variables:
#    USE_XAW= yes			# or no
#    BUILD_SPECIALFLAGS= -Dxx 		# need some starnge define flags ?
#    LOCAL_LIBPATHS= -L /amd/hx/lib/X11/
#    LOCAL_INCLUDES= -I /usr/include/
#    LOCAL_OPTFLAGS=
#    LOCAL_DEFINES=
#    LOCAL_LINKFLAGS= 


# the next 2 lines may work only with GNU make, you can hardcode the first one
# while you should never need the second one
IMPLPATH := $(shell pwd)
RELSE := $(shell date '+%m/%d/%y  %H:%M:%S')
PWD := $(shell pwd)


ifndef OS2_SHELL
 XOS := $(shell uname)
 XOSREL := $(shell uname -r)
else 
 XOS := OS2
endif

CC= gcc   

# get compile preferences
ifeq (0,$(MAKELEVEL))
-include $(HOME)/.uqlx_cprefs
endif

ifeq ($(USE_XAW), yes)
  XAW_FLAG= -DXAW
else
  XAW_FLAG=
endif

# now try to guess OS and correct BUILDFLAGS ....
ifeq ($(XOS),Linux)
  BUILDFLAGS := -DUSE_IPC -DXSCREEN -DQVFS -DMOUSE  -DUSE_IOSZ -DDO_GRAB  -DSERIAL  -DNEWSERIAL -DNEWPTY  -DFASTLOOP  -DSH_MEM -DIPDEV #-DDEBUG_ROM #   # -DUSE_VM -DSH_MEM
endif

ifeq ($(XOS),SunOS)
ifeq ($(OSTYPE),solaris)	# Solaris ?
  BUILDFLAGS :=  -DUSE_IPC -DSOLARIS -DFASTLOOP -DXSCREEN -DQVFS  -DMOUSE  -DDO_GRAB  -DSERIAL  -DNEWSERIAL -DNEWPTY -DNO_FIONREAD -DSH_MEM -DVM_SCR -DIPDEV #-DDEBUG_ROM  # -DUSE_VM -DSH_MEM
  XLFLAG := -lsocket -lxnet
else			# old sunos...
  BUILDFLAGS := -DUSE_IPC -DXSCREEN -DQVFS  -DSUNOS -DMOUSE  -DDO_GRAB  -DSERIAL  -DNEWSERIAL -DNEWPTY -DNO_FIONREAD  -DFASTLOOP -DBSD -DNO_MEMMOVE -DNO_GETOPT #-DSH_MEM
endif
endif

ifeq ($(XOS),IRIX)
  BUILDFLAGS := -DUSE_IPC -DIPDEV -DXSCREEN -DQVFS -DMOUSE  -DDO_GRAB  -DSERIAL  -DNEWSERIAL -DNEWPTY  -DNO_FIONREAD -DFASTLOOP #-DVM_SCR  -DSH_MEM # -DUSE_VM -DSH_MEM
endif

ifeq ($(XOS),HP-UX)
  BUILDFLAGS := -DQVFS  -DMOUSE  -DDO_GRAB  -DSERIAL  -DNEWSERIAL -DNEWPTY -DNO_FIONREAD  -DFASTLOOP -DSH_MEM #-DVM_SCR  #-DDEBUG_ROM #   #-DUSE_VM  -DSH_MEM
endif

ifeq ($(XOS),OS2)
  BUILDFLAGS :=  -DQVFS -DEMX -DMOUSE  -DDO_GRAB  -DSERIAL  -DNEWSERIAL -DNEWPTY -DNO_FIONREAD  -DFASTLOOP #-DVM_SCR  #-DDEBUG_ROM #   #-DUSE_VM  -DSH_MEM
endif

# Default Case:
ifndef BUILDFLAGS
   BUILDFLAGS := -DQVFS  -DMOUSE  -DDO_GRAB  -DFASTLOOP #-DVM_SCR  #-DDEBUG_ROM #  -DUSE_VM -DSH_MEM
   UNKNOWN_ARCH := true
endif


# Library and Include paths:
# most configurationss don't complain about nonexistent directories in the search path,
# IRIX is the exception ..
ifeq ($(XOS),IRIX)
else
INCLUDES := -I /usr/openwin/include/ -I /usr/include/X11R6/ -I /usr/include/X11R5/ \
	-I /usr/X11/include/
LIBS := -L/usr/X11/lib/ -L/usr/openwin+/lib/ -L/usr/openwin/lib/ \
	-L/usr/X11R6/lib/ -L/usr/X11R5/lib/
endif

# now append local definitions and preferences
BUILDFLAGS += $(BUILD_SPECIALFLAGS)
BUILDFLAGS += $(LOCAL_DEFINES)
INCLUDES += $(LOCAL_INCLUDES)
LIBS += $(LOCAL_LIBPATHS)

#SUN includes:
#INCLUDES= -I /usr/openwin/include/
# HPUX includes:
#INCLUDES = -I /usr/include/X11R5/

#SUN libs
#LIBS = #-L /usr/openwin/lib/  #-L /opt/SUNWspro/SC4.0/lib/
#HP libs
# LIBS = -L /usr/lib/X11R5/

# X11R6 libs (Linux)
# LIBS = -L  /usr/X11R6/lib

PROFFLAGS= #-pg -a

OPTFLAGS=  $(PROFFLAGS)  -O3 -g  -finline-functions $(LOCAL_OPTFLAGS) -fomit-frame-pointer
DEBUGFLAGS=  #-DTRACE #-DBACKTRACE  #-DDEBUG -DVTIME

LINKFLAGS= $(LOCAL_LINKFLAGS)

##BUILDFLAGS=     -DMOUSE  -DDO_GRAB  -DSERIAL  -DNEWSERIAL -DNEWPTY -DNO_FIONREAD  -DFASTLOOP -DVM_SCR  #-DDEBUG_ROM -DUSE_VM -DSH_MEM




WFLAGS= #-Wimplicit #-Wstrict-prototypes #-Wpointer-arith

ENX :=  '-DIMPL="$(IMPLPATH)/"'  '-DHOME="$(HOME)/"'
ENVFLAGS := $(ENX)




XTSRCS := xql.c xtmain.c unixstuff.c xqlmouse.c
XLSRCS := x.c xlmain.c unixstuff.c xqlmouse.c
XWSRCS := x.c xql.c xtmain.c xlmain.c unixstuff.c xqlmouse.c

XTOBJS := xql.o xtmain.o xqlmouse_aw.o unixstuff_aw.o
XLOBJS := x.o xlmain.o xqlmouse.o unixstuff.o



##WINOBJS= $(XLOBJS)

HEADERS :=  QDOS.h QL.h  QLtypes.h  QDisk.h QL68000.h cond.h iexl.h QSerial.h  unix.h \
	QFilesPriv.h  QL_config.h  QSound.h   QInstAddr.h  QLfiles.h boot.h \
	Qerror.h trace.h uqlx_cfg.h emudisk.h driver.h vm.h \
	misdefs.h xcodes.h QL_screen.h \
	iexl_general.h memaccess.h iexl_ug.h QVFS.h insnx.h \
	QLip.h iptraps.h util.h xc68.h xipc.h script.h


OBJ := Init.o general.o instructions_ao.o instructions_pz.o  \
	QLtraps.o QL_hardware.o QL_config.o dummies.o vm.o \
	xqlkey.o qmtrap.o uxfile.o QL_serial.o pty.o uqlx_cfg.o\
	QL_files.o QL_driver.o QDisk.o trace.o version.o QLserio.o \
	QL_screen.o QL_poll.o xcodes.o QL_boot.o QL_basext.o \
	QL_cconv.o insnx.o insnx2.o iexl_general.o QVFS.o \
	Xscreen.o QLip.o util.o xc68.o xipc.o script.o


SRC := Init.c general.c instructions_ao.c instructions_pz.c   \
	QLtraps.c QL_hardware.c QL_config.c dummies.c vm.c \
	xqlkey.c qmtrap.c uxfile.c QL_serial.c pty.c uqlx_cfg.c \
	QL_files.c QL_driver.c QDisk.c trace.c version.c QLserio.c \
	QL_screen.c QL_poll.c xcodes.c QL_boot.c QL_basext.c \
	QL_cconv.c insnx.c insnx2.c iexl_general.c QVFS.c \
	Xscreen.c QLip.c util.c xc68.c xipc.c script.c


DOCS := README COPYRIGHT docs/socket.texi docs/uqlx.texi docs/ql.html docs/qxlwin.html

ROMS := romdir/js_rom romdir/min.189

CONFIGFILES := Makefile Xql Xqlaw 

AUX := .gdbinit BOOT.test bench1 bench2 xx.c insnx.c.old Xgui.c
UTILS := utils/README utils/xheader utils/Makefile utils/qcp.c utils/qls.c


## conditionalise !!!!!!
ifneq (,$(findstring DXAW,$(XAW_FLAG)))
 EXE_NAME= qm-aw
else
 EXE_NAME= qm
endif

# link in required libraries - and nothing more
ifneq (,$(findstring DXAW,$(XAW_FLAG)))
    XLIBS := -lXaw -lXmu -lXt -lX11 -lXext
else
  ifneq (,$(findstring DSH_MEM,$(BUILDFLAGS)))
    XLIBS :=  -lX11 -lXext
  else
    XLIBS := -lX11
  endif
endif


ifneq (,$(findstring DXAW,$(XAW_FLAG)))
   WINSRCS := $(XTSRCS)
   WINOBJS := $(XTOBJS)
else
   WINSRCS := $(XLSRCS)
   WINOBJS := $(XLOBJS)
endif



ifneq (,$(findstring $(DEBUG_ON),$(DEBUG_FILES)))
  DO_DEBUG=true
else 
  DO_DEBUG=false
#ifneq (,$(strip $(DEBUG_ON) ))
#  NODEBUG=true
#endif
endif


# export ALL variables (lazy typing)
export


ifneq (,$(findstring DXAW,$(XAW_FLAG)))
all: printarch qm-aw
else
all: printarch qm
endif


noaw:
	$(MAKE) all USE_XAW="no"

xaw:  
	$(MAKE) all USE_XAW="yes"	

##exe:	$(EXE_NAME) qm

.PHONY: printarch
printarch:
	@echo
ifeq (,$(UNKNOWN_ARCH))
	@echo "*** Making UQLX for $(XOS) ***" 
else
	@echo "*** Wanrning: unknown architecture $(XOS) ***"
endif
	@echo




xqlmouse.o:	xqlmouse.c
	$(CC) $(PROFFLAGS)  -c -O3 $(ENVFLAGS) $(INCLUDES) $(OPTFLAGS) $(BUILDFLAGS) $(WFLAGS) $(XAW_FLAG) $<

xqlmouse_aw.o:	xqlmouse.c
	$(CC) $(PROFFLAGS)  -c -O3 -o xqlmouse_aw.o $(ENVFLAGS) $(INCLUDES) $(OPTFLAGS) $(BUILDFLAGS) $(WFLAGS) $(XAW_FLAG) $<




unixstuff.o:	unixstuff.c
	$(CC) $(PROFFLAGS)  -c -g $(DEBUGFLAGS) $(BUILDFLAGS) $(INCLUDES) $(OPTFLAGS) -O0 $(ENVFLAGS) $(WFLAGS) $(XAW_FLAG) $<

unixstuff_aw.o:	unixstuff.c
	$(CC) $(PROFFLAGS)  -c -g -o unixstuff_aw.o $(DEBUGFLAGS) $(BUILDFLAGS) $(INCLUDES) $(OPTFLAGS) $(ENVFLAGS) $(WFLAGS) $(XAW_FLAG) $<




general.o:	general.c instructions_ao.c instructions_pz.c
	$(CC) $(PROFFLAGS)  -c  -fexpensive-optimizations -fdelayed-branch -fschedule-insns2 -fcaller-saves \
	-frerun-cse-after-loop \
		$(OPTFLAGS) $(DEBUGFLAGS) $(BUILDFLAGS) $(INCLUDES) $(WFLAGS) \
	 $<  

iexl_general.o:	iexl_general.c instructions_ao.c instructions_pz.c
	$(CC) $(PROFFLAGS)  -c  -fexpensive-optimizations -fdelayed-branch -fschedule-insns2 -fcaller-saves \
	-frerun-cse-after-loop \
		$(OPTFLAGS) $(DEBUGFLAGS) $(BUILDFLAGS) $(INCLUDES) $(WFLAGS) \
	 $<  



.c.o:
  ifdef DEBUG_ON
    ifneq (,$(findstring true,$(DO_DEBUG)))
	$(CC) $(PROFFLAGS)  -c  -g $(INCLUDES) $(DEBUGFLAGS) $(BUILDFLAGS) $(ENVFLAGS)  $(WFLAGS) $(XAW_FLAG) $<
    else
	$(CC) $(PROFFLAGS)  -c  -g $(INCLUDES) $(DEBUGFLAGS) $(OPTFLAGS) $(BUILDFLAGS) $(ENVFLAGS)  $(WFLAGS) $(XAW_FLAG) $<
    endif
  else
   ifneq (,$(strip $(DEBUG_FILES) ))
	$(MAKE) $@ DEBUG_ON=$< DEBUG_TARGET=$@
   else
	$(CC) $(PROFFLAGS)  -c  -g $(INCLUDES) $(DEBUGFLAGS) $(OPTFLAGS) $(BUILDFLAGS) $(ENVFLAGS)  $(WFLAGS) $(XAW_FLAG) $<
  endif
  endif




ifeq (,$(XAW_FLAG))
qm:     $(OBJ) $(WINOBJS)
else
qm-aw:  $(OBJ) $(WINOBJS)
endif
	$(CC) -v $(PROFFLAGS)  $(LINKFLAGS) $(LIBS) -o $(EXE_NAME)  $(OBJ) $(WINOBJS)  $(XLIBS) $(XLFLAG) 
  ifndef UNKNOWN_ARCH
	@echo
	@echo "*** you have almost done it, ***"
	@echo "the name of the executable is"
	@echo "     >>>  $(EXE_NAME)  <<<"
	@echo "now type 'make docs' to get the"
	@echo "documentation in docs/ done"
	@echo
	@echo "if you are new to UQLX"
	@echo "'make install'"
	@echo "will do a simple installation for you"
	@echo "'make gui' will create a simple GUI"
	@echo
  else
	@echo
	@echo "so far everything seems to have worked"
	@echo "- you might want to try out some of the"
	@echo "more difficult BUILDFLAG options"
  endif


install: $(HOME)/.uqlxrc mdv1 mdv1/BOOT mdv2 win1
	@echo 
	@echo "seems like everything is done, try it!"


$(HOME)/.uqlxrc:
	echo 'SYSROM = js_rom' > $(HOME)/.uqlxrc
	echo 'ROMIM = tk2_ext,0xc000' >> $(HOME)/.uqlxrc
	echo 'ROMDIR = $(PWD)/romdir/'  >> $(HOME)/.uqlxrc
	echo 'RAMTOP = 4096'  >> $(HOME)/.uqlxrc
	echo 'PRINT = lpr' >> $(HOME)/.uqlxrc
	echo 'CPU_HOG = 0' >> $(HOME)/.uqlxrc
	echo 'DEVICE = MDV1,$(PWD)/mdv1/' >> $(HOME)/.uqlxrc
	echo 'DEVICE = MDV2,$(PWD)/mdv2/' >> $(HOME)/.uqlxrc
	echo 'DEVICE = WIN1,$(PWD)/win1/' >> $(HOME)/.uqlxrc
	echo 'DEVICE = RAM1,/tmp/.ram1-%x' >> $(HOME)/.uqlxrc
	echo 'DEVICE = RAM2,/tmp/.ram2-%x' >> $(HOME)/.uqlxrc
	echo 'DEVICE = RAM3,/tmp/.ram3-%x' >> $(HOME)/.uqlxrc
	echo 'DEVICE = RAM4,/tmp/.ram4-%x' >> $(HOME)/.uqlxrc
	echo 'DEVICE = RAM5,/tmp/.ram5-%x' >> $(HOME)/.uqlxrc
	echo 'DEVICE = RAM6,/tmp/.ram6-%x' >> $(HOME)/.uqlxrc
	echo 'DEVICE = RAM7,/tmp/.ram7-%x' >> $(HOME)/.uqlxrc
	echo 'DEVICE = RAM8,/tmp/.ram8-%x' >> $(HOME)/.uqlxrc
	@echo "$(HOME)/.uqlxrc written, read docs for more details"

mdv1:
	- mkdir mdv1

mdv1/BOOT:
	- cp BOOT.test mdv1/BOOT

mdv2:
	- mkdir mdv2

win1:
	- mkdir win1

Xgui:	util.o Xgui.c
	gcc -g -o Xgui $(INCLUDES) $(CCFLAGS) $(ENVFLAGS) $(BUILDFLAGS) Xgui.c util.o $(LIBS) \
		-lXaw -lXmu -lXt -lXext -lX11 $(XLFLAG) 

gui:	Xgui



.PHONY : docs
docs:
	@echo "making DVI file"
	-(cd docs; texi2dvi uqlx.texi)
	@echo "making info file"
	-(cd docs; makeinfo uqlx.texi)
	@echo "making html file"
	-(cd docs; texi2html uqlx.texi)
	-(cd docs; texi2dvi socket.texi)
	-(cd docs; texi2html socket.texi)
	@echo
	@echo "*****"
	@echo "docs/uqlx.info, docs/uqlx.dvi and docs/socket.dvi done"

.PHONY : do_checkin
do_checkin:
	-mkdir RCS
	cp $(HOME)/archive/uqlxRCS.tar.gz RCS/
	(cd RCS; gzip -d uqlxRCS.tar.gz; tar -xvf uqlxRCS.tar)
	rm RCS/uqlxRCS.tar*
	cp $(HOME)/www/ql.html docs/
	ci -l  $(SRC) $(XWSRCS) $(HEADERS) \
	  $(CONFIGFILES)  $(AUX) \
	  $(DOCS)


.PHONY : do_archive
do_archive: do_checkin
	(cd RCS; tar -cvf ../uqlxRCS.tar * .gdb* ../docs/*,v; gzip -9 ../uqlxRCS.tar;  mv ../uqlxRCS.tar.gz $(HOME)/archive/ )



.PHONY : distr
distr: version do_archive $(SRC) $(XWSRCS) $(CONFIGFILES) $(HEADERS)  $(DOCS)
	- rm -f uqlx.zip
	zip -9 -r uqlx.zip $(SRC) $(XWSRCS) \
	        $(CONFIGFILES) $(AUX) $(HEADERS) \
		$(DOCS) $(UTILS) $(ROMS) .uqlxrc
	cp uqlx.zip $(HOME)/big/
#	uuencode uqlx.zip uqlx.zip >$(HOME)/big/uqlx.uue
#	gzip -9 -f $(HOME)/big/uqlx.uue

.PHONY : save
save:	
	- rm -f uqlx.zip
	zip -9 -r uqlx.zip $(SRC) $(XWSRCS) \
	        $(CONFIGFILES) $(AUX) $(HEADERS) \
		$(DOCS) $(UTILS) $(ROMS) .uqlxrc
	cp uqlx.zip $(HOME)/big/

.PHONY : upload
upload: distr docs
	set_version
	insert_banner
	upl_www
	upload_uqlx

.PHONY : mdistr
mdistr: version $(SRC) $(XWSRCS) $(CONFIGFILES) $(AUX) $(HEADERS) $(DOCS)
	zip -9 -r uqlx.zip $(SRC) $(XWSRCS)  \
	        $(CONFIGFILES) $(AUX) $(HEADERS) \
		$(DOCS) $(UTILS)  $(ROMS) .uqlxrc

.PHONY : version
version:
	- rm -f version.c
	echo '#include "QLtypes.h"' > version.c
	echo '#include "QL68000.h"' >> version.c
	echo 'char *release="$(RELSE)";' >> version.c
	echo $(RELSE) > $(HOME)/.uqlx_version

.PHONY : clean
clean:
	- rm -f $(OBJ) $(XTOBJS) $(XLOBJS)


.PHONY : tags
tags:	$(SRC)
	etags -d $(SRC) $(XWSRCS) $(HEADERS)

.PHONY : bench1
bench1:	qm
	time ./qm -b 'lrun "$(PWD)/bench1"'

.PHONY : bench2
bench2: qm
	time ./qm  -b 'lrun "$(PWD)/bench2"'


.PHONY : bench1-aw
bench1-aw:	qm-aw
	time ./qm-aw -b 'lrun "$(PWD)/bench1"'

.PHONY : bench2-aw
bench2-aw: qm-aw
	time ./qm-aw -b 'lrun "$(PWD)/bench2"'

twin:
	touch $(XLSRCS) $(XTSRCS) xqlmouse.c unixstuff.c


