signhome=$(SIGNINGKEYS)
smtools=C:/Program Files/Microsoft Visual Studio 8/Common7/Tools/Bin
pfxfile=$(signhome)\\codesign-itsutils.pfx


out=../build
obj=../build/apihook
src=.
commonsrc=../common

include ../local.mak

all:


OBJS=debug.obj stringutils.obj kernelmisc.obj

define link_ce_exe
	@mkdir -p "$(dir $1)"
	echo building exe $1
	echo from $2
	echo
	@"$(celd)" \
		/libpath:"$(ppclib)" \
		/libpath:"$(celib)" \
		/nologo \
		/pdb:"$(subst .exe,.pdb,$1)" \
		/stack:0x10000,0x1000 \
		$(celdtargetflags) \
		/subsystem:windowsce,4.20 \
		/align:"4096"   \
		/out:"$1" \
		/debug \
		/map \
		coredll.lib \
		corelibc.lib \
		ccrtrtti.lib \
		secchk.lib \
		$2
endef
define link_ce_dll
	@mkdir -p "$(dir $1)"
	echo building dll $1
	echo from $2
	echo
	@"$(celd)" \
		/libpath:"$(ppclib)" \
		/libpath:"$(celib)" \
		/nologo \
		/pdb:"$(subst .dll,.pdb,$1)" \
		/stack:0x10000,0x1000 \
		$(celdtargetflags) \
		/subsystem:windowsce,4.20 \
		/align:"4096"   \
		/entry:"_DllMainCRTStartup" \
		/dll  \
		/out:"$1" \
		/debug \
		/map \
		coredll.lib \
		corelibc.lib \
		ccrtrtti.lib \
		secchk.lib \
		$2
endef
define compile_ce_obj
	@mkdir -p "$(dir $1)"
	echo building obj $1
	echo from $2
	echo
	@"$(cecc)" \
	    /I "z:\home\sources\wince500\PRIVATE\WINCEOS\COREOS\NK\INC" \
	    /I "z:\home\sources\wince500\PUBLIC\COMMON\OAK\INC" \
		/I "$(cesdk)\include" \
		/I "$(ceinclude)" \
		/I "z:\home\sources\wince500\PUBLIC\COMMON\SDK\INC" \
		/I "$(commonsrc)" \
		/I "../dll" \
		/nologo \
		/W3 \
		/O2 \
		/c \
		/Zi \
		/EHsc \
		/MT \
		/D APIHOOK_EXPORTS \
		/D "ARM" /D "_ARM_" /D "ARMV4" \
		/D _WIN32_WCE=501 /D "WIN32_PLATFORM_PSPC=400" /D UNDER_CE=501 \
		/D "UNICODE" /D "_UNICODE" \
		/D _CRT_SECURE_NO_WARNINGS /D _SECURE_SCL=0 /D _HAS_ITERATOR_DEBUGGING=0 \
		$(cflags_$(basename $(notdir $1))) \
		/Fo"$1" \
		$2
endef
define sign_binary
	@"$(smtools)/signtool" sign -f "$(pfxfile)" $1
endef

targetdefs:=/D "ARM" /D "_ARM_" /D "ARMV4"
cdefs:=$(targetdefs) /D "UNICODE" /D "_UNICODE" /D "NDEBUG"
cdefs+=/D _CRT_SECURE_NO_WARNINGS /D _SECURE_SCL=0 /D _HAS_ITERATOR_DEBUGGING=0 /D NOMINMAX /D _AA_WITH_WINMAIN

pmdef300:=/D _WIN32_WCE=300 /D "WIN32_PLATFORM_PSPC=310" /D UNDER_CE=300
pmdef420:=/D _WIN32_WCE=420 /D "WIN32_PLATFORM_PSPC=400" /D UNDER_CE=420
pmdef500:=/D _WIN32_WCE=500 /D "WIN32_PLATFORM_PSPC" /D UNDER_CE=500
cflags:=/Zi /nologo /W3 /O2 /c /Fo"$(obj)/" /I "..\include" /I "../dll" /I "../common" /EHsc /FI ../common/nowarn.h  /I ../include/msvc

$(obj)/cever_deps300.obj: ../dll/cever_deps.cpp
	@"$(cecc)" $(cdefs) $(pmdef300) $(dlldefs) $(pb300incs) $(cflags) $^ /Fo"$@"
$(obj)/cever_deps420.obj: ../dll/cever_deps.cpp
	@"$(cecc)" $(cdefs) $(pmdef420) $(dlldefs) $(pb420incs) $(cflags) $^ /Fo"$@"
