#!/bin/sh
#soft/eleves/i386/bin/bash

rm -f macros.m4
cat > macros.m4 <<\EOF
define(LIBS, LIB=")
define(INIT, PRGM=$1)
define(SOURCES, `dnl
dnl s il y a des virgules, les enlever
ML="patsubst(translit(`$*',`,',` '),[^ ]*[.]mli)"
MLI="patsubst(translit(`$* ',`,',` '),[^ ]*[.]ml\([^i]\), \1)"')dnl
define(INCLUDES, INCL="patsubst(translit(`$*',`,',` '),)")dnl
define(LIBRARIES, LIBR="patsubst(translit(`$*',`,',` '),)")dnl
define(COMPFLAGS, COMPF="patsubst(translit(`$*',`,',` '),)")dnl
define(LINKFLAGS, LINKF="patsubst(translit(`$*',`,',` '),)")dnl
define(COMMONFLAGS, COMMONF="patsubst(translit(`$*',`,',` '),)")dnl
define(VERSION, VER="patsubst(translit(`$*',`,',` '),)")dnl
define(USE_NUMS, `define(`LIBS', LIBS nums.cma -cclib -lnums)')dnl
define(EXTRA, EXTRADIST="$1")dnl
define(USE_PARSER, WITHYACC=yes)dnl
define(USE_LEXER, WITHLEX=yes)dnl
define(END, `LIBS"')
EOF

echo 'include(macros.m4)dnl
include(Makefile.am)
END' | m4  > Makefile.cfg
source Makefile.cfg

PARSERFILES=""
PARSERML=""
EXTRACMI=""
SPECMLI=""
LEXERCMI=""
LEXERRULE1=""
LEXERRULE1B=""
PARSERCMI=""
PARSERRULE1=""
PARSERRULE2=""
PARSERRULE3=""
PARSERRULE3B=""

if [ "$WITHLEX" == "yes" ]
then
    PARSERFILES="lexer.mll"
    PARSERML="lexer.ml"
    LEXERCMI="lexer.cmi"
    LEXERRULE1="lexer.ml: lexer.mll @@PARSERCMI@@"
    LEXERRULE1B="\$(CAMLLEX) \$(LEXFLAGS) lexer.mll"
fi

if [ "$WITHYACC" == "yes" ]
then
    PARSERRULE1="parser.cmo: parser.cmi"
    PARSERRULE2="parser.cmx: parser.cmi"
    PARSERRULE3="parser.ml parser.mli: parser.mly"
    PARSERRULE3B="\$(CAMLYACC) \$(YACCFLAGS) parser.mly"
    PARSERFILES="$PARSERFILES parser.mly"
    PARSERML="$PARSERML parser.ml"
    PARSERCMI="parser.cmi"
    SPECMLI="parser.mli"
fi

EXTRACMI="$EXTRACMI $LEXERCMI $PARSERCMI"

CMI=`echo $ML $MLI | sed 's/[.]mli/.cmi/g;s/[.]ml/.cmi/g'`
CMI="$CMI $EXTRACMI"
TOUSFICHIERS="$ML $PARSERFILES"
TOUSML="$ML $PARSERML"


one_dependence (){
    cat $1 |
    sed -n 's/^[ ]*open[ ]*\([^; ]*\)[; ]*$/{{\1}}/p
    ; s/[^a-z]\([A-Z][^.( ]*\)[.]/{{\1}}/gp' |  sed 's/\(}}\|^\)\([^{]\|{[^{]\)*\({{\|$\)/\1\3/g' | 
    tr 'A-Z{}' 'a-z\n ' | sort | uniq  | sed  '/^\('`echo *.ml | sed 's/ /\\\\|/g'`'\)$/p' | sed -n '/[^ ]/p' | sed 's/ *$/.ml/' | sed -n  '/^\('`echo $2 | sed 's/ /\\\\|/g'`'\)$/p' | sed 's/[.]ml/.@@@cmo/g'
}

dep(){
    (echo all: `echo $TOUSML | sed 's/[.]ml/.@@@cmo/g'`
    for i in $TOUSFICHIERS
    do
    cmo=`echo $i | sed 's/[.].*$/.@@@cmo/g'`
    ord=`one_dependence $i "$TOUSML"`       
    ord=`echo $ord`
    echo "$cmo : $ord"
    echo -e '\t$@'
    done)    | make -n -f - all 2> /dev/null | sed -n 's/@@@//gp'
}
order=`dep *.ml`
order=`echo $order`

cat Makefile.in | sed "s@@PRGM@@$PRGMg; s@@DISTML@@$MLg; s@@DISTMLI@@$MLIg; s@@CMI@@$CMIg; s@@CMO@@$orderg; s@@EXTRADIST@@$EXTRADISTg; s@@LEXERRULE1@@$LEXERRULE1g; s@@LEXERRULE1B@@$LEXERRULE1Bg; s@@PARSERRULE1@@$PARSERRULE1g; s@@PARSERRULE2@@$PARSERRULE2g; s@@PARSERRULE3@@$PARSERRULE3g; s@@PARSERRULE3B@@$PARSERRULE3Bg; s@@LEXPARSE@@$PARSERFILESg; s@@LEXPARSEML@@$PARSERMLg; s@@SPECMLI@@$SPECMLIg; s@@PARSERCMI@@$PARSERCMIg; s@@LIBS@@$LIBg; s@@VERSION@@$VERg; s@@LIBRARIES@@$LIBRg;s@@COMPFLAGS@@$COMPFg; s@@LINKFLAGS@@$LINKFg; s@@COMMONFLAGS@@$COMMONFg; s@@INCLUDE@@$INCLg" > Makefile

touch .depend
rm -f macros.m4 Makefile.cfg