all: xglurbules xglurbules-noshm vglglurbules

# CC=cacheprof gcc
CC ?= gcc

INSTALL=/usr/bin/install

.ifndef PREFIX
PREFIX=/usr/shmooo
.endif

BIN_DIR=${PREFIX}/bin
MAN_DIR=${PREFIX}/man/man1

COMPRESS=/usr/bin/gzip
STRIP= /usr/bin/true

MAN_FILE=xglurbules.1.gz

.ifdef NOMANCOMPRESSED
MAN_FILE=xglurbules.1
.endif

XINCS= -I/usr/X11R6/include
XSHM = -lXext
XLIBS= -L/usr/X11R6/lib -lX11 -lm -L/usr/local/lib
LIBS = ${XLIBS}

VGLLIBS= -lvgl -lm

CFLAGS+= ${XINCS}

# N.B. if you don't use -fomit-frame-pointer when using -O3 then
# on ia32 gcc barfs on forcing the registers. Not sure why, but
# but it seems that the optimizer runs out of registers on the
# rendering loop, even though it's easily got enough.
# The gcc register optimization is pretty poor on that
# loop. Hand coded was a bit better, but not worth it for the
# extra hassles and non-portability. Then again, I'm sure most
# commercial compilers would be about as bad.

CFLAGS+= -O3 -Wall
CFLAGS+= -ffast-math
CFLAGS+= -fstrength-reduce
CFLAGS+= -fomit-frame-pointer

.if ${MACHINE_ARCH} == i386
CFLAGS+= -fforce-mem -fforce-addr -funroll-loops -mfancy-math-387
.endif

#CFLAGS=-O3 -pg -ggdb -DDEBUG

clean:
	rm -f vglglurbules xglurbules xglurbules-noshm *.o glurbules.gmon xglurbules.1.gz

depend:
	gcc -E -MM *.c > .depend

install: xglurbules xglurbules-noshm ${MAN_FILE}
	${INSTALL} xglurbules ${BIN_DIR}
	${INSTALL} xglurbules-noshm ${BIN_DIR}
	${INSTALL} ${MAN_FILE} ${MAN_DIR}
	${INSTALL} xglurbules-test ${BIN_DIR}

xglurbules.1.gz: xglurbules.1
	${COMPRESS} xglurbules.1 -c > xglurbules.1.gz

# Main Targets :
xglurbules: shm-main.o psys.o shm-gfx-x.o rend-x.o Makefile
	${CC} ${CFLAGS} shm-main.o psys.o shm-gfx-x.o rend-x.o -o xglurbules ${LIBS} ${XSHM}
	${STRIP} xglurbules

xglurbules-noshm: main.o psys.o gfx-x.o rend-x.o Makefile
	${CC} ${CFLAGS} main.o psys.o gfx-x.o rend-x.o -o xglurbules-noshm ${LIBS}
	${STRIP} xglurbules-noshm

vglglurbules: vgl-main.o psys.o gfx-vgl.o rend-vgl.o Makefile
	${CC} ${CFLAGS} vgl-main.o psys.o gfx-vgl.o rend-vgl.o -o vglglurbules ${VGLLIBS}
	${STRIP} vglglurbules

# Stuff depended on by above (should rulify these)
main.o: main.[ch] Makefile
	${CC} ${CFLAGS} -c main.c -o main.o

psys.o: psys.[ch] Makefile
	${CC} ${CFLAGS} -c psys.c -o psys.o

# Graphics routines
gfx-x.o: gfx-x.[ch] Makefile
	${CC} ${CFLAGS} -c gfx-x.c -o gfx-x.o

gfx-vgl.o: gfx-vgl.[ch] Makefile
	${CC} ${CFLAGS} -c gfx-vgl.c -o gfx-vgl.o

shm-gfx-x.o: gfx-x.[ch] Makefile
	${CC} ${CFLAGS} -c gfx-x.c -o shm-gfx-x.o -DUSE_XSHM_EXT

rend-x.o: rend-x.[ch] Makefile
	${CC} ${CFLAGS} -c rend-x.c -o rend-x.o

rend-vgl.o: rend-vgl.[ch] Makefile
	${CC} ${CFLAGS} -c rend-vgl.c -o rend-vgl.o

shm-main.o: main.[ch] Makefile
	${CC} ${CFLAGS} -c main.c -o shm-main.o -DUSE_XSHM_EXT

vgl-main.o: main.[ch] Makefile
	${CC} ${CFLAGS} -c main.c -o vgl-main.o -DCONSOLE_BLOBS

