# Mesa 3-D graphics library
# Version:  4.0
# 
# Copyright (C) 1999  Brian Paul   All Rights Reserved.
# 
# 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
# BRIAN PAUL 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.

# MinGW makefile v1.2 for Mesa
#
#  Copyright (C) 2002 - Daniel Borca
#  Email : dborca@users.sourceforge.net
#  Web   : http://www.geocities.com/dborca


#
#  Available options:
#
#    Environment variables:
#	GLIDE		path to Glide3 SDK; used with FX.
#			default = $(TOP)/glide3
#	FX=1		build for 3dfx Glide3. Note that this disables
#			compilation of most WMesa code and requires fxMesa.
#			As a consequence, you'll need the Win32 Glide3
#			library to build any application.
#			default = no
#	ICD=1		build the installable client driver interface
#			(windows opengl driver interface)
#			default = no
#	X86=1		optimize for x86 (if possible, use MMX, SSE, 3DNow).
#			default = no
#
#    Targets:
#	all:		build everything
#	libgl:		build GL
#	clean:		remove object files
#	realclean:	remove all generated files
#

# MinGW core makefile updated for Mesa 7.0
#
#  Updated : by Heromyth, on 2007-7-21
#  Email   : zxpmyth@yahoo.com.cn
#  Bugs    : 1) All the default settings work fine. But the setting X86=1 can't work. 
#            The others havn't been tested yet.
#            2) The generated DLLs are *not* compatible with the ones built
#            with the other compilers like VC8, especially for GLUT. 
#            3) MAlthough more tests are needed, it can be used individually!


.PHONY : all libgl clean realclean

ifeq ($(ICD),1)
  # when -std=c99 mingw will not define WIN32
  CFLAGS = -Wall -Werror
else
  # I love c89
  CFLAGS = -Wall -pedantic
endif
CFLAGS += -O2 -ffast-math

export CFLAGS


ifeq ($(wildcard $(addsuffix /rm.exe,$(subst ;, ,$(PATH)))),)
UNLINK = del $(subst /,\,$(1))
else
UNLINK = $(RM) $(1)
endif

all: libgl libglu libglut example

libgl: lib
	$(MAKE) -f Makefile.mgw -C src/mesa

libglu: libgl
	$(MAKE) -f Makefile.mgw -C src/glu/sgi

libglut: libglu 
	$(MAKE) -f Makefile.mgw -C src/glut/glx

example: libglut 
	$(MAKE) -f Makefile.mgw star -C progs/samples
	copy progs\samples\star.exe lib

lib:
	mkdir lib

clean:
	$(MAKE) -f Makefile.mgw clean -C src/mesa
	$(MAKE) -f Makefile.mgw clean -C src/glu/sgi
	$(MAKE) -f Makefile.mgw clean -C src/glut/glx

realclean: clean
	-$(call UNLINK,lib/*.a)
	-$(call UNLINK,lib/*.dll)
