commonsrc=../../itsutils/common

MSVCINCDIRS=-I ../../itsutils/include/msvc
COMMONINCDIRS=-I ../../../cpip/cpip-client -I $(commonsrc)

MSVCDEFS=-D_SECURE_SCL=0 -D_CRT_SECURE_NO_WARNINGS -D_HAS_ITERATOR_DEBUGGING=0
# C4127: conditional expression is constant
# C4296: ... : expression is always false

# C4100: ... : unreferenced formal parameter
# C4242: ... : conversion from ... to ..., possible loss of data
# C4244: ... : conversion from ... to ..., possible loss of data
# C4365: ... : conversion from ... to ..., signed/unsigned mismatch
# C4512: ... : assignment operator could not be generated
# C4514: ... : unreferenced inline function has been removed
# C4571: Informational: catch(...) semantics changed since Visual C++ 7.1; structured exceptions (SEH) are no longer caught
# C4619: #pragma warning : there is no warning number ...
# C4668: ... is not defined as a preprocessor macro, replacing with ... for ...
# C4710: ... : function not inlined
# C4820: ... : ... bytes padding added after data member ...
# C4826: Conversion from ... to ... is sign-extended. This may cause unexpected runtime behavior.

ifeq ($(OS),Windows_NT)
VC8:=$(subst \,/,$(PROGRAMFILES))/Microsoft Visual Studio 8/vc
#BOOST=c:/local/boost/boost_1_39_0
CC=$(VC8)/bin/cl.exe
CINCS=-I $(BOOST) -I "$(VC8)/include" -I "$(VC8)/PlatformSDK/Include" $(MSVCINCDIRS) $(COMMONINCDIRS)
CDEFS=-D_NO_RAPI $(MSVCDEFS)
CFLAGS=-EHsc -c -Zi -Wall -nologo -wd4100 -wd4242 -wd4244 -wd4365 -wd4512 -wd4514 -wd4571 -wd4619 -wd4668 -wd4710 -wd4820 -wd4826
LD=$(VC8)/bin/link.exe
LDPATHS=-libpath:$(BOOST)/lib-x86 -libpath:"$(VC8)/lib" -libpath:"$(VC8)/PlatformSDK/Lib"
LDLIBS=user32.lib msvcrt.lib libcmt.lib
LDFLAGS=-debug  -nodefaultlib:libcmt -nologo
CCOUTF=-Fo
LDOUTF=-out:
E=.exe
O=.obj

OUT=build/x86/
OBJ=build/x86/o
else
ifeq ($(OS),Windows_CE)
VCE8:=$(subst \,/,$(PROGRAMFILES))/Microsoft Visual Studio 8/vc/ce
WM6:=$(subst \,/,$(PROGRAMFILES))/Windows Mobile 6 SDK/PocketPC
#BOOST=c:/local/boost/boost_1_39_0
CC=$(VCE8)/bin/x86_arm/cl.exe
CINCS=-I $(BOOST) -I "$(VCE8)/include" -I "$(WM6)/Include/Armv4i"  $(MSVCINCDIRS) $(COMMONINCDIRS)
CDEFS=-D_NO_RAPI $(MSVCDEFS)

# wince specific defs
CDEFS+=-DARM -D_ARM_ -DARMV4 
CDEFS+=-DWINVER=0x0400 -DWIN32_PLATFORM_PSPC=400 -DUNDER_CE=420 -DUNICODE -D_UNICODE -D_WIN32_WCE=0x501
CDEFS+=-D_BOOST_LITE
pb500src=z:/home/sources/wince500
CINCS+=-I $(pb500src)/PUBLIC/COMMON/OAK/INC

CFLAGS=-EHsc -c -Zi -Wall -nologo -wd4191 -wd4201 -wd4567 -wd4100 -wd4242 -wd4244 -wd4365 -wd4512 -wd4514 -wd4571 -wd4619 -wd4668 -wd4710 -wd4820

LD=$(VCE8)/bin/x86_arm/link.exe
LDPATHS=-libpath:$(BOOST)/lib-arm -libpath:"$(VCE8)/lib/armv4i" -libpath:"$(WM6)/Lib/Armv4i"
LDLIBS=coredll.lib corelibc.lib
#  implicit : libcmt + libcpmt
LDFLAGS=-debug -nologo

#wince specific flags
LDFLAGS+=-subsystem:windowsce,3.00 -machine:thumb
CCOUTF=-Fo
LDOUTF=-out:
E=.exe
O=.obj

OUT=build/arm/
OBJ=build/arm/o
else
CC=g++-mp-4.3
CINCS=-I /opt/local/include $(COMMONINCDIRS)
CDEFS=-D_NO_RAPI
CFLAGS=-ggdb -Wall -c -Wno-format
LDPATHS=-L/opt/local/lib
LDLIBS=-liconv -lboost_thread-xgcc40-mt -lstdc++.6 -lc -lgcc_s.1 /usr/lib/crt1.o
CCOUTF=-o 
LDOUTF=-o 
E=
O=.o

OUT=build/osx/
OBJ=build/osx/o
endif
endif

ifeq ($(OS),Windows_CE)
OBJS+=singlestepper
else
OBJS+=testemu
endif

OBJS+=bkptmanager codesnipmanager emulateinsn ThreadContext stringutils

all: $(OUT)/ss$(E)

ce:
	$(MAKE) OS=Windows_CE

$(OUT)/ss$(E):$(addprefix $(OBJ)/,$(addsuffix $(O),$(OBJS)))
	@mkdir -p $(OUT)/
	@"$(LD)" $(LDPATHS) $(LDFLAGS) $(LDLIBS) $(LDOUTF)"$@" $^

vpath .cpp . $(commonsrc)
$(OBJ)/%$(O): %.cpp
	@mkdir -p $(OBJ)/
	@"$(CC)" "$<" $(CCOUTF)"$@" $(CDEFS) $(CFLAGS) $(CINCS)

$(OBJ)/%$(O): $(commonsrc)/%.cpp
	@mkdir -p $(OBJ)/
	@"$(CC)" "$<" $(CCOUTF)"$@" $(CDEFS) $(CFLAGS) $(CINCS)

clean:
	$(RM) -r $(OBJ) $(OUT)


# dependencies
$(OBJ)/ThreadContext$(O): ThreadContext.h
$(OBJ)/bkptmanager$(O): bkptmanager.h
$(OBJ)/codesnipmanager$(O): codesnipmanager.h
$(OBJ)/emulateinsn$(O): insndecoder.h bitutils.h appexceptions.h bkptmanager.h codesnipmanager.h
$(OBJ)/singlestepper$(O): insndecoder.h
$(OBJ)/testemu$(O): emulateinsn.h insndecoder.h ThreadContext.h bkptmanager.h


testce:
	pput -f ../../itsutils/build/tstarg.exe /windows/test.exe
	itssign.bat  build/arm/ss.exe
	pput -f build/arm/ss.exe /windows
	prun ss.exe

