#!/bin/sh

SRC="stringPlus.mli stringPlus.ml parsing_helper.mli parsing_helper.ml stringmap.mli stringmap.ml ptree.mli piptree.mli pitptree.mli types.mli funsymbhash.mli funsymbhash.ml tree.mli tree.ml pitypes.mli param.mli param.ml parser.mli parser.ml lexer.ml pitparser.mli pitparser.ml pitlexer.ml pvqueue.mli pvqueue.ml terms.mli terms.ml termslinks.mli termslinks.ml display.mli display.ml termsEq.mli termsEq.ml reduction_helper.mli reduction_helper.ml evaluation_helper.mli evaluation_helper.ml history.mli history.ml pievent.mli pievent.ml weaksecr.mli weaksecr.ml noninterf.mli noninterf.ml database.mli database.ml selfun.mli selfun.ml rules.mli rules.ml syntax.mli syntax.ml tsyntax.mli tsyntax.ml piparser.mli piparser.ml pilexer.ml spassout.mli spassout.ml simplify.mli simplify.ml pisyntax.mli pisyntax.ml pitsyntax.mli pitsyntax.ml pitransl.mli pitransl.ml pitranslweak.mli pitranslweak.ml destructor.mli destructor.ml lemma.mli lemma.ml reduction.mli reduction.ml reduction_bipro.mli reduction_bipro.ml piauth.mli piauth.ml move_new_let.mli move_new_let.ml proswapper.mli proswapper.ml encode_queries.mli encode_queries.ml version.mli version.ml main.ml"

SRCTOTEX="stringPlus.cmx parsing_helper.cmx param.cmx piparser.cmx pilexer.cmx pitparser.cmx pitlexer.cmx fileprint.ml lexertotex.ml pitlexertotex.ml version.mli version.ml proveriftotex.ml"

SRCTOTEXC="stringPlus.cmo parsing_helper.cmo param.cmo piparser.cmo pilexer.cmo pitparser.cmo pitlexer.cmo fileprint.ml lexertotex.ml pitlexertotex.ml version.mli version.ml proveriftotex.ml"

SRCINTERACT="stringPlus.mli stringPlus.ml parsing_helper.mli parsing_helper.ml stringmap.mli stringmap.ml ptree.mli pitptree.mli types.mli funsymbhash.mli funsymbhash.ml tree.mli tree.ml pitypes.mli param.mli param.ml parser.mli parser.ml lexer.ml pitparser.mli pitparser.ml pitlexer.ml types.mli pitypes.mli pvqueue.mli pvqueue.ml terms.mli terms.ml termslinks.mli termslinks.ml display.mli display.ml termsEq.mli termsEq.ml reduction_helper.mli reduction_helper.ml evaluation_helper.mli evaluation_helper.ml simplify.mli simplify.ml history.mli history.ml pievent.mli pievent.ml database.mli database.ml pitsyntax.mli pitsyntax.ml destructor.mli destructor.ml lemma.mli lemma.ml reduction_bipro.mli reduction_bipro.ml display_interact.mli display_interact.ml menu_helper.mli menu_helper.ml reduction_interact.mli reduction_interact.ml convert_repl.mli convert_repl.ml menu_interact.mli menu_interact.ml version.mli version.ml main_interact.ml"

SRCANAL="rusage.c stringPlus.mli stringPlus.ml analyze.ml"
SRCADDTAGS="stringPlus.mli stringPlus.ml addexpectedtags.ml"

if uname -a | egrep -q \(Cygwin\)\|\(MINGW\)
then
    EXEC=.exe
else
    EXEC=
fi

if [ X"$1" = X-nointeract ]
then
    INTERACT=false
    shift
else
    INTERACT=true
fi

