# Linux makefile for Glide2/SST1
#
#  Copyright (c) 2003 - Daniel Borca
#  Email : dborca@users.sourceforge.net
#  Web   : http://www.geocities.com/dborca
#
#  Copyright (c) 2006 - Guillem Jover <guillem@hadrons.org>
#

#
#  Available options:
#
#    Environment variables:
#	FX_GLIDE_HW	build for the given ASIC (either sst1, or sst96).
#			default = sst1
#	XPATH		specify X11 path; needed for sst96.
#			default = /usr/X11R6 (sst96 only)
#	X11LIBS		X libraries path; default = $(XPATH)/lib
#	OPTFLAGS	pass given optimization flags to compiler
#			default = -O1 -ffast-math
#	DEBUG=1		enable debugging checks and messages
#			default = no
#	USE_X86=1	use assembler triangle specializations!
#			default = no
#
#    Targets:
#	all:		build everything
#	glide2x:	build Glide2x lib
#	clean:		remove object files
#	realclean:	remove all generated files
#

.PHONY: all glide2x clean realclean
.INTERMEDIATE: fxgasm
.SUFFIXES: .lo

export PATH := $(PATH):.

###############################################################################
#	general defines (user settable?)
###############################################################################

GLIDE_VERSION_MAJOR = 2
GLIDE_VERSION_MINOR = 46

GLIDE_LIB = libglide.a
GLIDE_SO  = libglide.so
GLIDE_SO_X= libglide2x.so
GLIDE_SONAME = $(GLIDE_SO).$(GLIDE_VERSION_MAJOR)
GLIDE_SHARED = $(GLIDE_SONAME).$(GLIDE_VERSION_MINOR)

FX_GLIDE_HW ?= sst1
FX_GLIDE_SW = ../../../swlibs
GLIDE_LIBDIR = ../../lib/$(FX_GLIDE_HW)

###############################################################################
#	tools
###############################################################################

CC = gcc
AS = nasm
AR = ar

CP = cp

###############################################################################
#	defines
###############################################################################

# platform
CDEFS = -DINIT_LINUX

XPATH ?= /usr/X11R6
X11LIBS ?= $(XPATH)/lib
ifeq ($(FX_GLIDE_HW),sst96)
## NOTE: no -lXxf86rush in new X versions
LDLIBS = -L$(X11LIBS) -lX11 -lXxf86dga -lXxf86rush -lXxf86vm
endif
LDLIBS += -lm

# general
CDEFS += -DGLIDE_HARDWARE -DGLIDE_DEFAULT_GAMMA=1.3f -DGLIDE_LIB=1

# subsystem
ifeq ($(FX_GLIDE_HW),sst1)
CDEFS += -DSST1
else
ifeq ($(FX_GLIDE_HW),sst96)
CDEFS += -DSST96
CDEFS += -DSST96_FIFO
#CDEFS += -DSST96_ALT_FIFO_WRAP
#CDEFS += -DINIT96VGASWAP
#CDEFS += -DINIT_ACCESS_DIRECT
CDEFS += -DGLIDE_USE_ALT_REGMAP
else
$(error Invalid FX_GLIDE_HW setting)
endif
endif

# debug
ifdef DEBUG
CDEFS += -DGDBG_INFO_ON -DGLIDE_DEBUG -DGLIDE_SANITY_ASSERT -DGLIDE_SANITY_SIZE
endif

# other
CDEFS += -DGLIDE_PLUG -DGLIDE_SPLASH

###############################################################################
#	flags
###############################################################################

# librarian
ARFLAGS = rus

# assembler
ASFLAGS = -O6 -felf -D__linux__
ASFLAGS += $(CDEFS)

# compiler
CFLAGS = -Wall
CFLAGS += -I. -I../../incsrc -I../../init -I../../init/initvg -I../../init/init96
CFLAGS += -I$(FX_GLIDE_SW)/fxmisc -I$(FX_GLIDE_SW)/newpci/pcilib -I$(FX_GLIDE_SW)/fxmemmap
ifeq ($(FX_GLIDE_HW),sst96)
CFLAGS += -I$(XPATH)/include
endif
CFLAGS += $(CDEFS)

ifeq ($(USE_X86),1)
CFLAGS += -DGL_X86
OPTFLAGS ?= -O1 -ffast-math
else
CFLAGS += -DGLIDE_USE_C_TRISETUP=1
OPTFLAGS ?= -O1 -ffast-math
endif

# optflags
CFLAGS += $(OPTFLAGS)

