# NMake Makefile to build The Tests for G-I

# Please do not change anything after this line

!include gi-build-common-msvc.mak

!if "$(CFG)" == "release"
!if "$(VSVER)" == "9" && "$(PLAT)" == "x64"
TESTS_CFLAGS_ADD = /MD /O1 /Oi
!else
TESTS_CFLAGS_ADD = $(CFLAGS_ADD)
!endif
!else
TESTS_CFLAGS_ADD = /MDd /Od /Zi /DG_ENABLE_DEBUG
!endif

BASE_GLIB_LIBS = gio-$(GLIB_APIVERSION).lib gobject-$(GLIB_APIVERSION).lib gmodule-$(GLIB_APIVERSION).lib glib-$(GLIB_APIVERSION).lib
CFLAGS = $(TESTS_CFLAGS_ADD) /I$(TOP_SRCDIR) /W3 /we4013 /FImsvc_recommended_pragmas.h /DHAVE_CONFIG_H
LDFLAGS = /link $(LDFLAGS_ARCH) $(BASE_GLIB_LIBS) /DEBUG /opt:noref
LDFLAGS_DLL = /link $(LDFLAGS_ARCH) /DLL /out:$@ /implib:$*-$(GI_APIVERSION).lib $(BASE_GLIB_LIBS) /DEBUG /opt:noref

# Special CFLAGS for Regress test
REGRESS_CFLAGS = /I$(PREFIX)\include\cairo /DREGRESS_PRINT_PREVIEW_COMMAND="evince --unlink-tempfile --preview --print-settings %s %f" /DREGRESS_SOME_CHAR='c'

# The test .gir's for G-I that are built
built_test_girs = 	\
	GIMarshallingTests-$(GI_APIVERSION).gir	\
	Everything-$(GI_APIVERSION).gir	\
	Offsets-$(GI_APIVERSION).gir	\
	SLetter-$(GI_APIVERSION).gir	\
	Utility-$(GI_APIVERSION).gir	\
	GtkFrob-$(GI_APIVERSION).gir	\
	GetType-$(GI_APIVERSION).gir	\
	WarnLib-$(GI_APIVERSION).gir	\
	Typedefs-$(GI_APIVERSION).gir	\
	Regress-$(GI_APIVERSION).gir	\
	Bar-$(GI_APIVERSION).gir	\
	Headeronly-$(GI_APIVERSION).gir	\
	Identfilter-$(GI_APIVERSION).gir

built_test_typelibs =	\
	GIMarshallingTests-$(GI_APIVERSION).typelib	\
	Everything-$(GI_APIVERSION).typelib	\
	Offsets-$(GI_APIVERSION).typelib	\
	SLetter-$(GI_APIVERSION).typelib	\
	Utility-$(GI_APIVERSION).typelib	\
	GtkFrob-$(GI_APIVERSION).typelib	\
	GetType-$(GI_APIVERSION).typelib	\
	WarnLib-$(GI_APIVERSION).typelib	\
	Typedefs-$(GI_APIVERSION).typelib	\
	Regress-$(GI_APIVERSION).typelib	\
	Bar-$(GI_APIVERSION).typelib	\
	Headeronly-$(GI_APIVERSION).typelib	\
	Identfilter-$(GI_APIVERSION).typelib

test_programs =	\
	gitestrepo.exe	\
	gitestthrows.exe	\
	giteststructinfo.exe	\
	gitypelibtest.exe	\
	gitestoffsets.exe

built_doc_tests =	\
	Regress-$(GI_APIVERSION)-C	\
	Regress-$(GI_APIVERSION)-Python	\
	Regress-$(GI_APIVERSION)-Gjs	\
	Regress-$(GI_APIVERSION)-sections.txt

!if "$(BUILD_INTROSPECTION)" == "TRUE"
all: setgirbuildenv $(built_test_girs) $(built_test_typelibs) $(test_programs) $(built_doc_tests) warn_tests_log.txt

