#
# This is a front-end app, so we need to compile it with the FE compilers
# on BGL.  We just include the MPI header so that data types are available
# for the rsd_queue to use.
#

ifneq ($(shell which blrts_xlc 2> /dev/null),)
    ############################################################
    # BlueGene with xlc
    ############################################################
	CC = /home/tgamblin/opt/openmpi/bin/mpicc
	CXX =  /home/tgamblin/opt/openmpi/bin/mpicxx
	DEPCC = $(CC) -MM
	DEPCXX = $(CXX) -MM
	CXXFLAGS += -I/bgl/BlueLight/ppcfloor/bglsys/include -g -O3 -Wall
	CXXFLAGS += -DMPICH_IGNORE_CXX_SEEK  -DMPICH_SKIP_MPICXX
	BINUTILS_HOME = /usr
    ############################################################
else
    ############################################################
    # x86_64 machines with gcc
    ############################################################
	CC = mpicxx
	CXX = mpicxx
	DEPCC = gcc -MM
	DEPCXX = g++ -MM
	CXXFLAGS += -g -O3 -Wall 
	CXXFLAGS += -DMPICH_IGNORE_CXX_SEEK -DMPICH_SKIP_MPICXX
	BINUTILS_HOME = /opt/local/encap/binutils-2.17
    ############################################################
endif

CXXFLAGS += -g 
CXXFLAGS += -DRCAT 

# Be sure to enable this in the record library if you enable it here!
# TODO: get rid of all the ifdefs, select these features at runtime.
#CXXFLAGS += -DFEATURE_TIMING_HISTO

# Binutils locations
BINUTILS_INC = -I$(BINUTILS_HOME)/include -I$(BINUTILS_HOME)/include/libiberty
BINUTILS_LIBS = -L$(BINUTILS_HOME)/lib -lbfd -liberty

# MPI Tracer library location
MPITRACE_INC = -I../record/libsrc -I../record/libsrc/glob
MPITRACE_LIBS = -L../record/lib -lglob

USE_WISC=n

ifeq ($(USE_WISC),y)

SW_HOME=/home/tgamblin/src/sw
SW_PLATFORM=x86_64-unknown-linux2.4
DWARF_HOME=/home/tgamblin/opt/libdwarf
XML2_HOME=/home/tgamblin/opt/libxml2

SW_INCLUDE = -I$(SW_HOME)/core
SW_LIBS = -L$(SW_HOME)/$(SW_PLATFORM)/lib -lstackwalk -lcommon -lsymtabAPI -liberty
SW_LIBS += -L$(DWARF_HOME)/lib -ldwarf
SW_LIBS += -L$(XML2_HOME)/lib -lxml2

else

SW_LIBS += -L../stackwalk/ver0 -lstackwalk

endif

# Add in libraries to the make flags.
CXXFLAGS += -I../record/common/inc $(MPITRACE_INC) $(BINUTILS_INC) 
LDFLAGS += $(MPITRACE_LIBS) $(BINUTILS_LIBS) $(SW_LIBS) -lrt

# define CFLAGS based on CXXFLAGS but add in language specifics here.
CFLAGS = $(CXXFLAGS)

ALL:= unwind rcat
#ALL:= rcat unwind nrmse rexpand md rcat rlen unwind loadsim tolong

all: $(ALL)

# These are common sources
C_SRCS = 
CXX_SRCS = AddressTranslator.C 

# include common src, mpi trace lib src
VPATH += ../record/common/src
CFLAGS+=-I../record/common/inc -I../record/libsrc

UNWIND_OBJS = unwind.o 
RCAT_OBJS = $(C_SRCS:.c=.o) $(CXX_SRCS:.C=.o) rcat.o
RLEN_OBJS = $(C_SRCS:.c=.o) $(CXX_SRCS:.C=.o) rlen.o
LOADSIM_OBJS = $(C_SRCS:.c=.o) $(CXX_SRCS:.C=.o) loadsim.o

NRMSE_OBJS = $(C_SRCS:.c=.o) $(CXX_SRCS:.C=.o) decompress.o nrmse.o
REXPAND_OBJS = $(C_SRCS:.c=.o) $(CXX_SRCS:.C=.o) decompress.o rexpand.o
MD_OBJS = $(C_SRCS:.c=.o) $(CXX_SRCS:.C=.o) decompress.o md.o
TOLONG_OBJS = $(C_SRCS:.c=.o) $(CXX_SRCS:.C=.o) tolong.o

# these lines are adapted from the GNU make manual :-
# 4.14 Generating Prerequisites Automatically
%.d: %.c 
	@$(SHELL) -ec '$(DEPCC) $(CFLAGS) $< \
    | sed '\''s/\($*\)\.o[ :]*/\1.o $@ : /g'\'' > $@; \
    [ -s $@ ] || rm -f $@'

%.D: %.C
	@$(SHELL) -ec '$(DEPCXX) $(CXXFLAGS) $< \
    | sed '\''s/\($*\)\.o[ :]*/\1.o $@ : /g'\'' > $@; \
    [ -s $@ ] || rm -f $@'

.c.o: 
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ -c $<

.C.o: 
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $@ -c $<

rcat: $(RCAT_OBJS)
	$(CXX) $(LDFLAGS) -o $@ $(RCAT_OBJS) $(LDFLAGS)

rlen: $(RLEN_OBJS)
	$(CXX) $(LDFLAGS) -o $@ $(RLEN_OBJS) $(LDFLAGS)

unwind: $(UNWIND_OBJS)
	$(CXX) $(LDFLAGS) -o $@ $(UNWIND_OBJS) $(LDFLAGS)


# utils
clean:
	rm -f $(ALL) *.o *~ *.d *.D

.PHONY: clean

ifneq ($(MAKECMDGOALS),clean)
-include $(C_SRCS:.c=.d) $(CXX_SRCS:.C=.D)
endif

