# +----------------------------------------------------------------------+
# | Aubit 4gl Language Compiler Version $.0   lib/libgui makefile        |
# +----------------------------------------------------------------------+
# | 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.73 2011/11/25 10:05:00 mikeaubury Exp $
#

ROOT		=../..
LIBROOT		=${ROOT}/lib

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

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

WANTKW_C		= rules/generated/mk_states.c
Y_OUTPUT		= rules/generated/y.output

ifeq "${YACC}" "no"
	GENRULES    =${ROOT}/tools/no_yacc/cygwin/compilers/4glc/rules/generated
	Y_TAB_C		=${GENRULES}/y.tab.c
	Y_TAB_H		=${GENRULES}/y.tab.h
	CFLAGS		+=-I${ROOT}/tools/no_yacc/cygwin/compilers/4glc
	Y_OUTPUT	=
else
	GENRULES    =rules/generated
	Y_TAB_C		=${GENRULES}/y.tab.c
	Y_TAB_H		=${GENRULES}/y.tab.h
endif

ifeq "${GCC_MINGW}" "yes"
	CFLAGS		+=-I${ROOT}/tools/getopt
endif

#temp. workarounds for older versions of bizon y.output format:
HOSTNAME_SPEC   =xxaptiva

ifeq "${HOSTNAME}" "${HOSTNAME_SPEC}"
	#WANTKW_C	=/tmp/4glc/wantkw.c
	Y_OUTPUT	=/xxtmp/4glc/rules/generated/y.output
endif

CMODS_EXE       =4glc.c
#--- KEEP IN APLPABETIC ORDER ---
CMODS_LIB       =\
				API_lex.c API_parse_self.c  \
				compile.c class.c clobber.c \
				dim.c \
				field_handling.c \
				globals.c pragma.c \
				import.c labels.c insert_curs.c fix_insert.c load_prototypes.c \
				linearise.c \
				rules/generated/kw.c \
				list.c lexer.c lex.c  expr_munging.c lint.c \
                                mod.c commands.c  map.c extendedmap.c parsehelp.c common.c \
                                ../../lib/generated/std_funcs.c  \
                                var_handling.c variables.c variables_new.c \
                		${Y_TAB_C} \
                		${WANTKW_C}

CMODS_LIB_OPT       =\
				API_lex.c API_parse_self.c  \
				compile.c class.c clobber.c \
				dim.c \
				field_handling.c \
				globals.c pragma.c \
				import.c labels.c insert_curs.c fix_insert.c load_prototypes.c \
				linearise.c \
				rules/generated/kw.c \
				list.c lexer.c lex.c  expr_munging.c lint.c \
                                mod.c commands.c  map.c extendedmap.c parsehelp.c common.c \
                                ../../lib/generated/std_funcs.c  \
                                var_handling.c variables.c variables_new.c \
                		${Y_TAB_C} \
                		${ROOT}/compilers/4glc/rules/generated/states_optimised.c


CMODS           =${CMODS_EXE} ${CMODS_LIB}
CMODS_OPT       =${CMODS_EXE} ${CMODS_LIB_OPT}

ifneq "${GETOPT_LONG}" "yes"
	ifeq "${GETOPT_LONG}" "iberty"
		AUBIT_LIB+=-L/opt/sfw/lib -liberty
    else
        CMODS_GETOPTS=${ROOT}/tools/getopt/getopt.c ${ROOT}/tools/getopt/getopt1.c
        CMODS   += ${CMODS_GETOPTS}
    endif
endif

4GLCAOBJ		=${CMODS:.c=.o}
4GLCAOBJ_OPT		=${CMODS_OPT:.c=.op}
OBJS_LIB		=${CMODS_LIB:.c=.o}
OBJS_LIB_OPT		=${CMODS_LIB_OPT:.c=.op}

