PSPPATH := $(shell psp-config --psp-prefix)
PSPSDK := $(shell psp-config --pspsdk-path)
ARCH = psp-

CC = $(ARCH)gcc -std=gnu99
AR = $(ARCH)ar
RANLIB = $(ARCH)ranlib
RM = rm -f
CFLAGS = -g -Wall -Wmissing-prototypes -Os -G0 -fsingle-precision-constant -I. -I $(PSPPATH)/include -I $(PSPSDK)/include -funit-at-a-time
LFLAGS = -g -Wall -Os -G0 -L$(PSPPATH)/lib

DEPDIR = .deps

API_OBJS = \
	eglBindTexImage.o \
	eglChooseConfig.o \
	eglCreateContext.o \
	eglCreatePbufferSurface.o \
	eglCreateWindowSurface.o \
	eglDestroyContext.o \
	eglDestroySurface.o \
	eglGetConfigAttrib.o \
	eglGetConfigs.o \
	eglGetError.o \
	eglGetDisplay.o \
	eglInitialize.o \
	eglMakeCurrent.o \
	eglQueryString.o \
	eglSwapBuffers.o \
	eglSwapInterval.o \
	eglTerminate.o \
	eglWaitGL.o \
	eglWaitNative.o \
	glAlphaFunc.o \
	glArrayElement.o \
	glBegin.o \
	glDrawBezierArrays.o \
	glDrawBezierElements.o \
	glDrawSplineArrays.o \
	glDrawSplineElements.o \
	glBindBufferARB.o \
	glBindTexture.o \
	glBlendEquation.o \
	glBlendFunc.o \
	glBufferDataARB.o \
	glBufferSubDataARB.o \
	glClear.o \
	glClearColor.o \
	glClearDepth.o \
	glClearDepthf.o \
	glClearStencil.o \
	glColor.o \
	glColorMask.o \
	glColorPointer.o \
	glColorTable.o \
	glCompressedTexImage2D.o \
	glCopyTexImage2D.o \
	glCullFace.o \
	glDeleteBuffersARB.o \
	glDeleteTextures.o \
	glDepthFunc.o \
	glDepthMask.o \
	glDepthRange.o \
	glDepthRangef.o \
	glDrawArrays.o \
	glDrawBuffer.o \
	glDrawElements.o \
	glEnable.o \
	glEnableClientState.o \
	glEnd.o \
	glFinish.o \
	glFlush.o \
	glFog.o \
	glFrontFace.o \
	glFrustumf.o \
	glFrustum.o \
	glGenBuffersARB.o \
	glGenTextures.o \
	glGetBufferSubDataARB.o \
	glGetFloatv.o \
	glGetIntegerv.o \
	glGetError.o \
	glGetString.o \
	glInterleavedArrays.o \
	glIsTexture.o \
	glLight.o \
	glLightModel.o \
	glLineWidth.o \
	glLoadIdentity.o \
	glLoadMatrixf.o \
	glLockArraysEXT.o \
	glLogicOp.o \
	glMapBufferARB.o \
	glMaterial.o \
	glMatrixMode.o \
	glMultMatrixf.o \
	glNormal.o \
	glNormald.o \
	glNormalPointer.o \
	glOrtho.o \
	glOrthof.o \
	glPixelStore.o \
	glPushAttrib.o \
	glPushClientAttrib.o \
	glPopMatrix.o \
	glPushMatrix.o \
	glPolygonMode.o \
	glPolygonOffset.o \
	glPrioritizeTextures.o \
	glReadBuffer.o \
	glReadPixels.o \
	glRotatef.o \
	glScalef.o \
	glScaled.o \
	glScissor.o \
	glShadeModel.o \
	glStencilFunc.o \
	glStencilMask.o \
	glStencilOp.o \
	glTexCoord.o \
	glTexCoordPointer.o \
	glTexEnv.o \
	glTexGen.o \
	glTexImage2D.o \
	glTexSubImage2D.o \
	glTexParameter.o \
	glTranslatef.o \
	glUnmapBufferARB.o \
	glVertex.o \
	glVertexd.o \
	glVertexi.o \
	glVertexPointer.o \
	glViewport.o \
	glWeightPointerPSP.o \
	pspgl_buffers.o \
	pspgl_context.o \
	pspgl_copy_pixels.o \
	pspgl_dlist.o \
	pspgl_ge_init.o \
	pspgl_hash.o \
	pspgl_matrix.o \
	pspgl_misc.o \
	pspgl_stats.o \
	pspgl_texobj.o \
	pspgl_varray.o \
	pspgl_varray_draw.o \
	pspgl_varray_draw_elts.o \
	pspgl_varray_draw_range_elts.o \
	pspgl_vidmem.o

