# (c) UQLX - see COPYRIGHT
#
# 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= -g -O3 -O0		# or whatever
#    LOCAL_DEFINES=
#    LOCAL_LINKFLAGS= 


# the whole Makefile is utterly GNU Make dependent

IMPLPATH := $(shell pwd)
RELSE := $(shell date '+%m/%d/%y  %H:%M:%S')
NRELSE := $(shell date '+%d.%m.%y-%H.%M')
PWD := $(shell pwd)

-include .config

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


# don't override CC definitions..
ifndef CC
 CC= gcc
else
# ..unless it isn't gcc
 ifeq (,$(findstring gcc,$(CC)))
   CC= gcc
   REDEF_CC= yes
 endif
endif



# 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 := -DLINUX -DUSE_IPC -DXSCREEN -DQVFS -DMOUSE  -DUSE_IOSZ -DDO_GRAB  -DSERIAL  -DNEWSERIAL -DNEWPTY  -DFASTLOOP  -DSH_MEM -DIPDEV #-DUSE_VM #-DEVM_SCR # -DBACKING_STORE
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 -DUSE_VM -DIPDEV  #-DDEBUG_ROM  # -DUSE_VM -DSH_MEM # -DBACKING_STORE
  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 -DEVM_SCR #-DSH_MEM # -DBACKING_STORE
endif
endif

ifeq ($(XOS),NetBSD)
  BUILDFLAGS := -DUSE_IPC -DXSCREEN -DQVFS -DMOUSE -DUSE_IOSZ -DDO_GRAB \
-DSERIAL -DNEWSERIAL -DNEWPTY -DFASTLOOP -DSH_MEM -DIPDEV -DBSD44 -DEVM_SCR\
#-DDEBUG_ROM  # -DBACKING_STORE
endif

ifeq ($(XOS),FreeBSD)
  BUILDFLAGS := -DUSE_IPC -DXSCREEN -DQVFS -DMOUSE -DUSE_IOSZ -DDO_GRAB \
-DSERIAL -DNEWSERIAL -DNEWPTY -DFASTLOOP -DSH_MEM -DIPDEV -DBSD44 -DEVM_SCR \
#-DDEBUG_ROM # -DBACKING_STORE
endif

ifeq ($(XOS),IRIX)
  BUILDFLAGS := -DUSE_IPC -DIPDEV -DXSCREEN -DQVFS -DMOUSE  -DDO_GRAB  -DSERIAL  -DNEWSERIAL -DNEWPTY  -DNO_FIONREAD -DFASTLOOP -DEVM_SCR #-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 -DEVM_SCR #-DVM_SCR  #-DDEBUG_ROM #   #-DUSE_VM  -DSH_MEM # -DBACKING_STORE
endif

ifeq ($(XOS),OS2)
  BUILDFLAGS :=  -DQVFS -DEMX -DMOUSE  -DDO_GRAB  -DSERIAL  -DNEWSERIAL -DNEWPTY -DNO_FIONREAD  -DFASTLOOP -DEVM_SCR  # -DBACKING_STORE
endif

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

ifndef GENERIC_CPU
ifeq (,$(findstring ERROR,$(DEF_CPU)))
   BUILDFLAGS += $(DEF_CPU)
endif
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/ -I/usr/X11R6/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 $(DEBUG)  -finline-functions $(LOCAL_OPTFLAGS) -fomit-frame-pointer
OPTFLAGS=  $(GCC_XFLAGS) $(PROFFLAGS) -O2 $(DEBUG)  $(LOCAL_OPTFLAGS) -fomit-frame-pointer 

DEBUGFLAGS=  #-DTRACE #-DBACKTRACE  #-DDEBUG -DVTIME

LINKFLAGS= $(LOCAL_LINKFLAGS)


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

ENX :=  '-DIMPL="$(IMPLPATH)/"' 
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 insnx.h \
	iexl_general.h memaccess.h iexl_ug.h QVFS.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  iexl_general.o QVFS.o \
	Xscreen.o QLip.o util.o xc68.o xipc.o script.o rompatch.o

#insnx.o insnx2.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 rompatch.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 guesscpu_linux config MK.all do_install browse_manual
UTILS := utils/README utils/xheader utils/Makefile utils/qcp.c utils/qls.c \
	utils/qxl_fschk.zip


## 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

ifdef QM_CONFIG_DONE
ifneq (,$(findstring DXAW,$(XAW_FLAG)))
all: printarch qm-aw
else
all: printarch qm
endif
else
all: print_usage
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) ***" 
ifneq (,$(findstring ERROR,$(DEF_CPU)))
	@echo "couldn't set CPU flags, guesscpu_* returned $(DEF_CPU)"
else
	@echo "$(CC) compiling with $(DEF_CPU) flag"
endif
ifneq (,$(REDEF_CC))
	@echo "Warning: CC redefined to $(CC)"
endif
else
	@echo "*** Wanrning: unknown architecture $(XOS) ***"
endif
	@echo

.PHONY: print_usage
print_usage:
	@echo "Please do 'make config' first"

.PHONY: config
config:
	./config >.config

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  $(DEBUGFLAGS) $(BUILDFLAGS) $(INCLUDES) $(OPTFLAGS)  $(ENVFLAGS) $(WFLAGS) $(XAW_FLAG) $<

unixstuff_aw.o:	unixstuff.c
	$(CC) $(PROFFLAGS)  -c -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  $(INCLUDES) $(DEBUGFLAGS) $(OPTFLAGS) $(BUILDFLAGS) $(ENVFLAGS)  $(WFLAGS) $(XAW_FLAG) $<
    endif
  else
   ifneq (,$(strip $(DEBUG_FILES) ))
	$(MAKE) $@ DEBUG_ON=$< DEBUG_TARGET=$@
   else
	$(CC) $(PROFFLAGS)  -c  $(INCLUDES) $(DEBUGFLAGS) $(OPTFLAGS) $(BUILDFLAGS) $(ENVFLAGS)  $(WFLAGS) $(XAW_FLAG) $<
  endif
  endif