!include gi-setenv-msvc.mak

# Rules for building the test DLLs
gimarshallingtests.dll: $(TOP_SRCDIR)\tests\gimarshallingtests.c
	$(CC) $(CFLAGS) $(TOP_SRCDIR)\tests\gimarshallingtests.c $(LDFLAGS_DLL)
	@-if exist $@.manifest @mt /manifest $@.manifest /outputresource:$@;2

everything.dll: everything.c everything.h
	$(CC) $(CFLAGS) /I$(TOP_SRCDIR)\tests everything.c $(LDFLAGS_DLL)
	@-if exist $@.manifest @mt /manifest $@.manifest /outputresource:$@;2

offsets.dll: $(TOP_SRCDIR)\tests\offsets\offsets.c
	$(CC) $(CFLAGS) /I$(TOP_SRCDIR)\tests /I$(TOP_SRCDIR)\tests\offsets $(TOP_SRCDIR)\tests\offsets\offsets.c $(LDFLAGS_DLL)
	@-if exist $@.manifest @mt /manifest $@.manifest /outputresource:$@;2

{$(TOP_SRCDIR)\tests\scanner\}.c{}.dll:
	$(CC) $(CFLAGS) /I$(TOP_SRCDIR)\tests $< $(LDFLAGS_DLL)
	@-if exist $@.manifest @mt /manifest $@.manifest /outputresource:$@;2

regress.dll:
	$(CC) $(CFLAGS) /I$(TOP_SRCDIR)\tests	\
	$(REGRESS_CFLAGS)	\
	$(TOP_SRCDIR)\tests\scanner\regress.c	\
	$(TOP_SRCDIR)\tests\scanner\annotation.c	\
	$(TOP_SRCDIR)\tests\scanner\foo.c	\
	$(TOP_SRCDIR)\tests\scanner\drawable.c	\
	$(LDFLAGS_DLL) cairo-gobject.lib cairo.lib
	@-if exist $@.manifest @mt /manifest $@.manifest /outputresource:$@;2

# Rules for test programs
{$(TOP_SRCDIR)\tests\repository\}.c{}.exe:
	$(CC) $(CFLAGS) /I$(TOP_SRCDIR)\girepository $< $(LDFLAGS) girepository-$(GI_APIVERSION).lib
	@-if exist $@.manifest @mt /manifest $@.manifest /outputresource:$@;1

{$(TOP_SRCDIR)\tests\scanner\}.c{}.exe:
	$(CC) $(CFLAGS) /I$(TOP_SRCDIR)\girepository -I$(TOP_SRCDIR)\tests $< $(LDFLAGS) girepository-$(GI_APIVERSION).lib
	@-if exist $@.manifest @mt /manifest $@.manifest /outputresource:$@;1

gitestoffsets.exe: gitestoffsets.c
	$(CC) $(CFLAGS) /I$(TOP_SRCDIR)\girepository /I$(TOP_SRCDIR)\tests\offsets /I$(TOP_SRCDIR)\tests $*.c $(LDFLAGS) girepository-$(GI_APIVERSION).lib
	@-if exist $@.manifest @mt /manifest $@.manifest /outputresource:$@;1
	@set GI_TYPELIB_PATH=.
	@-$@ offsets.compiled offsets.introspected
	@-fc offsets.compiled offsets.introspected > gitestoffsets.log

# Rules for building the .gir's
GIMarshallingTests-$(GI_APIVERSION).gir: gimarshallingtests.dll
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all --warn-error --reparse-validate	\
	--namespace=GIMarshallingTests --symbol-prefix=gi_marshalling_tests --nsversion=$(GI_APIVERSION)	\
	--no-libtool -I$(TOP_SRCDIR)	\
	--add-include-path=. --include=Gio-$(GLIB_APIVERSION)	\
	--library=$* --output=$@	\
	--c-include="tests/gimarshallingtests.h"	\
	$(TOP_SRCDIR)\tests\gimarshallingtests.h $(TOP_SRCDIR)\tests\gimarshallingtests.c