###############################################################################
#	objects
###############################################################################

GLIDE_HEADERS = \
	glide.h gump.h glidesys.h glideutl.h

GLIDE_PRIVATE_HEADERS = \
	fxglide.h gsstdef.h

###############################################################################
#	objects
###############################################################################

GLIDE_OBJECTS = \
	gsplash.o \
	g3df.o  \
	gu.o \
	guclip.o \
	gpci.o \
	gump.o \
	diglide.o \
	disst.o \
	ditex.o \
	gbanner.o \
	gerror.o \
	gmovie.o \
	digutex.o \
	ddgump.o \
	gaa.o \
	gdraw.o \
	gglide.o \
	glfb.o \
	gsst.o \
	gtex.o \
	gtexdl.o \
	gutex.o \
	gxdraw.o

GLIDE_OBJECTS += \
	cpuid.o

ifeq ($(USE_X86),1)
ifeq ($(FX_GLIDE_HW),sst1)
GLIDE_OBJECTS += \
	xdraw.o
else
GLIDE_OBJECTS += \
	xdraw96.o
endif
endif

ifeq ($(FX_GLIDE_HW),sst96)
GLIDE_OBJECTS += \
	sst96.o \
	../../init/init96/init96.o \
	../../init/init96/lindrvr.o \
	../../init/init96/initat3d.o \
	../../init/init96/initmcrx.o
endif

GLIDE_OBJECTS += \
	../../init/init.o \
	../../init/vgdrvr.o \
	../../init/vg96drvr.o \
	../../init/initvg/gamma.o \
	../../init/initvg/dac.o \
	../../init/initvg/video.o \
	../../init/initvg/parse.o \
	../../init/initvg/sli.o \
	../../init/initvg/util.o \
	../../init/initvg/info.o \
	../../init/initvg/print.o \
	../../init/initvg/gdebug.o \
	../../init/initvg/sst1init.o \
	$(FX_GLIDE_SW)/newpci/pcilib/sst1_pci.o \
	$(FX_GLIDE_SW)/newpci/pcilib/fxmsr.o \
	$(FX_GLIDE_SW)/newpci/pcilib/fxpci.o \
	$(FX_GLIDE_SW)/newpci/pcilib/fxlinux.o

# FIXME: needed for now to match the old library signature, should be checked
#        if it's really needed.
GLIDE_OBJECTS += \
	$(FX_GLIDE_SW)/fxmisc/fxos.o \
	$(FX_GLIDE_SW)/fxmisc/fximg.o

###############################################################################
#	rules
###############################################################################

.c.o:
	$(CC) -o $@ $(CFLAGS) -c $<
.c.lo:
	$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -c $<

###############################################################################
#	main
###############################################################################
all: glide2x

glide2x: $(GLIDE_LIBDIR)/$(GLIDE_LIB) $(GLIDE_LIBDIR)/$(GLIDE_SO) $(GLIDE_LIBDIR)/$(GLIDE_SONAME) $(GLIDE_LIBDIR)/$(GLIDE_SO_X)

$(GLIDE_LIBDIR)/$(GLIDE_LIB): $(GLIDE_OBJECTS)
	$(AR) $(ARFLAGS) $@ $^

$(GLIDE_LIBDIR)/$(GLIDE_SO): $(GLIDE_LIBDIR)/$(GLIDE_SHARED)
	ln -fs $(GLIDE_SHARED) $(GLIDE_LIBDIR)/$(GLIDE_SO)
$(GLIDE_LIBDIR)/$(GLIDE_SONAME): $(GLIDE_LIBDIR)/$(GLIDE_SHARED)
	ln -fs $(GLIDE_SHARED) $(GLIDE_LIBDIR)/$(GLIDE_SONAME)
$(GLIDE_LIBDIR)/$(GLIDE_SO_X): $(GLIDE_LIBDIR)/$(GLIDE_SHARED)
	ln -fs $(GLIDE_SHARED) $(GLIDE_LIBDIR)/$(GLIDE_SO_X)

$(GLIDE_LIBDIR)/$(GLIDE_SHARED): $(GLIDE_OBJECTS:.o=.lo)
	$(CC) -o $@ -shared -Wl,--no-undefined -Wl,-soname,$(GLIDE_SONAME) $^ $(LDFLAGS) $(LDLIBS)

###############################################################################
#	rules(2)
###############################################################################

cpuid.o: cpudtect.asm
	$(AS) -o $@ $(ASFLAGS) $<
