VERSION= 2.0

B       = buddy
BU      = buddy-2.4
P	= cudd
CU      = cudd-3.0.0

VPATH = $(BU)/src:$(CU)/cudd:$(CU)/epd:$(CU)/mtr:$(CU)/st:$(CU)/util

dirs = cudd-3.0.0 linux64 win64 macos out buddy-2.4

# Windows mingw
#CC	= gcc
#CXX     = g++
# -DDD_STATS -DDD_VERBOSE -DDD_COUNT
# Use CXX to link buddy_tcl
#
#CCFLAGS =  -O2 -DHAVE_SYS_RESOURCE_H=0
#BCFLAGS = -O2 
#CLDFLAGS = -shared 
#LIBEXT = dll
#TCLINC = -IC:/Tcl/include
#TCLLIBDIR = C:/Tcl/lib
#FICKLE=/home/acau/perldd/tclDD/fickle-2.04/fickle.tcl
#TACCLE=/home/acau/perldd/tclDD/taccle-1.1/taccle.tcl
#LIBCUDDTCL = win64/cudd_tcl.$(LIBEXT)
#LIBBUDDYTCL = win64/buddy_tcl.$(LIBEXT)
#LDFLAGS1 = -L$(TCLLIBDIR) -ltclstub85
#PIPESRC = 

# using Windows mingw32 crosscompiler 
## ./configure --host=x86_64-w64-mingw32
#CC=x86_64-w64-mingw32-gcc
#CXX=x86_64-w64-mingw32-g++ 
#AR=x86_64-w64-mingw32-ar
#RANLIB=x86_64-w64-mingw32-ranlib
#NM=x86_64-w64-mingw32-nm
#RC=x86_64-w64-mingw32-windres
#STRIP=x86_64-w64-mingw32-strip
#CONFIGUREFLAGS= --host=x86_64-w64-mingw32
#CCFLAGS =  -O2 
#BCFLAGS = -O2 
#CLDFLAGS = -shared 
#TCLINC = -I/Users/cau/tempura/mp-tempura/win64/kitcreator/kitcreator-0.12.2/tcl/inst/include
#TCLLIBDIR = /Users/cau/tempura/mp-tempura/win64/kitcreator/kitcreator-0.12.2/tcl/inst/lib
#LIBEXT = dll
#LIBCUDDTCL = win64/cudd_tcl.$(LIBEXT)
#LIBBUDDYTCL = win64/buddy_tcl.$(LIBEXT)
#LDFLAGS1 = -L$(TCLLIBDIR) -ltclstub86  -lwsock32 
#PIPESRC = pipefork.c
#
#




# Linux 64 gcc compiler
#CC	= gcc
#CXX     = g++
#CCFLAGS	= -O3 -fPIC
#BCFLAGS = -O2 -fPIC
#CLDFLAGS = -shared
#LIBEXT = so
#TCLINC = -I/home/cau/tempura/kitcreator-0.12.2/tcl/inst/include
#TCLLIBDIR = /home/cau/tempura/kitcreator-0.12.2/tcl/inst/lib
#JAVAINC = -I/usr/local/java/include -I/usr/local/java/include/linux
#FICKLE=../fickle-2.04/fickle.tcl
#TACCLE=../taccle-1.1/taccle.tcl
#CONFIGUREFLAGS=
#LIBCUDDTCL = linux64/cudd_tcl.$(LIBEXT)
#LIBBUDDYTCL = linux64/buddy_tcl.$(LIBEXT)
#LIBCUDDJAVA = linux64/libjavacudd.$(LIBEXT)
#LDFLAGS1 = -L$(TCLLIBDIR) -ltclstub8.6
#PIPESRC = pipefork.c


# MACOS gcc compiler
CC	= gcc
CXX     = g++
CCFLAGS	= -O3 -arch x86_64 -arch arm64
BCFLAGS = -O2 -arch x86_64 -arch arm64
CLDFLAGS = -dynamiclib -arch x86_64 -arch arm64
LIBEXT = dylib
TCLINC = -I/Users/cau/tempura/mp-tempura/macos/kitcreator/kitcreator-0.12.2/tcl/inst/include
TCLLIBDIR = /Users/cau/tempura/mp-tempura/macos/kitcreator/kitcreator-0.12.2/tcl/inst/lib
JAVAINC = -I/opt/local/Library/Java/JavaVirtualMachines/openjdk17/Contents/Home/include
FICKLE= /Users/cau/programs/bdd/fickle-2.04/fickle.tcl
TACCLE= /Users/cau/programs/bdd/taccle-1.1/taccle.tcl
CONFIGUREFLAGS=
LIBCUDDTCL = macos/cudd_tcl.$(LIBEXT)
LIBBUDDYTCL = macos/buddy_tcl.$(LIBEXT)
LIBCUDDJAVA = macos/libjavacudd.$(LIBEXT)
LDFLAGS1 = -L$(TCLLIBDIR) -ltclstub8.6
PIPESRC = pipefork.c




