##############################################################################
#
#           Copyright (c)2008 Geovariances, Avon, France.
#
#   In consideration  of payment of  the license fee,  which is a part of
#   the price you  paid for this  product, Geovariances (GV) as licensor,
#   grants you, the licensee, a non-exclusive right to use this copy of a
#   GV software product.
#   GV reserves all rights not  expressly granted to licensee. GV retains
#   titleship and ownership  of software.  This license is not  a sale of
#   the original  software or any  copy. GV also  retains  titleship  and
#   ownership of any modifications or  derivations of this software.  Any
#   modifications of this software  must be clearly marked as such.  This
#   copyright message must  appear in its entirety  in this software,  or
#   any modifications or derivations thereof.
#
#   Geovariances welcomes any comments, suggestions, bug reports, etc. At
#   the discretion  of Geovariances,  any customer  supplied  bug  fixes,
#   enhancements, or utility codes will be distributed in future software
#   releases (the contributor will of course be credited).
#
#           Geovariances
#           49bis, Avenue Franklin Roosevelt
#           77210 Avon, FRANCE
#
#            Phone: +33-(0)-160.749.100
#              Fax: +33-(0)-164.228.728
#           e-mail: support@geovariances.fr
#
#                       All Rights Reserved
#
##############################################################################

##############################################################################
# Makefile for GTXserver/client/C samples
# $Id: Makefile 20145 2012-04-04 12:29:56Z foucher $
##############################################################################

## This Makefile must be used with GNU make.
## Under windows, DSP/DSW files should be used instead
## or you can use Cygwin (www.cygwin.com) to get a win32 GNU make.


# Just type "make all" or "make debug" to compile the examples.
# motif_client is for the moment the only example with an interface but it
# can only be compiled under UNIX or windows with Exceed XDK. If you want a
# windows binary of motif_client.exe, please contact Geovariances.

# If you just want to compile one example ask for its full output path:
# make winnt/text_list.exe

# Use "make -s" for a less verbose output

# Use shared gtxclient by default
MODE = shared
#MODE = static

# List of sources, all c files by default
SOURCES_ALL.c = $(wildcard *.c)
SOURCES.c = $(SOURCES_ALL.c)
# If you do not want to compile motif_client:, uncomment the following
#SOURCES.c = $(SOURCES_ALL.c:motif_client.c=)

ifeq ($(origin GTX_DEVKIT), undefined)
  GTX_DEVKIT=../..
endif

OS_ARCH := $(subst /,_,$(shell uname -s))
ifneq (,$(findstring CYGWIN,$(OS_ARCH)))
  ARCH = winnt
  ifeq ($(origin GTX_ARCH), undefined)
    GTX_ARCH = winnt
    ifneq (,$(findstring WOW64,$(OS_ARCH)))
      GTX_ARCH = winnt64
    endif
  endif
endif
ifeq ($(OS_ARCH),Linux)
  ARCH = linux
  ifeq ($(origin GTX_ARCH), undefined)
    GCC_VERSION=$(shell gcc_version=`LANG=C gcc -v 2>&1 | sed -n 's/^gcc version \(.\).\(.\).*/\1\2/p'`; if [ $$gcc_version -gt 41 ]; then gcc_version=41; fi; echo $$gcc_version)
    COMPILER=gcc$(GCC_VERSION)
    ifeq ($(shell uname -a | grep x86_64 | wc -l | sed -e "s/ //g"),1)
      GTX_ARCH = linux64-$(COMPILER)
    else
      GTX_ARCH = linux-$(COMPILER)
    endif
  endif
endif

DEF_static =
DEF_shared = -DGTX_DLL

