#------------------------------------------------------------------------------
# General Settings
#------------------------------------------------------------------------------

TOPDIR = ../..

include $(TOPDIR)/Makefile.defs
include $(TOPDIR)/mf/common.defs

.SUFFIXES: .cpp .o
.PHONY: all install clean


# Directories
CUBEDIR = ../cube
CUBEINC = -I$(CUBEDIR)
CUBELIB = -L$(CUBEDIR)
ifeq ($(ESH_AR),)
  CUBELIB += -lcube3
else
  CUBELIB += $(ESH_RPATH) -lcube3so
endif

STATSDIR = $(TOPDIR)/utils/stats
STATSINC = -I$(STATSDIR)
STATSLIB = -L$(STATSDIR) -lstats

# Compiler settings
CCXXFLAGS := $(CCXXFLAGS) $(SZLIB_CFLAGS)

# Linker settings
LDFLAGS	:= $(CLDFLAGS) $(CCXXLIBS) $(CUBELIB) \
           $(SZLIB_LIBPATH) $(SZLIB_LIB) $(UTILLIB)

# Installable tools
TOOLS = \
	cube3_clean \
	cube3_cmp \
	cube3_cut \
	cube3_diff \
	cube3_mean \
	cube3_merge \
	cube3_remap \
	cube3_part \
	cube3_score \
	cube3_stat \
	cube3_topoassist \
	tau2cube3


-include Makefile.internal


#------------------------------------------------------------------------------
# Rules
#------------------------------------------------------------------------------

all: $(TOOLS)

install: all
	$(MKDIR) -m 755 $(BINDIR)
	@for tool in $(TOOLS)""; do \
		if [ -n "$$tool" ]; then \
			echo "$(INSTALL) -c -m 755 $$tool $(BINDIR)" ; \
			eval "$(INSTALL) -c -m 755 $$tool $(BINDIR)" ; \
		fi; \
	done

clean:
	-rm -f $(TOOLS) libcube3test.a *.o


.cpp.o:
	$(CCXX) $(CCXXFLAGS) $(CUBEINC) -c $<


#------------------------------------------------------------------------------
# Link rules
#------------------------------------------------------------------------------

cube3_clean: cube_clean.o algebra.o Filter.o Predicates.o $(CUBEDIR)/libcube3.a
	$(CCXX) $(CCXXFLAGS) -o $@ cube_clean.o Filter.o algebra.o Predicates.o \
		$(LDFLAGS)

cube3_cmp: cube_cmp.o algebra.o Filter.o Predicates.o $(CUBEDIR)/libcube3.a
	$(CCXX) $(CCXXFLAGS) -o $@ cube_cmp.o algebra.o Filter.o Predicates.o \
		$(LDFLAGS)

cube3_cut: cube_cut.o algebra.o Filter.o Predicates.o $(CUBEDIR)/libcube3.a
	$(CCXX) $(CCXXFLAGS) -o $@ cube_cut.o algebra.o Predicates.o Filter.o \
		$(LDFLAGS)

cube3_diff: cube_diff.o algebra.o Predicates.o Filter.o $(CUBEDIR)/libcube3.a
	$(CCXX) $(CCXXFLAGS) -o $@ cube_diff.o algebra.o Filter.o \
		Predicates.o \
		$(LDFLAGS)

cube3_mean: cube_mean.o algebra.o Predicates.o Filter.o $(CUBEDIR)/libcube3.a
	$(CCXX) $(CCXXFLAGS) -o $@ cube_mean.o algebra.o Filter.o \
		Predicates.o \
		$(LDFLAGS)

cube3_merge: cube_merge.o algebra.o Predicates.o Filter.o $(CUBEDIR)/libcube3.a
	$(CCXX) $(CCXXFLAGS) -o $@ cube_merge.o algebra.o Filter.o \
		Predicates.o \
		$(LDFLAGS)

cube3_part: cube_part.o algebra.o Filter.o Predicates.o $(CUBEDIR)/libcube3.a
	$(CCXX) $(CCXXFLAGS) -o $@ cube_part.o Filter.o algebra.o Predicates.o \
		$(LDFLAGS)

