#
# This makefile must be executed on a system with makedepend, such as Solaris.
# In my copious amount of spare time, I hope to write a Java-based makedepend
# to eliminate this dependency (no pun intended). TB

BUILD_DIR = ../..
TOPDIR   = ../../..

STUBDIR = WindowsSystemHeaderStubs
BUILDSTUBDIR = BuildStubs

SHARE_SRC = $(TOPDIR)/src/share
SUN_SRC = $(SHARE_SRC)/native/sun
COMP_SRC = $(SUN_SRC)/awt/alphacomposite
DEBUG_SRC = $(SUN_SRC)/awt/debug
IMG_SRC = $(SUN_SRC)/awt/image
MEDIA_SRC = $(SUN_SRC)/awt/medialib
J2D_SRC  = $(SUN_SRC)/java2d
J2D_WINDOWS_SRC = $(WINDOWS_SRC)/native/sun/java2d
J2D_FONT_SRC = $(SUN_SRC)/font
LOOP_SRC = $(SUN_SRC)/java2d/loops
PIPE_SRC = $(SUN_SRC)/java2d/pipe
WINDOWS_SRC = $(TOPDIR)/src/windows
SRC = $(WINDOWS_SRC)/native/sun/windows

SRCDIRS = \
	$(COMP_SRC) \
	$(DEBUG_SRC) \
	$(IMG_SRC) \
	$(IMG_SRC)/cvutils \
	$(IMG_SRC)/gif \
	$(MEDIA_SRC) \
	$(J2D_SRC) \
	$(J2D_FONT_SRC) \
	$(J2D_WINDOWS_SRC)/windows \
	$(J2D_WINDOWS_SRC)/d3d \
	$(J2D_WINDOWS_SRC)/opengl \
	$(LOOP_SRC) \
	$(PIPE_SRC) \
	$(SRC)

INCLUDES = \
	   -I$(STUBDIR) \
	   -I$(BUILDSTUBDIR) \
	   -I$(SHARE_SRC)/javavm/export \
	   -I$(WINDOWS_SRC)/javavm/export \
	   -I$(SHARE_SRC)/native/common \
	   -I$(WINDOWS_SRC)/native/common \
	   -I$(SUN_SRC)/dc/doe \
	   -I$(SUN_SRC)/dc/path \
	   -I$(COMP_SRC) \
	   -I$(DEBUG_SRC) \
	   -I$(IMG_SRC) \
	   -I$(IMG_SRC)/cvutils \
	   -I$(MEDIA_SRC) \
	   -I$(J2D_SRC) \
	   -I$(J2D_FONT_SRC) \
	   -I$(J2D_WINDOWS_SRC) \
	   -I$(J2D_WINDOWS_SRC)/windows \
	   -I$(J2D_WINDOWS_SRC)/d3d \
	   -I$(J2D_WINDOWS_SRC)/opengl \
	   -I$(LOOP_SRC) \
	   -I$(PIPE_SRC) \
	   -I$(SRC)

STUBFILES = \
	$(STUBDIR)/ddraw.h \
	$(STUBDIR)/Ole2.h \
	$(STUBDIR)/d3d.h \
	$(STUBDIR)/d3dx.h \
	$(STUBDIR)/cderr.h \
	$(STUBDIR)/commdlg.h \
	$(STUBDIR)/direct.h \
	$(STUBDIR)/imm.h \
	$(STUBDIR)/ime.h \
	$(STUBDIR)/io.h \
	$(STUBDIR)/mmsystem.h \
	$(STUBDIR)/new.h \
	$(STUBDIR)/new \
	$(STUBDIR)/shellapi.h \
	$(STUBDIR)/shlobj.h \
	$(STUBDIR)/tchar.h \
	$(STUBDIR)/winbase.h \
	$(STUBDIR)/windef.h \
	$(STUBDIR)/windows.h \
	$(STUBDIR)/winspool.h \
	$(STUBDIR)/winuser.h \
	$(STUBDIR)/wtypes.h

default: dependencies

FILES_cpp = jawt.cpp

dependencies:
	rm -rf make.depend
	rm -rf make.tmp make.tmp2 make.tmp.bak
	rm -rf $(STUBDIR) $(BUILDSTUBDIR) depend.filelist
	for file in $(FILES_c) $(FILES_cpp) $(EXTRAFILES_c); do \
	    for dir in $(SRCDIRS); do \
	    	if [ -f $$dir/$$file ]; then \
		    echo $$dir/$$file >>depend.filelist; \
		fi; \
	    	if [ -f $$dir/$${file}pp ]; then \
		    echo $$dir/$${file}pp >>depend.filelist; \
		fi; \
	    done; \
	done
	touch make.tmp
	mkdir $(STUBDIR)
	touch $(STUBFILES)
	mkdir $(BUILDSTUBDIR)
	gnumake -f Depend.mak classhdrstubs
	cat depend.filelist | xargs -n 100 makedepend \
		-DWIN32 -D_X86X -Dx86 -DDEBUG -D_MSC_VER -DMLIB_NO_LIBSUNMATH \
		-a -f make.tmp -o.obj $(INCLUDES)
	fgrep .obj make.tmp | sed -f Depend.sed | sort -u | nawk -f ../awt/CondenseRules.awk > make.depend
	rm -rf make.tmp make.tmp2 make.tmp.bak
	rm -rf $(STUBDIR) $(BUILDSTUBDIR) depend.filelist


include ../awt/FILES_export_windows.gmk

FILES_java = $(FILES_export) $(FILES_export2) $(FILES_export3)

classhdrstubs:
	for file in `echo $(FILES_java) | \
		      tr ' ' '\n' | \
		      sed -e 'y/\//_/' -e 's/\.java/.h/'`; do \
	    echo "#include <jni.h>" > $(BUILDSTUBDIR)/$$file; \
	done
