# +----------------------------------------------------------------------+
# | Aubit 4gl Language Compiler Version $.0                              |
# +----------------------------------------------------------------------+
# | Copyright (c) 2000-1 Aubit Development Team (See Credits file)       |
# +----------------------------------------------------------------------+
# | This program is free software; you can redistribute it and/or modify |
# | it under the terms of one of the following licenses:                 |
# |                                                                      |
# |  A) the GNU General Public License as published by the Free Software |
# |     Foundation; either version 2 of the License, or (at your option) |
# |     any later version.                                               |
# |                                                                      |
# |  B) the Aubit License as published by the Aubit Development Team and |
# |     included in the distribution in the file: LICENSE                |
# |                                                                      |
# | This program is distributed in the hope that it will be useful,      |
# | but WITHOUT ANY WARRANTY; without even the implied warranty of       |
# | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        |
# | GNU General Public License for more details.                         |
# |                                                                      |
# | You should have received a copy of both licenses referred to here.   |
# | If you did not, or have any questions about Aubit licensing, please  |
# | contact afalout@ihug.co.nz                                           |
# +----------------------------------------------------------------------+

#
# $Id: Makefile,v 1.19 2008/11/25 10:19:06 mikeaubury Exp $
#

ROOT		=../../..

#All stuff common to more then one Aubit compiler make file is there:
include ${ROOT}/incl/Makefile-common

## ==================================================================
##                              Options
## ==================================================================

SRC					=esql.ec
SRC_C				=${SRC:.ec=.c}
OBJS				=${SRC_C:.c=.o}

CFLAGS_INFX			+=${CFLAGS} -I.. -I${LIBROOT} -I${ROOT}/compilers/fcompile \
					-I${INFORMIXDIR} -I${INFORMIXDIR}/incl/esql \
					-I$(AUBITDIR)/incl -g ${FPIC}

CFLAGS_NOTINFX			+=${CFLAGS} -I.. -I${LIBROOT} -I${ROOT}/compilers/fcompile \
					-I$(AUBITDIR)/incl -g ${FPIC}

ESQL_INCLPATH		=-I.. -I${LIBROOT} -I${ROOT}/compilers/fcompile \
					-I$(AUBITDIR)/incl ${C_IFLAGS}

ifneq "${INFORMIXDIR}" ""
	ESQL_INCLPATH	+=-I${INFORMIXDIR}
endif

LD_LFLAGS_INFX           =-L$(INFORMIXDIR)/lib -L$(INFORMIXDIR)/lib/esql \
                    -L$(INFORMIXDIR)/lib/cli -g
LD_LFLAGS_NOTINFX        = -g

ifneq "$(findstring esql,${PLUGIN_STATIC})" ""
	
	#Remove any -shared flags and add the -static one:
	SO_LDFLAGS      :=-static $(filter-out -shared,${SO_LDFLAGS})

	#Must include libaubit4gl when linking statically, since statically linked
    #libs cannot have unresolved symbols at link-time. This one still has to be
    #linked in shared mode, since we don't make libaubit4gl.a (Thank God...)
	LD_POSTFLAGS    =-L${LIBROOT} -shared -l${AUBITLIBFULL}

	#Don't know why, but -static flag was not enough, I still got everything
	#linked shared - so we had to explicitly name objects to link statically:
    #(Probably because we use gcc not ldd directly to do linking, and gcc
    #found the -shared flag at the end where we need it for libaubit4gl)

    #Separate Informix from non-informix libraries:
	ONLY_IFX_LIBS   :=$(filter -lif%,${IFX_LIBS})
    NON_IFX_LIBS    :=$(filter-out -lif%,${IFX_LIBS})

    #Change -l notation into full object file name:
	ONLY_IFX_LIBS	:=$(subst -lif,libif,${ONLY_IFX_LIBS})
	ONLY_IFX_LIBS	:=$(addsuffix .a,${ONLY_IFX_LIBS})

    #Seaparate libs in lib/ from libs in lib/esql/
	IFXLIBS_LIB     :=$(filter libifasf.a,${ONLY_IFX_LIBS})
	IFXLIBS_LIB_ESQL:=$(filter-out libifasf.a,${ONLY_IFX_LIBS})

	#Add full path:
	IFXLIBS_LIB		:=$(addprefix $(INFORMIXDIR)/lib/,${IFXLIBS_LIB})
	IFXLIBS_LIB_ESQL:=$(addprefix $(INFORMIXDIR)/lib/esql/,${IFXLIBS_LIB_ESQL})

	#Final result:
	IFX_LIBS		:=${IFXLIBS_LIB} ${IFXLIBS_LIB_ESQL} ${NON_IFX_LIBS} -lifasf