ifeq (,$(XAW_FLAG))
qm:     $(OBJ) $(WINOBJS)
else
qm-aw-defunct:  $(OBJ) $(WINOBJS)
endif
	$(CC)  $(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 
	@echo "now type 'make docs' to get the"
	@echo "documentation in docs/ done"
	@echo
	@echo "next check/set PREFIX and"
	@echo "'make install'"
	@echo
	@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

qm-aw:
	@echo "*** sorry, qm-aw target currently not supported ***"
	@echo


:PHONY : install
install: qm
	if [ -z "$$PREFIX" ] ; then 			\
          if [ "`whoami`" = "root" ] ; then 		\
	     PREFIX=/usr/local ;			\
	  else						\
	     PREFIX=$$HOME ;				\
	  fi;						\
	fi;						\
	mkdir -p $$PREFIX ;				\
	ln -sf $$PWD/qm $$PREFIX/bin/qm ;			\
	ln -sf $$PWD/qm $$PREFIX/bin/qmin ;			\
	ln -sf $$PWD/qm $$PREFIX/bin/qjs ;			\
	ln -sf $$PWD/qm $$PREFIX/bin/qx ;			\
	ln -sf $$PWD/qm $$PREFIX/bin/qxx ;			\
	ln -sf $$PWD/qm $$PREFIX/bin/qxxx ;

	@echo "created softlinks to qm executable"


Xgui:	util.o Xgui.c
	gcc -o Xgui $(INCLUDES) $(CCFLAGS) $(ENVFLAGS) $(BUILDFLAGS) $(OPTFLAGS) 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/ )



# used to be deps: $(SRC) $(XWSRCS) $(CONFIGFILES) $(HEADERS)  $(DOCS)
.PHONY : distr
distr: version do_archive full_save
# used to be:
#	- rm -f uqlx.zip
#	zip -9 -r uqlx.zip $(SRC) $(XWSRCS) \
#	        $(CONFIGFILES) $(AUX) $(HEADERS) \
#		$(DOCS) $(UTILS) $(ROMS) .uqlxrc
#	cp uqlx.zip $(HOME)/big/


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

.PHONY: full_save
full_save: save
	mkdir -p /usr/tmp/p/uqlx-$(NRELSE)
	cd /usr/tmp/p/uqlx-$(NRELSE) ; unzip -q $(HOME)/big/uqlx.zip ; \
	   cd .. ; tar cf - uqlx-$(NRELSE)  | bzip2 -9 >$(HOME)/big/uqlx-$(NRELSE).tar.bz2; \
	   rm -rf uqlx-$(NRELSE)/romdir ; \
	   tar cf - uqlx-$(NRELSE)  | bzip2 -9 >$(HOME)/big/uqlx-noroms-$(NRELSE).tar.bz2 ;\
	   rm -rf uqlx-$(NRELSE)/docs ; \
	   tar cf - uqlx-$(NRELSE)  | bzip2 -9 >$(HOME)/big/uqlx-noroms-nodocs-$(NRELSE).tar.bz2 ;
	rm -rf /usr/tmp/p/uqlx-$(NRELSE)

.PHONY: backup
backup: full_save
	rm $(HOME)/big/uqlx-$(NRELSE).tar.bz2 $(HOME)/big/uqlx-noroms-nodocs-$(NRELSE).tar.bz2


.PHONY : upload
upload: distr docs
	set_version
	insert_banner
	upl_www
	-rm /usr/tmp/p/uqlx.zip /usr/tmp/p/uqlx-noroms.zip /usr/tmp/p/uqlx-noroms-nodocs.zip
	cd $(HOME)/big; zip -9 /usr/tmp/p/uqlx.zip   uqlx-$(NRELSE).tar.bz2  
	cd $(HOME)/big; zip -9 /usr/tmp/p/uqlx-noroms.zip  uqlx-noroms-$(NRELSE).tar.bz2 
	cd $(HOME)/big; zip -9 /usr/tmp/p/uqlx-noroms-nodocs.zip  uqlx-noroms-nodocs-$(NRELSE).tar.bz2 
	rm $(HOME)/big/uqlx-$(NRELSE).tar.bz2 $(HOME)/big/uqlx-noroms-nodocs-$(NRELSE).tar.bz2
	upload_uqlx $(NRELSE)


.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) .config .gcc_version

### extra .hpr 8.8.99 ###
.PHONY : distclean
distclean:
	- rm -f  $(OBJ) $(XTOBJS) $(XLOBJS) qm qm-aw Xgui qcp qls xheader tags TAGS utils/qcp utils/qls utils/xheader
	- rm -f docs/*aux docs/*cp docs/*dvi docs/*fn docs/*rej docs/*ky docs/*log docs/*pg docs/*toc* docs/*tp docs/*vr docs/*info* docs/*fns docs/[su]*html
	- rm -rf docs/ref *~
	- rm -rf `find . -depth -name "*~" -print`
#		#

.PHONY : tags
tags:	$(SRC) $(XWSRC) $(HEADERS)
	etags  $(SRC) $(XWSRCS) $(HEADERS)

.PHONY : ctags
ctags:	$(SRC) $(XWSRC) $(HEADERS)
	ctags -id $(SRC) $(XWSRCS) $(HEADERS) /* "-d" is "outdated"... *//**/

.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


