# Makefile
#
# The makefile expects the following override make variables to be specified
# by the caller:
#
# TARGET_SYSTEM
#	The target platform to compile the CodeMirror for.  If this is not
#	defined, then the this makefile will recursively invoke itself with
#	all available target system IDs.
#
# HOST_SYSTEM
#	The host system to compile for.  If this is not specified, then a
#	script is executed to determine the host system automatically.
#
# Valid values for host and target systems : 
#   - LINUX_X86(_64) 32bit/64bit linux host/target 
#   - WIN32/WIN64 32bit/64bit windows host/target


# Determine the host system.
ifndef HOST_SYSTEM
  HOST_SYSTEM = auto
endif
ifeq ($(HOST_SYSTEM),auto)
  HOST_SYSTEM := $(shell ./HostSystem.sh)
endif
ifeq ($(HOST_SYSTEM),)
  $(error Host system not recognized)
endif

BASEDIR := .

# List of supported target systems.

# Determine the TARGET_SYSTEM for LINUX hosts
ifneq (,$(findstring LINUX,$(HOST_SYSTEM)))
  ifeq ($(shell uname -m),x86_64)
    TARGET_SYSTEM = LINUX_X86_64
    PIC = -fpic
  else
    TARGET_SYSTEM = LINUX_X86
    # PIC does not work on x86 because of TTMATH asm code.
    PIC =
  endif
endif

# Determine the TARGET_SYSTEM for Win32/Win64 hosts
ifneq (,$(findstring WIN,$(HOST_SYSTEM)))
    TARGET_SYSTEM = WIN32
endif

include Defs.mk

MTRACEDB_CC_SOURCES = \
	mtracedb/db.cc mtracedb/getopt.cc mtracedb/process.cc

MTRACE_CC_SOURCES = \
	mtrace/main.cc mtrace/socket_win32.cc

MANALYZE_CC_SOURCES = \
	manalyze/main.cc manalyze/html_gen.cc

MT_CC_SOURCES = \
	$(MTRACEDB_CC_SOURCES) \
	$(MANALYZE_CC_SOURCES) \
	$(MTRACE_CC_SOURCES)

ALL_TARGETS = \
        $(MT_BUILD_DIR)/ps3mtrace$(EXE_EXT) \
        $(MT_BUILD_DIR)/ps3manalyze$(EXE_EXT) 

all: $(ALL_TARGETS)

CC_SOURCES = $(MT_CC_SOURCES) 

$(foreach cc,$(CC_SOURCES),$(eval $(call compile_cc,$(cc))))

MT_OBJECTS = \
	$(patsubst %.cc,$(MT_BUILD_DIR)/%.$(OBJ_EXT),$(MT_CC_SOURCES))

MANALYZE_OBJECTS = \
	$(patsubst %.cc,$(MT_BUILD_DIR)/%.$(OBJ_EXT),$(MANALYZE_CC_SOURCES))

MTRACE_OBJECTS = \
	$(patsubst %.cc,$(MT_BUILD_DIR)/%.$(OBJ_EXT),$(MTRACE_CC_SOURCES))

MTRACEDB_OBJECTS = \
	$(patsubst %.cc,$(MT_BUILD_DIR)/%.$(OBJ_EXT),$(MTRACEDB_CC_SOURCES))

$(MT_BUILD_DIR)/ps3mtrace$(EXE_EXT) : $(MTRACEDB_LIB) $(MTRACE_OBJECTS) 
	$(call link_executable,$@,$^)

$(MT_BUILD_DIR)/ps3manalyze$(EXE_EXT) : $(MTRACEDB_LIB) $(MANALYZE_OBJECTS) 
	$(call link_executable,$@,$^)

$(MTRACEDB_LIB): $(MTRACEDB_OBJECTS)
	$(call link_lib,$@,$^)

clean:
	$(RM) $(filter %.$(OBJ_EXT),$(MT_OBJECTS))
	$(RM) $(ALL_TARGETS)
	$(RM) $(MTRACEDB_LIB)

tags:
	@ $(RM) tags
	@$(CTAGS) --extra=fq -R . $(EDG_DIR)

gtags:
	@ $(RM) TAGS
	@$(GTAGS) 

wc:
	@ wc -l \
          $(MT_CC_SOURCES) 


install: all
	p4 edit $(DEPOT_MAIN)/BinPS3/ps3mtrace$(EXE_EXT)
	p4 edit $(DEPOT_MAIN)/BinPS3/ps3manalyze$(EXE_EXT)
	cp -v $(MT_BUILD_DIR)/ps3mtrace$(EXE_EXT) $(DEPOT_MAIN)/BinPS3
	cp -v $(MT_BUILD_DIR)/ps3manalyze$(EXE_EXT) $(DEPOT_MAIN)/BinPS3

.PHONY: all ctags gtags clean docs expand

