#*******************************************************************************
#*                              uBee512 Makefile                               *
#*                      "Microbee 512K Premium Emulator"                       *
#*                                                                             *
#*                       Copyright (C) 2007 Stewart Kay                        *
#*******************************************************************************
#
#===============================================================================
# REVISION HISTORY (Most recent at top)
#===============================================================================
# v1.3.0 - S.J.Kay 31/8/2007
# --------------------------
# - Added async, serial, and printer C modules.
# - Added printer sub directory to Windows ZIP file.
#
# v1.2.0 - S.J.Kay 22/8/2007
# --------------------------
# - Added tapes sub directory to Windows ZIP file
# - Added tape and function C modules.
# - Fixed -DAPPVER=$(APPVER) for Windows, and FreeBSD.  Caused the --version
#   option to crash program.
#
# v1.1.0 - S.J.Kay 17/8/2007
# --------------------------
# Added and changed some variable names,  added -DAPPVER, modified FreeBSD
# build section for v6.2.
#
# v1.0.0 - S.J.Kay 28/6/2007
# --------------------------
# Created initial multi-platform make file to produce Linux, Win32 and FreeBSD
# targets.  The Win32 target is cross compiled on a Linux host.  The FreeBSD
# target currently requires building on a FreeBSD machine. 
#
#===============================================================================
# How to use this GNU make file.
#===============================================================================
# make or gmake if on a FreeBSD machine will show the options available.
#
# !!!!! Do a make clean after changing any header files before compiling !!!!!
#
#===============================================================================
# Requirements
#===============================================================================
# Requirements for all targets:
# - NASM assembler (Netwide Assembler)
# - MZ80 package (v3.4 appears to be the latest)
# - Application sources !
# - Set the xCINC and xCLIB in this Makefile for each target to suit your own
#   development platform.
#
# Requirements for native target:
# - GCC tool chain
# - The SDL development package
#
# Requirements for cross compile target (win32):
# - For the Win32 build the i386-mingw32 cross compile tool chain is required.
# - The SDL development package for mingw32 must be installed using the cross
#   compile option.  The WCINC and WCLIB values must match the location of the
#   libs and includes directories created.

#===============================================================================
# Overrides
#===============================================================================
.SUFFIXES:

#===============================================================================
# Archiving definitions
#===============================================================================
APPROOT=../../ubee512

#===============================================================================
# Application specific definitions
#===============================================================================
APP=ubee512
VERSION=1.3.0
TITLE=uBee512

APPVER=\"$(VERSION)\"
APPIDSTR=\"$(APP)\ v$(VERSION)\"
TITLESTRING=\"$(TITLE)\ v$(VERSION)\ -\ Microbee\ 512K\ Premium\ emulator\"
ICONSTRING=\"$(TITLE)\"

OBJC=DIR/$(APP).o DIR/crtc.o DIR/fdc.o DIR/gui.o DIR/keyb.o DIR/memmap.o
OBJC+=DIR/vdu.o DIR/z80.o DIR/disk.o DIR/pio.o DIR/sound.o DIR/paknet.o
OBJC+=DIR/tape.o DIR/function.o DIR/async.o DIR/serial.o DIR/printer.o

OBJA=DIR/mz80.o

# Platform prefixes: P1=linux, P2=win32, P3=FreeBSD
P1_OBJC=$(OBJC:DIR/%=linux/%)
P1_OBJA=$(OBJA:DIR/%=linux/%)

P2_OBJC=$(OBJC:DIR/%=win32/%)
P2_OBJA=$(OBJA:DIR/%=win32/%)

P3_OBJC=$(OBJC:DIR/%=freebsd/%)
P3_OBJA=$(OBJA:DIR/%=freebsd/%)

#===============================================================================
# Executables and flags required by all targets 
#===============================================================================
XCC = gcc
XCFLAGS=-Wall
NASM=nasm

