# +----------------------------------------------------------------------+
# | 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.11 2010/10/27 19:42:03 mikeaubury Exp $
#

ROOT		=../../..

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

.PHONY: all clean 

## ==================================================================
##                              GTK+ Options
## ==================================================================

CFLAGS+=-g ${GTK_INC_PATH} ${GTK_LIB_PATH}

ifeq "${WIN_PATH}" "1"
#ifeq "" "$(findstring cygdrive,${GTK_INC_PATH})"
ifeq "" "$(findstring :,${GTK_INC_PATH})"
#GTK installed inside CygWin tree - need to translate to Windows path
	#under cygwin path /usr/lib/ is actailly a symling to /lib, but "real" Windows
	#app (like MingGW) don't know anythign about links! So for now we will add path to
	#there.   -ID:/cygwin/usr/lib/glib-2.0/include
	ADD_ME		=-I${WIN_CYGPATH}/lib/glib-2.0/include \
					-I${WIN_CYGPATH}/lib/gtk-2.0/include
	GLIB_CFLAGS		:=$(subst -I,-I${WIN_CYGPATH},${GLIB_CFLAGS}) ${ADD_ME}
	GTK_INC_PATH	:=$(subst -I,-I${WIN_CYGPATH},${GTK_INC_PATH}) ${ADD_ME}
	GTK_LIB_PATH	:=$(subst -L,-L${WIN_CYGPATH},${GTK_LIB_PATH}) -L${WIN_CYGPATH}/lib
endif
#endif
endif

GTKLIBS			:=$(subst -rdynamic,,${GTKLIBS}) 

#Need to find better sollution for this:
#dropline.net and other installers have -lintl, but zip has -lintl-1
#ifeq "${HOSTNAME}" "istation"
#	GTKLIBS			:=$(subst -lintl,-lintl-1,${GTKLIBS})
#endif

CFLAGS				+=-I.. -I. -I${ROOT}/incl ${GLIB_CFLAGS} ${GTK_INC_PATH} \
					${GTK_LIB_PATH} -I/usr/local/include/ncurses -I/usr/local/include

CFLAGS				:=$(subst /target/build,/usr,${CFLAGS})
GTK_LIB_PATH   		:=$(subst /target/build,/usr,${GTK_LIB_PATH})

CFLAGS		 		:=$(subst /target,/usr,${CFLAGS})
CFLAGS				+=${PIC}
GTK_LIB_PATH 		:=$(subst /target,/usr,${GTK_LIB_PATH})

#-mms-bitfields or -fnative-struct

ifeq "${WIN_PATH}" "1"
ifeq "" "$(findstring :,${GTK_LIB_PATH})"
	GTK_LIB_PATH 	:=$(subst -L,-L${WIN_CYGPATH},${GTK_LIB_PATH})  -L${WIN_CYGPATH}/lib
endif
endif

#we don't want -Wall in CFLAGS when compiling form_x_xdr.c because it would
#give us bunch of warnings about unised varibles, that we cannot fix
#because this file is generated by rpcgen:
CFLAGS_FORM_X_XDR_C =$(CFLAGS:%-Wall=%)

# We don't want -Wmissing-declarations and -Wmissing-prototypes when
# compiling C code created by 4glc, since it is not creating prototypes,
# so we get lots of warnings:
CFLAGS_4GLC2 		=$(CFLAGS:%-Wmissing-declarations=%)
CFLAGS_4GLC1 		=$(CFLAGS_4GLC2:%-Wmissing-prototypes=%)
CFLAGS_4GLC 		=$(CFLAGS_4GLC1:%-Wstrict-prototypes=%)

#we cannot compile GTK code with  -Wstrict-prototypes because
#GTK+ supplied libraries have many functions declared without parameters
CFLAGS_GTK_C 		=$(CFLAGS:%-Wstrict-prototypes=%)

#Fails with error: initializer element is not computable at load time:
ifeq "${NON_PEDANTIC_OK}" "1"
	CFLAGS_4GLC 	:=$(CFLAGS_4GLC:%-pedantic=%)
endif

ifeq "${GTKBUILD}" "yes"
	ALL				+=${PLUGINDIR}/libUI_HL_GTK${SO_EXT}