BSRC    = bddio.c bddop.c bvec.c cache.c fdd.c \
	  imatrix.c kernel.c pairs.c prime.c reorder.c tree.c

CXXSRC = cppext.cxx 

PSRC	= cuddAPI.c cuddAddAbs.c cuddAddApply.c cuddAddFind.c cuddAddIte.c \
	  cuddAddInv.c cuddAddNeg.c cuddAddWalsh.c cuddAndAbs.c \
	  cuddAnneal.c cuddApa.c cuddApprox.c cuddBddAbs.c cuddBddCorr.c \
	  cuddBddIte.c cuddBridge.c cuddCache.c cuddCheck.c cuddClip.c \
	  cuddCof.c cuddCompose.c cuddDecomp.c cuddEssent.c \
	  cuddExact.c cuddExport.c cuddDot.c cuddGenCof.c cuddGenetic.c \
	  cuddGroup.c cuddHarwell.c cuddInit.c cuddInteract.c \
	  cuddLCache.c cuddLevelQ.c \
	  cuddLinear.c cuddLiteral.c cuddMatMult.c cuddPriority.c \
	  cuddRead.c cuddRef.c cuddReorder.c cuddSat.c cuddSign.c \
	  cuddSolve.c cuddSplit.c cuddSubsetHB.c cuddSubsetSP.c cuddSymmetry.c \
	  cuddTable.c cuddUtil.c cuddWindow.c cuddZddCount.c cuddZddFuncs.c \
	  cuddZddGroup.c cuddZddIsop.c cuddZddLin.c cuddZddMisc.c \
	  cuddZddPort.c cuddZddReord.c cuddZddSetop.c cuddZddSymm.c \
	  cuddZddUtil.c st.c mtrGroup.c mtrBasic.c texpand.c \
	  strsav.c  safe_mem.c  prtime.c ucbqsort.c cstringstream.c\
          $(PIPESRC) pathsearch.c datalimit.c cpu_time.c cpu_stats.c \
          epd.c

PHDR    = $(CU)/config.h cudd.h cuddDot.h cuddInt.h
BHDR    = $(BU)/config.h
POBJ	= $(PSRC:.c=.o)
BOBJ	= $(BSRC:.c=.o) cppext.o
INCLUDE = -I$(CU)/ -I$(CU)/cudd -I$(CU)/epd -I$(CU)/mtr -I$(CU)/st -I$(CU)/util
BINCLUDE = -I$(BU)/src -I$(BU)


TCL=tclsh


TCLOBJ = scanner_fusion_logic.tcl fusion_logic.tcl



all: $(CU)/config.h $(POBJ) $(BU)/config.h $(BOBJ) $(TCLOBJ) buddy_tcl.o cudd_tcl.o $(LIBCUDDTCL) $(LIBBUDDYTCL)

$(CU)/config.h:
	cd $(CU);./configure $(CONFIGUREFLAGS)

$(BU)/config.h:
	cd $(BU);./configure $(CONFIGUREFLAGS)

cudd_tcl.c: cudd_tcl.i
	swig -tcl -namespace -prefix bdd_tcl -pkgversion 3.0.0 -o cudd_tcl.c cudd_tcl.i

buddy_tcl.c: buddy_tcl.i
	swig -tcl -namespace -prefix bdd_tcl -pkgversion 2.4 -o buddy_tcl.c buddy_tcl.i

cudd_tcl.o: cudd_tcl.c
	$(CC) $(CCFLAGS) -DUSE_TCL_STUBS $(TCLINC) $(INCLUDE) -c cudd_tcl.c

buddy_tcl.o: buddy_tcl.c
	$(CC) $(BCFLAGS) -DUSE_TCL_STUBS $(TCLINC) $(BINCLUDE) -c buddy_tcl.c

cudd_java.c: cudd_java.i
	swig -java -outdir cudd-java -o cudd_java.c cudd_java.i

cudd_java.o: cudd_java.c
	$(CC) $(CCFLAGS) $(JAVAINC) $(INCLUDE) -c cudd_java.c

$(LIBCUDDTCL): $(POBJ)  cudd_tcl.o
	$(CC) $(CLDFLAGS) -o $(LIBCUDDTCL) $(POBJ) cudd_tcl.o $(LDFLAGS1)

$(LIBBUDDYTCL): $(BOBJ)  buddy_tcl.o
	$(CC) $(CLDFLAGS) -o $(LIBBUDDYTCL) $(BOBJ) -lstdc++  buddy_tcl.o $(LDFLAGS1)

$(LIBCUDDJAVA): $(POBJ)  cudd_java.o
	$(CC) $(CLDFLAGS) -o $(LIBCUDDJAVA) $(POBJ) cudd_java.o $(LDFLAGS1)