cube3_remap: cube_remap.o algebra.o Predicates.o Filter.o $(CUBEDIR)/libcube3.a
	$(CCXX) $(CCXXFLAGS) -o $@ cube_remap.o algebra.o Filter.o \
		Predicates.o \
		$(LDFLAGS)

cube3_score: cube_score.o helper.o CnodeInfo.o RegionInfo.o Blacklist.o \
  Predicates.o $(CUBEDIR)/libcube3.a
	$(CCXX) $(CCXXFLAGS) -o $@ cube_score.o helper.o CnodeInfo.o \
		RegionInfo.o Blacklist.o Predicates.o $(LDFLAGS)

cube3_stat: cube_stat.cpp
	$(CCXX) $(CCXXFLAGS) $(CUBEINC) $(STATSINC) -o $@ cube_stat.cpp $(LDFLAGS) $(STATSLIB)

cube3_topoassist: cube_topoassist.o $(CUBEDIR)/libcube3.a 
	$(CCXX) $(CCXXFLAGS) -o $@ cube_topoassist.o \
		$(LDFLAGS)

tau2cube3: TauProfile.o tau2cube.o $(CUBEDIR)/libcube3.a
	$(CCXX) $(CCXXFLAGS) -o $@ TauProfile.o tau2cube.o $(LDFLAGS)


#------------------------------------------------------------------------------
# Dependencies
#
# Generated by:
#   g++ -MM -I../cube *.cpp \
#      | sed -e 's,../cube,$(CUBEDIR),g' \
#            -e 's,../../../utils/stats,$(STATSDIR),g'
#------------------------------------------------------------------------------

algebra.o: algebra.cpp $(CUBEDIR)/AggrCube.h $(CUBEDIR)/Cube.h $(CUBEDIR)/Cnode.h \
 $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Cartesian.h \
 $(CUBEDIR)/Machine.h $(CUBEDIR)/Sysres.h $(CUBEDIR)/Metric.h $(CUBEDIR)/Matrix.h \
 $(CUBEDIR)/Node.h Predicates.h $(CUBEDIR)/Process.h $(CUBEDIR)/Region.h \
 $(CUBEDIR)/Thread.h algebra.h Filter.h $(CUBEDIR)/cube_error.h
cube_clean.o: cube_clean.cpp $(CUBEDIR)/Cube.h $(CUBEDIR)/Cnode.h \
 $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Machine.h \
 $(CUBEDIR)/Sysres.h $(CUBEDIR)/Metric.h $(CUBEDIR)/Matrix.h $(CUBEDIR)/Region.h \
 algebra.h Filter.h $(CUBEDIR)/Thread.h $(CUBEDIR)/services.h
cube_cmp.o: cube_cmp.cpp $(CUBEDIR)/Cube.h $(CUBEDIR)/Cnode.h $(CUBEDIR)/Vertex.h \
 $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Machine.h $(CUBEDIR)/Sysres.h \
 $(CUBEDIR)/Metric.h $(CUBEDIR)/Matrix.h $(CUBEDIR)/Region.h algebra.h Filter.h \
 $(CUBEDIR)/Thread.h $(CUBEDIR)/services.h
cube_cut.o: cube_cut.cpp $(CUBEDIR)/Cube.h $(CUBEDIR)/Cnode.h $(CUBEDIR)/Vertex.h \
 $(CUBEDIR)/IdentObject.h Filter.h $(CUBEDIR)/Machine.h $(CUBEDIR)/Sysres.h \
 $(CUBEDIR)/Metric.h $(CUBEDIR)/Matrix.h $(CUBEDIR)/Region.h algebra.h \
 $(CUBEDIR)/Thread.h $(CUBEDIR)/services.h
cube_diff.o: cube_diff.cpp $(CUBEDIR)/Cube.h $(CUBEDIR)/Cnode.h \
 $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Machine.h \
 $(CUBEDIR)/Sysres.h $(CUBEDIR)/Metric.h $(CUBEDIR)/Matrix.h $(CUBEDIR)/Region.h \
 algebra.h Filter.h $(CUBEDIR)/Thread.h $(CUBEDIR)/services.h