# For Solaris
CC_solaris 		= cc -Xc -v -xarch=v8plusa
CC_OPTS_solaris		= -fast -xarch=v8plusa
CC_OPTS_DEBUG_solaris	= -g
LD_solaris 		= $(CC_solaris)
DEFS_solaris		= $(DEF_$(MODE))
LIBS_solaris		= -L$(GTX_LIB_PATH) -lgtxclient -lsocket -lnsl -lresolv -lc
LIBS_DEBUG_solaris	= -L$(GTX_LIB_PATH) -lgtxclient_debug -lsocket -lnsl -lresolv -lc
GTX_INCLUDES_solaris	= -I$(GTX_DEVKIT)/include
X11_INC_PATH_solaris	= -I/usr/openwin/include
X11_LIB_PATH_solaris	=
XM_INC_PATH_solaris	= -I/usr/dt/include
XM_LIB_PATH_solaris	=
XM_DEFS_winnt           = -DXLIB_ILLEGAL_ACCESS -DXMSTRINGDEFINES -DCTL
X_LIBLIST_solaris	= -lXm -lXt -lX11
LIB_PREFIX_solaris      = lib
EXT_BIN_solaris         =
EXT_LIB_static_solaris  = .a
EXT_LIB_shared_solaris  = .so
OUTPUT_OBJ_solaris      = -o $(GTX_ARCH)/release/$(<:.c=$(OBJ_EXT_$(ARCH)))
OUTPUT_DEBUG_OBJ_solaris= -o $(GTX_ARCH)/debug/$(<:.c=$(OBJ_EXT_$(ARCH)))
OUTPUT_solaris          = -o 
OUTPUT_DEBUG_solaris    = $(OUTPUT_solaris)
OBJ_EXT_solaris         = .o
ifeq ($(GTX_ARCH), solaris64)
CC_solaris 		= cc -Xc -v -xarch=v9
CC_OPTS_solaris		= -fast -xarch=v9
# Add this because solaris 64 bit of libxm was linked using this define
XM_INC_PATH_solaris    += -DSUN_CTL
endif

# For Irix
CC_irix	 		= cc -ansi -n32
CC_OPTS_irix		=
CC_OPTS_DEBUG_irix	= -g
LD_irix 		= $(CC_irix)
DEFS_irix		= $(DEF_$(MODE))
LIBS_irix		= -L$(GTX_LIB_PATH) -lgtxclient
LIBS_DEBUG_irix		= -L$(GTX_LIB_PATH) -lgtxclient_debug
GTX_INCLUDES_irix	= -I$(GTX_DEVKIT)/include
X11_INC_PATH_irix	=
X11_LIB_PATH_irix	=
XM_INC_PATH_irix	=
XM_LIB_PATH_irix	=
XM_DEFS_winnt           = -DXLIB_ILLEGAL_ACCESS -DXMSTRINGDEFINES -DCTL
X_LIBLIST_irix		= -lXm -lXt -lX11
LIB_PREFIX_irix         = lib
EXT_BIN_irix            =
EXT_LIB_static_irix     = .a
EXT_LIB_shared_irix     = .so
OUTPUT_OBJ_irix         = -o $(GTX_ARCH)/release/$(<:.c=$(OBJ_EXT_$(ARCH)))
OUTPUT_DEBUG_OBJ_irix   = -o $(GTX_ARCH)/release/$(<:.c=$(OBJ_EXT_$(ARCH)))
OUTPUT_irix             = -o 
OUTPUT_DEBUG_irix       = $(OUTPUT_irix)
OBJ_EXT_irix            = .o
ifeq ($(GTX_ARCH), irix64)
CC_irix			= cc -ansi -64
endif