endif


#TODO: remove all this - its obsolete:
ifdef xxxxCOMSPECxxxx
    #since we are using ESQL/C compiler, and then MSVC, this define is not automatic:
	#ESQL_FLAGS		=-D__CYGWIN__ -e
	ESQL_FLAGS		=-e
	# -e, -p          Preprocess only (no compilation or linking).

    #strange things happen to paths when invoking native Windows programs from CygWin make,
    #so we need to use explicit backslash, even though slash is understood by most
    #Windows programs:
	ESQL_INCLPATH	+=-I${LIBROOT} 
	#-I${ROOT}\compilers\fcompile

    #FIXME!!!!! I'm using variable named TMP somewhere!!!!
	#Should be OK now
	#TMP=/cygdrive/d/DOCUME~1/ADMINI~1/LOCALS~1/Temp
    #PWD=
    #export TMP
    #export PWD

	#IFX_CSDK_DIR=/CSDK
	INFORMIXDIR_CSDK	=${INFORMIXDIR_UNQUOTED}${IFX_CSDK_DIR}
	IFX_LIBS="${INFORMIXDIR_CSDK}\bin\isqlt09a.dll"  "${INFORMIXDIR_CSDK}\bin\igl4n304.dll" \
		"${INFORMIXDIR_CSDK}\bin\iglxn304.dll"  "${INFORMIXDIR_CSDK}\bin\igo4n304.dll"

else
#    ESQL_INCLPATH	=-I${LIBROOT} -I${ROOT}/compilers/fcompile
	
endif

ALL				=${PLUGINDIR}/libSQL_esql${SO_EXT}

#C pre-processor flags:
CPP_FLAGS=-I${ROOT}/incl -I.. -P
#-P - line numbers - cpc don't like them
#-C - keep comments

#SAP DB esql pre-compiler flags:
CPC_FLAGS=-H nocheck -c
#-u dba,dba -d TST

#SAP DB esql linker:
CPCLNK=${SAPDBROOT}/interfaces/precompiler/bin/cpclnk

ifneq "${COMSPEC}" ""
	LIBAUBIT4GL=-L${LIBROOT} -l${AUBITLIBFULL}
endif

PGLIBS=-L${ECPG_LIBDIR} ${ECPG_LFLAGS} -lecpg -lecpg_compat -lpgtypes

ifneq "${COMSPEC}" ""
	QUERIX_IFLAGS=-I"${QUERIXDIR}/include"
    #-I"E:/Program files/W2000/QueriX/include"
	QUERIX_LFLAGS=-L"${QUERIXDIR}/lib"
    QUERIX_LIBS="${QUERIXDIR}/lib/libesql.lib" "${QUERIXDIR}/lib/libesql.lib" \
				"${QUERIXDIR}/lib/libfgl.lib"
	#"${QUERIXDIR}/lib/libsqlc.lib"
	#"${QUERIXDIR}/bin/libfgl.dll"
else
	QUERIX_IFLAGS=-I${QUERIXDIR}/incl
	QUERIX_LFLAGS=-L${QUERIXDIR}/lib
    STATIC=-static
    QUERIX_LIBS=-lesql
endif

ifeq "${TARGET_OS}" "solaris"
	ESQL_FLAGS+=${PIC}
endif

ifeq "${TARGET_OS}" "linux"
	ESQL_FLAGS+=${PIC}
endif

