#  -Wshadow

CXX=g++
CXXFLAGS=-Wall -Werror -O3 -g # -pg 
CFLAGS=-Wall -Werror -O3 -g # -pg 
OBJS=error.o filewrapper.o util.o datasource.o imagedatasource.o shiftdatasource.o interdatasource.o blockdatasource.o shiftpropagator.o interdomainsubsetpropagator.o blockreadpropagator.o datasourceread.o patternminsearcher.o minsearch.o execpropagator.o extract.o ntfsallocation.o ntfsbitmap.o ntfsmftentry.o ntfsmftentryreader.o xmloutput.o ntfsmftentryxml.o ntfsrunlistpropagator.o 
EXES=q-ex-pattern-file q-ex-jpeg-carve q-pattern-file is-valid-jpeg

# http://stackoverflow.com/questions/714100/os-detecting-makefile

UNAME := $(shell uname)

ifeq ($(UNAME), Linux)
  # -lprofiler is for google-perftools
	LDFLAGS=-lgecodesearch -lgecodeint -lgecodekernel -lgecodesupport -lgecodeminimodel -lgecodegist # -lprofiler
endif

ifeq ($(UNAME), Darwin)
	LDFLAGS=-framework gecode
endif

all: $(EXES)

q-file-on-boundary: $(OBJS) q-file-on-boundary.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) 

q-file-on-boundary-two: $(OBJS) q-file-on-boundary-two.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) 

q-file-carving: $(OBJS) q-file-carving.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) 

q-file-carving-layered: $(OBJS) q-file-carving-layered.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) 

q-file-carving-allocated: $(OBJS) q-file-carving-allocated.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) 

q-allocated: $(OBJS) q-allocated.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) 

q-pattern-file: $(OBJS) q-pattern-file.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) 

q-ex-pattern-file: $(OBJS) q-ex-pattern-file.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) 

q-ex-jpeg-carve: $(OBJS) q-ex-jpeg-carve.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) 

q-ex-jpeg-carve-pattern-file: $(OBJS) q-ex-jpeg-carve-pattern-file.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) 

is-valid-jpeg: is-valid-jpeg.c
	$(CC) $(CFLAGS) -o $@ $^ -ljpeg

error.o: error.cpp error.hh forensics.hh

filewrapper.o: filewrapper.cpp filewrapper.hh error.hh forensics.hh

datasource.o: datasource.cpp datasource.hh forensics-gecode.hh forensics.hh

imagedatasource.o: imagedatasource.cpp imagedatasource.hh datasource.hh forensics-gecode.hh forensics.hh

shiftdatasource.o: shiftdatasource.cpp shiftdatasource.hh datasource.hh shiftpropagator.hh forensics-gecode.hh forensics.hh

interdatasource.o: interdatasource.cpp interdatasource.hh datasource.hh interdomainsubsetpropagator.hh forensics-gecode.hh forensics.hh

blockdatasource.o: blockdatasource.cpp blockdatasource.hh datasource.hh blockreadpropagator.hh forensics-gecode.hh forensics.hh

shiftpropagator.o: shiftpropagator.cpp shiftpropagator.hh forensics-gecode.hh forensics.hh

interdomainsubsetpropagator.o: interdomainsubsetpropagator.cpp interdomainsubsetpropagator.hh forensics-gecode.hh forensics.hh

blockreadpropagator.o: blockreadpropagator.cpp blockreadpropagator.hh forensics-gecode.hh forensics.hh

datasourceread.o: datasourceread.cpp datasourceread.hh datasource.hh forensics-gecode.hh forensics.hh unsafe.hh

util.o: util.cpp util.hh forensics-gecode.hh forensics.hh

patternminsearcher.o: patternminsearcher.cpp patternminsearcher.hh minsearcher.hh datasource.hh forensics-gecode.hh forensics.hh

minsearch.o: minsearch.cpp minsearch.hh minsearcher.hh patternminsearcher.hh datasource.hh forensics-gecode.hh forensics.hh unsafe.hh

execpropagator.o: execpropagator.cpp execpropagator.hh unsafe.hh datasource.hh blockdatasource.hh forensics-gecode.hh forensics.hh

extract.o: extract.cpp extract.hh datasource.hh forensics-gecode.hh forensics.hh

ntfsallocation.o: ntfsallocation.cpp ntfsallocation.hh ntfsbitmap.hh unsafe.hh error.hh datasource.hh forensics-gecode.hh forensics.hh

ntfsbitmap.o: ntfsbitmap.cpp ntfsbitmap.hh unsafe.hh error.hh datasource.hh forensics-gecode.hh forensics.hh

ntfsmftentry.o: ntfsmftentry.cpp ntfsmftentry.hh error.hh filewrapper.hh