#===============================================================================
# Default target - prevents accidental non-linux builds if on other platforms
#===============================================================================
help:
	@echo "This is the $(APP) v$(VERSION) Microbee emulator GNU makefile"
	@echo "You must specify one of the following:"
	@echo
	@echo "make linux                 native Linux build"
	@echo "gmake freebsd              native FreeBSD build"	
	@echo "make win                   cross compiled Windows build"
	@echo "make all                   make Linux and Windows builds"
	@echo "make clean                 removes all built platform files"
	@echo "make srcdist               make source distribution"		
	@echo "make windist               make win32 binary distribution"			
	@echo "make help                  this help information"	
	@echo "make install               installs the Linux binary files"
	@echo "make uninstall             uninstalls the Linux binary files"	
	
#===============================================================================
# Linux target
#===============================================================================
CC = gcc
DEBUG=-g
CFLAGS=$(DEBUG) -Wall
CINC=-I/usr/include/SDL
CLIB=-L/usr/lib -lSDL -lpthread
CDEF=-D_GNU_SOURCE=1 -D_REENTRANT -Duse_audio
CDEF+=-DAPPVER=$(APPVER) -DTITLESTRING=$(TITLESTRING) -DICONSTRING=$(ICONSTRING)
CDEF+=-DAPPIDSTR=$(APPIDSTR) 
linux: linux/$(APP)

linux/$(APP): makez80 $(P1_OBJC) $(P1_OBJA)
	$(CC) $(P1_OBJC) $(P1_OBJA) $(CLIB) -o linux/$(APP)

linux/%.o: %.c
	[ -d linux ] || mkdir linux
	$(CC) -c $(CFLAGS) $(CINC) $(CDEF) $(*).c -o linux/$(*).o

linux/%.o: %.asm
	[ -d linux ] || mkdir linux
	$(NASM) -f elf mz80.asm
	mv $(*).o linux/

#===============================================================================
# Windows target
#===============================================================================
WCC=i386-mingw32-gcc
WDEBUG=-g
WCFLAGS=$(WDEBUG) -Wall
WCINC=-I/usr/local/i386-mingw32/include
WCLIB=-L/usr/local/i386-mingw32/lib -lmingw32 -lSDLmain -lSDL
WCDEF=-D_GNU_SOURCE=1 -D_REENTRANT -DMINGW -Duse_audio
WCDEF+=-DAPPVER=$(APPVER) -DTITLESTRING=$(TITLESTRING) -DICONSTRING=$(ICONSTRING)
WCDEF+=-DAPPIDSTR=$(APPIDSTR) 

win: win32/$(APP).exe

win32/$(APP).exe: makez80 $(P2_OBJC) $(P2_OBJA)
	$(WCC) $(P2_OBJC) $(P2_OBJA) $(WCLIB) -o win32/$(APP).exe

win32/%.o: %.c
	[ -d win32 ] || mkdir win32
	$(WCC) -c $(WCFLAGS) $(WCINC) $(WCDEF) $(*).c -o win32/$(*).o

win32/%.o: %.asm
	[ -d win32 ] || mkdir win32
	$(NASM) -f win32 mz80.asm
	mv mz80.obj win32/mz80.o

#===============================================================================
# FreeBSD target (not a cross compile)
#===============================================================================
FCC = gcc
FDEBUG=-g
FCFLAGS=$(DEBUG) -Wall
#
# for FreeBSD v5.4
#FCINC=-I/usr/local/include/SDL11
#FCLIB=-L/usr/local/lib -lSDL-1.1 -lSDLmain-1.1
#
# for FreeBSD v6.2
FCINC=-I/usr/local/include/SDL -I/usr/local/include
FCLIB=-L/usr/local/lib -lSDL -lSDLmain

FCDEF=-D_GNU_SOURCE=1 -D_REENTRANT -Duse_audio
FCDEF+=-DAPPVER=$(APPVER) -DTITLESTRING=$(TITLESTRING) -DICONSTRING=$(ICONSTRING)
FCDEF+=-DAPPIDSTR=$(APPIDSTR) 

