# Mesa 3-D graphics library
# Version:  3.5
#
# Copyright (C) 2001 Wind River Systems, Inc

# The MIT License
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
# 
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
# DEALINGS IN THE SOFTWARE.

# Makefile for GLU library

##### MACROS #####
GLU_MAJOR = 1
GLU_MINOR = 3
GLU_TINY = 0$(MESA_MAJOR)0$(MESA_MINOR)0$(MESA_TINY)

##### RULES #####

include ../rules.windml

GLU_SOURCES = \
	glu.c \
	mipmap.c \
	nurbs.c \
	nurbscrv.c \
	nurbssrf.c \
	nurbsutl.c \
	polytest.c \
	project.c \
	quadric.c \
	tess.c \
	tesselat.c \
	../src/windml/tornado/torMesaGLUInit.c

GLU_OBJECTS = $(GLU_SOURCES:.c=.o)
GLU_OBJNAME = $(MESA_LIBDIR)/objMesaGLU.o 

SOURCES = $(GLU_SOURCES)

##### TARGETS #####

all: depend.$(CPU)$(TOOL) $(GLU_OBJNAME)

# Make the GLU library
$(GLU_OBJNAME): $(GLU_OBJECTS)
#	$(LD) -r $(GLU_OBJECTS) -o $(MESA_OBJNAME)
	$(LD) -r $(GLU_OBJECTS) -o $(GLU_OBJNAME)
#	$(AR) rus $(MESA_LIBNAME) $(GLU_OBJNAME)
#	$(AR) rus $(VX_LIBNAME) $(GLU_OBJNAME)

depend.$(CPU)$(TOOL):
ifeq ($(WIND_HOST_TYPE),x86-win32)
	@ $(RM) $@
	@ $(ECHO) Creating depend.$(CPU)$(TOOL)
ifneq ($(SOURCES),)
	@ for %f in ($(SOURCES)) do \
	$(CC) -MM $(CFLAGS) %f >>$@ 
endif
else
Makefile
	@ $(RM) $@
	@ $(ECHO) "Creating depend.$(CPU)$(TOOL)"
ifneq ($(SOURCES),)
	@ for FILE in $(filter-out $(NODEPENDOBJS), $(SOURCES)); \
	do \
	$(CC) -MM $(CFLAGS) $$FILE  \
	| $(TCL) $(BIN_DIR)/depend.tcl $(TGT_DIR) >>$@; \
	done	
endif
endif

.PHONY = clean

clean:
#	$(AR) d $(MESA_LIBNAME) $(GLU_OBJNAME)
#	$(AR) d $(VX_LIBNAME) $(GLU_OBJNAME)
	$(RM) $(GLU_OBJNAME)
	$(RM) $(GLU_OBJECTS)
	$(RM) depend.$(CPU)$(TOOL)

include depend.$(CPU)$(TOOL)