$(obj)/cever_deps500.obj: ../dll/cever_deps.cpp
	@"$(cecc)" $(cdefs) $(pmdef500) $(dlldefs) $(pb500incs) $(cflags) $^ /Fo"$@"

TARGETLIST+=$(out)/loadhook.exe
LOADHOOK_OBJS=loadhook.obj $(OBJS) cever_deps300.obj cever_deps420.obj cever_deps500.obj MemoryUsage.obj
$(out)/loadhook.exe: $(addprefix $(obj)/,$(LOADHOOK_OBJS))
	$(call link_ce_exe,$@,$^)
	$(call sign_binary,$@)



vpath .cpp $(src)
vpath .cpp $(commonsrc)
vpath .cpp ../dll

$(obj)/%.obj: $(src)/%.cpp
	$(call compile_ce_obj,$@,$^)
$(obj)/%.obj: $(commonsrc)/%.cpp
	$(call compile_ce_obj,$@,$^)
$(obj)/%.obj: ../dll/%.cpp
	$(call compile_ce_obj,$@,$^)

TARGETLIST+=$(out)/apihookgdi.dll
APIHOOKgdi_OBJS=apihookgdi.obj $(OBJS)
$(out)/apihookgdi.dll:  $(addprefix $(obj)/,$(APIHOOKgdi_OBJS))
	$(call link_ce_dll,$@,$^)
	$(call sign_binary,$@)
cflags_apihookgdi=-D HOOKGDI -D_USE_KLOG
$(obj)/apihookgdi.obj: $(src)/apihook.cpp
	$(call compile_ce_obj,$@,$^)

TARGETLIST+=$(out)/apihookw32a.dll
APIHOOKw32a_OBJS=apihookw32a.obj $(OBJS)
$(out)/apihookw32a.dll:  $(addprefix $(obj)/,$(APIHOOKw32a_OBJS))
	$(call link_ce_dll,$@,$^)
	$(call sign_binary,$@)
cflags_apihookw32a=-D HOOKW32A -D_USE_KLOG
$(obj)/apihookw32a.obj: $(src)/apihook.cpp
	$(call compile_ce_obj,$@,$^)

TARGETLIST+=$(out)/apihookw32h.dll
APIHOOKw32h_OBJS=apihookw32h.obj $(OBJS)
$(out)/apihookw32h.dll:  $(addprefix $(obj)/,$(APIHOOKw32h_OBJS))
	$(call link_ce_dll,$@,$^)
	$(call sign_binary,$@)
cflags_apihookw32h=-D HOOKW32H -D_USE_KLOG
$(obj)/apihookw32h.obj: $(src)/apihook.cpp
	$(call compile_ce_obj,$@,$^)

TARGETLIST+=$(out)/apihookdboa.dll
APIHOOKdboa_OBJS=apihookdboa.obj $(OBJS)
$(out)/apihookdboa.dll:  $(addprefix $(obj)/,$(APIHOOKdboa_OBJS))
	$(call link_ce_dll,$@,$^)
	$(call sign_binary,$@)
cflags_apihookdboa=-D HOOKDBOA -D_USE_KLOG
$(obj)/apihookdboa.obj: $(src)/apihook.cpp
	$(call compile_ce_obj,$@,$^)

TARGETLIST+=$(out)/apihookw32s.dll
APIHOOKw32s_OBJS=apihookw32s.obj $(OBJS)
$(out)/apihookw32s.dll:  $(addprefix $(obj)/,$(APIHOOKw32s_OBJS))
	$(call link_ce_dll,$@,$^)
	$(call sign_binary,$@)
cflags_apihookw32s=-D HOOKW32S -D_USE_KLOG
$(obj)/apihookw32s.obj: $(src)/apihook.cpp
	$(call compile_ce_obj,$@,$^)

TARGETLIST+=$(out)/apihookwmgr.dll
APIHOOKwmgr_OBJS=apihookwmgr.obj $(OBJS)
$(out)/apihookwmgr.dll:  $(addprefix $(obj)/,$(APIHOOKwmgr_OBJS))
	$(call link_ce_dll,$@,$^)
	$(call sign_binary,$@)
cflags_apihookwmgr=-D HOOKWMGR -D_USE_KLOG
$(obj)/apihookwmgr.obj: $(src)/apihook.cpp
	$(call compile_ce_obj,$@,$^)


all: $(TARGETLIST)

install: $(TARGETLIST)
	pput -f $(TARGETLIST) /windows

clean:
	-rm -rf $(obj)
	-rm -f $(addsuffix .*,$(basename $(TARGETLIST)))