# For Linux
CC_linux                = gcc -ansi -m32
CC_OPTS_linux           =
CC_OPTS_DEBUG_linux     = -g
LD_linux 		= gcc -m32
DEFS_linux              = $(DEF_$(MODE)) -D_GNU_SOURCE
LIBS_linux              = -L$(GTX_LIB_PATH) -lgtxclient
LIBS_DEBUG_linux        = -L$(GTX_LIB_PATH) -lgtxclient_debug
GTX_INCLUDES_linux      = -I$(GTX_DEVKIT)/include
X11_INC_PATH_linux      = -I/usr/X11R6/include
X11_LIB_PATH_linux      = -L/usr/X11R6/lib
XM_INC_PATH_linux       = -I$(PROJECT_HOME)/include/openmotif-2.2.3
XM_LIB_PATH_linux       = -L$(PROJECT_HOME)/lib/openmotif-2.2.3/$(GTX_ARCH)/shared
XM_DEFS_winnt           = -DXLIB_ILLEGAL_ACCESS -DXMSTRINGDEFINES -DCTL
X_LIBLIST_linux         = -lXm -lXt -lX11
LIB_PREFIX_linux        = lib
EXT_BIN_linux           =
EXT_LIB_static_linux    = .a
EXT_LIB_shared_linux    = .so
OUTPUT_OBJ_linux        = -o $(GTX_ARCH)/release/$(<:.c=$(OBJ_EXT_$(ARCH)))
OUTPUT_DEBUG_OBJ_linux  = -o $(GTX_ARCH)/debug/$(<:.c=$(OBJ_EXT_$(ARCH)))
OUTPUT_linux            = -o 
OUTPUT_DEBUG_linux      = $(OUTPUT_linux)
OBJ_EXT_linux           = .o
ifeq (linux64, $(firstword $(subst -, ,$(GTX_ARCH))))
X11_LIB_PATH_linux      = -L/usr/X11R6/lib64
CC_linux		= gcc -ansi -m64
LD_linux 		= gcc -m64
endif

# For Windows NT
CC_winnt 		= cl
DEFS_winnt              = /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE"
CC_OPTS_winnt_dsp       = /nologo /MD /W3 /EHsc /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" $(DEF_$(MODE)) $(DEFS_winnt) /FD
CC_OPTS_DEBUG_winnt_dsp	= /nologo /MDd /W3 /Gm /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" $(DEF_$(MODE)) $(DEFS_winnt) /FD
CC_OPTS_winnt           = $(CC_OPTS_winnt_dsp) /Fo"$(GTX_ARCH)\\release\\" /Fd"$(GTX_ARCH)\\release\\"
CC_OPTS_DEBUG_winnt     = $(CC_OPTS_DEBUG_winnt_dsp) /Fo"$(GTX_ARCH)\\debug\\" /Fd"$(GTX_ARCH)\\debug\\"
LD_winnt 		= link
LIBS_winnt		= $(GTXCLIENT_LIB_WINNT) msvcrt.lib wsock32.lib kernel32.lib
LIBS_DEBUG_winnt	= $(GTXCLIENT_LIB_WINNT_DEBUG) msvcrtd.lib wsock32.lib kernel32.lib
GTX_INCLUDES_winnt	= /I $(GTX_DEVKIT)/include
XDK_PATH                = C:/sdk/xdk10
X11_INC_PATH_winnt	= -I$(XDK_PATH)/include
X11_LIB_PATH_winnt	= -libpath:$(XDK_PATH)/lib
XM_INC_PATH_winnt	= /I $(XDK_PATH)/motif21/include
XM_LIB_PATH_winnt	= -libpath:$(XDK_PATH)/motif21/lib
XM_DEFS_winnt           = /D "XLIB_ILLEGAL_ACCESS" /D "NOREDIRECT" /D "XMSTRINGDEFINES" /D "CTL" 
X_LIBLIST_winnt	        = hclxm.lib hclxt.lib xlib.lib
LIB_PREFIX_winnt        =
EXT_BIN_winnt           = .exe
EXT_LIB_static_winnt    = .lib
EXT_LIB_shared_winnt    = .lib
OBJ_EXT_winnt           = .obj
OUTPUT_OBJ_winnt        =
OUTPUT_DEBUG_OBJ_winnt  =
OUTPUT_winnt            = /nologo /subsystem:console /machine:IX86 /nodefaultlib /out:
OUTPUT_DEBUG_winnt      = /nologo /incremental:no /debug $(OUTPUT_winnt)
ifeq ($(GTX_ARCH), winnt64)
XDK_PATH                = C:/sdk/xdk12/x64
OUTPUT_winnt            = /nologo /subsystem:console /machine:amd64 /nodefaultlib /out:
endif

