#
# This file has been modified as part of the FreeMiNT project. See
# the file Changes.MH for details and dates.
#

#
# Makefile for MiNT using the GCC
#

# cross compiling
#CROSS = yes
CROSS = no

#
# target and host compiler (GCC recommended)
# 
ifeq ($(CROSS),yes)
CC = /scratch_hp/fnaumann/bin/m68k-atari-mint-gcc
NATIVECC = gcc
NATIVECFLAGS = -O
MINTLIBINC = -I/scratch_hp/fnaumann/m68k-atari-mint/include
else
CC = gcc -pipe
NATIVECC = $(CC)
NATIVECFLAGS = -O
MINTLIBINC =
endif

AS = $(CC)
LIBS = #-liio

# used tools
MV    = mv
CP    = cp
RM    = rm -f
TOUCH = touch
MKDIR = mkdir
MAKE  = make
MKDEP = $(CC) -MM
SED   = sed
CRLF  = crlf -s

# generic target fake
TARGET = __target

TARGETS = 000 030 040 deb mil my1 my2

#default: my1
#default: my2

help:
	@echo '# targets:'
	@echo '# --------'
	@echo '# - $(TARGETS)'
	@echo '# - depend'
	@echo '# - clean'
	@echo '# - distclean'

all: 000 030 040 deb mil

000: $(TARGET).000
	@echo '# building a normal kernel ...'
	@echo '# using CC = $(CC)'
	$(MAKE) build MINT="../bin/mint000.prg" DEFS=$(DEFS) MODEL="-m68000"

030: $(TARGET).030
	@echo '# building a 030 kernel ...'
	@echo '# using CC = $(CC)'
	$(MAKE) build MINT="../bin/mint030.prg" DEFS="-DONLY030 -DCPU030" MODEL="-m68020-60"

040: $(TARGET).040
	@echo '# building a 040 kernel ...'
	@echo '# using CC = $(CC)'
	$(MAKE) build MINT="../bin/mint040.prg" DEFS="-DONLY030 -DMMU040 -DCPU040" MODEL="-m68040"

deb: $(TARGET).deb
	@echo '# building a debug kernel ...'
	@echo '# using CC = $(CC)'
	$(MAKE) build MINT="../bin/mintnp.prg" DEFS="-DDEBUG_INFO -DONLY030 -DCPU030" MODEL="-m68030"

mil: $(TARGET).mil
	@echo '# building a MILAN kernel ...'
	@echo '# using CC = $(CC)'
	$(MAKE) build MINT="../bin/mintmil.prg" DEFS="-DONLY030 -DMMU040 -DMILAN -DCPU040" MODEL="-m68040"

my1: $(TARGET).my1
	@echo '# building a special kernel ...'
	@echo '# using CC = $(CC)'
	$(MAKE) build MINT="../bin/mintnp.prg" DEFS="-DONLY030 -DDEBUG_INFO -DCPU060" MODEL="-m68020-60"

my2: $(TARGET).my2
	@echo '# building a special kernel ...'
	@echo '# using CC = $(CC)'
	$(MAKE) build MINT="../bin/mint040.prg" DEFS="-DONLY030 -DMMU040 -DDEBUG_INFO -DMILAN -DCPU040" MODEL="-m68020-60"

$(TARGET).000:
	$(MAKE) clean
	$(RM) $(TARGET).*
	$(TOUCH) $@

$(TARGET).030:
	$(MAKE) clean
	$(RM) $(TARGET).*
	$(TOUCH) $@

$(TARGET).040:
	$(MAKE) clean
	$(RM) $(TARGET).*
	$(TOUCH) $@

$(TARGET).060:
	$(MAKE) clean
	$(RM) $(TARGET).*
	$(TOUCH) $@

$(TARGET).deb:
	$(MAKE) clean
	$(RM) $(TARGET).*
	$(TOUCH) $@

$(TARGET).mil:
	$(MAKE) clean
	$(RM) $(TARGET).*
	$(TOUCH) $@

$(TARGET).vmx:
	$(MAKE) clean
	$(RM) $(TARGET).*
	$(TOUCH) $@

$(TARGET).my1:
	$(MAKE) clean
	$(RM) $(TARGET).*
	$(TOUCH) $@

$(TARGET).my2:
	$(MAKE) clean
	$(RM) $(TARGET).*
	$(TOUCH) $@

$(TARGET).gryfmil:
	$(MAKE) clean
	$(RM) $(TARGET).*
	$(TOUCH) $@

$(TARGET).gryf030:
	$(MAKE) clean
	$(RM) $(TARGET).*
	$(TOUCH) $@

#
# target machine
#
MODEL = 

#
# add -DDIRSEP_SLASH to make forward slash a path separator in kernel filesystems
# add -DMULTITOS for a MultiTOS kernel
# add -DONLY030 for a version of MiNT that needs a 680x0, x >= 3
# add -DCPU030 to make the kernel know its compiled for 030
# add -DCPU040 to make the kernel know its compiled for 040
# add -DCPU060 to make the kernel know its compiled for 060
# add -DDEBUG_INFO for debugging information
# add -DFASTTEXT for the u:\dev\fasttext fast console driver
#
DEFAULTDEFS = \
	-DDIRSEP_SLASH \
	-DMULTITOS \
	-DVERBOSE_BOOT