Everything-$(GI_APIVERSION).gir: everything.dll
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all --warn-error --reparse-validate	\
	--namespace=Everything --nsversion=$(GI_APIVERSION)	\
	--no-libtool -I$(TOP_SRCDIR) -I$(TOP_SRCDIR)\tests	\
	--add-include-path=. --include=Gio-$(GLIB_APIVERSION)	\
	--library=$* --output=$@	\
	everything.h everything.c

Offsets-$(GI_APIVERSION).gir: offsets.dll
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all --warn-error --reparse-validate	\
	--namespace=Offsets --nsversion=$(GI_APIVERSION)	\
	--no-libtool -I$(TOP_SRCDIR) -I$(TOP_SRCDIR)\tests\offsets -I$(TOP_SRCDIR)\tests	\
	--pkg=gobject-$(GLIB_APIVERSION) --add-include-path=. --include=GObject-$(GLIB_APIVERSION)	\
	--library=$* --output=$@	\
	$(TOP_SRCDIR)\tests\offsets\offsets.h $(TOP_SRCDIR)\tests\offsets\offsets.c

SLetter-$(GI_APIVERSION).gir: sletter.dll
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all --reparse-validate	\
	--namespace=SLetter --nsversion=$(GI_APIVERSION) \
	--no-libtool -I$(TOP_SRCDIR)\tests -I$(TOP_SRCDIR)	\
	--add-include-path=. --include=Gio-$(GLIB_APIVERSION)	\
	--identifier-prefix=S --c-include="sletter.h" --warn-error	\
	--library=$* --output=$@	\
	$(TOP_SRCDIR)\tests\scanner\sletter.h $(TOP_SRCDIR)\tests\scanner\sletter.c

Utility-$(GI_APIVERSION).gir: utility.dll
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all --reparse-validate	\
	--namespace=Utility --nsversion=$(GI_APIVERSION)	\
	--no-libtool -I$(TOP_SRCDIR)\tests -I$(TOP_SRCDIR) --pkg=gobject-$(GLIB_APIVERSION)	\
	--add-include-path=. --include=GObject-$(GLIB_APIVERSION)	\
	--c-include="utility.h" --warn-error	\
	--library=$* --output=$@ \
	$(TOP_SRCDIR)\tests\scanner\utility.h $(TOP_SRCDIR)\tests\scanner\utility.c

GtkFrob-$(GI_APIVERSION).gir: gtkfrob.dll
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all --reparse-validate	\
	--namespace=GtkFrob --nsversion=$(GI_APIVERSION)	\
	--no-libtool -I$(TOP_SRCDIR)\tests -I$(TOP_SRCDIR) --pkg=gobject-$(GLIB_APIVERSION)	\
	--add-include-path=. --include=GObject-$(GLIB_APIVERSION)	\
	--identifier-prefix=Gtk --symbol-prefix=gtk_frob --warn-error	\
	--library=$* --output=$@ \
	$(TOP_SRCDIR)\tests\scanner\gtkfrob.h $(TOP_SRCDIR)\tests\scanner\gtkfrob.c

GetType-$(GI_APIVERSION).gir: gettype.dll
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all --reparse-validate	\
	--namespace=GetType --nsversion=$(GI_APIVERSION)	\
	--no-libtool -I$(TOP_SRCDIR)\tests -I$(TOP_SRCDIR) --pkg=gobject-$(GLIB_APIVERSION)	\
	--add-include-path=. --include=GObject-$(GLIB_APIVERSION)	\
	--c-include="gettype.h" --identifier-prefix=GetType --symbol-prefix=gettype	\
	--library=$* --output=$@ \
	$(TOP_SRCDIR)\tests\scanner\gettype.h $(TOP_SRCDIR)\tests\scanner\gettype.c