endif

## ==================================================================
##                              Curses Options
## ==================================================================

PDCURSESX_CFLAGS	=${XCURSES_CFLAGS} -DXCURSES -I${ROOT}/incl -I.. \
	${CWARN} -DSRC_TREE -DDEBUG -DHAVE_CONFIG_H
	
ifneq "${HAVE_CURSES}" "0"
	ALL					+=${PLUGINDIR}/libUI_HL_TUI${SO_EXT} ${PLUGINDIR}/libUI_HL_TUIN${SO_EXT}
	#CURSES_INC_PATH must be BEFORE system paths:
	#Note: On CygWin term.h is in -I/usr/include/ncurses
	CFLAGS				:=${CURSES_INC_PATH} -I/usr/include/ncurses ${CFLAGS}
else
	ifneq "${HAVE_PDCURSES}" "0"
		ALL				+=${PLUGINDIR}/libUI_HL_TUIN${SO_EXT}
		DO_PDCURSES		=1
	endif
	ifneq "${HAS_PDCURSES_STATIC_OBJS}" "0"
		ALL				+=${PLUGINDIR}/libUI_HL_TUINs${SO_EXT}
		ALL				+=${PLUGINDIR}/libUI_HL_TUIw${SO_EXT}
		DO_PDCURSES		=1
	endif
		
	ifeq "${DO_PDCURSES}" "1"
		CURSES_LIB_PATH	=${PD_CURSES_LIB_PATH}
		CURSES_INC_PATH	=${PD_CURSES_INC_PATH}
		CURSES_LIB_NAME	=${PD_CURSES_LIB_NAME}

		ifeq "${WIN_PATH}" "1"
			#CURSES_LIB_PATH 	:=$(subst -L/cygdrive/d,-Ld:,${CURSES_LIB_PATH})
			#CURSES_INC_PATH 	:=$(subst -I/cygdrive/d,-Id:,${CURSES_INC_PATH})
			#CURSES_LIB_NAME 	:=$(subst /cygdrive/d,d:,${CURSES_LIB_NAME})
			CURSES_LIB_PATH 	:=$(subst -L${PD_CURSES_CYGDRIVE},-L${PD_CURSES_DRIVE}:,${CURSES_LIB_PATH})
			CURSES_INC_PATH 	:=$(subst -I${PD_CURSES_CYGDRIVE},-I${PD_CURSES_DRIVE}:,${CURSES_INC_PATH})
			CURSES_LIB_NAME 	:=$(subst ${PD_CURSES_CYGDRIVE},${PD_CURSES_DRIVE}:,${CURSES_LIB_NAME})
			#CURSES_LIB_NAME 	:=$(subst /cygdrive/d,d:,${CURSES_LIB_NAME}) d:/pdc25_vc_w32/panel.lib
			#CURSES_LIB_NAME=d:/pdc25_vc_w32/curses.dll d:/pdc25_vc_w32/panel.lib
		endif

		#CURSES_INC_PATH must be BEFORE system paths:
		CFLAGS			:=${CURSES_INC_PATH} ${CFLAGS}
	endif
endif

CFLAGS					+=-I.. -I. -I${ROOT}/incl

ifeq "${NON_PEDANTIC_OK}" "1"
	CFLAGS_NO_PEDANTIC  =$(CFLAGS:%-pedantic=%)
else
	CFLAGS_NO_PEDANTIC  =${CFLAGS}
endif

CURSES_LIB_NAME_NO_FORM	=$(CURSES_LIB_NAME:%-lform=%)

## ==================================================================
##                              Common Options
## ==================================================================


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

CFLAGS			+=-g -I${ROOT}/incl -I.. -I${LIBROOT}/libaubit4gl

## ==================================================================
##                              Source files
## ==================================================================

OBJS	=forms.o generic_ui.o menu.o display_array.o formcntrl.o input_array.o common_hlui.o misc.o 
OBJS2	=lowlevel_tui.o width_narrow.o
OBJS4	=lowlevel_tui_noform_wide.o form_tui.o width_wide.o
OBJS5	=lowlevel_gtk.o widget_gtk.o menu_gtk.o width_narrow.o

