top_srcdir		= $(shell pwd)

GPROF:=

USE_HISTO:=y
USE_BITS:=n

GCC=gcc
GXX=g++
ifeq ($(shell uname), AIX)
  MPI_CC  = mpcc
  MPI_CXX = mpCC
  MPIP_CC = mpcc
	MPICFLAGS   = -qlanglvl=extc99 -O0 -g -DAIX
  CFLAGS = -I/usr/lpp/ppe.poe/include
  else
ifneq ($(shell which blrts_xlc 2> /dev/null),)
  platform=BGL
  MPI_CC=		mpixlc
  MPI_CXX = mpixlcxx
  MPIP_CC=	mpixlc
	MPICFLAGS   = -qlanglvl=extc99 -O0 -DHAVE_RTS_GETTIMEBASE
  LDFLAGS=-lrts.rts

  else
  MPI_CC = cc
  MPI_CXX = CC
  MPIP_CC = cc
  MPICFLAGS		= -Wall -std=gnu99 -O0
  MPICPPFLAGS		= -Wall -O0
	LDLIBS = -lrt
endif
endif

CFLAGS+=-DMPICH_IGNORE_CXX_SEEK
MPICPPFLAGS+=-DMPICH_IGNORE_CXX_SEEK

CFLAGS+= 	-g 

MPIPLDFLAGS=   -L/${HOME}/opt/lib
#MPIPLDFLAGS=   -L/${HOME}/tools/mpiP-3.1.0  
#LDFLAGS+=  -L/${HOME}/opt/efence

MPIPLDFLAGS += -g
LDFLAGS += -g

#MPIPLDLIBS =     -lmpiP
#MPIPLDLIBS =     -lmpiP-mpich
#MPIPLDLIBS +=    -lunwind
LDLIBS +=     -lm
#LDLIBS +=    -lefence

RECLIB=glob
RECLDFLAGS += -L../../record/lib
RECLDLIBS = -l${RECLIB}

LDFLAGS+=$(GPROF)

ALL:= generator

all: $(ALL)

SRCS:=replay.c \
 rsd_reader.c \
 prsd_traverse.c \
 op_exec.c \
 busy_wait.c \
 mem_handler.c 
 
COMMON_SRCS:= rsd_queue.c    \
 prsd_stack.c \
 params_queue.c \
 opstruct.c \
 params.c \
 req_handler.c \
 ptr_handler.c \
 list.c \
 rank_recursive.c \
 mpi_util.c

OTHER_SRCS:=ascii_utils.c \
 queue.c 

GEN_SRCS:=code_generator_handler.c \
	op_generator.c \
	code_generator.c \
	rsd_reader.c \
	prsd_traverse.c \
	busy_wait.c \
	mem_handler.c


CFLAGS+=-I.
 
# include histogram src and header
ifeq ($(USE_HISTO),y)
COMMON_CXX_SRCS += Histogram.C BitVector.C TimeList.C Timing.C
#SRCS+=normal_dist.c
endif

ifeq ($(USE_BITS),y)
  COMMON_CXX_SRCS+=Intseq.C
  endif

COMMON_CXX_SRCS+=VParam.C RList.C RankSet.C stack_sig.C cvector.C

# This is used to select between the wisconsin and the older stackwalk libs
USE_WISC=n

ifeq ($(USE_WISC),y)
SW_HOME=`pwd`/../../record/core
SW_PLATFORM=x86_64-unknown-linux2.4

SW_INCLUDE = -I"$(SW_HOME)"
SW_LIBS = -L$(SW_HOME)/$(SW_PLATFORM)/lib -lstackwalk -lcommon -lsymtabAPI -liberty

CFLAGS += -DWISCONSIN_WALKER  $(SW_INCLUDE)

else

# Not using wisconsin walker
CFLAGS += -I../../stackwalk/ver0

SW_HOME=${top_srcdir}/../../stackwalk/ver0
SW_LIBS = -L$(SW_HOME) -lstackwalk
SW_INCLUDE = -I$(SW_HOME)

endif
LDLIBS+=$(SW_LIBS)

VPATH+=../../record/common/src
CFLAGS+=-I../../record/common/inc -I../../record/inc -I../../record/libsrc -I../../record/libsrc/glob
MPICFLAGS+=$(CFLAGS)
MPICFLAGS+=$(GPROF)
MPICPPFLAGS+=$(CFLAGS)

OBJS = $(SRCS:.c=.o)

COMMON_OBJS = $(COMMON_SRCS:.c=.o) $(COMMON_CXX_SRCS:.C=.o)

GEN_OBJS = $(GEN_SRCS:.c=.o)

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

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

#%.o: %.c
#	$(GCC) $(CFLAGS) -c -o $@ $<

#%.o: %.C
#	$(GXX) $(CFLAGS) -c -o $@ $<
%.o: %.c
	$(MPI_CC) $(MPICFLAGS) -c -o $@ $<

%.o: %.C
	$(MPI_CXX) $(MPICPPFLAGS) -c -o $@ $<

generator: $(GEN_OBJS) $(COMMON_OBJS)
	$(MPI_CXX) $(LDFLAGS) -o $@ $(GEN_OBJS) $(COMMON_OBJS) $(LDLIBS)

replay: $(OBJS) $(COMMON_OBJS)
	$(MPI_CXX) $(LDFLAGS) -o $@ $(OBJS) $(COMMON_OBJS) $(LDLIBS)

# build to replay with mpip
mpip_replay: $(OBJS) $(COMMON_OBJS)
	$(MPI_CXX) $(MPIPLDFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(COMMON_OBJS) $(MPIPLDLIBS) $(LDLIBS)

# build to replay with umpire itself!
ump_replay: $(OBJS) ../../record/lib/lib${RECLIB}.a
	$(MPI_CXX) $(RECLDFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(RECLDLIBS) $(LDLIBS)

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

# utils

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

.PHONY: clean