ntfsmftentryreader.o: ntfsmftentryreader.cpp ntfsmftentryreader.hh ntfsmftentry.hh error.hh filewrapper.hh

ntfsrunlistpropagator.o: ntfsrunlistpropagator.cpp ntfsrunlistpropagator.hh ntfsmftentryreader.hh ntfsmftentry.hh datasource.hh error.hh filewrapper.hh

q-file-on-boundary.o: q-file-on-boundary.cpp forensics-gecode.hh filewrapper.hh imagedatasource.hh shiftdatasource.hh interdatasource.hh blockdatasource.hh datasource.hh minsearch.hh minsearcher.hh patternminsearcher.hh

q-file-on-boundary-two.o: q-file-on-boundary-two.cpp forensics-gecode.hh filewrapper.hh imagedatasource.hh shiftdatasource.hh interdatasource.hh blockdatasource.hh datasource.hh minsearch.hh minsearcher.hh patternminsearcher.hh

q-file-carving.o: q-file-carving.cpp forensics-gecode.hh filewrapper.hh imagedatasource.hh shiftdatasource.hh interdatasource.hh blockdatasource.hh datasource.hh minsearch.hh minsearcher.hh patternminsearcher.hh extract.hh

q-file-carving-layered.o: q-file-carving-layered.cpp forensics-gecode.hh filewrapper.hh imagedatasource.hh shiftdatasource.hh interdatasource.hh blockdatasource.hh datasource.hh minsearch.hh minsearcher.hh patternminsearcher.hh extract.hh

q-file-carving-allocated.o: q-file-carving-allocated.cpp forensics-gecode.hh filewrapper.hh imagedatasource.hh shiftdatasource.hh interdatasource.hh blockdatasource.hh datasource.hh minsearch.hh minsearcher.hh patternminsearcher.hh extract.hh ntfsallocation.hh ntfsallocation.cpp

q-allocated.o: q-allocated.cpp forensics-gecode.hh filewrapper.hh imagedatasource.hh shiftdatasource.hh interdatasource.hh blockdatasource.hh datasource.hh minsearch.hh minsearcher.hh patternminsearcher.hh extract.hh ntfsallocation.hh ntfsallocation.cpp

q-pattern-file.o: q-pattern-file.cpp forensics-gecode.hh filewrapper.hh imagedatasource.hh shiftdatasource.hh interdatasource.hh blockdatasource.hh datasource.hh minsearch.hh minsearcher.hh patternminsearcher.hh extract.hh ntfsallocation.hh ntfsallocation.cpp ntfsrunlistpropagator.cpp ntfsrunlistpropagator.hh ntfsmftentry.cpp ntfsmftentry.hh ntfsmftentryreader.cpp ntfsmftentryreader.hh xmloutput.hh xmloutput.cpp ntfsmftentryxml.hh ntfsmftentryxml.cpp ntfsseglist.hh

q-ex-pattern-file.o: q-ex-pattern-file.cpp filewrapper.hh imagedatasource.hh shiftdatasource.hh interdatasource.hh blockdatasource.hh datasource.hh minsearch.hh minsearcher.hh patternminsearcher.hh extract.hh ntfsallocation.hh ntfsallocation.cpp ntfsrunlistpropagator.cpp ntfsrunlistpropagator.hh ntfsmftentry.cpp ntfsmftentry.hh ntfsmftentryreader.cpp ntfsmftentryreader.hh

q-ex-jpeg-carve.o: q-ex-jpeg-carve.cpp filewrapper.hh imagedatasource.hh shiftdatasource.hh interdatasource.hh blockdatasource.hh datasource.hh minsearch.hh minsearcher.hh patternminsearcher.hh extract.hh ntfsallocation.hh ntfsallocation.cpp ntfsrunlistpropagator.cpp ntfsrunlistpropagator.hh ntfsmftentry.cpp ntfsmftentry.hh ntfsmftentryreader.cpp ntfsmftentryreader.hh

q-ex-jpeg-carve-pattern-file.o: q-ex-jpeg-carve-pattern-file.cpp filewrapper.hh imagedatasource.hh shiftdatasource.hh interdatasource.hh blockdatasource.hh datasource.hh minsearch.hh minsearcher.hh patternminsearcher.hh extract.hh ntfsallocation.hh ntfsallocation.cpp ntfsrunlistpropagator.cpp ntfsrunlistpropagator.hh ntfsmftentry.cpp ntfsmftentry.hh ntfsmftentryreader.cpp ntfsmftentryreader.hh

xmloutput.o: xmloutput.cpp xmloutput.hh forensics.hh

ntfsmftentryxml.o: ntfsmftentryxml.cpp ntfsmftentryxml.hh xmloutput.hh forensics.hh

clean: 
	@rm -f *.o *~ $(EXES) testntfsmftentryxml.xml

outputclean:
	@rm -f carving/output-*jpg