LIBS3	=-lpanel_g -lncurses_g -lgpm

PDCURSES_OBJ		=lowlevel_tui_noform.o form_tui.o width_narrow.o
PDCURSESX_OBJ		=lowlevel_tui_noformX.o form_tuiX.o width_narrow.o

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

all: a4gl_API_lowlevel.h ${ALL}
	@echo "Default trgets (${ALL}) compiled sucessfuly."


#What was this is should it be removed completely? Mike?
#${LIBROOT}/libUI_HLGENERIC${SO_EXT}: $(OBJS) API_lowlevel.o
#	gcc -L${ROOT}/lib -rdynamic -shared $(OBJS) API_lowlevel.o -o $@ -l${AUBITLIBFULL}
#	${LD} ${SO_LDFLAGS} -o $@ $^ ${LINKLIBS}

#Standard Curses based plug-in
#${PLUGINDIR}/libUI_HL_TUI${SO_EXT}: ${PLUGINDIR}/libUI_HL_TUI${SO_EXT}
${PLUGINDIR}/libUI_HL_TUI${SO_EXT}:  $(OBJS) ${OBJS2} 
	${LD} ${CURSES_LIB_PATH} ${SO_LDFLAGS} -o $@ $(OBJS) ${OBJS2} \
		${LINKLIBS} ${CURSES_LIB_NAME} 

TUIw: ${PLUGINDIR}/libUI_HL_TUIw${SO_EXT}

#PDcurses with libform from CygWin added
libUI_HL_TUIw${SO_EXT}: ${PLUGINDIR}/libUI_HL_TUIw${SO_EXT}
${PLUGINDIR}/libUI_HL_TUIw${SO_EXT}: $(OBJS) lowlevel_tui_win32.o width_narrow.o
	${LD} ${CURSES_LIB_PATH} ${SO_LDFLAGS} -o $@ $(OBJS) lowlevel_tui_win32.o width_narrow.o \
		${LINKLIBS} -L$(ROOT)/tools/cygwin/libform -lform ${CURSES_LIB_NAME} 

#PDcurses with libform from CygWin added - STATICALLY linked
libUI_HL_TUIws${SO_EXT}: ${PLUGINDIR}/libUI_HL_TUIws${SO_EXT}
${PLUGINDIR}/libUI_HL_TUIws${SO_EXT}: $(OBJS) lowlevel_tui_win32.o width_narrow.o
	${LD} ${CURSES_LIB_PATH} ${SO_LDFLAGS} -o $@ $(OBJS) lowlevel_tui_win32.o width_narrow.o \
		${LINKLIBS} -L$(ROOT)/tools/cygwin/libform -lform_g ${CURSES_LIB_NAME} 

#TUI mode plug-in with Aubit's own implementation of Curses libform
#This also enables PDcurses to be used instead of Ncurses, since PDcurses have 
#no libform implementation (PDcurses are only Curses implementation available for Windows)
libUI_HL_TUIN${SO_EXT}: ${PLUGINDIR}/libUI_HL_TUIN${SO_EXT}
${PLUGINDIR}/libUI_HL_TUIN${SO_EXT}: $(OBJS) ${PDCURSES_OBJ}
	${LD} ${CURSES_LIB_PATH} ${SO_LDFLAGS} -o $@ $(OBJS) ${PDCURSES_OBJ} \
		${LINKLIBS} ${CURSES_LIB_NAME_NO_FORM}  

#Statically linked TUIN
libUI_HL_TUINs${SO_EXT}: ${PLUGINDIR}/libUI_HL_TUINs${SO_EXT}
${PLUGINDIR}/libUI_HL_TUINs${SO_EXT}: $(OBJS) ${PDCURSES_OBJ}
	${LD} ${CURSES_LIB_PATH} ${SO_LDFLAGS} -o $@ $(OBJS) ${PDCURSES_OBJ} \
		${LINKLIBS} ${PD_CURSES_LIB_NAME}