ifdef COMSPEC
	#CFLAGS=-g -O2 -Wall -D_REENTRANT -DIFX_THREAD -I../../../incl -I..
	#ESQL_SOMETHING=esql
	ESQL_FLAGS=-thread
	LDFLAGS=
	#IFX_CSDK_DIR=/CSDK
	INFORMIXDIR_CSDK	=${INFORMIXDIR_UNQUOTED}${IFX_CSDK_DIR}
	IFX_LIBS="${INFORMIXDIR_CSDK}\bin\isqlt09a.dll"  "${INFORMIXDIR_CSDK}\bin\igl4n304.dll" \
		"${INFORMIXDIR_CSDK}\bin\iglxn304.dll"  "${INFORMIXDIR_CSDK}\bin\igo4n304.dll"
	LINKLIBS=-L../../ -l${AUBITLIBFULL}
	CFLAGS+=-D_REENTRANT -DIFX_THREAD -I"${INFORMIXDIR_CSDK}\incl\esql"	
endif

ifneq "${COMSPEC}" ""
#PLEASE DO NOT USE HARD-CODED PATHS UNDER --ANY-- CIRCUMSTANCES! IT'S POINTLESS!
#	ECPG_INCDIR			:=c:/progra~1/postgr~1/8.1/include
	ECPG_INCDIR			:=$(shell echo "${ECPG_INCDIR}" | tr '\\' '/')
#$(shell echo "${ECPG_INCDIR}" | tr '\\' '/')
	LIBPQ_FE_H_IFLAGS	:=$(shell echo "${LIBPQ_FE_H_IFLAGS}" | tr '\\' '/')
	ECPG_IFLAGS			:=$(shell echo "${ECPG_IFLAGS}" | tr '\\' '/')
	PGLIBS				:=$(shell echo "${PGLIBS}" | tr '\\' '/')
endif	


.SUFFIXES: .ec .o .c

## ==================================================================
##                              Targets
## ==================================================================

ALL: ${ALL}

#remove this once esql_compatible.ec is finished:

##################
#ESQL/C database plug-in compiled with Informix ESQL/C compiler:
libSQL_esql${SO_EXT}: ${PLUGINDIR}/libSQL_esql${SO_EXT}
${PLUGINDIR}/libSQL_esql${SO_EXT}: ${SRC}
#	cpp ${CPP_FLAGS} $^ -D__IFX__  > ifx_$^
ifneq "${COMSPEC}" ""
#Windows
#	$(ESQL_SOMETHING) $(ESQL_FLAGS) -e $<
	export INFORMIXDIR=${INFORMIXDIR_UNQUOTED} ; \
		${IFMX_ESQLC} $(ESQL_FLAGS) -e $<
	$(CC) $(CFLAGS_INFX) -c $(basename $<).c -o $(basename $<).o
	-@rm $(basename $<).c $(basename $<).c_*
	$(CC) $(LFLAGS_INFX) -mms-bitfields -shared -Wl,--export-all-symbols $(basename $<).o ${IFX_LIBS} ${LINKLIBS} -o $@
else
#UNIX
	export INFORMIXC=${INFORMIXC}; \
		${IFMX_ESQLC} ${CFLAGS}  -g -c $^ ${ESQL_FLAGS}  ${WALL} ${ESQL_INCLPATH} ${C_DFLAGS}
	${LD} ${LD_LFLAGS_INFX} $(SO_LDFLAGS) -g  esql.o ${IFX_LIBS} -o $@ ${LD_POSTFLAGS}
endif


INFOFLEX: ${PLUGINDIR}/libSQL_infoflex${SO_EXT}
${PLUGINDIR}/libSQL_infoflex${SO_EXT}:
	esqlpp esql_infoflex.ec
	sqlcc -c -o esql_infoflex.o esql_infoflex.c
	sqlcc ${LD_LFLAGS_NOTINFX} $(SO_LDFLAGS) -g  esql_infoflex.o -o $@ ${LD_POSTFLAGS}


#------------------------ esql_compatible.ec ----------------------------

##################
#ESQL/C database plug-in compiled with Informix ESQL/C compiler:
#${PLUGINDIR}/libSQL_esqlI${SO_EXT}: ${PLUGINDIR}/libSQL_esqlI${SO_EXT}
${PLUGINDIR}/libSQL_esqlI${SO_EXT}: esql_compatible.ec
	cpp ${CPP_FLAGS} $^ -D__IFX__  > ifx_$^
	export INFORMIXC=${INFORMIXC}; ${IFMX_ESQLC} -c ifx_$^ ${ESQL_FLAGS} \
		${ESQL_INCLPATH} ${C_DFLAGS}
	${LD} ${LD_LFLAGS_INFX} $(SO_LDFLAGS) ifx_esql.o ${IFX_LIBS} -o $@ ${LD_POSTFLAGS}