%.tcl: %.fcl
	$(TCL) $(FICKLE) -v $<

%.tcl: %.tac
	$(TCL) $(TACCLE) -d -v -w $<

bddio.o: $(BU)/config.h
	$(CC) $(BCFLAGS) $(BINCLUDE) -c buddy-2.4/src/bddio.c

bddop.o: $(BU)/config.h 
	$(CC) $(BCFLAGS) $(BINCLUDE) -c buddy-2.4/src/bddop.c

bvec.o:  $(BU)/config.h
	$(CC) $(BCFLAGS) $(BINCLUDE) -c buddy-2.4/src/bvec.c

cache.o: $(BU)/config.h
	$(CC) $(BCFLAGS) $(BINCLUDE) -c buddy-2.4/src/cache.c

fdd.o: $(BU)/config.h
	$(CC) $(BCFLAGS) $(BINCLUDE) -c buddy-2.4/src/fdd.c

kernel.o:  $(BU)/config.h
	$(CC) $(BCFLAGS) $(BINCLUDE) -c buddy-2.4/src/kernel.c

pairs.o: $(BU)/config.h
	$(CC) $(BCFLAGS) $(BINCLUDE) -c buddy-2.4/src/pairs.c

tree.o: $(BU)/config.h
	$(CC) $(BCFLAGS) $(BINCLUDE) -c buddy-2.4/src/tree.c

cppext.o:  $(BU)/config.h
	$(CXX) $(BCFLAGS) $(BINCLUDE) -c buddy-2.4/src/cppext.cxx

reorder.o: $(BU)/config.h 
	$(CC) $(BCFLAGS) $(BINCLUDE) -c buddy-2.4/src/reorder.c

prime.o: $(BU)/config.h
	$(CC) $(BCFLAGS) $(BINCLUDE) -c buddy-2.4/src/prime.c

imatrix.o: $(BU)/config.h 
	$(CC) $(BCFLAGS) $(BINCLUDE) -c buddy-2.4/src/imatrix.c

.c.o: $(PSRC) $(PHDR) 
	$(CC) $(CCFLAGS) $(INCLUDE) -c $<

flcheck_macos: $(TCLOBJ) macos/buddy_tcl.dylib macos/cudd_tcl.dylib flcheck.tcl
	cp buddy.tcl flcheck_macos.vfs
	cp cudd.tcl flcheck_macos.vfs
	cp flcheck.tcl flcheck_macos.vfs
	cp fusion_logic_commands.tcl flcheck_macos.vfs
	cp fusion_logic_derived.tcl flcheck_macos.vfs
	cp fusion_logic.tab.tcl flcheck_macos.vfs
	cp fusion_logic.tcl flcheck_macos.vfs
	cp scanner_fusion_logic.tcl flcheck_macos.vfs
	cp macos/buddy_tcl.dylib flcheck_macos.vfs/lib/buddy_tcl
	cp macos/cudd_tcl.dylib flcheck_macos.vfs/lib/cudd_tcl
	sdx wrap flcheck_macos.kit -runtime tclkit-8.6.17_macos
	mv flcheck_macos.kit flcheck_macos

flcheck_linux64: $(TCLOBJ) linux64/buddy_tcl.so linux64/cudd_tcl.so flcheck.tcl
	cp buddy.tcl flcheck_linux64.vfs
	cp cudd.tcl flcheck_linux64.vfs
	cp flcheck.tcl flcheck_linux64.vfs
	cp fusion_logic_commands.tcl flcheck_linux64.vfs
	cp fusion_logic_derived.tcl flcheck_linux64.vfs
	cp fusion_logic.tab.tcl flcheck_linux64.vfs
	cp fusion_logic.tcl flcheck_linux64.vfs
	cp scanner_fusion_logic.tcl flcheck_linux64.vfs
	cp linux64/buddy_tcl.so flcheck_linux64.vfs/lib/buddy_tcl
	cp linux64/cudd_tcl.so flcheck_linux64.vfs/lib/cudd_tcl
	sdx wrap flcheck_linux64.kit -runtime tclkit-8.6.17_linux64
	mv flcheck_linux64.kit flcheck_linux64

flcheck_win64: $(TCLOBJ) win64/buddy_tcl.dll win64/cudd_tcl.dll flcheck.tcl
	cp buddy.tcl flcheck_win64.vfs
	cp cudd.tcl flcheck_win64.vfs
	cp flcheck.tcl flcheck_win64.vfs
	cp fusion_logic_commands.tcl flcheck_win64.vfs
	cp fusion_logic_derived.tcl flcheck_win64.vfs
	cp fusion_logic.tab.tcl flcheck_win64.vfs
	cp fusion_logic.tcl flcheck_win64.vfs
	cp scanner_fusion_logic.tcl flcheck_win64.vfs
	cp win64/buddy_tcl.dll flcheck_win64.vfs/lib/buddy_tcl
	cp win64/cudd_tcl.dll flcheck_win64.vfs/lib/cudd_tcl
	sdx wrap flcheck_win64.kit -runtime tclkit-8.6.17_win64
	mv flcheck_win64.kit flcheck_win64.exe