#Debug version of TUIN, using debug library libpanel_g
libUI_HL_TUIN-DEBUG${SO_EXT}: ${PLUGINDIR}/libUI_HL_TUIN-DEBUG${SO_EXT}
${PLUGINDIR}/libUI_HL_TUIN-DEBUG${SO_EXT}: $(OBJS) ${PDCURSES_OBJ}
	${LD} ${CURSES_LIB_PATH} ${SO_LDFLAGS} -o $@ $(OBJS) ${PDCURSES_OBJ} \
		${LINKLIBS} ${LIBS3}

#Not shure what this is? Mike?
libUI_HL_TUINW${SO_EXT}: ${PLUGINDIR}/libUI_HL_TUINW${SO_EXT}
${PLUGINDIR}/libUI_HL_TUINW${SO_EXT}: $(OBJS) ${OBJS4}
	${LD} ${CURSES_LIB_PATH} ${SO_LDFLAGS} -o $@ $(OBJS) ${OBJS4} ${LINKLIBS} \
		-L/usr/local/widec/lib -static -lpanelw_g -lncursesw_g

#TUI linked with Xcurses from PDcurses
#
#To use XCurses with an existing curses program, you need to make one
#      change to your code:
#      Call XCursesExit() just before exiting from your program. eg.
#     
#     #ifdef XCURSES
#      XCursesExit();
#     #endif
#      exit(0);
#     
#      This call is required to enable the child X process to shut down cleanly
#      and free up the shared memory it used.
#
#${PLUGINDIR}/libUI_HL_TUIX${SO_EXT}: ${PLUGINDIR}/libUI_HL_TUIX${SO_EXT}
${PLUGINDIR}/libUI_HL_TUIX${SO_EXT}: CFLAGS=${PDCURSESX_CFLAGS}
${PLUGINDIR}/libUI_HL_TUIX${SO_EXT}: $(OBJS) ${PDCURSESX_OBJ} 
	${LD} ${SO_LDFLAGS} -o $@ $(OBJS) ${PDCURSESX_OBJ} ${LINKLIBS} \
		${XCURSES_LIBS} -lXpanel
	
	
#Standard GTK+ based plug-in
#${PLUGINDIR}/libUI_HL_GTK${SO_EXT}: ${PLUGINDIR}/libUI_HL_GTK${SO_EXT}
${PLUGINDIR}/libUI_HL_GTK${SO_EXT}: $(OBJS) ${OBJS5}
	${LD} ${GTK_LIB_PATH} ${SO_LDFLAGS} ${PIC} -o $@ $(OBJS) ${OBJS5} \
		${LINKLIBS} ${GTKLIBS} ${RDYNAMIC} -L/opt/gnome/lib  ${GTKLIBS}

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

#API_lowlevel.c: ${LIBROOT}/libaubit4gl/API_lowlevel.spec API_lowlevel.h a4gl_API_lowlevel.h
#	(cd ${LIBROOT}/libaubit4gl && ${SH} ../bin/dlmagic ./API_lowlevel.spec > ../libui/ui_highlevel/API_lowlevel.c)

#so is it now only this one, or...
a4gl_API_lowlevel.h: ${LIBROOT}/libaubit4gl/API_lowlevel.spec
	${SH} ${LIBROOT}/bin/dlmagic $^ -h > $@

width_narrow.o: width.c
	${CC} -DNO_WIDEC  ${CFLAGS} -c -o $@ $^

width_wide.o: width.c
	${CC} -DWIDEC  ${CFLAGS} -c -o $@ $^

lowlevel_tui.o: lowlevel/lowlevel_tui.c a4gl_API_lowlevel.h
	${CC} ${CFLAGS} -I$(ROOT)/incl -I. -Ilowlevel -c -o $@ $<

lowlevel_tui_win32.o: lowlevel/lowlevel_tui.c a4gl_API_lowlevel.h
	${CC} ${CFLAGS} -I$(ROOT)/tools/cygwin/libform -I$(ROOT)/incl -I. -Ilowlevel  -c -o $@ $<

lowlevel_thin.o: lowlevel/lowlevel_thin.c
	${CC} ${CFLAGS} -I$(ROOT)/incl -I. -Ilowlevel -c -o $@ $^

lowlevel_tui_noform.o: lowlevel/lowlevel_tui.c a4gl_API_lowlevel.h
	${CC} ${CFLAGS} -DNO_CURSES_FORM -I$(ROOT)/incl -I. -Ilowlevel -c -o $@ $<

