##
## Copyright (c) 2002 Sun Microsystems, Inc.
##
## See the file "license.terms" for information on usage and redistribution
## of this file, and for a DISCLAIMER OF ALL WARRANTIES.
##

##
## GCspy - Makefile for the C++ code
##

UNAME=$(shell uname -s)
ifeq ($(UNAME), SunOS)
	# SunOS code not well tested
	#EXTRA_CC_FLAGS = -D_SPARC_ -Kpic
	EXTRA_CC_FLAGS = -D_SPARC_ 
	EXTRA_LD_FLAGS = -lsocket
	DYNAMIC_FLAG = -G
        LIB_SUFFIX = so
	#CC = CC
	CC = g++
endif
ifeq ($(UNAME), Linux)
	EXTRA_CC_FLAGS = -D_LINUX_
	EXTRA_LD_FLAGS = -lpthread
	DYNAMIC_FLAG = -shared
        LIB_SUFFIX = so
	CC = g++
endif
ifeq ($(UNAME), Darwin)
        EXTRA_CC_FLAGS = -dynamic -D_LINUX_
        DYNAMIC_FLAG = -dynamiclib
        LIB_SUFFIX = dylib
	LD = g++
        CC = g++
        GCSPY_LIB = -Llib -lgcspy
endif

CC_FLAGS = $(EXTRA_CC_FLAGS)
LD_FLAGS = -L$(LIB_DIR) $(EXTRA_LD_FLAGS) -lgcspy -lhsgcspy -mt

OBJ_DIR = obj
BIN_DIR = bin
LIB_DIR = lib

SRC_DIR = ./src
INCLUDE_DIR = ./include

CORE_LIB_NAME = libgcspy.$(LIB_SUFFIX)
HS_LIB_NAME = libhsgcspy.$(LIB_SUFFIX)

CORE_FILES.cpp =	gcspy_buffered_input.cpp \
			gcspy_buffered_output.cpp \
			gcspy_color_db.cpp \
			gcspy_comm.cpp \
			gcspy_command_stream.cpp \
			gcspy_cont_area.cpp \
			gcspy_interpreter.cpp \
			gcspy_main_server.cpp \
			gcspy_server_state.cpp \
			gcspy_shape_stream.cpp \
			gcspy_space.cpp \
			gcspy_stream.cpp \
			gcspy_timer.cpp \
			gcspy_utils.cpp \
			\
			test_driver.cpp

HS_FILES.cpp =		hs_mc_driver.cpp \
			hs_old_driver.cpp \
			hs_perm_driver.cpp

CORE_FILES.hpp = 	gcspy_array_input.hpp \
			gcspy_array_output.hpp \
			gcspy_buffered_input.hpp \
			gcspy_buffered_output.hpp \
			gcspy_color_db.hpp \
			gcspy_comm.hpp \
			gcspy_command_stream.hpp \
			gcspy_cont_area.hpp \
			gcspy_interpreter.hpp \
			gcspy_io.hpp \
			gcspy_main_server.hpp \
			gcspy_server_state.hpp \
			gcspy_shape_stream.hpp \
			gcspy_space.hpp \
			gcspy_stream.hpp \
			gcspy_timer.hpp \
			gcspy_types.hpp \
			gcspy_utils.hpp \
			\
			test_driver.hpp

HS_FILES.hpp =		hs_mc_driver.hpp \
			hs_old_driver.hpp \
			hs_perm_driver.hpp

CORE_FILES.bin =	test_io.cpp \
			test_shape_stream.cpp \
			test_simple_comm.cpp \
			test_simple_server.cpp

HS_FILES.bin =		test_hs_old_driver.cpp \
			test_hs_perm_driver.cpp

DIR_CORE_FILES.o = $(patsubst %.cpp, $(OBJ_DIR)/%.o, $(CORE_FILES.cpp))
DIR_HS_FILES.o = $(patsubst %.cpp, $(OBJ_DIR)/%.o, $(HS_FILES.cpp))

DIR_CORE_FILES.hpp = $(patsubst %.hpp, $(INCLUDE_DIR)/%.hpp, $(CORE_FILES.hpp))
DIR_HS_FILES.hpp = $(patsubst %.hpp, $(INCLUDE_DIR)/%.hpp, $(HS_FILES.hpp))

DIR_CORE_FILES.bin = $(patsubst %.cpp, $(BIN_DIR)/%, $(CORE_FILES.bin))
DIR_HS_FILES.bin = $(patsubst %.cpp, $(BIN_DIR)/%, $(HS_FILES.bin))

all: dirs core hs 

dirs:
	mkdir -p $(OBJ_DIR)
	mkdir -p $(LIB_DIR)

compile: $(DIR_CORE_FILES.o) $(DIR_HS_FILES.o)

## 

## Core

core: core_lib

core_lib: $(LIB_DIR)/$(CORE_LIB_NAME)

$(LIB_DIR)/$(CORE_LIB_NAME): $(DIR_CORE_FILES.o)
	$(LD) $(DYNAMIC_FLAG) -o $@ $(DIR_CORE_FILES.o)

## HS

hs: hs_lib

hs_lib: $(LIB_DIR)/$(HS_LIB_NAME)

$(LIB_DIR)/$(HS_LIB_NAME): $(DIR_HS_FILES.o)
	$(LD) $(DYNAMIC_FLAG) $(GCSPY_LIB) -o $@ $(DIR_HS_FILES.o)

## BIN

bindir:
	mkdir -p $(BIN_DIR)

bin: bindir $(DIR_CORE_FILES.bin) $(DIR_EVM_FILES.bin) $(DIR_HS_FILES.bin)

## General rules

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(DIR_CORE_FILES.hpp) $(DIR_HS_FILES.hpp)
	$(CC) -c $(CC_FLAGS) -I$(INCLUDE_DIR) -o $@ $<

$(BIN_DIR)/%: $(OBJ_DIR)/%.o
	$(CC) $(CC_FLAGS) $(LD_FLAGS) -I$(INCLUDE_DIR) -o $@ $< 

## Cleaning up stuff

clean: uninstall 

install: all bin

uninstall:
	rm -rf $(OBJ_DIR)
	rm -rf $(BIN_DIR)
	rm -rf $(LIB_DIR)