#Use this to create dependency for the parser:
RULES_SRC		=$(wildcard rules/*.reqd) $(wildcard rules/*.rule) $(wildcard rules/sqlpack/infx/*.rule)
#RULES_SRC			=$(addprefix rules/,$(RULES_SRC_tmp))

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

ifdef COMSPEC
	ALL			=${ROOT}/lib/lib4glc${SO_EXT}
    	CMODS		=${CMODS_EXE}
	4GLCAOBJ	=${CMODS:.c=.o}
    4GL_LIB     =-l4glc
endif

ALL				+=${ROOT}/bin/4glc 



C_LOCAL_IFLAGS  =-I${ROOT}/lib/liblex/lex_c -I.  -Irules -I${GENRULES}
#-I${ROOT}/lib -I${ROOT}/lib/libincl
CFLAGS			+=${C_LOCAL_IFLAGS} ${RPCLIB_INCLUDE} ${CURSES_INC_PATH}
LCLINT_CFLAGS   =${C_IFLAGS} ${C_LOCAL_IFLAGS}

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

ifeq "${GCC_MINGW}" "yes"
	LINKLIBS	+=-liberty
endif

ifeq "${TARGET_OS}" "linux" 
	LD_EXE_FLAGS=-rdynamic
endif

#ifeq "${TARGET_OS}" "solaris"
	#LINKLIBS	+=-ldl
	#AUBIT_LIB	+=-ldl
#endif
ifeq "${TARGET_OS}" "hpux"
	BISON_CC=cc
else
	BISON_CC=${CC}
endif

ifeq "something" "blah"
	LD_EXE_FLAGS=-export-dynamic
endif

ifeq "${TARGET_OS}" "aix"
	ifeq "${AIX_OBJECT_MODE}" "64"
		STRIPFLAGS=-X64
	endif
endif

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

all: a4gl_4glc_int.h ${ALL} 
	@echo "Default targets (${ALL}) successfully compiled."

core: ${ROOT}/bin/4glc 
4glc: ${ROOT}/lib/lib4glc${SO_EXT}

a4gl_4glc_int.h: API_lex.c API_parse.c

${ROOT}/bin/4glc: ${4GLCAOBJ} 
	${LD_EXE} ${LD_EXE_FLAGS} -L${ROOT}/lib -o $@ $^ ${AUBIT_LIB} ${4GL_LIB} ${EXTRASYSTEMLIBS} -lpthread
ifeq "${STRIP_EXECUTABLES}" "yes"
	${CP}  $@${EXEEXT} $@-strip${EXEEXT}
	${STRIP} ${STRIPFLAGS} $@-strip${EXEEXT}
endif

## ==================================================================
##                            Windows Targets
## ==================================================================

lib4glc${SO_EXT}: ${ROOT}/lib/lib4glc${SO_EXT}
${ROOT}/lib/lib4glc${SO_EXT}: ${OBJS_LIB}
	${LD} ${SO_LDFLAGS} -o $@ $^ ${LINKLIBS}
ifeq "${SO_EXT}" ".dll"
	${MV} TMP${SOEXP_EXT} $@.a
endif


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

#rules.t :
#	${MAKE} -C rules $(MKNAME)

rules/generated/y.tab.o: ${Y_TAB_C} ${Y_TAB_H}
	${BISON_CC} ${CFLAGS} -c -o $@ ${Y_TAB_C} ${YYDEBUG} -I${ROOT}/lib/liblex/lex_c -I.

rules/generated/mk_states.o:  rules/generated/mk_states.c
	${CC} ${CFLAGS} -O2 -c -o $@ $< -I. -Irules/generated

${Y_TAB_C} rules/generated/y.output: ${RULES_SRC}
	${MAKE} -C rules

../common/dataio/form_x.h:
	${MAKE} -C ../../common/dataio rpc
commands.o: commands.c expr_as_string_when_possible.c

API_lex.c: API_lex.spec ../../incl/a4gl_API_lex.h    ../../incl/a4gl_API_lex_lib.h
	${SH} ../../lib/bin/dlmagic $< > $@
	${SH} ../../lib/bin/dlmagic $< -S > API_lex_self.c

	
../../incl/a4gl_API_lex.h: API_lex.spec	
	${SH} ../../lib/bin/dlmagic $< -h > $@

../../incl/a4gl_API_lex_lib.h: API_lex.spec	
	${SH} ../../lib/bin/dlmagic $< -H > $@


	
#../../incl/a4gl_API_lex.h: API_lex.spec	
#${SH} ../../lib/bin/dlmagic $< -h > $@

#../../incl/a4gl_API_lex_lib.h: API_lex.spec	
#${SH} ../../lib/bin/dlmagic $< -H > $@
#${ROOT}/tools/no_yacc/cygwin/compilers/4glc/rules/generated/y.tab.c

API_parse.c: API_parse.spec ../../incl/a4gl_API_parse.h    ../../incl/a4gl_API_parse_lib.h
	${SH} ../../lib/bin/dlmagic $< > $@

API_parse_self.c: API_parse.spec ../../incl/a4gl_API_parse.h    ../../incl/a4gl_API_parse_lib.h
	${SH} ../../lib/bin/dlmagic $< -S > API_parse_self.c

../../incl/a4gl_API_parse.h: API_parse.spec	
	${SH} ../../lib/bin/dlmagic $< -h > $@

../../incl/a4gl_API_parse_lib.h: API_parse.spec	
	${SH} ../../lib/bin/dlmagic $< -H > $@

rules/generated/mk_states.c: mk_states_c ${Y_OUTPUT}
ifeq "${HOSTNAME}" "${HOSTNAME_SPEC}"
	cp ${Y_OUTPUT} rules/generated/y.output
endif
	@echo "Y_OUTPUT=${Y_OUTPUT}"
ifneq "${YACC}" "no"
	${SH} $<
#the "t" file is some kind of temporary file created by wantkw_gen.pl
	${RM} t
else
	${CP} ${ROOT}/tools/no_yacc/cygwin/compilers/4glc/rules/generated/mk_states* rules/generated
endif

mk_states_c:
	cd ${ROOT}; config.status --file compilers/4glc/mk_states_c

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

${GENRULES}/kw.c ${GENRULES}/single_words.rule  \
rules/generated/kw.h rules/generated/y.tab.h:
	${MAKE} -C rules $(MKNAME)

4glc.o: 				rules/generated/kw.h rules/generated/y.tab.h a4gl_4glc_int.h ../../incl/a4gl_API_lex.h ../../incl/a4gl_API_parse.h
dim.o: 					rules/generated/kw.h rules/generated/y.tab.h a4gl_4glc_int.h ../../incl/a4gl_API_lex.h ../../incl/a4gl_API_parse.h
compile.o: 				rules/generated/kw.h rules/generated/y.tab.h a4gl_4glc_int.h ../../incl/a4gl_API_lex.h ../../incl/a4gl_API_parse.h

mod.o: 					mod.c ${Y_TAB_C}
${GENRULES}/y.tab.o: 	${ROOT}/common/dataio/form_x.h

lexer.o: ${GENRULES}/kw.h 
lexer.o: ${GENRULES}/y.tab.h

## ==================================================================
##                            Other Targets
## ==================================================================

splint: lclint
lclint: $(CMODS)
	${LCLINTERR}${LCLINTEXE} ${LCLINTFLAGS} $(LCLINT_CFLAGS) $(CMODS) > ${LCLINTLOG} ${LCLINTLOGCMD}
	${CAT} ${LCLINTLOG} >> ${ROOT}/${LCLINT_GLOBAL_LOG}
	@echo "see ${LCLINTLOG} for results"

show:
	@echo "YACC=${YACC}"
	@echo "GENRULES=${GENRULES}"
	@echo "Y_TAB_C=${Y_TAB_C}"
	@echo "CFLAGS=${CFLAGS}"
	@echo "Y_OUTPUT=${Y_OUTPUT}"
	@echo "RDYNAMIC=${RDYNAMIC}"

## ==================================================================
##                            Clean Targets
## ==================================================================

clean: clean.rules.generated clean.rules 
	${RM} *${SO_EXT} *.o *.err *.a *.exe *.bak .*.bak .\#* \
	*.log *.dll *.dll.a *.def wantkw.c wantkw.h rules/generated/mk_states_1.h rules/generated/mk_states.h \
	rules/generated/mk_states.c API_lex.c ../../incl/a4gl_API_lex.h ../../incl/a4gl_API_lex_lib.h \
	API_parse_self.c API_lex_self.c ../../incl/a4gl_API_parse_lib.h fgllint \
	../../incl/a4gl_API_parse.h API_parse.c fglcalltree  $(ROOT)/bin/fgllint $(ROOT)/bin/fglcalltree $(ROOT)/bin/fgllink $(ROOT)/bin/fglreload

#WARNING! do NOT clean mk_states_c - this is an autoconf generated file
#and will get cleaned only in make.distclean target of root makefile
	
clean.rules.generated:
	(cd rules/generated; ${RM} *.yacc *.c *.h single_words *.o *.yh *.rule \
	*.output *.bak .*.bak)
	
clean.rules:
	${MAKE} -C rules clean


fgllint: ../../bin/fgllint


extra: ../../bin/fglreload ../../bin/fgllint ../../bin/fglcalltree  ../../bin/fglfunc 

fglfunc:../../bin/fglfunc
../../bin/fglfunc: func.o API_lex.o  linearise.o calltree_expr.o module_def.o expr_munging.o 
	$(CC) ${CFLAGS} ${RDYNAMIC}  -g -o $@ $^ -L$(AUBITDIR)/lib -laubit4gl ${EXTRASYSTEMLIBS}


../../bin/fglreload: 	reload.c\
				API_lex.c API_parse_self.c  \
				compile.c class.c clobber.c \
				dim.c \
				field_handling.c \
				globals.c pragma.c \
				import.c labels.c insert_curs.c fix_insert.c load_prototypes.c \
				linearise.c \
				rules/generated/kw.c \
				list.c lexer.c lex.c  expr_munging.c lint.c \
                                mod.c commands.c  map.c extendedmap.c parsehelp.c common.c \
                                ../../lib/generated/std_funcs.c  \
                                var_handling.c variables.c variables_new.c \
                		${Y_TAB_C} \
                		${ROOT}/compilers/4glc/rules/generated/states_optimised.c ${CMODS_GETOPTS}
	$(CC) -g $(CFLAGS)  -DYYDEBUG  -fPIC -I. -I$(AUBITDIR)  -I$(AUBITDIR)/incl $(LD_EXE_FLAGS) -o $@ $^ -L$(AUBITDIR)/lib -laubit4gl  ${AUBIT_LIB} ${EXTRASYSTEMLIBS}

fglreload: ../../bin/fglreload

fglreload_static:  ../../bin/fglreload_static

../../bin/fglreload_static : reload.c API_lex_self.c common.c ../../lib/generated/std_funcs.c mod.c
	$(CC) -g -fPIC -I. -I$(AUBITDIR)  -I$(AUBITDIR)/incl $(LD_EXE_FLAGS) reload.c API_lex_self.c common.c ../../lib/generated/std_funcs.c  -o ../../bin/fglreload_static -L$(AUBITDIR)/lib -laubit4gl  -L`aubit-config DEFAULT_PLUGINDIR` -lLEX_C ${EXTRASYSTEMLIBS}

../../bin/fgllint: lint_main.o API_lex.o  lint.o expr_munging.o linearise.o   common.o ../../lib/generated/std_funcs.o   load_prototypes.o
	$(CC) ${CFLAGS} ${RDYNAMIC} -g -o $@ $^ -L$(AUBITDIR)/lib -laubit4gl  ${EXTRASYSTEMLIBS}
	#cp fgllint $(AUBITDIR)/bin

mkglobals: ../../bin/mkglobals
../../bin/mkglobals: mk_globals.o API_lex_self.o  lint.o expr_munging.o linearise.o   common.o ../../lib/generated/std_funcs.c  $(ROOT)/lib/liblex/lex_4gl/compile_4gl.c   $(ROOT)/lib/liblex/lex_4gl/common.o  $(ROOT)/lib/liblex/lex_4gl/binding.o  $(ROOT)/lib/liblex/lex_4gl/init.o   $(ROOT)/lib/liblex/lex_4gl/class.o
	$(LD_EXE) ${RDYNAMIC} -g -o $@ $^ -L$(AUBITDIR)/lib -laubit4gl  ${EXTRASYSTEMLIBS}



calltree_expr.o: expr_as_string_when_possible.c

fglcalltree:../../bin/fglcalltree
../../bin/fglcalltree: calltree.o API_lex.o  linearise.o calltree_expr.o module_def.o 
	$(CC) ${CFLAGS} ${RDYNAMIC}  -g -o $@ $^ -L$(AUBITDIR)/lib -laubit4gl ${EXTRASYSTEMLIBS}

	#cp fglcalltree $(AUBITDIR)/bin

fglmklib:../../bin/fglmklib
../../bin/fglmklib: mklib.o API_lex.o  linearise.o calltree_expr.o module_def.o 
	$(CC) ${CFLAGS} ${RDYNAMIC}  -g -o $@ $^ -L$(AUBITDIR)/lib -laubit4gl ${EXTRASYSTEMLIBS}



#fglsplit: split.o API_lex.o  linearise.o
	#$(CC) -Wall -rdynamic  -g -o $@ $^ -L$(AUBITDIR)/lib -laubit4gl
	#cp $@ $(AUBITDIR)/bin

fgllink: fgllink.o API_lex.o expr_munging.o linearise.o common.o ../../lib/generated/std_funcs.c
	$(CC)  -I$(ROOT)/incl ${RDYNAMIC} -g -o $@ $^ -L$(AUBITDIR)/lib -laubit4gl ${EXTRASYSTEMLIBS}

	cp fgllink $(AUBITDIR)/bin


${ROOT}/compilers/4glc/rules/generated/states_optimised.c: rules/generated/mk_states.c mk_states_opt.c
	$(CC) $(CFLAGS) -DMKSTATESOPTS -g -I${ROOT}/incl -I${ROOT} -I${ROOT}/compilers/4glc -I${ROOT}/compilers/4glc/rules/generated  rules/generated/mk_states.c  -o ${ROOT}/compilers/4glc/rules/generated/mk_states_optimised
	${ROOT}/compilers/4glc/rules/generated/mk_states_optimised > ${ROOT}/compilers/4glc/rules/generated/states_optimised.c
	

%.op:%.c
	$(CC) ${CFLAGS} -Wall -DOPTIMIZED -c -o $@ -O3 -fPIC -DPIC -DSRC_TREE  -DHAVE_CONFIG_H  -I${ROOT}/incl -I${ROOT} -I${ROOT}/compilers/4glc -I${ROOT}/compilers/4glc/rules/generated -I${ROOT}/compilers/4glc/rules $<

optclean:
	find . -name "*.op" -exec rm {} \;

opt: ../../bin/4glc_opt
../../bin/4glc_opt: ${4GLCAOBJ_OPT} 
	echo ${LD_EXE}
	echo ${AUBIT_LIB}
	echo ${4GL_LIB}
	echo  ${EXTRASYSTEMLIBS}
	${LD}  ${CFLAGS} ${RDYNAMIC} -L${ROOT}/lib -o $@ $^ ${AUBIT_LIB} ${4GL_LIB} ${EXTRASYSTEMLIBS}

sopt: ../../bin/4glc_sopt
../../bin/4glc_sopt: ${4GLCAOBJ_OPT} 
	echo ${LD_EXE}
	echo ${AUBIT_LIB}
	echo ${4GL_LIB}
	echo  ${EXTRASYSTEMLIBS}
	${LD}  ${CFLAGS} ${RDYNAMIC} -L${ROOT}/lib -o $@ $^  -L$(ROOT)/lib/libaubit4gl -laubit4gl_static -lm -lz -ldl ${EXTRASYSTEMLIBS}

fglsplit:../../bin/fglsplit

../../bin/fglsplit:  split.o API_lex.o  lint.o expr_munging.o linearise.o   common.o ../../lib/generated/std_funcs.c   load_prototypes.o
	$(CC) $(CFLAGS) -Wall ${RDYNAMIC}  -g -o $@ $^ -L$(AUBITDIR)/lib -laubit4gl ${EXTRASYSTEMLIBS}


expr_munging_proto.o: expr_munging.c
	$(CC) $(CFLAGS) -c -o expr_munging_proto.o expr_munging.c -Dfind_function_single_rtype=find_function_single_rtype_proto

fglproto: ../../bin/fglproto
../../bin/fglproto:  prototypes.o API_lex.o  lint.o expr_munging_proto.o linearise.o   common.o ../../lib/generated/std_funcs.c   load_prototypes.o
	$(CC) ${CFLAGS} -Wall ${RDYNAMIC}  -g -o $@ $^ -L$(AUBITDIR)/lib -laubit4gl ${EXTRASYSTEMLIBS}



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