GTX_LIB_PATH = $(GTX_DEVKIT)/lib/$(GTX_ARCH)/$(MODE)

GTX_CLIENT_LIB		= $(GTX_LIB_PATH)/$(LIB_PREFIX_$(ARCH))gtxclient$(EXT_LIB_$(MODE)_$(ARCH))
GTX_CLIENT_LIB_DEBUG    = $(GTX_LIB_PATH)/$(LIB_PREFIX_$(ARCH))gtxclient_debug$(EXT_LIB_$(MODE)_$(ARCH))

      PROGS = $(SOURCES.c:%.c=$(GTX_ARCH)/%$(EXT_BIN_$(ARCH)))
PROGS_DEBUG = $(SOURCES.c:%.c=$(GTX_ARCH)/%_debug$(EXT_BIN_$(ARCH)))
 PROGS_PURE = $(SOURCES.c:%.c=$(GTX_ARCH)/%_pure$(EXT_BIN_$(ARCH)))
      DSPS := $(SOURCES.c:%.c=%.dsp)
      DSPS := $(DSPS:motif_client.dsp=)


# ---------------------------------------------------------------------------
# No modification needed after this line

all: PREREQ $(PROGS)

debug: PREREQ $(PROGS_DEBUG)

pure: PREREQ $(PROGS_PURE)

##
## DSPs and DSW.
##
dsp: all_samples.dsw

all_samples.dsw: $(DSPS)
	@echo "Creating all_samples.dsw..."
	echo "Microsoft Developer Studio Workspace File, Format Version 6.00" > $@; \
	for d in $(DSPS); do \
	PROJ=`echo $$d | sed -e s/.dsp//`; \
	echo "Project: \"$$PROJ\"=.\\$$d - Package Owner=<4>" >> $@; \
	echo "Package=<5>"  >> $@; \
	echo "{{{" >> $@; \
	echo "}}}" >> $@; \
	echo "Package=<4>" >> $@; \
	echo "{{{" >> $@; \
	echo "}}}" >> $@; \
	done; \
	unix2dos $@ >/dev/null 2>&1

# Need to have backslahes in dll name for the copy (DOS command) to work
DEVKIT_BACK=$(subst /,\\,$(GTX_DEVKIT))
GTXCLIENT_LIB_WINNT       = $(DEVKIT_BACK)\\lib\\$(GTX_ARCH)\\shared\\$(LIB_PREFIX_winnt)gtxclient$(EXT_LIB_$(MODE)_winnt)
GTXCLIENT_LIB_WINNT_DEBUG = $(DEVKIT_BACK)\\lib\\$(GTX_ARCH)\\shared\\$(LIB_PREFIX_winnt)gtxclient_debug$(EXT_LIB_$(MODE)_winnt)
GTX_CLIENT_DLL		  = $(GTXCLIENT_LIB_WINNT:lib=dll)
GTX_CLIENT_DLL_DEBUG	  = $(GTXCLIENT_LIB_WINNT_DEBUG:lib=dll)

%.dsp: Makefile dsp.tmpl
	@echo "Creating $@ ..."
	sed -e 's#__TMPL_PROG__#$(@:%.dsp=%)#g' \
	    -e 's#__CPP_RELEASE_FLAGS__#$(CC_OPTS_winnt_dsp) $(GTX_INCLUDES_winnt) /c#g'\
	    -e 's#__LD_RELEASE_FLAGS__#$(LIBS_winnt) $(OUTPUT_winnt)"winnt/$(@:%.dsp=%$(EXT_BIN_winnt))"#g' \
	    -e 's#__LIB_GTXCLIENT_RELEASE__#$(GTX_CLIENT_DLL)#g' \
	    -e 's#__CPP_DEBUG_FLAGS__#$(CC_OPTS_DEBUG_winnt_dsp) $(GTX_INCLUDES_winnt) /c#g'\
	    -e 's#__LD_DEBUG_FLAGS__#$(LIBS_DEBUG_winnt) $(OUTPUT_DEBUG_winnt)"winnt/$(@:%.dsp=%_debug$(EXT_BIN_winnt))"#g' \
	    -e 's#__LIB_GTXCLIENT_DEBUG__#$(GTX_CLIENT_DLL_DEBUG)#g' \
	    < dsp.tmpl > $@; \
	unix2dos $@ >/dev/null 2>&1

