#  Authors     [Robert Meolic (meolic@uni-mb.si)]
#  Revision    [$Revision: 76 $]
#  Date        [$Date: 2013-04-26 14:26:09 +0200 (pet, 26 apr 2013) $]
#
#  Copyright   [This file is part of EST (Efficient Symbolic Tools).
#               Copyright (C) 2003, 2013
#               UM-FERI, Smetanova ulica 17, SI-2000 Maribor, Slovenia
#
#               EST is free software; you can redistribute it and/or modify
#               it under the terms of 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.
#
#               EST 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 the GNU General Public
#               License along with this program; if not, write to the Free
#               Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
#               Boston, MA 02110-1301 USA.]

RM = rm -f
CP = cp
MKDIR = mkdir -p
CD = cd

ECHO = echo
DATE = date -R
LS = perl -e 'print localtime((stat($$ARGV[0]))[9]) . " $$ARGV[0]\n";'
LINECMD = sed -e 's/\(...\) \(...\) \(..\) \(.*\) \(.*\) \(.*\)/\* \3 \2 \5 \4 \6/'

all: nop
mish: bindir about start mc ok
lib: bindir header $(BINDIR)/mcMain.o $(BINDIR)/mcThread.o $(BINDIR)/mcDiagnostic.o $(BINDIR)/mcTree.o $(BINDIR)/mcAutomata.o $(BINDIR)/mc.tab.o

# -----------------------------------------------------------------------
# testing

local: mish
	@$(CP) mcDialog.tcl $(BINDIR)

# -----------------------------------------------------------------------
# help

nop:
	@echo Please, use \"make -f Makefile.xxx\", where xxx is your OS.

start:
	@echo "---------------------------------------"
	@echo "| Building Model checking package ... |"
	@echo "---------------------------------------"

ok:
	@echo "------------------------------------------------"
	@echo "| Model checking package successfully compiled |"
	@echo "------------------------------------------------"

# -----------------------------------------------------------------------
# create a directory for binary files

bindir:
	@$(MKDIR) $(BINDIR)

# -----------------------------------------------------------------------
# create information about the package

about:
	@$(ECHO) "Builded on \c" > $(BINDIR)/mc.about
	@$(DATE) >> $(BINDIR)/mc.about
	@$(LS) mc.h | $(LINECMD) >> $(BINDIR)/mc.about
	@$(LS) mcInt.h | $(LINECMD) >> $(BINDIR)/mc.about
	@$(LS) mcMain.c | $(LINECMD) >> $(BINDIR)/mc.about
	@$(LS) mcThread.c | $(LINECMD) >> $(BINDIR)/mc.about
	@$(LS) mcDiagnostic.c | $(LINECMD) >> $(BINDIR)/mc.about
	@$(LS) mcAutomata.c | $(LINECMD) >> $(BINDIR)/mc.about
	@$(LS) mcMsc.c | $(LINECMD) >> $(BINDIR)/mc.about
	@$(LS) mcTree.c | $(LINECMD) >> $(BINDIR)/mc.about
	@$(LS) mcParser.l | $(LINECMD) >> $(BINDIR)/mc.about
	@$(LS) mcParser.y | $(LINECMD) >> $(BINDIR)/mc.about
	@$(LS) mcTcl.c | $(LINECMD) >> $(BINDIR)/mc.about
	@$(LS) mcDialog.tcl | $(LINECMD) >> $(BINDIR)/mc.about

# -----------------------------------------------------------------------
# copy header file

header:
	@$(CP) mc.h $(BINDIR)

# -----------------------------------------------------------------------
# make objects
# -----------------------------------------------------------------------

$(BINDIR)/mcMain.o: mcMain.c mc.h mcInt.h
	$(CC) -o $(BINDIR)/mcMain.o -c mcMain.c

$(BINDIR)/mcThread.o: mcThread.c mc.h mcInt.h
	$(CC) -o $(BINDIR)/mcThread.o -c mcThread.c

$(BINDIR)/mcDiagnostic.o: mcDiagnostic.c mc.h mcInt.h
	$(CC) -o $(BINDIR)/mcDiagnostic.o -c mcDiagnostic.c

