#!/bin/sh
##########################################################################
#
#			Aubit 4gl compiler - make system
#
# genmake - utillity script to create Aubit-style makefiles from typical
# existing 4gl makefiles.
#
# You are not supposed to run this script mannualy; it will be called from
# makefiles created with "prepmake" script.
# $Id: genmake,v 1.6 2001/10/16 03:09:13 afalout Exp $
#
##########################################################################

if [ $# -lt 2 -o "$1" = "--help" ]
then
    echo "ERROR: not enough parameters."
	echo "You are not supposed to run this script mannualy; it will be"
	echo "called from makefiles created with 'prepmake' script."
    exit 2
fi

	#filer out crap:
    CMDLINE=
    CMDLINEBASENAME=
	CNT=0
    CNTALL=0
    CNTSKIP=0
	###########
	for a in $@
    ###########
	do
        let CNTALL=CNTALL+1
		DIRNAME=`dirname $a`
        FULLNAME=$a
		a=`basename $a`
		if ! [ "$a" = "libfgl4js.42x" -o "$a" = "crap" ]
        then
	        let CNT=CNT+1
            if [ "$DIRNAME" != "" ] && [ "$DIRNAME" != "." ]
            then
	            if [ "$DIRNAME" != "$PWD" ]
    	        then
					if [ "$MAXDIR" != "" ]
                    then
						A1=$(echo $MAXDIR | sed -e "s/\//\\\\\//g")
                    else
                        echo "FIXME: cannot do this without MAXDIR"
                        exit 99
                    fi
					A3=$(echo $DIRNAME | sed -e "s/$A1//")
					A2=$(echo $A3 | sed -e "/../s/..//")
					#echo "DIRNAME = $DIRNAME"
                    #echo "LASTDIR = $LASTDIR"

					#current dir:
					B1=$(echo $PWD | sed -e "s/$A1//")

                    #if [ "B1" = "/cm/source" ]
                    #then
						#../../gprog/contact.42r points outside current dir (/cm/source), to /../gprog
						TMP=$A2
						A2=$(echo $A2 | sed -e "/../s/\/\.\.//")
					#fi


                    #../winds/invwind.42x points outside current dir, to ../winds. STOP.
					if [ "$A2" != "/gprog" ] && [ "$A2" != "prog" ] && [ "$A2" != "/gform" ]  && [ "$A2" != "$B1" ]
                    then
						#if this happens, add it to vpath
						echo "$FULLNAME points outside current dir ($B1), to $A2. STOP."
                        echo $TMP
    	                exit 67


                        #FIXME:
                        #Maximise makefiles sometimes expect object to allreadu be
                        #in ../prog or ../gprog:
						#we should actually check if this file is in current dir,
                        #and if not, look for it, and add vpath to that place

                    fi
                fi
            fi
			STRIPPATH=`basename $a`
			CMDLINE="$CMDLINE $a"
			CMDLINEBASENAME="$CMDLINEBASENAME $STRIPPATH"

   			#second can't be .42x
            ##########
			case $a in
            ##########

            *.42x)
				if test "$CNT" = "1"
                then
                    #We are supposed to make library:
	                FIRST=$a
				fi

				#second is treated a GLOBALS, and lib cannot be GLOBAL file(?)
				if test "$CNT" = "2"
                then
                    echo "Got $a in second position."
                    #exit 56
                    GLOBNAME=1
                fi
            ;;

            *)
				if test "$GLOBNAME" = "1"
	            then
                    #This will happen if we cannot use second param for GLOBALS
                    #because it's not 4gl file:
					GLOBNAME=$a
                else
					if test "$CNT" = "1"
		            then
						#FIRST=`basename $a`
		                FIRST=$a
		            fi
		            if test "$CNT" = "2"
		            then
						#SECOND=`basename $a`
		                SECOND=$a
		            fi
                fi
	        ;;

			####
			esac
			####



        else
            let CNTSKIP=CNTSKIP+1
		fi
    ####
	done
    ####

PROG=`basename $FIRST .4go`
if [ "$PROG" != "$FIRST" ]
then
    IS4GO="1"
    IS42M="0"
    ISLIB="1"
    OBJEXT=4go
    PROGEXT=4gi
	LIBEXT=4go
	FRMEXT=frm

