########################################################################
###
###  Makefile for PRISM ver1.1
###
###  Copyright (C) 1999
###    Taisuke Sato, Yoshitaka Kameya, Yasushi Hagiwara, 
###       Nobuhisa Ueda, and Hiroshi Ishimaru,
###    Dept. of Computer Science, Tokyo Institute of Technology.
###
############################## targets #################################
##
## [PRISM compiling] -- choose a combination of three independent options.
##
##   make                  --- saved status(*1),  GUI(*3),    dynamic(*5)
##   make static           --- saved status,      GUI,        static(*6)
##   make noGUI            --- saved status,      no-GUI(*4), dynamic
##   make noGUI-static     --- saved status,      no-GUI,     static
##   make bootstrap        --- bootstrapping(*2), GUI,        dynamic
##   make bootstrap-static --- bootstrapping,     GUI,        static
##   make bootstrap-noGUI  --- bootstrapping,     no-GUI,     dynamic
##   make bootstrap-noGUI-static --- bootstrapping, no-GUI,   static
##
##   (*1) start from saved status.  (*2) start by bootstrapping.
##   (*3) use the system with GUI built-ins. (*4) with no GUI built-ins.
##   (*5) use C routines with dynamic linking. (*6) with static linking.
##
## [Others]
##
##   make install --- Copy the PRISM executable. 
##   make clean --- Clean up the files which is not used after installation.  
##   make distclean --- Clean up the files which is not in distribution.
##
################ Specify your system configuration ################

## C compiler and the options:
CC = gcc
CFLAGS = -O2

## PRISM executable (saved file by SICStus built-in save/1):
PRISM = prism
PRISM_BIN = /usr/local/bin

## Specify the directory in which you expand `prism1.2.tgz'.
TOP = /usr/local/lib

## X libraries for GUI:
## (please ignore if you don't use GUI.)
X_LIB = /usr/local/X11R6/lib

## SICStus Prolog library directory:
SP_LIB = /usr/local/lib/sicstus3
## SICStus Prolog executable (shell script):
SP_EXE = /usr/local/bin/sicstus
## Choose one from {fastcode, compactcode, profiledcode, debugcode}
## (See SICStus Prolog User's Manual)
## `fastcode' is available only for 680x0, Sparc, and MIPS platforms.
## SP_CMP_CODE = fastcode
SP_CMP_CODE = compactcode

## Libraries for GUI (please ignore if you don't use GUI.):
##  `-lsocket' option will be required for Solaris 2.
LIBS = -lX11  #-lsocket
## Add `-L$(X_LIB)' and/or `-R$(X_LIB)' option(s) if nessesary.
## Or set LD_LIBRARY_PATH to the library path of your system.
LIBOPT = -L$(X_LIB) $(LIBS)
#LIBOPT = -L$(X_LIB) -R$(X_LIB) $(LIBS)

################### end of system configuration ##################

PRISM_PATH = $(TOP)/prism

SP_BIN = $(SP_LIB)/bin
LIBOPT_NO_GUI = -lm

OFILES_NO_GUI = em.o random.o trie.o prob.o trace.o
OFILES = $(OFILES_NO_GUI) graph.o
PL_NO_GUI = [prism,parse,make_routines,em,exec,c_interface,\
			sw_handling,modifier,trace,misc,start]
PL = [prism,parse,make_routines,em,tclIF,exec,c_interface,\
      sw_handling,modifier,trace,misc,start]

VERSION = 1.2
MESSAGE = '-=-=-=-=-= PRISM programming system: version $(VERSION) =-=-=-=-=-'

##################################################################
### target definitions: 
##################################################################

## [NOTE]
##   We use `splfr' provided by SICStus Prolog 3. This is invoked by
##   "$(SP_BIN)/splfr Resource SourceFile [+dynamic|+static] [+c CFiles]
##   [+o Objectfiles] [+l Libraries]", then we get a library `prism.so'.

all: prism

##################################################################
## make GUI version

prism: o-files clean-pl concat-pl
	$(SP_BIN)/splfr prism foreign.pl +dynamic +o $(OFILES)\
		+l $(LIBOPT) $(LIBOPT_NO_GUI)
	echo "prolog_flag(compiling,_,$(SP_CMP_CODE)),compile($(PL)),save($(PRISM)),nl,write($(MESSAGE)),nl,nl,start." | $(SP_EXE) -f -a -help 

static: o-files clean-pl concat-pl clean-static
	$(SP_BIN)/splfr prism foreign.pl +static +o $(OFILES)\
		+l $(LIBOPT) $(LIBOPT_NO_GUI)
	$(SP_BIN)/spmkds prism.exe prism
	echo "prolog_flag(compiling,_,$(SP_CMP_CODE)),compile($(PL)),save($(PRISM)),nl,write($(MESSAGE)),nl,nl,start." | ./prism.exe -f -b $(SP_BIN)/sp.ql -a -help

##################################################################
##   make non-GUI version

