#
# make file to build FB's Run-Time Library
#
# needed: GNU make, GCC and AR
#
# set TARGET to dos, win32 or linux -- if not defined, it will
# be the same as HOST, if the later could be guessed
#

##################################################################

HOST :=
ifdef DJGPP
    HOST := dos
else
    ifeq ($(OS),Windows_NT)
        ifeq ($(OSTYPE),cygwin)
            HOST := cygwin
        else
            HOST := win32
        endif
    else
        ifdef WINDIR
            HOST := win32
        else
            ifdef windir
                HOST := win32
            else
                ifdef HOME
                    HOST := linux
                endif
            endif
        endif
    endif
endif

ifndef TARGET
    ifndef HOST
        CHECKHOST_MSG := $(error error: TARGET not defined and HOST couldn't be guessed)
    else
        CHECKHOST_MSG :=
    endif
    TARGET := $(HOST)
endif

##################################################################

OSDEPPATH :=
ifndef CC
    CC := gcc
endif
CFLAGS := -ffast-math -Wall -Wno-format -I .
ifdef DEBUG
    CFLAGS += -O0 -g -DDEBUG
else
    CFLAGS += -O2
endif

ifeq ($(TARGET),win32)
    OSDEPPATH := win32
    CFLAGS += -DTARGET_WIN32 -DTARGET_X86
endif

ifeq ($(TARGET),dos)
    OSDEPPATH := dos
    CFLAGS += -DTARGET_DOS -DTARGET_X86
endif

ifeq ($(TARGET),linux)
    OSDEPPATH := linux
    CFLAGS += -DTARGET_LINUX -DTARGET_X86
endif

ifeq ($(TARGET),cygwin)
    OSDEPPATH := win32
    OSOBJPATH := cygwin
    CFLAGS += -DTARGET_CYGWIN -DTARGET_X86
endif

ifeq ($(TARGET),xbox)
    OSDEPPATH := xbox
    CFLAGS += -DTARGET_XBOX -DTARGET_X86
    SDLFLAGS := -DENABLE_XBOX -DDISABLE_CDROM
    CFLAGS += -std=gnu99 -ffreestanding -nostdlib -nostdinc -fno-builtin -fno-exceptions -mno-cygwin -march=i386 $(SDLFLAGS)
    ifndef OPENXDK
        CHECKHOST_MSG := $(error error: OPENXDK not defined - need path to OpenXDK for headers)
    endif
    CFLAGS += -I$(OPENXDK)/i386-pc-xbox/include -I$(OPENXDK)/include -I$(OPENXDK)/include/SDL
endif

ifndef DEBUG
	LDFLAGS += -s
endif

libpath = ../../lib/$(TARGET)

ifndef OSOBJPATH
	OSOBJPATH = $(OSDEPPATH)
endif

ifdef MULTITHREADED
	CFLAGS += -DMULTITHREADED
	lib = $(libpath)/libfbmt.a
	objpath = obj/$(OSOBJPATH)/mt
else
	lib = $(libpath)/libfb.a
	objpath = obj/$(OSOBJPATH)
endif

ifndef OSDEPPATH
	CHECKTARGET_MSG := $(error error: TARGET not supported)
else
	CHECKTARGET_MSG :=
endif

##################################################################

objects := $(patsubst %.c,$(objpath)/%.o,$(wildcard *.c))
objects += $(patsubst %.s,$(objpath)/%.o,$(wildcard *.s))
osdepobjs := $(patsubst $(OSDEPPATH)/%.c,$(objpath)/%.o,$(wildcard $(OSDEPPATH)/*.c))
osdepobjs += $(patsubst $(OSDEPPATH)/%.s,$(objpath)/%.o,$(wildcard $(OSDEPPATH)/*.s))
headers := $(wildcard *.h)

##################################################################

VPATH = $(OSDEPPATH)

all : checkhost checktarget checkdirs $(objects) $(osdepobjs) $(lib)

$(objpath)/%.o : %.c $(headers)
	$(CC) -c $(CFLAGS) $< -o $@

$(objpath)/%.o : %.s $(headers)
#	$(AS) $< -o $@
	$(CC) -x assembler-with-cpp -c $(CFLAGS) $< -o $@

$(lib) : $(objects) $(osdepobjs)
	$(AR) cr $(lib) $(objects) $(osdepobjs)

$(libpath) :
	mkdir -p $(libpath)

$(objpath) :
	mkdir -p $(objpath)


.PHONY: checktarget
checktarget : ; $(CHECKTARGET_MSG)

.PHONY: checkhost
checkhost : ; $(CHECKHOST_MSG)

.PHONY: checkdirs
checkdirs : $(libpath) $(objpath)

.PHONY : clean
clean :
	rm -f $(lib)
	rm -f $(objects)
	rm -f $(osdepobjs)