else
	PROG=`basename $FIRST .42m`
	if [ "$PROG" != "$FIRST" ]
	then
	    IS4GO="0"
	    IS42M="1"
    	ISLIB="1"
        OBJEXT=42m
        PROGEXT=42r
	    LIBEXT=42x
		FRMEXT=42f
    else
		PROG=`basename $FIRST .42x`
		if [ "$PROG" != "$FIRST" ]
		then
		    IS4GO="0"
		    IS42M="0"
	    	ISLIB="1"
	        OBJEXT=42m
	        PROGEXT=42r
		    LIBEXT=42x
           	FRMEXT=42f
	    else
		    IS4GO="0"
	    	IS42M="0"
			ISLIB="0"
        fi
    fi
fi

if test "$ISLIB" = "0"
then
	PROG=`basename $FIRST .4gi`
	if [ "$PROG" != "$FIRST" ]
	then
	    IS4GI="1"
		FJSLINKLINE=0
        OBJEXT=4go
        PROGEXT=4gi
		LIBEXT=4go
       	FRMEXT=frm
	else
		PROG=`basename $FIRST .42r`
		if [ "$PROG" != "$FIRST" ]
		then
		    IS4GI="1"
            #we are extracting components from 4Js link line, not from
            #dependencies list:
			FJSLINKLINE=1
            OBJEXT=42m
            PROGEXT=42r
	        LIBEXT=42x
			FRMEXT=42f
        else
			echo "Cannot recognise extension of $FIRST STOP."
    	    exit 4
        fi
	fi
fi

	HEADERNAME='${AUBITDIR}/incl/header.mki'
	#HEADERNAME=header.mki
	FOOTERNAME='${AUBITDIR}/incl/footer.mki'
	FORMFILES=
    LIBLIST=
    FGLLIST=