libGL.a_OBJS = \
	$(API_OBJS) \
	eglGetProcAddress.o

#	glGenLists.o
#	glIsList.o
#	glDeleteLists.o

libGLU.a_OBJS = \
	gluBuildMipmaps.o \
	gluLookAt.o \
	gluLookAtf.o \
	gluPerspective.o \
	gluPerspectivef.o \
	gluScaleImage.o \
	pspglu.o

libglut.a_OBJS = \
	glut.o \
	glutGetProcAddress.o

all: $(DEPDIR) $(libGL.a_OBJS) $(libGLU.a_OBJS) $(libglut.a_OBJS) libGL.a libGLU.a libglut.a


%.a: $(libGL.a_OBJS) $(libGLU.a_OBJS) $(libglut.a_OBJS)
	$(RM) $@
	$(AR) cru $@ $($@_OBJS)
	$(RANLIB) $@
	@$(ARCH)nm -o -fp -g --defined-only $@ | \
		awk '$$2~/^(gl|egl|glut|__pspgl)/ { next } \
				{ if (!bad) print "Bad symbols:"; print "\t", $$1, $$2; bad++ } \
			END	{ if (bad) { \
					print bad," bad symbol(s)"; exit(1) \
				  } else { \
					print "Namespace OK" } \
				}'


eglGetProcAddress.o: eglGetProcAddress.c pspgl_proctable_decls.h pspgl_proctable.h

# Extract all the public GL and EGL API symbols which are extensions (ends with PSP, ARB or EXT)
# Symbols must be sorted by name so that bsearch can be used to look for them.
pspgl_proctable.h: $(API_OBJS) Makefile
	$(ARCH)nm -fp -g --defined-only $(API_OBJS) | sort -k1 | \
		awk '$$2=="T" && $$1 ~ /^(gl|egl)[A-Z][a-zA-Z]/ \
			{ print "\t{ \"" $$1 "\", "$$1 " }," }' > $@ \
			|| rm -f $@

pspgl_proctable_decls.h: $(API_OBJS) Makefile
	$(ARCH)nm -fp -g --defined-only $(API_OBJS) | sort -k1 | \
		awk '$$2=="T" && $$1 ~ /^(gl|egl)[A-Z][a-zA-Z]/ \
			{ print "extern void " $$1 " (void);" }' > $@ \
			|| rm -f $@

$(DEPDIR):
	mkdir $(DEPDIR)

.c.o:
	$(CC) $(CFLAGS) -MD -MF $(DEPDIR)/$*.d -c $<

.S.o:
	$(CC) $(CFLAGS) -c $<

tar: clean
	( cd .. && tar cvfz pspgl-`date "+%Y-%m-%d"`.tar.gz pspgl --exclude "*.DS_Store" && cd - )

clean:
	$(RM) -rf *.o *.a $(DEPDIR) pspgl_proctable.h pspgl_proctable_decls.h
	make -C tools clean
	make -C tests clean
	make -C test-q3 clean
	make -C test-vfpu clean

install: all
	mkdir -p $(PSPPATH)/include $(PSPPATH)/lib
	mkdir -p $(PSPPATH)/include/GL $(PSPPATH)/include/GLES
	cp GL/*.h $(PSPPATH)/include/GL
	cp GLES/*.h $(PSPPATH)/include/GLES
	cp libGL.a $(PSPPATH)/lib
	cp libGLU.a $(PSPPATH)/lib
	cp libglut.a $(PSPPATH)/lib

-include $(wildcard $(DEPDIR)/*.d) dummy