# Mesa 3-D graphics library
# Version:  5.1
# 
# Copyright (C) 1999-2003  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 core makefile v1.4 for Mesa
#
#  Copyright (C) 2002 - Daniel Borca
#  Email : dborca@users.sourceforge.net
#  Web   : http://www.geocities.com/dborca

# MinGW core-glut 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) Although more tests are needed, it can be used individually!


#
#  Available options:
#
#    Environment variables:
#	CFLAGS
#
#	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 GL
#	clean:		remove object files
#



.PHONY: all clean
.INTERMEDIATE: x86/gen_matypes.exe
.SUFFIXES: .rc .res

# Set this to the prefix of your build tools, i.e. mingw32-
TOOLS_PREFIX = mingw32-

TOP = ../../..

LIBDIR = $(TOP)/lib

LIB_NAME = glut32

DLL_EXT = .dll
IMP_EXT = .a
LIB_PRE = lib
STRIP = -s

AR = ar
ARFLAGS = crus
DLLTOOL = dlltool

GLUT_DLL = $(LIB_NAME)$(DLL_EXT)
GLUT_IMP = $(LIB_PRE)$(LIB_NAME)$(IMP_EXT)
GLUT_DEF = $(LIB_NAME).def

LDLIBS = -L$(LIBDIR) -lwinmm -lgdi32 -luser32 -lopengl32 -lglu32 
LDFLAGS = $(STRIP) -shared -fPIC -Wl,--kill-at

CFLAGS += -DBUILD_GLUT32 -DGLUT_BUILDING_LIB -DMESA -D_DLL
CFLAGS += -DNDEBUG -DLIBRARYBUILD -I$(TOP)/include 

CC = $(TOOLS_PREFIX)gcc
CXX = $(TOOLS_PREFIX)g++
CXXFLAGS = $(CFLAGS)

AR = ar
ARFLAGS = crus

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

HDRS = glutint.h glutstroke.h glutbitmap.h glutwin32.h stroke.h win32_glx.h win32_x11.h

SRCS = \
	glut_bitmap.c \
	glut_bwidth.c \
	glut_cindex.c \
	glut_cmap.c \
	glut_cursor.c \
	glut_dials.c \
	glut_dstr.c \
	glut_event.c \
	glut_ext.c \
	glut_fcb.c \
	glut_fullscrn.c \
	glut_gamemode.c \
	glut_get.c \
	glut_init.c \
	glut_input.c \
	glut_joy.c \
	glut_key.c \
	glut_keyctrl.c \
	glut_keyup.c \
	glut_mesa.c \
	glut_modifier.c \
	glut_overlay.c \
	glut_shapes.c \
	glut_space.c \
	glut_stroke.c \
	glut_swap.c \
	glut_swidth.c \
	glut_tablet.c \
	glut_teapot.c \
	glut_util.c \
	glut_vidresize.c \
	glut_warp.c \
	glut_win.c \
	glut_winmisc.c \
	win32_glx.c \
	win32_menu.c \
	win32_util.c \
	win32_winproc.c \
	win32_x11.c
	

SRCSSEMIGENS = \
	glut_8x13.c \
	glut_9x15.c \
	glut_hel10.c \
	glut_hel12.c \
	glut_hel18.c \
	glut_mroman.c \
	glut_roman.c \
	glut_tr10.c \
	glut_tr24.c



SOURCES = $(SRCS) $(SRCSSEMIGENS)

OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))

.c.o:
	$(CC) -o $@ $(CFLAGS) -c $<
.cc.o:
	$(CXX) -o $@ $(CXXFLAGS) -c $<


all: $(LIBDIR) $(LIBDIR)/$(GLUT_DLL) $(LIBDIR)/$(GLUT_IMP)

$(LIBDIR):
	mkdir -p $(LIBDIR)

$(LIBDIR)/$(GLUT_DLL) $(LIBDIR)/$(GLUT_IMP): $(OBJECTS)
	$(CXX) $(LDFLAGS) -o $(LIBDIR)/$(GLUT_DLL) $^ $(LDLIBS)
	$(DLLTOOL) --as=as --dllname $(LIB_NAME) --output-def $(LIBDIR)/$(GLUT_DEF) $^
	$(DLLTOOL) --as=as -k --dllname $(LIB_NAME) --output-lib $(LIBDIR)/$(GLUT_IMP) --def $(LIBDIR)/$(GLUT_DEF) 

clean:
	-$(call UNLINK,*.o)