case X$1 in
    Xocb.native )
	cd src &&\
	    ocamlbuild -use-ocamlfind main.native &&\
	    ocamlbuild -use-ocamlfind proveriftotex.native &&\
	    ocamlbuild -use-ocamlfind -lflag rusage.o rusage.o analyze.native &&\
	    ocamlbuild -use-ocamlfind addexpectedtags.native &&\
	    cp _build/main.native ../proverif$EXEC &&\
	    cp _build/proveriftotex.native ../proveriftotex$EXEC &&\
	    cp _build/analyze.native ../analyze$EXEC &&\
	    cp _build/addexpectedtags.native ../addexpectedtags$EXEC &&\
	    rm -f main.native proveriftotex.native analyze.native addexpectedtags.native &&\
	    if [ $INTERACT = true ]
	    then
		ocamlbuild -use-ocamlfind main_interact.native &&\
		    cp _build/main_interact.native ../proverif_interact$EXEC &&\
		    rm -f main_interact.native
	    fi
	    cd .. ;;

    Xocb.byte )
	cd src &&\
	    ocamlbuild -use-ocamlfind main.byte &&\
	    ocamlbuild -use-ocamlfind proveriftotex.byte &&\
	    ocamlbuild -use-ocamlfind addexpectedtags.byte &&\
	    cp _build/main.byte ../proverif$EXEC &&\
	    cp _build/proveriftotex.byte ../proveriftotex$EXEC &&\
	    cp _build/addexpectedtags.byte ../addexpectedtags$EXEC &&\
	    ocamlc -o ../analyze$EXEC -custom unix.cma $SRCANAL &&\
	    rm -f main.byte proveriftotex.byte addexpectedtags.byte stringPlus.cmo stringPlus.cmi analyze.cmo analyze.cmi rusage.o &&\
	    if [ $INTERACT = true ]
	    then
		ocamlbuild -use-ocamlfind main_interact.byte &&\
		    cp _build/main_interact.byte ../proverif_interact$EXEC &&\
		    rm -f main_interact.byte
	    fi
	    cd .. ;;

    Xocb.debug )
	cd src &&\
	    ocamlbuild -tag debug -use-ocamlfind main.byte &&\
	    ocamlbuild -tag debug -use-ocamlfind proveriftotex.byte &&\
	    ocamlbuild -tag debug -use-ocamlfind addexpectedtags.byte &&\
	    cp _build/main.byte ../proverif$EXEC &&\
	    cp _build/proveriftotex.byte ../proveriftotex$EXEC &&\
	    cp _build/addexpectedtags.byte ../addexpectedtags$EXEC &&\
	    ocamlc -g -o ../analyze$EXEC -custom unix.cma $SRCANAL &&\
	    rm -f main.byte proveriftotex.byte addexpectedtags.byte stringPlus.cmo stringPlus.cmi analyze.cmo analyze.cmi rusage.o &&\
	    if [ $INTERACT = true ]
	    then
		ocamlbuild -tag debug -use-ocamlfind main_interact.byte &&\
		    cp _build/main_interact.byte ../proverif_interact$EXEC &&\
		    rm -f main_interact.byte
	    fi
	    cd .. ;;

    Xocb.profile )
	cd src &&\
	    ocamlbuild -use-ocamlfind -lflag profileprim.o profileprim.o main.native &&\
	    ocamlbuild -use-ocamlfind proveriftotex.native &&\
	    ocamlbuild -use-ocamlfind -lflag rusage.o rusage.o analyze.native &&\
	    ocamlbuild -use-ocamlfind addexpectedtags.native &&\
	    cp _build/main.native ../proverif$EXEC &&\
	    cp _build/proveriftotex.native ../proveriftotex$EXEC &&\
	    cp _build/analyze.native ../analyze$EXEC &&\
	    cp _build/addexpectedtags.native ../addexpectedtags$EXEC &&\
	    rm -f main.native proveriftotex.native analyze.native addexpectedtags.native &&\
	    if [ $INTERACT = true ]
	    then
		ocamlbuild -use-ocamlfind main_interact.native &&\
		    cp _build/main_interact.native ../proverif_interact$EXEC &&\
		    rm -f main_interact.native
	    fi
	    cd .. ;;

    Xprofile )
	cd src &&\
	    ocamlyacc -v parser.mly &&\
	    ocamllex lexer.mll &&\
	    ocamlyacc -v piparser.mly &&\
	    ocamllex pilexer.mll &&\
	    ocamlyacc -v pitparser.mly &&\
	    ocamllex pitlexer.mll &&\
	    ocamlopt -o ../proverif$EXEC unix.cmxa profileprim.c profile.mli profile.ml str.cmxa $SRC &&\
	    ocamllex lexertotex.mll &&\
	    ocamllex pitlexertotex.mll &&\
	    ocamlopt -o ../proveriftotex$EXEC $SRCTOTEX &&\
	    ocamlopt -o ../analyze$EXEC unix.cmxa $SRCANAL &&\
	    ocamlopt -o ../addexpectedtags$EXEC $SRCADDTAGS &&\
	    if [ $INTERACT = true ]
	    then
		ocamlfind ocamlopt -o ../proverif_interact$EXEC -package lablgtk2 -linkpkg unix.cmxa str.cmxa $SRCINTERACT
	    fi;;

    Xnative | X )
	cd src &&\
	    ocamlyacc -v parser.mly &&\
	    ocamllex lexer.mll &&\
	    ocamlyacc -v piparser.mly &&\
	    ocamllex pilexer.mll &&\
	    ocamlyacc -v pitparser.mly &&\
	    ocamllex pitlexer.mll &&\
	    ocamlopt -o ../proverif$EXEC unix.cmxa str.cmxa $SRC &&\
	    ocamllex lexertotex.mll &&\
	    ocamllex pitlexertotex.mll &&\
	    ocamlopt -o ../proveriftotex$EXEC $SRCTOTEX &&\
	    ocamlopt -o ../analyze$EXEC unix.cmxa $SRCANAL &&\
	    ocamlopt -o ../addexpectedtags$EXEC $SRCADDTAGS &&\
	    if [ $INTERACT = true ]
	    then
		ocamlfind ocamlopt -o ../proverif_interact$EXEC -package lablgtk2 -linkpkg unix.cmxa str.cmxa $SRCINTERACT
	    fi;;

    Xbyte )
	cd src &&\
	    ocamlyacc -v parser.mly &&\
	    ocamllex lexer.mll &&\
	    ocamlyacc -v piparser.mly &&\
	    ocamllex pilexer.mll &&\
	    ocamlyacc -v pitparser.mly &&\
	    ocamllex pitlexer.mll &&\
	    ocamlc -o ../proverif$EXEC unix.cma str.cma $SRC &&\
	    ocamllex lexertotex.mll &&\
	    ocamllex pitlexertotex.mll &&\
	    ocamlc -o ../proveriftotex$EXEC $SRCTOTEXC &&\
	    ocamlc -o ../analyze$EXEC -custom unix.cma $SRCANAL &&\
	    ocamlc -o ../addexpectedtags$EXEC $SRCADDTAGS &&\
	    if [ $INTERACT = true ]
	    then
		ocamlfind ocamlc -o ../proverif_interact$EXEC -package lablgtk2 -linkpkg unix.cma str.cma $SRCINTERACT
	    fi;;

    Xdebug )
	cd src &&\
	    ocamlyacc -v parser.mly &&\
	    ocamllex lexer.mll &&\
	    ocamlyacc -v piparser.mly &&\
	    ocamllex pilexer.mll &&\
	    ocamlyacc -v pitparser.mly &&\
	    ocamllex pitlexer.mll &&\
	    ocamlc -g -o ../proverif$EXEC unix.cma str.cma $SRC &&\
	    ocamllex lexertotex.mll &&\
	    ocamllex pitlexertotex.mll &&\
	    ocamlc -g -o ../proveriftotex$EXEC $SRCTOTEXC &&\
	    ocamlc -g -o ../analyze$EXEC -custom unix.cma $SRCANAL &&\
	    ocamlc -g -o ../addexpectedtags$EXEC $SRCADDTAGS &&\
	    if [ $INTERACT = true ]
	    then
		ocamlfind ocamlc -g -o ../proverif_interact$EXEC -package lablgtk2 -linkpkg unix.cma str.cma $SRCINTERACT
	    fi;;

    Xclean )
	rm -f proveriftotex$EXEC
	rm -f proverif$EXEC
        rm -f proverif_interact$EXEC
	rm -f analyze$EXEC
	rm -f addexpectedtags$EXEC
	rm -f src/*lexer.ml src/*lexertotex.ml src/*parser.ml src/*parser.mli src/*.cmx src/*.cmo src/*.cmi src/*.o
	rm -rf src/_build ;;

    Xinstall )
	cp proverif$EXEC $2/bin/proverif$EXEC &&\
	chmod +x $2/bin/proverif$EXEC &&\
	cp proveriftotex$EXEC $2/bin/proveriftotex$EXEC &&\
	chmod +x $2/bin/proveriftotex$EXEC &&\
	mkdir -p $2/doc/proverif &&\
	mkdir -p $2/share/proverif &&\
	cp analyze$EXEC $2/doc/proverif/analyze$EXEC &&\
	chmod +x $2/doc/proverif/analyze$EXEC &&\
	cp addexpectedtags$EXEC $2/doc/proverif/addexpectedtags$EXEC &&\
	chmod +x $2/doc/proverif/addexpectedtags$EXEC &&\
	cp -r examples $2/doc/proverif &&\
	cp docs/manual-untyped.pdf README LICENSE $2/doc/proverif &&\
	cp cryptoverif.pvl cssproverif.css $2/share/proverif &&\
	cp -r emacs $2/share/proverif/emacs &&\
	if [ $INTERACT = true ]
	then
	    cp proverif_interact$EXEC $2/bin/proverif_interact$EXEC &&\
	    chmod +x $2/bin/proverif_interact$EXEC
	fi;;

    *)
	echo Unknown option
esac