##################
#Querix ESQL/C compiler:
#HEAD= > /tmp/scr.scr 2>&1; head /tmp/scr.scr
HEAD_NOWARN= 2>&1 | grep -v "warning:" | grep -v "In function" > /tmp/scr.scr ; head /tmp/scr.scr
BREAK=@exit 1
#${PLUGINDIR}/libSQL_esqlQ${SO_EXT}: ${PLUGINDIR}/libSQL_esqlQ${SO_EXT}
${PLUGINDIR}/libSQL_esqlQ${SO_EXT}: esql_compatible.ec
##must remove .c file or .ec will not get recompiled
	rm -f q_$(basename $<).c
	cpp ${CPP_FLAGS} $^ -D__QUERIX__ -D__QUERIX_FIX__ > q_$^
##-DNEWERA
#need quotes because of the path on Windows
	"${Q_ESQLC}" q_$^ ${HEAD}
#	${BREAK}
	${CC} -g -c q_$(basename $<).c -o q_$(basename $<).o -I${ROOT}/incl ${QUERIX_IFLAGS} ${HEAD_NOWARN}
#	${BREAK}
	${CC} -shared -g q_$(basename $<).o -o $@ ${QUERIX_LFLAGS} ${QUERIX_LIBS}
#	rm -f q_$(basename $<).c

##################
#SAP DB ESQL/C compiler:
PRECIOUS : sap_esql_compatible.ec.o
#${PLUGINDIR}/libSQL_esqlSAP${SO_EXT}: ${PLUGINDIR}/libSQL_esqlSAP${SO_EXT}
${PLUGINDIR}/libSQL_esqlSAP${SO_EXT}: esql_compatible.ec
#cpc will allways add .cpc extension to any source files
	cpp ${CPP_FLAGS} $^ -D__SAP__  -I${SAPDBROOT}/interfaces/precompiler/incl > sap_$^.cpc
	${SAPDB_ESQLC} ${CPC_FLAGS} sap_$^ -I${ROOT}/incl 2>&1
	${CC} -c ${SAPDB_INCDIR} -I${ROOT}/incl -o sap_$^.o sap_$^.c
#-I${SAPDBROOT}/interfaces/precompiler/incl
#	rm sap_$^.cpc
#	${CPCLNK} -shared sap_esql_compatible.ec.o
	${CC} -shared sap_$^.o -o $@ ${SAPDB_LIBDIR} -lpcrl -lsqlca -ldl
#-L${SAPDBROOT}/interfaces/precompiler/lib

##################
#PostgreSQL ESQL/C compiler:
#${PLUGINDIR}/libSQL_esqlPG${SO_EXT}: ${PLUGINDIR}/libSQL_esqlPG${SO_EXT}
${PLUGINDIR}/libSQL_esqlPG${SO_EXT}: esql_compatible.ec

#	cpp ${CPP_FLAGS} $^ -D__PG__ -D__PG_FIX__ -I/opt/ecpg-cvs/include > pg_$^
	cpp ${CPP_FLAGS} $^ -D__PG__ -D__PG_FIX__ ${PGSQL_INCLUDE} > pg_$^
#	${PG_ESQLC} -I/opt/ecpg-cvs/include -C INFORMIX -t pg_$^
	${PG_ESQLC} ${PGSQL_INCLUDE} -C INFORMIX -t pg_$^
#	${CC} ${STATIC} -g --shared $^ -o $@ ${PGLIBS} ${LIBAUBIT4GL}

##################
#Plexus also has esql/c compiler (c:\xdp32\esqlc.exe)


###################
#Simple Informix ESQL/C plug-in, based on 'simple' template
#FIXME: does not compile
#FIXME: Not sure what is this good for, when we already have working one?
#${PLUGINDIR}/libSQL_c_esql${SO_EXT}: ${PLUGINDIR}/libSQL_c_esql${SO_EXT}
${PLUGINDIR}/libSQL_c_esql${SO_EXT}: esql_simple_infx.ec
	export INFORMIXC=${INFORMIXC}; ${IFMX_ESQLC} -c $^ ${ESQL_FLAGS} ${ESQL_INCLPATH} ${C_DFLAGS}
	${LD} ${LD_LFLAGS_NOTINFX} $(SO_LDFLAGS) $(basename $<).o ${IFX_LIBS} -o $@ ${LD_POSTFLAGS}