xdraw.o: xdraw.asm
	$(AS) -o $@ $(ASFLAGS) $<
xdraw96.o: xdraw96.asm
	$(AS) -o $@ $(ASFLAGS) $<

cpuid.lo: cpuid.o
	$(CP) $< $@
xdraw.lo: xdraw.o
	$(CP) $< $@
xdraw96.lo: xdraw96.o
	$(CP) $< $@

ifeq ($(FX_GLIDE_HW),sst96)
../../init/initvg/gamma.o: ../../init/initvg/gamma.c
	$(CC) -o $@ $(CFLAGS) -USST96 -c $<
../../init/initvg/dac.o: ../../init/initvg/dac.c
	$(CC) -o $@ $(CFLAGS) -USST96 -c $<
../../init/initvg/video.o: ../../init/initvg/video.c
	$(CC) -o $@ $(CFLAGS) -USST96 -c $<
../../init/initvg/parse.o: ../../init/initvg/parse.c
	$(CC) -o $@ $(CFLAGS) -USST96 -c $<
../../init/initvg/sli.o: ../../init/initvg/sli.c
	$(CC) -o $@ $(CFLAGS) -USST96 -c $<
../../init/initvg/util.o: ../../init/initvg/util.c
	$(CC) -o $@ $(CFLAGS) -USST96 -c $<
../../init/initvg/info.o: ../../init/initvg/info.c
	$(CC) -o $@ $(CFLAGS) -USST96 -c $<
../../init/initvg/print.o: ../../init/initvg/print.c
	$(CC) -o $@ $(CFLAGS) -USST96 -c $<
../../init/initvg/gdebug.o: ../../init/initvg/gdebug.c
	$(CC) -o $@ $(CFLAGS) -USST96 -c $<
../../init/initvg/sst1init.o: ../../init/initvg/sst1init.c
	$(CC) -o $@ $(CFLAGS) -USST96 -c $<

../../init/initvg/gamma.lo: ../../init/initvg/gamma.c
	$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -USST96 -c $<
../../init/initvg/dac.lo: ../../init/initvg/dac.c
	$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -USST96 -c $<
../../init/initvg/video.lo: ../../init/initvg/video.c
	$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -USST96 -c $<
../../init/initvg/parse.lo: ../../init/initvg/parse.c
	$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -USST96 -c $<
../../init/initvg/sli.lo: ../../init/initvg/sli.c
	$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -USST96 -c $<
../../init/initvg/util.lo: ../../init/initvg/util.c
	$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -USST96 -c $<
../../init/initvg/info.lo: ../../init/initvg/info.c
	$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -USST96 -c $<
../../init/initvg/print.lo: ../../init/initvg/print.c
	$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -USST96 -c $<
../../init/initvg/gdebug.lo: ../../init/initvg/gdebug.c
	$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -USST96 -c $<
../../init/initvg/sst1init.lo: ../../init/initvg/sst1init.c
	$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -USST96 -c $<
endif

$(GLIDE_OBJECTS): fxinline.h fxgasm.h

fxinline.h: fxgasm
	$< -inline > $@

fxgasm.h: fxgasm
	$< -hex > $@

fxgasm: fxgasm.c $(GLIDE_HEADERS) $(GLIDE_PRIVATE_HEADERS)
	$(CC) -o $@ $(CFLAGS) $<

###############################################################################
#	clean, realclean
###############################################################################

clean:
	-$(RM) *.o *.lo
	-$(RM) ../../init/*.o ../../init/*.lo
	-$(RM) ../../init/initvg/*.o ../../init/initvg/*.lo
	-$(RM) ../../init/init96/*.o ../../init/init96/*.lo
	-$(RM) $(FX_GLIDE_SW)/newpci/pcilib/*.o $(FX_GLIDE_SW)/newpci/pcilib/*.lo
	-$(RM) $(FX_GLIDE_SW)/fxmisc/*.o $(FX_GLIDE_SW)/fxmisc/*.lo
	-$(RM) fxinline.h
	-$(RM) fxgasm.h

realclean: clean
	-$(RM) $(GLIDE_LIBDIR)/$(GLIDE_LIB)
	-$(RM) $(GLIDE_LIBDIR)/$(GLIDE_SHARED)
	-$(RM) $(GLIDE_LIBDIR)/$(GLIDE_SO)
	-$(RM) $(GLIDE_LIBDIR)/$(GLIDE_SONAME)
	-$(RM) $(GLIDE_LIBDIR)/$(GLIDE_SO_X)