Typedefs-$(GI_APIVERSION).gir: typedefs.dll
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all --reparse-validate	\
	--namespace=Typedefs --nsversion=$(GI_APIVERSION)	\
	--no-libtool -I$(TOP_SRCDIR)\tests -I$(TOP_SRCDIR) --pkg=gobject-$(GLIB_APIVERSION)	\
	--add-include-path=. --include=GObject-$(GLIB_APIVERSION)	\
	--c-include="typedefs.h" --identifier-prefix=Typedefs --symbol-prefix=typedefs	\
	--library=$* --output=$@ \
	$(TOP_SRCDIR)\tests\scanner\typedefs.h $(TOP_SRCDIR)\tests\scanner\typedefs.c

WarnLib-$(GI_APIVERSION).gir: warnlib.dll
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all --reparse-validate	\
	--namespace=WarnLib --nsversion=$(GI_APIVERSION)	\
	--no-libtool -I$(TOP_SRCDIR)\tests -I$(TOP_SRCDIR)	\
	--add-include-path=. --include=Gio-$(GLIB_APIVERSION)	\
	--c-include="warnlib.h" --symbol-prefix=warnlib_	\
	--library=$* --output=$@ \
	$(TOP_SRCDIR)\tests\scanner\warnlib.h $(TOP_SRCDIR)\tests\scanner\warnlib.c

Regress-$(GI_APIVERSION).gir: Utility-$(GI_APIVERSION).gir regress.dll
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all	\
	--namespace=Regress --nsversion=$(GI_APIVERSION)	\
	--no-libtool -I$(TOP_SRCDIR)\tests -I$(TOP_SRCDIR)	\
	--add-include-path=. --include=Gio-$(GLIB_APIVERSION)	\
	--include=Utility-$(GI_APIVERSION) --include=cairo-$(GI_APIVERSION)	\
	--c-include="regress.h" --warn-error	\
	--library=$* --output=$@	\
	$(REGRESS_CFLAGS)	\
	$(TOP_SRCDIR)\tests\scanner\regress.c $(TOP_SRCDIR)\tests\scanner\regress.h	\
	$(TOP_SRCDIR)\tests\scanner\annotation.c $(TOP_SRCDIR)\tests\scanner\annotation.h	\
	$(TOP_SRCDIR)\tests\scanner\foo.c $(TOP_SRCDIR)\tests\scanner\foo.h	\
	$(TOP_SRCDIR)\tests\scanner\drawable.c $(TOP_SRCDIR)\tests\scanner\drawable.h

Bar-$(GI_APIVERSION).gir: Utility-$(GI_APIVERSION).gir barapp.exe
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all	\
	--namespace=Bar --nsversion=$(GI_APIVERSION)	\
	--program=barapp	\
	--no-libtool -I$(TOP_SRCDIR)\tests -I$(TOP_SRCDIR) --pkg=gobject-$(GLIB_APIVERSION)	\
	--add-include-path=. --include=GObject-$(GLIB_APIVERSION)	\
	--accept-unprefixed	\
	--output=$@	\
	$(TOP_SRCDIR)\tests\scanner\barapp.c $(TOP_SRCDIR)\tests\scanner\barapp.h

Headeronly-$(GI_APIVERSION).gir:
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all	\
	--warn-error --reparse-validate --namespace=Headeronly --nsversion=$(GI_APIVERSION)	\
	--header-only --output=$@ $(TOP_SRCDIR)\tests\scanner\headeronly.h

Identfilter-$(GI_APIVERSION).gir:
	$(PYTHON) $(G_IR_SCANNER_CURRENT) --warn-all --reparse-validate	\
	--namespace=Identfilter --accept-unprefixed --nsversion=1.0 --header-only	\
	--identifier-filter-cmd="$(PYTHON) $(TOP_SRCDIR)\tests\scanner\identfilter.py"	\
	--output=$@ $(TOP_SRCDIR)\tests\scanner\identfilter.h