clean:
	rm -f $(PROGS) $(PROGS_DEBUG) $(PROGS_PURE) $(GTX_ARCH) *~ *.tmp

PREREQ:
	mkdir -p $(GTX_ARCH)/release
	mkdir -p $(GTX_ARCH)/debug
ifeq ($(ARCH), winnt)
	cp $(subst \\,/,$(GTX_CLIENT_DLL)) $(GTX_ARCH)
	cp $(subst \\,/,$(GTX_CLIENT_DLL_DEBUG)) $(GTX_ARCH)
else
	cp $(GTX_CLIENT_LIB) $(GTX_ARCH)
	if test -f $(GTX_CLIENT_LIB_DEBUG) ; then \
	  cp $(GTX_CLIENT_LIB_DEBUG) $(GTX_ARCH) ; \
	fi
endif

##
## Compile/Link
##
$(GTX_ARCH)/%$(EXT_BIN_$(ARCH)): %.c $(OBJECTS) $(GTX_CLIENT_LIB)
	@echo "Compiling $< ..."
	$(CC_$(ARCH)) -c $(CC_OPTS_$(ARCH)) $(DEFS_$(ARCH)) $(GTX_INCLUDES_$(ARCH)) \
	$($<_COPTS) $< $(OUTPUT_OBJ_$(ARCH))
	@echo "Linking $@ ..."
	$(LD_$(ARCH)) $(GTX_ARCH)/release/$(<:.c=$(OBJ_EXT_$(ARCH))) \
	$($<_LOPTS) $(OUTPUT_$(ARCH))$@ $(LIBS_$(ARCH))

$(GTX_ARCH)/%_debug$(EXT_BIN_$(ARCH)): %.c $(OBJECTS) $(GTX_CLIENT_LIB_DEBUG)
	@echo "Compiling $< ..."
	$(CC_$(ARCH)) -c $(CC_OPTS_DEBUG_$(ARCH)) $(DEFS_$(ARCH)) $(GTX_INCLUDES_$(ARCH)) \
	$($<_COPTS) $< $(OUTPUT_DEBUG_OBJ_$(ARCH))
	@echo "Linking $@ ..."
	$(LD_$(ARCH)) $(GTX_ARCH)/debug/$(<:.c=$(OBJ_EXT_$(ARCH))) $($<_LOPTS) \
	$(OUTPUT_DEBUG_$(ARCH))$@ $(LIBS_DEBUG_$(ARCH))

$(GTX_ARCH)/%_pure$(EXT_BIN_$(ARCH)): %.c $(OBJECTS) $(GTX_CLIENT_LIB_DEBUG)
	@echo "Compiling $< ..."
	purify $(CC_$(ARCH)) -c $(CC_OPTS_DEBUG_$(ARCH)) $(DEFS_$(ARCH)) $(GTX_INCLUDES_$(ARCH)) \
	$($<_COPTS) $< $(OUTPUT_DEBUG_OBJ_$(ARCH))
	@echo "Linking $@ ..."
	$(LD_$(ARCH)) $(GTX_ARCH)/debug/$(<:.c=$(OBJ_EXT_$(ARCH))) $($<_LOPTS) \
	$(OUTPUT_DEBUG_$(ARCH))$@ $(LIBS_DEBUG_$(ARCH))

#
# Special options for Motif client
#
motif_client.c_COPTS = $(XM_INC_PATH_$(ARCH)) $(X11_INC_PATH_$(ARCH)) $(XM_DEFS_$(ARCH))
motif_client.c_LOPTS = $(XM_LIB_PATH_$(ARCH)) $(X11_LIB_PATH_$(ARCH)) $(X_LIBLIST_$(ARCH))
