.SUFFIXES:
.SUFFIXES: .s .o

BRANCH=master
CD=cd
ECHO:=echo
GIT:=git
HOST=acdc
PULL:=pull
SED:=sed
SCP:=scp
SOURCE:=origin
SSH:=ssh
TIMESTAMP:=$(shell date +%m-%d-%Y\ %H:%M:%S)
UNAME:=$(shell uname)
USER:=root
WEB_DIR:=/var/www/madness/x86

ifeq ($(UNAME), Linux)
    ASM=as
    ASM_FLAGS=--32 -g -gstabs+ --defsym GAS=0x01 --defsym UNIX=0x01 --defsym LINUX=0x01
    SED_FLAGS:=-i
    OS_DIR:=linux
endif
ifeq (${UNAME}, FreeBSD)
    # Note: gmake must be used!
    ASM:=as
    ASM_FLAGS:=--32 -g -gstabs+ --defsym GAS=0x01 --defsym UNIX=0x01 --defsym BSD=0x01
    SED:=sed
    SED_FLAGS:= -i "" -E
    OS_DIR:=bsd
endif
ifeq (${UNAME}, SunOS)
    # Note: gmake must be used!
    ASM:=gas
    ASM_FLAGS:=--32 -g -gstabs+ --defsym GAS=0x01 --defsym UNIX=0x01 --defsym SOLARIS=0x01
    SED:=gsed
    SED_FLAGS:= -i
    OS_DIR:=solaris
endif
ifeq (${UNAME}, Darwin)
    ASM:=clang
    # No -g because we're compiling with gcc via clang, but debugging with lldb.
    ASM_FLAGS:=-arch i386 -c -mmacosx-version-min=10.6 -DCLANG -DUNIX -DOSX
    SED:=sed
    SED_FLAGS:= -i "" -E
    OS_DIR:=osx
endif
ifeq (${OS}, Windows_NT)
    ASM:=as
    ASM_FLAGS=--32 -g -gstabs+ --defsym GAS=0x01 --defsym WINDOWS=0x01 --defsym WINDOWS7=0x01
    SED:=sed
    SED_FLAGS:= -i -E
    OS_DIR:=windows
endif

# Linker variables
LD=ld
ifeq ($(UNAME), Linux)
    LD_FLAGS=-m elf_i386
endif
ifeq (${UNAME}, FreeBSD)
    LD_FLAGS=-m elf_i386_fbsd
endif
ifeq (${UNAME}, SunOS)
    LD_FLAGS=-z target=x86 -lc
endif
ifeq (${UNAME}, Darwin)
    LD_FLAGS=-arch i386 -macosx_version_min 10.6 -e _start -lc
endif
ifeq (${OS}, Windows_NT)
    LD_FLAGS=-arch elf32-i386 -e _start
    LIBS=-lkernel32
endif

# Misc command variables
RM=rm
RM_FLAGS=-f

# Install variables
CHMOD=chmod
CHOWN=chown
GROUP=audio
MODE=4755
OWNER=root

# Madness files
MADNESS_SRC=madness.s
MADNESS_OBJ=madness.o
MADNESS_BIN=madness

default: linux

INCLUDES = \
       bss.s \
       commands.s \
       constants.s \
       creatures.s \
       data.s \
       initialize.s \
       input.s \
       lamp.s \
       object.s \
       pack.s \
       platform.s \
       print.s \
       random.s \
       room.s \
       room-actions.s \
       room-handlers.s \
       score.s \
       sound.s \
       spells.s \
       splash.s \
       timer.s

#MADNESS_OBJS = ${INCLUDES:.s=.o}

# Madness build

linux: ${MADNESS_BIN}

mods: ${MADNESS_BIN}
ifeq (${UNAME}, Darwin)
mods: ASM_FLAGS += -DMODS
else
mods: ASM_FLAGS += --defsym MODS=true
endif

# See the comment below for details on sed usage.
${MADNESS_BIN}: ${MADNESS_OBJ}
	${LD} ${LD_FLAGS} ${MADNESS_OBJ} -o ${MADNESS_BIN} ${LIBS}

# This really sucks, but the OS X assembler doesn't support the same
# directives that the other assemblers do, so we must modify them before
# assembling, and then revert them after.
${MADNESS_OBJ}: ${MADNESS_SRC} ${INCLUDES}
	@${ECHO} ".data" > version.s
	@${ECHO} ".ifdef MODS" >> version.s
	@${ECHO} "PLATFORM: .asciz \"Platform: ${UNAME}\"" >> version.s
	@${ECHO} "TIMESTAMP: .asciz \"Version: ${TIMESTAMP}\"" >> version.s
	@${ECHO} ".endif" >> version.s
ifeq (${UNAME}, Darwin)
	@${SED} ${SED_FLAGS} "s/\.ifdef/\#if/" *.s
	@${SED} ${SED_FLAGS} "s/\.endif/\#endif/" *.s
	@${SED} ${SED_FLAGS} "s/\.include/\#include/" *.s
	@${SED} ${SED_FLAGS} "s/\.equ/\.set/" *.s
	@${SED} ${SED_FLAGS} "s/\.int/\.long/" *.s
endif
	${ASM} ${ASM_FLAGS} -o ${MADNESS_OBJ} $<
ifeq (${UNAME}, Darwin)
	@${SED} ${SED_FLAGS} "s/\#if/\.ifdef/" *.s
	@${SED} ${SED_FLAGS} "s/\#endif/\.endif/" *.s
	@${SED} ${SED_FLAGS} "s/\#include/\.include/" *.s
	@${SED} ${SED_FLAGS} "s/\.set/\.equ/" *.s
	@${SED} ${SED_FLAGS} "s/\.long/\.int/" *.s
endif

clean:
	${RM} ${RM_FLAGS} ${MADNESS_OBJ} ${MADNESS_BIN}

setuid:
	${CHOWN} ${OWNER}:${GROUP} ${MADNESS_BIN}
	${CHMOD} ${MODE} ${MADNESS_BIN}

stage:
	${SCP} ${MADNESS_BIN} ${USER}@${HOST}:${WEB_DIR}/${OS_DIR}

update:
	${SSH} -t ${USER}@${HOST} \
	"${CD} ${WEB_DIR}/sources ; ${GIT} ${PULL} ${SOURCE} ${BRANCH}"

# Rules to build object files from source.
#.s.o:
#	${ASM} ${ASM_FLAGS} $< -o $@