#if we revceived only prog name and one 4gl file, AND program name is one
#of lib extensions, this is library function, not executable program:
if [ $# = "2" ] && [ "$ISLIB" = "1" ]
then
    IS_SINGLE_LIB="1"
	FILENAME=allsinglelibs.mk
	fname=`basename $SECOND .$OBJEXT`
	fname=`basename $fname .4gl`

    if ! [ -f $FILENAME ]
    then
		echo include $HEADERNAME > $FILENAME
		echo >> $FILENAME
		echo '#we are using this dummy name only to get all in objects-' >> $FILENAME
        echo '#it will not be used for anything - and it will possibly' >> $FILENAME
        echo '#even fail to link:' >> $FILENAME
		echo "PROG		= dummy.lib"  >> $FILENAME
		echo >> $FILENAME
		echo "GLOBALS.4gl	= $fname.4gl" >> $FILENAME
        GLOBFILE=$fname.4gl
		echo >> $FILENAME
		echo 'FILES.4gl	= \' >> $FILENAME
		echo '		${GLOBALS.4gl} \' >> $FILENAME
	else
		echo "			$fname.4gl \\" >> $FILENAME
	fi

else
	FILENAME=$PROG.mk

	echo include $HEADERNAME > $FILENAME
	echo >> $FILENAME
    #echo "#-------------------------------------" >> $FILENAME
	#echo >> $FILENAME

	if [ "$ISLIB" = "1" ]
    then
		echo "PROG		= $PROG.lib"  >> $FILENAME
    else
		echo "PROG		= $PROG"  >> $FILENAME
    fi
	echo >> $FILENAME

	if [ "$GLOBNAME" != "" ]
    then
		#if we received non-4gl dile as second param:
		fname=`basename $GLOBNAME .$OBJEXT`
    else
		fname=`basename $SECOND .$OBJEXT`
    fi

	fname=`basename $fname .4gl`
	echo "GLOBALS.4gl	= $fname.4gl" >> $FILENAME
    GLOBFILE=$fname.4gl
	echo >> $FILENAME

	##################
	for a in $CMDLINE
    ##################
	do
		if [ "$FIRST" != "$a" ] 		#it's program name
        then
	        if [ "$GLOBNAME" != "$a" ] #it's GLOBALS file
            then
				if [ "$SECOND" != "$a" -o "$GLOBNAME" != "" ]
                then

				##########
				case $a in
		        ##########

				#*.42m) || *.4go) HOW THE HELL DO YOU DO _OR_here ?
				#*.4go)
	            *.$OBJEXT)
					fname=`basename $a .$OBJEXT`
	                #EXT=ao
	                EXT=4gl

					#cinqwind is BOTH a 4gl and library (.42x, .aox) name
	                #which is VERY stupid thing to do, and should be fixed in Maximise;
	                #since I will have dependencies listeds with .4go in Maximise makefile,
	                #(there will be .42x in 4Js link line, but I'm not looking at that...
					#Maybe I shoud use "fgllink..." line to get files, and not dependencies?)
					if [ "$fname" = "cinqwind" -o "$fname" = "invwind" -o "$fname" = "lic_keys" -o "$fname" = "pinqwind" -o "$fname" = "wcustwind" -o "$fname" = "wordrwin" -o "$fname" = "wpinqwind" ]
	                then
						if [ "$OBJEXT" = "4go" ]
	                    then
							#EXT=aox
							#if [ "$LIBLIST" = "" ]
						    #then
							#	#echo '		${FILES.lib} \' >> $FILENAME
	                	    #fi
							LIBLIST="$LIBLIST $fname.lib"
	                    else
	    	                FGLLIST="$FGLLIST $fname.$EXT"
	                    fi
	                else
	                    FGLLIST="$FGLLIST $fname.$EXT"
	                fi

				;;

	            *.$LIBEXT)
					fname=`basename $a .$LIBEXT`
	                LIBLIST="$LIBLIST $fname.lib"
	            ;;

				#*.42f) || *.frm)
		        #*.frm)
                *.$FRMEXT)
					fname=`basename $a .$FRMEXT`
		            FORMFILES="$FORMFILES $fname.per"
		        ;;

		        *)
					echo "ERROR: what the hell is $a"
					echo "IS4GO = $IS4GO IS42M = $IS42M ISLIB = $ISLIB"
			        echo "$OBJEXT $PROGEXT $LIBEXT"
	                echo "---------------------------x"
					echo $CMDLINEBASENAME
	                echo "---------------------------x"
	                echo FIRST = $FIRST SECOND = $SECOND
					#echo $@
					exit 1
		        ;;

				####
				esac
				####
                fi
			fi
        fi
	####
	done
    ####

	echo >> $FILENAME

    ############################
	#Write all libs to makefile:
    ############################
	if [ "$LIBLIST" != "" ]
    then

		echo 'FILES.lib	= \' >> $FILENAME
		#################
		for a in $LIBLIST
	    #################
		do
            echo "			$a \\" >> $FILENAME
        ####
        done
        ####

		echo >> $FILENAME
    fi

    ############################
	#Write all 4gl's to makefile:
    ############################
	if [ "$FGLLIST" != "" ]
    then
		echo 'FILES.4gl	= \' >> $FILENAME
		echo '			${GLOBALS.4gl} \' >> $FILENAME

		#if [ "$LIBLIST" != "" ]
		#then
		#	echo '			${FILES.lib} \' >> $FILENAME
        #fi

		#################
		for a in $FGLLIST
	    #################
		do
            echo "			$a \\" >> $FILENAME
        ####
		done
        ####

		echo >> $FILENAME
    else
        #This can happen with porgrams that have only one 4gl file
		#echo FGLLIST is empty

	    grep -i "end main" $GLOBFILE > /dev/null

		RET=$?
		if test $RET != "0"
		then
            echo "no END MAIN in $GLOBFILE"

            #is this one of 0 size 4gl files?
			FGLFILESIZE=$(ls -al $GLOBFILE | awk '{print $5}')
    		if [ "$VERBOSE" = "1" ]
	    	then
				echo FGLFILESIZE of $GLOBFILE is $FGLFILESIZE
            fi
            if [ "$FGLFILESIZE" = "0" ]
            then
        	    echo "This is zero size file, ignoring."
            fi
			
			rm $FILENAME
            exit 0
	    else
			echo 'FILES.4gl	= ${GLOBALS.4gl} ' >> $FILENAME
        fi

	fi

    ############################
	#Write all forms to makefile:
    ############################
	if [ "$ISLIB" != "1" ]
    then

		if [ "$FORMFILES" = "" ]
	    then
			#as defined in header.mki:
			echo 'FILES.per	= ${ALLFORMS.per}' >> $FILENAME
	    else
			echo "FILES.per	= \\" >> $FILENAME

			###################
			for a in $FORMFILES
		    ###################
			do
				echo "			$a \\" >> $FILENAME
	        done
	    fi
    fi
	
    ############################
	#Write footer to makefile:
    ############################
	echo >> $FILENAME
    #echo "#-------------------------------------" >> $FILENAME
	#echo >> $FILENAME
	echo include $FOOTERNAME >> $FILENAME
	echo >> $FILENAME
fi

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