$(BINDIR)/mcTree.o: mcTree.c mc.h mcInt.h
	$(CC) -o $(BINDIR)/mcTree.o -c mcTree.c

$(BINDIR)/mcAutomata.o: mcAutomata.c mc.h mcInt.h
	$(CC) -o $(BINDIR)/mcAutomata.o -c mcAutomata.c

$(BINDIR)/mc.tab.o: mcParser.l mcParser.y mc.h mcInt.h
	$(FLEX) -Pmc -t mcParser.l > $(BINDIR)/lex.mc.c
	$(BISON) -p mc -b $(BINDIR)/mc -v mcParser.y
	$(CC) -I. -I$(BINDIR) -o $(BINDIR)/mc.tab.o -c $(BINDIR)/mc.tab.c

# -----------------------------------------------------------------------
# make tcl extension
# -----------------------------------------------------------------------

$(BINDIR)/mcTcl.o: mcTcl.c mc.h mcInt.h mcStubInit.c mcStubLib.c
	$(CC) -o $(BINDIR)/mcTcl.o -c mcTcl.c -D'USECONST=$(USECONST)'
	$(CC) -o $(BINDIR)/mcStubInit.o -c mcStubInit.c
	$(CC) -o $(BINDIR)/mcStubLib.o -c mcStubLib.c

mc: $(BINDIR)/mcMain.o $(BINDIR)/mcThread.o $(BINDIR)/mcDiagnostic.o $(BINDIR)/mcTree.o $(BINDIR)/mcAutomata.o $(BINDIR)/mc.tab.o $(BINDIR)/mcTcl.o
	$(CD) $(BINDIR); $(LN) \
		mcTcl.o \
		mcMain.o \
		mcThread.o \
		mcDiagnostic.o \
		mcTree.o \
		mcAutomata.o \
		mc.tab.o \
		mcStubInit.o \
		$(ESTLIB) $(PTHREADLIB) $(TCLLIB)
	$(CD) $(BINDIR); $(AR) libmcstub.a mcStubLib.o

# -----------------------------------------------------------------------
# purge = purify source directory, clean = purify bin directory

purge:
	@$(RM) *~

clean:
	@$(RM) $(BINDIR)/lex.mc.c
	@$(RM) $(BINDIR)/mc.tab.c
	@$(RM) $(BINDIR)/mc.output
	@$(RM) $(BINDIR)/mcMain.o
	@$(RM) $(BINDIR)/mcThread.o
	@$(RM) $(BINDIR)/mcDiagnostic.o
	@$(RM) $(BINDIR)/mcTree.o
	@$(RM) $(BINDIR)/mcAutomata.o
	@$(RM) $(BINDIR)/mc.tab.o
	@$(RM) $(BINDIR)/mcTcl.o
	@$(RM) $(BINDIR)/mcStubInit.o
	@$(RM) $(BINDIR)/mcStubLib.o
	@$(RM) $(BINDIR)/libmcstub.a
	@$(RM) $(BINDIR)/mcMain.bb
	@$(RM) $(BINDIR)/mcMain.bbg
	@$(RM) $(BINDIR)/mcMain.da
	@$(RM) $(BINDIR)/mcTcl.bb
	@$(RM) $(BINDIR)/mcTcl.bbg
	@$(RM) $(BINDIR)/mcTcl.da
	@$(RM) $(BINDIR)/mcThread.bb
	@$(RM) $(BINDIR)/mcThread.bbg
	@$(RM) $(BINDIR)/mcThread.da
	@$(RM) $(BINDIR)/mcDiagnostic.bb
	@$(RM) $(BINDIR)/mcDiagnostic.bbg
	@$(RM) $(BINDIR)/mcDiagnostic.da
	@$(RM) $(BINDIR)/mcTree.bb
	@$(RM) $(BINDIR)/mcTree.bbg
	@$(RM) $(BINDIR)/mcTree.da
	@$(RM) $(BINDIR)/mcAutomata.bb
	@$(RM) $(BINDIR)/mcAutomata.bbg
	@$(RM) $(BINDIR)/mcAutomata.da
	@$(RM) $(BINDIR)/mc.tab.bb
	@$(RM) $(BINDIR)/mc.tab.bbg
	@$(RM) $(BINDIR)/mc.tab.da