freebsd: freebsd/$(APP)

freebsd/$(APP): makez80 $(P3_OBJC) $(P3_OBJA)
	$(FCC) -pthread $(P3_OBJC) $(P3_OBJA) $(FCLIB) -o freebsd/$(APP)

freebsd/%.o: %.c
	[ -d freebsd ] || mkdir freebsd
	$(FCC) -c $(FCFLAGS) $(FCINC) $(FCDEF) $(*).c -o freebsd/$(*).o

freebsd/%.o: %.asm
	[ -d freebsd ] || mkdir freebsd
	$(NASM) -f elf mz80.asm
	mv $(*).o freebsd/

#===============================================================================
# Build Linux and Windows targets
#===============================================================================
all: linux/$(APP) win32/$(APP).exe

#===============================================================================
# Rules used by all targets 
#===============================================================================
makez80: makez80.c
	$(XCC) $(XCFLAGS) -o $@ makez80.c

mz80.asm: makez80
	./makez80 mz80.asm -l -s -x86

#===============================================================================
# General maintenance
#===============================================================================
clean:
	rm -f $(P1_OBJC) $(P1_OBJA) linux/$(APP) \
              $(P2_OBJC) $(P2_OBJA) win32/$(APP).exe \
              $(P3_OBJC) $(P3_OBJA) freebsd/$(APP) \
              makez80.o makez80

#===============================================================================
# Install and remove Linux binaries
#===============================================================================
PREFIX=/usr/local
BINDIR=$(PREFIX)/bin

installdirs:
	/bin/sh ./mkinstalldirs $(BINDIR)

install: installdirs
	install -m 755 linux/$(APP) $(BINDIR)

uninstall:
	rm $(BINDIR)/$(APP)

#===============================================================================
# Create source and win32 binary distributions
#===============================================================================
# Create a source tar distribution. This should contain the following:
# SDL.dll, tools (all bins), image (tools), doc
srcdist:
	ln -s $(APP) $(APPROOT)-$(VERSION)
	tar cvzf $(APP)-$(VERSION).tar.gz \
	$(APPROOT)-$(VERSION)/src/*.c \
	$(APPROOT)-$(VERSION)/src/*.h \
	$(APPROOT)-$(VERSION)/src/Makefile \
	$(APPROOT)-$(VERSION)/src/mkinstalldirs \
	$(APPROOT)-$(VERSION)/doc/MZ80/MZ80.TXT \
	$(APPROOT)-$(VERSION)/doc/ChangeLog \
	$(APPROOT)-$(VERSION)/doc/README \
	$(APPROOT)-$(VERSION)/doc/COPYING \
	$(APPROOT)-$(VERSION)/src/SDL.dll
	rm $(APPROOT)-$(VERSION)

# Create a win32 binary ZIP distribution file. This should contain the following:
# ubee512.exe, SDL.dll, tools (win32 bins), image (tools), doc
windist:
	rm -f $(APP)-$(VERSION)-win32.zip
	rm -Rf win32/ubee512
	mkdir win32/ubee512
	mkdir win32/ubee512/disks
	mkdir win32/ubee512/roms
	mkdir win32/ubee512/tapes
	mkdir win32/ubee512/printer	
	mkdir win32/ubee512/doc
	mkdir win32/ubee512/doc/MZ80
	cp SDL.dll win32/ubee512/	
	cp win32/ubee512.exe win32/ubee512/
	cp ../doc/MZ80/MZ80.TXT win32/ubee512/doc/MZ80/
	cp ../doc/ChangeLog win32/ubee512/doc/
	cp ../doc/README win32/ubee512/doc/
	cp ../doc/COPYING win32/ubee512/doc/
	cd win32 && zip -r $(APP)-$(VERSION)-win32.zip ubee512