# Rules for doc (Mallard) tests
Regress-$(GI_APIVERSION)-C: Regress-$(GI_APIVERSION).gir
	@-if exist $@ @rmdir /s /q $@
	$(PYTHON) $(G_IR_DOC_TOOL_CURRENT) --add-include-path=. --language C .\Regress-$(GI_APIVERSION).gir -o .\$@\

Regress-$(GI_APIVERSION)-Python: Regress-$(GI_APIVERSION).gir
	@-if exist $@ @rmdir /s /q $@
	$(PYTHON) $(G_IR_DOC_TOOL_CURRENT) --add-include-path=. --language Python .\Regress-$(GI_APIVERSION).gir -o .\$@\

Regress-$(GI_APIVERSION)-Gjs: Regress-$(GI_APIVERSION).gir
	@-if exist $@ @rmdir /s /q $@
	$(PYTHON) $(G_IR_DOC_TOOL_CURRENT) --add-include-path=. --language Gjs .\Regress-$(GI_APIVERSION).gir -o .\$@\

Regress-$(GI_APIVERSION)-sections.txt: Regress-$(GI_APIVERSION).gir
	$(PYTHON) $(G_IR_DOC_TOOL_CURRENT) --add-include-path=. --write-sections-file .\Regress-$(GI_APIVERSION).gir -o $@

# Run warn tests
warn_tests_log.txt:
	@-echo Runinng warn tests...
	@-copy GObject-$(GLIB_APIVERSION).gir $(TOP_SRCDIR)\gir
	@-copy GLib-$(GLIB_APIVERSION).gir $(TOP_SRCDIR)\gir
	@-set TOP_BUILDDIR=..
	@-for %a in ($(TOP_SRCDIR)\tests\warn\*.h) do if not "%a" == "$(TOP_SRCDIR)\tests\warn\common.h" $(PYTHON) $(TOP_SRCDIR)\tests\warn\warningtester.py %a >> $@
	@-del $(TOP_SRCDIR)\gir\GObject-$(GLIB_APIVERSION).gir
	@-del $(TOP_SRCDIR)\gir\GLib-$(GLIB_APIVERSION).gir

gitestoffsets.c: Offsets-$(GI_APIVERSION).typelib
	$(PYTHON) $(TOP_SRCDIR)\tests\offsets\gen-gitestoffsets $(TOP_SRCDIR)\tests\offsets\offsets.h > $@

# Generate .typelib's from generated .gir's
$(built_test_typelibs): $(built_test_girs)
	@-echo Compiling $*.typelib...
	@-$(G_IR_COMPILER_CURRENT) --includedir=. --debug --verbose $*.gir -o $@

!else
all: install-introspection

install-introspection:
	@-echo $(ERROR_MSG)
!endif

clean:
	@-del /f/q warn_tests_log.txt
	@-del /f/q gitestoffsets.log
	@-del /f/q Regress-$(GI_APIVERSION)-sections.txt
	@-rmdir /s /q Regress-$(GI_APIVERSION)-Gjs
	@-rmdir /s /q Regress-$(GI_APIVERSION)-Python
	@-rmdir /s /q Regress-$(GI_APIVERSION)-C
	@-for %a in ($(built_test_typelibs)) do @del %a
	@-for %a in ($(built_test_girs)) do @del %a
	@-del /f/q *.ilk
	@-del /f/q *.lib
	@-del /f/q *.exp
	@-del /f/q *.dll
	@-del /f/q *.exe
	@-for %a in (*.manifest) do @del /f/q %a
	@-del /f/q *.pdb
	@-del /f/q *.obj
	@-del /f/q gitestoffsets.c
	@-del offsets.compiled offsets.introspected
	@-del /f/q *.pyc