lowlevel_tui_noformX.o: lowlevel/lowlevel_tui.c
#Cant use warning flags here - xcurses headers produce flood of warnings 
#and there is nothing we can do about it ...
	${CC} $(filter-out ${CWARN},${PDCURSESX_CFLAGS}) -DNO_CURSES_FORM -Ilowlevel -I.  -c -o $@ $^
	
lowlevel_tui_noform_wide.o: lowlevel/lowlevel_tui.c
	${CC} ${CFLAGS} -DWIDEC -DNO_CURSES_FORM -c -I$(ROOT)/incl -I. -Ilowlevel -c -o $@ $^

form_tui.o: lowlevel/form_tui.c
	${CC} ${CFLAGS} -c -I$(ROOT)/incl -I. -Ilowlevel -c -o $@ $^

form_tuiX.o: lowlevel/form_tui.c
#Cant use warning flags here - xcurses headers produce flood of warnings 
#and there is nothing we can do about it ...
#NOTE: we still get some warnings here from PDcurses headers
	${CC} $(filter-out ${CWARN},${PDCURSESX_CFLAGS}) -DNO_CURSES_FORM -c -Ilowlevel -I. $^ -o $@

lowlevel_gtk.o: lowlevel/lowlevel_gtk.c a4gl_API_lowlevel.h
	${CC} ${CFLAGS_GTK_C} -c -I$(ROOT)/incl -I. -Ilowlevel $< -o $@ $(GTK_INC_PATH)

widget_gtk.o: lowlevel/widget_gtk.c
	${CC} ${CFLAGS_GTK_C} -c -I$(ROOT)/incl -I. -Ilowlevel $^ -o $@ $(GTK_INC_PATH)

menu_gtk.o: lowlevel/menu_gtk.c
	${CC} ${CFLAGS_GTK_C} -c -I$(ROOT)/incl -I../../../common/dataio -I. \
		-Ilowlevel $^ -o $@ $(GTK_INC_PATH)

## ==================================================================
##                              Dependencies
## ==================================================================

#Rule to generate API's:
${ROOT}/incl/a4gl_API_%.h :
	${MAKE} -C ${LIBROOT}/libaubit4gl api

${OBJS} :  a4gl_API_lowlevel.h

## ==================================================================
##                              Test
## ==================================================================

testit:  $(OBJS) testit.o API_lowlevel.o
	${CC} ${CURSES_LIB_PATH} -L${ROOT}/lib $^  -o testit -l${AUBITLIBFULL} ${CURSES_LIB_NAME} 

show:
	@echo "LINKLIBS=${LINKLIBS}"
	@echo "GTK_LIB_PATH=${GTK_LIB_PATH}" 
	@echo "GTKLIBS=${GTKLIBS}"
	@echo "CFLAGS_GTK_C=${CFLAGS_GTK_C}"
	@echo "CFLAGS=${CFLAGS}"
	@echo "HAVE_CURSES=${HAVE_CURSES}"
	@echo "CURSES_LIB_PATH=${CURSES_LIB_PATH}"
	@echo "CURSES_INC_PATH=${CURSES_INC_PATH}"
	@echo "CURSES_LIB_NAME=${CURSES_LIB_NAME}"
	@echo "HAVE_PDCURSES=${HAVE_PDCURSES}"	
	@echo "PD_CURSES_LIB_PATH=${PD_CURSES_LIB_PATH}"
	@echo "PD_CURSES_INC_PATH=${PD_CURSES_INC_PATH}"
	@echo "PD_CURSES_LIB_NAME=${PD_CURSES_LIB_NAME}"
	@echo "WIN_PATH=${WIN_PATH}"
	@echo "PD_CURSES_CYGDRIVE=${PD_CURSES_CYGDRIVE}"
	@echo "PD_CURSES_DRIVE=${PD_CURSES_DRIVE}"
	@echo "HAS_PDCURSES_STATIC_OBJS=${HAS_PDCURSES_STATIC_OBJS}"
	@echo "DO_PDCURSES=${DO_PDCURSES}"	
	@echo "XCURSES_CFLAGS=${XCURSES_CFLAGS}"
	@echo "XCURSES_LIBS=${XCURSES_LIBS}"
	@echo "PLUGINDIR=${PLUGINDIR}"
	@echo "AUBIT_SRC_ROOT=${AUBIT_SRC_ROOT}"
	