###################
#Simple PG - ecpg NOT in Informix compatible mode!!! Based on 'simple' template
#INTENDED TO be used for 4glc to resolve variables define as LIKE when compiling to 
#EC with POSTGRES dialect - DOES NOT HAVE IMPLEMENTED FULL FUNCTIONALITY OF
#DRIVER NEEDED TO RUN PROGRAMS.
#Seems abandoned - see postgresql/simple.c
#${PLUGINDIR}/libSQL_c_ecpg${SO_EXT}: ${PLUGINDIR}/libSQL_c_ecpg${SO_EXT}
libSQL_c_ecpg: ${PLUGINDIR}/libSQL_c_ecpg${SO_EXT}
${PLUGINDIR}/libSQL_c_ecpg${SO_EXT}: esql_simple_ecpg.ec
#	LD_RUN_PATH=${LD_RUN_PATH}:${POSTGRESDIR}/lib; export LD_RUN_PATH
	${PG_ESQLC} -ct $^
	${CC} -I$(ECPG_INCDIR) ${CFLAGS_NOTINFX} -c -I. -I.. -I${ROOT}/incl  ${LIBPQ_FE_H_IFLAGS} \
		${ECPG_IFLAGS} $(basename $<).c -o $(basename $<).o
	${CC} ${CFLAGS_NOTINFX} -shared -o $@ $(basename $<).o -L${LIBROOT} ${PGLIBS} ${LIBAUBIT4GL}

test_ecpg_config:
	echo pg_esqlc=${PG_ESQLC} 
	echo ECPG_INCDIR=${ECPG_INCDIR} 
	echo CFLAGS=${CFLAGS} 
	echo ECPG_IFLAGS=${ECPG_IFLAGS} 

## ==================================================================
##                              Sub-Targets
## ==================================================================

#Debugging: show current settings od make variables
show:
ifdef COMSPEC
	@echo "---------------------- Output of 'set' ----------------------------"
	set
	@echo "---------------------- Above: output of 'set' ----------------------------"
endif
	@echo "ONLY_IFX_LIBS=${ONLY_IFX_LIBS}"
	@echo "IFXLIBS_LIB=${IFXLIBS_LIB}"
	@echo "IFXLIBS_LIB_ESQL=${IFXLIBS_LIB_ESQL}"
	@echo "NON_IFX_LIBS=${NON_IFX_LIBS}"
	@echo "INFORMIXDIR=${INFORMIXDIR}"
ifdef COMSPEC
	@echo "INFORMIXDIR from set=`set | grep INFORMIXDIR`"
endif
	@echo "INFORMIXDIR_CSDK=${INFORMIXDIR_CSDK}"
	@echo "INFORMIXDIR_UNQUOTED=${INFORMIXDIR_UNQUOTED}"
	@echo "IFX_CSDK_DIR=${IFX_CSDK_DIR}"
	@echo "IFX_LIBS=${IFX_LIBS}"

## ==================================================================
##                              Clean
## ==================================================================

clean:
	${RM} *.o  *.bak *.c *.obj *.c_ *.a *.dll *.lnk *.map *.exp \
	*.lib .\#* ifx_* pg_* sap_* q_* ${PLUGINDIR}/libSQL_esql${SO_EXT} \
    	${PLUGINDIR}/libSQL_esqlPG${SO_EXT} ${PLUGINDIR}/libSQL_esqlSAP${SO_EXT} \
	${PLUGINDIR}/libSQL_esqlI${SO_EXT} \
	${PLUGINDIR}/libSQL_esqlQ${SO_EXT} \
	${PLUGINDIR}/libSQL_c_esql${SO_EXT}  \
	${PLUGINDIR}/libSQL_c_ecpg${SO_EXT} \
	*.pcl *.lst *~ ${ALL}

#------------------------------- EOF -------------------------------