kit: flcheck_macos flcheck_linux64 flcheck_win64

dist: 
	cd $(BU); make distclean; cd ../
	cd $(CU); make distclean; cd ../
	mkdir flcheck-$(VERSION)
	cp Makefile flcheck-$(VERSION)
	cp Readme flcheck-$(VERSION)
	cp ChangeLog flcheck-$(VERSION)
	cp itl-fl.pdf flcheck-$(VERSION)
	cp itl-fl-old.pdf flcheck-$(VERSION)
	cp buddy.tcl flcheck-$(VERSION)
	cp buddy_tcl.c flcheck-$(VERSION)
	cp buddy_tcl.i flcheck-$(VERSION)
	cp cuddDot.c flcheck-$(VERSION)
	cp cuddDot.h flcheck-$(VERSION)
	cp cudd.tcl flcheck-$(VERSION)
	cp cudd_tcl.c flcheck-$(VERSION)
	cp cudd_tcl.i flcheck-$(VERSION)
	cp cudd_java.i flcheck-$(VERSION)
	cp fusion_logic.tac flcheck-$(VERSION)
	cp fusion_logic.tcl flcheck-$(VERSION)
	cp fusion_logic.tab.tcl flcheck-$(VERSION)
	cp fusion_logic_commands.tcl flcheck-$(VERSION)
	cp fusion_logic_derived.tcl flcheck-$(VERSION)
	cp scanner_fusion_logic.fcl flcheck-$(VERSION)
	cp scanner_fusion_logic.tcl flcheck-$(VERSION)
	cp flcheck.tcl flcheck-$(VERSION)
	cp flcheck_linux64 flcheck-$(VERSION)
	cp flcheck_win64.exe flcheck-$(VERSION)
	cp flcheck_macos flcheck-$(VERSION)
	cp example-small.tcl flcheck-$(VERSION)
	cp example-small-past.tcl flcheck-$(VERSION)
	cp example-policy-rule.tcl flcheck-$(VERSION)
	cp example-policy-verification-left.tcl flcheck-$(VERSION)
	cp example-policy-verification-right.tcl flcheck-$(VERSION)
	cp example-policy-enforcement-left.tcl flcheck-$(VERSION)
	cp example-policy-enforcement-right.tcl flcheck-$(VERSION)
	cp example-policy-keys-left-new.tcl flcheck-$(VERSION)
	cp example-policy-keys-left.tcl flcheck-$(VERSION)
	cp example-policy-keys-right.tcl flcheck-$(VERSION)
	cp example-policy-keys-left-1.tcl flcheck-$(VERSION)
	cp example-policy-keys-right-1.tcl flcheck-$(VERSION)
	cp test-flux.tcl flcheck-$(VERSION)
	cp stdio-flux.in flcheck-$(VERSION)
	cp stdio-policy-enf-left.in flcheck-$(VERSION)
	cp stdio-policy-enf-right.in flcheck-$(VERSION)
	cp stdio-policy-keys-left-1.in flcheck-$(VERSION)
	cp stdio-policy-keys-left-new.in flcheck-$(VERSION)
	cp stdio-policy-keys-left.in flcheck-$(VERSION)
	cp stdio-policy-keys-right-1.in flcheck-$(VERSION)
	cp stdio-policy-keys-right.in flcheck-$(VERSION)
	cp stdio-policy-ver-left.in flcheck-$(VERSION)
	cp stdio-policy-ver-right.in flcheck-$(VERSION)
	cp stdio-regression-past.in flcheck-$(VERSION)
	cp stdio-regression.in flcheck-$(VERSION)
	cp stdio-test.in flcheck-$(VERSION)
	cp policy_library.tcl flcheck-$(VERSION)
	cp cudd-regression flcheck-$(VERSION)
	cp buddy-regression flcheck-$(VERSION)
	for X in $(dirs); do\
	 cp -r $$X flcheck-$(VERSION); done
	tar --exclude 'CVS' -czvf flcheck-$(VERSION).tar.gz flcheck-$(VERSION)
	zip -rq flcheck-$(VERSION).zip flcheck-$(VERSION)
	rm -rf flcheck-$(VERSION)

clean:
	rm -f *.o *.u mon.out gmon.out *.pixie *.Addrs *.Counts mnem.* \
	.pure core *.warnings config.c
	cd $(BU); make distclean; cd ../
	cd $(CU); make distclean; cd ../