## ==================================================================
##                              Clean
## ==================================================================

cleanish: clean.capi
	${RM} *${SO_EXT} *.o *.bak testit API_lowlevel.c API_lowlevel.h \
	lowlevel/*.bak remote_client/*.o 

clean: cleanish
	${RM} ${PLUGINDIR}/libUI_HL_GTK${SO_EXT} \
		${PLUGINDIR}/libUI_HL_TUI${SO_EXT} \
		${PLUGINDIR}/libUI_HL_TUIN${SO_EXT} \
		${PLUGINDIR}/libUI_HL_TUIN-DEBUG${SO_EXT} \
		${PLUGINDIR}/libUI_HL_TUINW${SO_EXT} \
		${PLUGINDIR}/libUI_HL_TUINs${SO_EXT} \
		${PLUGINDIR}/libUI_HL_TUIX${SO_EXT} \
		${PLUGINDIR}/libUI_HL_TUIw${SO_EXT} \
		${PLUGINDIR}/libUI_HL_TUIws${SO_EXT} 

clean_hl_tui : cleanish
		${RM} ${PLUGINDIR}/libUI_HL_TUI${SO_EXT} 

clean_hl_tuiw : cleanish
		${RM} ${PLUGINDIR}/libUI_HL_TUIw${SO_EXT} 

clean_hl_tuiws : cleanish
		${RM} ${PLUGINDIR}/libUI_HL_TUIws${SO_EXT} 

clean_hl_tuin : cleanish
		${RM} ${PLUGINDIR}/libUI_HL_TUIN${SO_EXT} 

clean_hl_tuins : cleanish
		${RM} ${PLUGINDIR}/libUI_HL_TUINs${SO_EXT} 

clean_hl_tuind : cleanish
		${RM} ${PLUGINDIR}/libUI_HL_TUIN-DEBUG${SO_EXT} 

clean_hl_tuinw : cleanish
		${RM} ${PLUGINDIR}/libUI_HL_TUIw${SO_EXT} 

clean_hl_tuix : cleanish
		${RM} ${PLUGINDIR}/libUI_HL_TUIX${SO_EXT} 

clean_hl_gtk : cleanish
		${RM} ${PLUGINDIR}/libUI_HL_GTK${SO_EXT} 

## ==================================================================
##                     CORBA/ORBit settings
## ==================================================================

IDLMAGIC		=${LIBROOT}/bin/idlmagic
ifeq "${HAS_ORBIT_TYPE}" "2"
	#CAPI_CFLAGS=$(shell pkg-config ORBit-2.0 ORBit-CosNaming-2.0 --cflags)
	#CAPI_LDFLAGS=$(shell pkg-config ORBit-2.0 ORBit-CosNaming-2.0 --libs)
else
	#there is apparently no diff between client and server targets:
	#CAPI_CFLAGS=$(shell orbit-config --cflags client)
	#CAPI_LDFLAGS=$(shell orbit-config --libs client)
endif
#ORBIT_NAME		=ORBit-2.0
#ORBIT_VERSION	=2.6.3
#ORBIT_CONFIG		=

ifneq "${TARGET_OS}" "hpux"
	ifneq "${TARGET_OS}" "cygwin"
		ifneq "${GCC_MINGW}" "yes"
            #all platforms except HP-UX, CygWin and MinGW:
			LINK_LIBS_SERVER           =-ldl -lm
		endif
	endif
else
            #HP-UX only:
			LINK_LIBS_SERVER           =-lcl -lm -lnsl
endif

#this would actually applies to WHOLE makefile not just from this point down
#and it caused UI_HL_GTK to fail when using GTK2 on armada
#CFLAGS	:=${CAPI_CFLAGS} ${CFLAGS}
#-D__CAPI__

#Names of all Aubit interfaces to create CORBA APIs and cleants/servers for:
API_NAMES		=sqlparse
API_NAMES_UP	=${shell  echo "${API_NAMES}" | tr a-z A-Z   }

CLIENTS			=$(foreach api_name,${API_NAMES},lib${api_name}_CLIENT${SO_EXT})
SERVERS			=$(foreach api_name,${API_NAMES},${api_name}-server${EXE_EXT})

#Functions needed to pupport dlopen of 'real' plug-in on SERVER side"
#A4GL_dl_openlibrary A4GL_find_func_allow_missing A4GL_find_func - libaubit4gl/calldll.c
#acl_getenv - resource/resource.c
#A4GL_exitwith - libaubit4gl/error.c

DLOPEN_SUPPORT= ${LIBROOT}/libaubit4gl/calldll.o \
				${LIBROOT}/resource/resource.o \
				${LIBROOT}/libaubit4gl/error.o \
				${LIBROOT}/libaubit4gl/pointers.o 

#Prevent 'make' from deleting our intermedate files:
.SECONDARY:

## ==================================================================
##                        CORBA/ORBit targets
## ==================================================================

#######################################
#Create all Aubit CORBA clients and servers
capi: clean.capi capi.clients capi.servers
	@echo "CORBA API clients/servers created:"
	@echo "${CLIENTS} ${SERVERS}"


#######################################
#Create all Aubit CORBA clients (plug-ins)
capi.clients: ${CLIENTS}
	@echo "CORBA API clients created:"
	@echo "${CLIENTS}"

#######################################
#Create all Aubit CORBA servers (executables that load 'real' plug-ins)
capi.servers: ${SERVERS}
	@echo "CORBA API servers created:"
	@echo "${SERVERS}"

######################################
#Create Aubit CORBA plug-in for % API
lib%_CLIENT${SO_EXT}: CFLAGS:=${CAPI_CFLAGS} ${CFLAGS} -D__CAPI__ 
lib%_CLIENT${SO_EXT}: CAPI_%-common.o CAPI_%-stubs.o CAPI_%-client.o \
	CLIENT_corba_server_util.o
	${LD} ${SO_LDFLAGS} ${CAPI_LDFLAGS} -o $@ $^
	cp $@ ${LIBROOT}/lib${shell echo "$*" | tr a-z A-Z }_CLIENT${SO_EXT}
	@echo "Created: ${LIBROOT}/lib${shell echo "$*" | tr a-z A-Z }_CLIENT${SO_EXT}"


#######################################
#Create Aubit plug-in CORBA server for % API
%-server${EXE_EXT}: CFLAGS:=${CAPI_CFLAGS} ${CFLAGS} -D__CAPI__
%-server${EXE_EXT}: CAPI_%-common.o CAPI_%-skels.o CAPI_%-skelimpl.o \
	CAPI_%-server.o ${DLOPEN_SUPPORT} ${LIBROOT}/libaubit4gl/API_%.o \
	SERVER_corba_server_util.o 
#	CAPI_corba_server_util.o
	${CC} ${LDFLAGS} ${CAPI_LDFLAGS} -o $@ $^ ${LINK_LIBS_SERVER}


## ==================================================================
##                        CORBA/ORBit sub-targets
## ==================================================================

####################################
#Compile a separate object specifically for use in CORBA server (with -D__CAPI__)
SERVER_corba_server_util.o: ${LIBROOT}/libaubit4gl/corba_server_util.c
	${CC} ${CFLAGS} -c $^ -o $@ -D__CSERVER__ -D__CAPI__ 
CLIENT_corba_server_util.o: ${LIBROOT}/libaubit4gl/corba_server_util.c
	${CC} ${CFLAGS} -c $^ -o $@ -D__CCLIENT__ -D__CAPI__
#CAPI_corba_server_util.o: ${LIBROOT}/libaubit4gl/corba_server_util.c
#	${CC} ${CFLAGS} -c $^ -o $@ -D__CAPI__


#${DLOPEN_SUPPORT} ${LIBROOT}/libaubit4gl/API_%.o :
	#${MAKE} -C ${LIBROOT}/libaubit4gl
	
####################################
#Create C function call wraper for CORBA client, from Aubit API .spec file
#Calls to xxx() function are just forwarded to CORBA_xxx() function which is 
#created by ORBIT_IDL from .idl file in turn created fron this same .spec file
CAPI_%-client.c: ${LIBROOT}/libaubit4gl/API_%.spec ${IDLMAGIC}
	${SH} ${IDLMAGIC} $< -client > $@

####################################
#Create C function call wraper for CORBA server, from Aubit API .spec file
#Calls to CORBA_xxx() function are just forwarded to xxx() function, which
#is expected to be handled by normal Aubit API_xx.c code and forwarded 
#to 'normal' Aubit plug-in
CAPI_%-server.c: ${LIBROOT}/libaubit4gl/API_%.spec ${IDLMAGIC}
	${SH} ${IDLMAGIC} $< -server > $@
	
#######################################
#Create skelimpl C code from .idl specification
CAPI_%-skelimpl.c: CAPI_%.idl ${IDLMAGIC}
#CAPI_%.h CAPI_%-common.c CAPI_%-stubs.c CAPI_%-skels.c CAPI_%-skelimpl.c: CAPI_%.idl
	${RM} CAPI_$*-skelimpl.c
	$(ORBIT_IDL) --skeleton-impl $<
#Check if ORBIT_IDL worked OK, since it does not return error code on exit:
	@if test -f CAPI_$*-skelimpl.c; then echo "$(ORBIT_IDL) OK"; else echo "$(ORBIT_IDL) ERROR"; exit 1; fi
#Add additional functions to -skelimpl:
	${SH} ${IDLMAGIC} ${LIBROOT}/libaubit4gl/API_$*.spec -add-to-skelimpl >> $@
#re-read just generated -skelimpl.c and insert function calls to our actuall functions:
	mv $@ $@-tmp
	${SH} ${IDLMAGIC} ${LIBROOT}/libaubit4gl/API_$*.spec -add-func-calls $@-tmp > $@
	${RM} $@-tmp
	@echo "OK: $@ created."
	
#eee:
#	${SH} ${IDLMAGIC} ${LIBROOT}/libaubit4gl/API_sqlparse.spec -add-func-calls

	
#######################################
#Create all needed (except skelimpl) CORBA C code from .idl specification
CAPI_%.h CAPI_%-common.c CAPI_%-stubs.c CAPI_%-skels.c: CAPI_%.idl
	${RM} CAPI_$*.h CAPI_$*-common.c CAPI_$*-stubs.c CAPI_$*-skels.c
	$(ORBIT_IDL) $^
	@if test -f CAPI_$*.h; then echo "$(ORBIT_IDL) OK"; else echo "$(ORBIT_IDL) ERROR"; exit 1; fi
	
#######################################
#Create CORBA .idl specification from Aubit API .spec file
CAPI_%.idl: ${LIBROOT}/libaubit4gl/API_%.spec ${IDLMAGIC}
	${SH} ${IDLMAGIC} $< > $@

## ==================================================================
##                        CORBA/ORBit clean targets
## ==================================================================

#######################################
#Clean all CAPI intermedate files
clean.capi:
	${RM} CAPI_*-common.c CAPI_*.h CAPI_*.idl CAPI_*-skels.c CAPI_*-stubs.c \
		CAPI_*-skelimpl.c *~ *.ior *.ref *.o \
		CAPI_*-client.c CAPI_*-server.c *.c-tmp *-server${EXE_EXT}
		
#######################################
#Clean all CAPI intermedate files and targets
#NOTE: cleans only local targets in this this dir, not lib/ or bin/
clean.capi.distclean: clean.capi
	${RM} ${CLIENTS} ${SERVERS}


show.capi:
	@echo "HAS_ORBIT_TYPE	=${HAS_ORBIT_TYPE}"
	@echo "ORBIT_IDL		=${ORBIT_IDL}"
	@echo "ORBIT_NAME		=${ORBIT_NAME}"
	@echo "ORBIT_VERSION	=${ORBIT_VERSION}"
	@echo "CAPI_LDFLAGS		=${CAPI_LDFLAGS}"
	@echo "CAPI_CFLAGS		=${CAPI_CFLAGS}"
	@echo "ORBIT_CONFIG		=${ORBIT_CONFIG}"

	
#################################### EOF ###################################