DEFINITIONS = $(DEFAULTDEFS) $(DEFS)

#
# optimizations
# 
OPTS =	-fomit-frame-pointer \
	-O3 $(MODEL)

# -O3 enable:
#     -finline-functions
#     -fstrength-reduce
#     -fexpensive-optimizations
#     and some other
# 
# not sure if -fno-defer-pop is useful

#
# enable warning messages
#
WARN =	-Wall \
	-Wmissing-prototypes \
	-Winline

#
# MiNT must be compiled with 16 bit integers (-mshort)
#
GENERAL = -mshort

CFLAGS = $(GENERAL) $(OPTS) $(DEFINITIONS) $(WARN)
ASFLAGS = $(GENERAL) -m68030 $(DEFINITIONS)

# generic target
MINT = ../bin/mint*.prg

# generic object dir
OBJDIR = objs

$(OBJDIR)/%.o: %.c
	@echo "# Compiling $*.c ..."
	@$(CC) $(CFLAGS) -c $< -o $@

$(OBJDIR)/%.d: %.c
	@echo "# Computing dependencies for $*.o"
	@o='o'; \
	$(MKDEP) $(CFLAGS) $< >$@.tmp \
	  && $(SED) "s,^\(.*\)\.o:,$(OBJDIR)/\1.$$o $@:," < $@.tmp > $@ \
	  && $(RM) $@.tmp

#
# files
#