cube_mean.o: cube_mean.cpp $(CUBEDIR)/Cube.h $(CUBEDIR)/Cnode.h \
 $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Machine.h \
 $(CUBEDIR)/Sysres.h $(CUBEDIR)/Metric.h $(CUBEDIR)/Matrix.h $(CUBEDIR)/Region.h \
 algebra.h Filter.h $(CUBEDIR)/Thread.h $(CUBEDIR)/services.h
cube_merge.o: cube_merge.cpp $(CUBEDIR)/Cube.h $(CUBEDIR)/cube_error.h \
 $(CUBEDIR)/Cnode.h $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Machine.h \
 $(CUBEDIR)/Sysres.h $(CUBEDIR)/Metric.h $(CUBEDIR)/Matrix.h $(CUBEDIR)/Region.h \
 algebra.h Filter.h $(CUBEDIR)/Thread.h $(CUBEDIR)/services.h
cube_remap.o: cube_remap.cpp $(CUBEDIR)/Cube.h $(CUBEDIR)/Cnode.h \
 $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Machine.h \
 $(CUBEDIR)/Sysres.h $(CUBEDIR)/Metric.h $(CUBEDIR)/Matrix.h $(CUBEDIR)/Region.h \
 algebra.h Filter.h $(CUBEDIR)/Thread.h $(CUBEDIR)/services.h
cube_score.o: cube_score.cpp Blacklist.h helper.h $(CUBEDIR)/Region.h \
 $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Cube.h $(CUBEDIR)/Cnode.h \
 enums.h $(CUBEDIR)/AggrCubeMaps.h $(CUBEDIR)/AggrCube.h $(CUBEDIR)/Cube.h \
 $(CUBEDIR)/Thread.h $(CUBEDIR)/Sysres.h $(CUBEDIR)/Metric.h $(CUBEDIR)/Matrix.h \
 CnodeInfo.h InfoObj.h RegionInfo.h $(CUBEDIR)/services.h
cube_stat.o: cube_stat.cpp $(CUBEDIR)/AggrCube.h $(CUBEDIR)/Cube.h \
 $(CUBEDIR)/Thread.h $(CUBEDIR)/Sysres.h $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h \
 $(CUBEDIR)/Metric.h $(CUBEDIR)/Matrix.h $(CUBEDIR)/Region.h $(CUBEDIR)/Cnode.h \
 $(STATSDIR)/P2Statistic.h $(CUBEDIR)/services.h
cube_topoassist.o: cube_topoassist.cpp cube_topoassist.h \
 $(CUBEDIR)/Cartesian.h $(CUBEDIR)/Cube.h $(CUBEDIR)/Process.h $(CUBEDIR)/Sysres.h \
 $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Thread.h Question.cpp
helper.o: helper.cpp helper.h $(CUBEDIR)/Region.h $(CUBEDIR)/Vertex.h \
 $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Cube.h $(CUBEDIR)/Cnode.h enums.h \
 Predicates.h $(CUBEDIR)/Thread.h $(CUBEDIR)/Sysres.h
tau2cube.o: tau2cube.cpp $(CUBEDIR)/Cube.h TauProfile.h $(CUBEDIR)/services.h
Blacklist.o: Blacklist.cpp Blacklist.h helper.h $(CUBEDIR)/Region.h \
 $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Cube.h $(CUBEDIR)/Cnode.h \
 enums.h RegionInfo.h InfoObj.h
CnodeInfo.o: CnodeInfo.cpp CnodeInfo.h InfoObj.h enums.h $(CUBEDIR)/Cube.h \
 $(CUBEDIR)/Cnode.h $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Region.h
Filter.o: Filter.cpp Filter.h $(CUBEDIR)/Cnode.h $(CUBEDIR)/Vertex.h \
 $(CUBEDIR)/IdentObject.h $(CUBEDIR)/Region.h
Predicates.o: Predicates.cpp Predicates.h $(CUBEDIR)/Region.h \
 $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h
RegionInfo.o: RegionInfo.cpp $(CUBEDIR)/Cube.h CnodeInfo.h InfoObj.h enums.h \
 RegionInfo.h $(CUBEDIR)/Region.h $(CUBEDIR)/Vertex.h $(CUBEDIR)/IdentObject.h \
 helper.h $(CUBEDIR)/Cnode.h
TauProfile.o: TauProfile.cpp TauProfile.h $(CUBEDIR)/services.h