noGUI: o-files-noGUI clean-pl concat-pl-noGUI
	$(SP_BIN)/splfr prism foreign.pl +dynamic +o $(OFILES_NO_GUI)\
	                                          +l $(LIBOPT_NO_GUI)
	echo "prolog_flag(compiling,_,$(SP_CMP_CODE)),compile($(PL_NO_GUI)),save(prism),nl,write($(MESSAGE)),nl,nl,start." | $(SP_EXE) -f -a -help

noGUI-static: o-files-noGUI clean-pl clean-static concat-pl-noGUI
	$(SP_BIN)/splfr prism foreign.pl +static +o $(OFILES_NO_GUI)\
                                                 +l $(LIBOPT_NO_GUI)
	$(SP_BIN)/spmkds prism.exe prism
	echo "prolog_flag(compiling,_,$(SP_CMP_CODE)),compile($(PL_NO_GUI)),save($(PRISM)),nl,write($(MESSAGE)),nl,nl,start." | ./prism.exe -f -b $(SP_BIN)/sp.ql -a -help

##################################################################
##   make bootstrap version (GUI)

bootstrap: o-files clean-pl bprism concat-pl all.pl
	$(SP_BIN)/splfr prism foreign.pl +dynamic +o $(OFILES)\
                                         +l $(LIBOPT) $(LIBOPT_NO_GUI)
	echo "prolog_flag(compiling,_,$(SP_CMP_CODE)),fcompile(all)." | $(SP_EXE) -B -f
 
bootstrap-static: o-files clean-pl clean-static bsprism concat-pl all.pl
	$(SP_BIN)/splfr prism foreign.pl +static +o $(OFILES)\
                                         +l $(LIBOPT) $(LIBOPT_NO_GUI)
	$(SP_BIN)/spmkds prism.exe prism
	echo "prolog_flag(compiling,_,$(SP_CMP_CODE)),fcompile(all)." | ./prism.exe -f -b $(SP_BIN)/sp.ql

##################################################################
##   make bootstrap version (no-GUI)

bootstrap-noGUI: o-files-noGUI clean-pl bprism concat-pl-noGUI all.pl-noGUI
	$(SP_BIN)/splfr prism foreign.pl +dynamic +o $(OFILES_NO_GUI)\
                                                 +l $(LIBOPT_NO_GUI)
	echo "prolog_flag(compiling,_,$(SP_CMP_CODE)),fcompile(all)." | $(SP_EXE) -B -f

bootstrap-noGUI-static: o-files-noGUI clean-static clean-pl bsprism\
							concat-pl-noGUI all.pl-noGUI 
	$(SP_BIN)/splfr prism foreign.pl +static +o $(OFILES_NO_GUI)\
                                                 +l $(LIBOPT_NO_GUI)
	$(SP_BIN)/spmkds prism.exe prism
	echo "prolog_flag(compiling,_,$(SP_CMP_CODE)),fcompile(all)." | ./prism.exe -f -b $(SP_BIN)/sp.ql

########## sub-targets #########

o-files: prism.h $(OFILES)
o-files-noGUI: prism.h $(OFILES_NO_GUI)

concat-pl:
	cat em_stable.pl emGUI.pl > em.pl
	cat startGUI.pl start_stable.pl > start.pl
	cat foreign_stable.pl foreignGUI.pl > foreign.pl

concat-pl-noGUI:
	cat em_stable.pl emNoGUI.pl >em.pl
	cat startNoGUI.pl start_stable.pl > start.pl
	cat foreign_stable.pl foreignNoGUI.pl > foreign.pl

all.pl:
	cat prism.pl parse.pl make_routines.pl em.pl exec.pl c_interface.pl\
	    sw_handling.pl modifier.pl misc.pl\
                trace.pl tclIF.pl start.pl > all.pl
	echo ":- nl,write($(MESSAGE)),nl,nl,start." >> all.pl

all.pl-noGUI:
	cat prism.pl parse.pl make_routines.pl em.pl exec.pl c_interface.pl\
		sw_handling.pl modifier.pl misc.pl trace.pl start.pl > all.pl
	echo ":- nl,write($(MESSAGE)),nl,nl,start." >> all.pl

bprism:
	./bprism.sh dynamic $(SP_EXE) $(PRISM_PATH) $(SP_BIN) > bprism
	cp bprism prism
	-rm -f bprism
	chmod a+x prism

bsprism:
	./bprism.sh static $(SP_EXE) $(PRISM_PATH) $(SP_BIN) > bprism
	cp bprism prism
	-rm -f bprism
	chmod a+x prism

## make the debugging executable `cprism'.
cprism: o-files main.c main.o
	$(CC) -o cprism $(OFILES_NO_GUI) main.o -lm

em.o: prism.h em.c
random.o: prism.h random.c
trie.o: prism.h trie.c
prob.o:	prism.h prob.c
graph.o: prism.h graph.c
main.o: prism.h main.c
trace.o: prism.h trace.c

install:
	cp ./prism $(PRISM_BIN)/$(PRISM)

distclean: clean clean-static
	-rm -f prism prism.so prism.s.o all.ql

clean: clean-pl
	-rm -f cprism $(OFILES) main.o

clean-pl:
	-rm -f start.pl em.pl foreign.pl all.pl

clean-static:
	-rm -f prism.exe