HFILES = \
	./version.h \
	./include/*.h

HEADER = \
	global.h \
	cnf.h \
	bios.h \
	xbios.h \
	console.h \
	dos.h \
	dosdir.h \
	dosfile.h \
	dosmem.h \
	dossig.h \
	filesys.h \
	main.h \
	memory.h \
	kmemory.h \
	proc.h \
	signal.h \
	time.h \
	timeout.h \
	tty.h \
	util.h \
	string.h \
	unifs.h \
	biosfs.h \
	pipefs.h \
	procfs.h \
	tosfs.h \
	shmfs.h \
	rendez.h \
	fasttext.h \
	welcome.h \
	mprot.h \
	update.h \
	resource.h \
	unicode.h \
	pun.h \
	fatfs.h \
	block_IO.h \
	xhdi.h \
	ssystem.h \
	detect.h \
	random.h

CFILES = \
	global.c \
	cnf.c \
	bios.c \
	xbios.c \
	console.c \
	dos.c \
	dosdir.c \
	dosfile.c \
	dosmem.c \
	dossig.c \
	filesys.c \
	main.c \
	memory.c \
	kmemory.c \
	proc.c \
	signal.c \
	time.c \
	timeout.c \
	tty.c \
	util.c \
	string.c \
	unifs.c \
	biosfs.c \
	pipefs.c \
	procfs.c \
	tosfs.c \
	shmfs.c \
	debug.c \
	rendez.c \
	fasttext.c \
	welcome.c \
	mprot030.c \
	mprot040.c \
	update.c \
	resource.c \
	unicode.c \
	pun.c \
	fatfs.c \
	block_IO.c \
	xhdi.c \
	ssystem.c \
	random.c

COBJS =	$(CFILES:%.c=$(OBJDIR)/%.o)

SFILES = \
	context.spp \
	intr.spp \
	syscall.spp \
	quickzer.spp \
	quickmov.spp \
	quickswa.spp \
	cpu.spp \
	vm5.spp \
	kernel.spp \
	detect.spp \
	mmu040.spp \
#	peekpoke.spp

SIFILES = $(SFILES) magic.i

SOBJS =	$(SFILES:%.spp=$(OBJDIR)/%.o)

OBJS = $(COBJS) $(SOBJS)

DEPENDENCIES = $(COBJS:.o=.d)

BUILD = info
BUILDINFO = $(OBJDIR)/$(BUILD).o

#
# main target
#
build: $(OBJDIR) $(OBJS) $(MINT)
	@echo '# Done.'

$(OBJDIR):
	$(MKDIR) $@

$(MINT): $(DEPENDENCIES) $(OBJS) buildtime
	@echo "# Linking $@ ..."
	@$(CC) $(CFLAGS) -o $@ $(OBJS) $(BUILDINFO) $(LIBS)

#
# for build time
#
MAKEBUILDTIME = mkbuild.tos

$(MAKEBUILDTIME): mkbuild.c
	$(NATIVECC) $(NATIVECFLAGS) -o $(MAKEBUILDTIME) mkbuild.c

buildtime: $(MAKEBUILDTIME)
	@echo "# Update build.h ..."
	@$(MAKEBUILDTIME)
	@echo "# Update cdef.h ..."
	@export CC="$(CC)"; \
	 export OPTS="$(OPTS)"; \
	 export DEFS="$(DEFINITIONS)"; \
	 sh cdef.sh
	@echo "# Delete $(BUILDINFO) ..."
	@$(RM) $(BUILDINFO)
	@echo "# Compiling $(BUILDINFO) ..."
	@$(CC) $(CFLAGS) -c $(BUILD).c -o $(BUILDINFO)

#
# install mint in boot dir
#
boot:
	$(CP) $(MINT) /c/auto

# overwrite the default
# gcc brings errors without -m68030 option
$(OBJDIR)/mprot030.o: mprot030.c mprot.h $(HFILES)
	@echo "# Compiling mprot030.c ..."
	@$(CC) $(CFLAGS) -m68030 -c $< -o $@

# overwrite the default
# gcc brings errors without -m68040 option
$(OBJDIR)/mprot040.o: mprot040.c mprot.h $(HFILES)
	@echo "# Compiling mprot040.c ..."
	@$(CC) $(CFLAGS) -m68040 -c $< -o $@

#
# the asm translator program
# moved to ./asmtrans/ subdir
#

ASMTRANS = asmtrans
ATRANSTTP = asmtrans.ttp
ATRANS = $(ASMTRANS)/$(ATRANSTTP)

$(ATRANS):
	cd $(ASMTRANS); \
	$(MAKE) ATRANS=$(ATRANSTTP) CC="$(NATIVECC)" CFLAGS="$(NATIVECFLAGS)"; \
	cd ../;

#
# the magic number include file is generated automagically
#
# magic.i only needs to be updated if the structures in proc.h
# change; otherwise, you can use the supplied magic.i.
#
# When cross-compiling:
# If you do need to generate a new magic.i, cross-compile genmagic.ttp
# and use `cnm' and the supplied `perl' script `genmagic.pl' to
# extract the values.
#
GENMAGICPRG = genmagic.ttp

$(GENMAGICPRG): genmagic.c ./include/proc.h ./include/file.h
	$(CC) -O3 -DGENMAGIC -o $(GENMAGICPRG) genmagic.c

ifeq ($(CROSS),yes)
#
# for cross-compiling use this: (assumes you have perl and cnm)
#
magic.i: $(GENMAGICPRG)
	perl genmagic.pl > $@
else
magic.i: $(GENMAGICPRG) ./include/proc.h
	$(GENMAGICPRG) $@
endif

#
# assembler source files
#
$(OBJDIR)/%.o: %.spp
	@echo "# Assembling $< ..."
	@$(ATRANS) $(DEFAULTDEFS) $(DEFS) -gas -o $(OBJDIR)/$*.s $<
	@$(CRLF) $(OBJDIR)/$*.s
	@$(AS) $(ASFLAGS) -c $(OBJDIR)/$*.s -o $@
	@$(RM) $(OBJDIR)/$*.s	

$(OBJDIR)/context.o:	$(ATRANS) magic.i context.spp
$(OBJDIR)/intr.o:	$(ATRANS) magic.i intr.spp
$(OBJDIR)/syscall.o:	$(ATRANS) magic.i syscall.spp
$(OBJDIR)/quickzer.o:	$(ATRANS) quickzer.spp
$(OBJDIR)/quickmov.o:	$(ATRANS) quickmov.spp
$(OBJDIR)/cpu.o:	$(ATRANS) cpu.spp
$(OBJDIR)/vm5.o:	$(ATRANS) vm5.spp
$(OBJDIR)/kernel.o:	$(ATRANS) magic.i kernel.spp
$(OBJDIR)/detect.o:	$(ATRANS) detect.spp
$(OBJDIR)/peekpoke.o:	$(ATRANS) peekpoke.spp
$(OBJDIR)/mmu040.o:	$(ATRANS) mmu040.spp

#
# macros for cleaning up
#
GENFILES = $(OBJS) $(BUILDINFO)
EXTRAS = $(MAKEBUILDTIME) $(GENMAGICPRG) $(MINT)

clean:
	$(RM) $(GENFILES)

distclean:
	$(MAKE) clean;
	$(RM) $(TARGET).*
	$(RM) $(DEPENDENCIES)
	$(RM) $(EXTRAS)
	$(RM) *~ include/*~ ../docu/*~ ../bin/*
	cd $(ASMTRANS); make clean; cd ../;

#
# for 'make depend'
#
depend: $(DEPENDENCIES)
	@echo "# Dependencies ok."

#
# misc. files and subdirectories to include in the distribution
#
#MISCFILES = copying readme.src changes makefile \
#	genmagic.c asmtrans.ttp

#
# macros for making distribution packages
#
#dist:
#	zoo a//h mintsrc.zoo $(MISCFILES) $(CFILES) $(HFILES) $(SIFILES) \
#	 $(ATRANSSRC)

#
# dependencies
#

$(SOBJS): ./include/proc.h

-include $(DEPENDENCIES)

# DO NOT DELETE THIS LINE -- make depend depends on it.
