#
# 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
STRIP = /scratch_hp/fnaumann/m68k-atari-mint/bin/xstrip
else
CC = gcc -pipe
NATIVECC = $(CC)
NATIVECFLAGS = -O
MINTLIBINC =
STRIP = strip
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 060 deb mil vmx

#default: my1
#default: my2

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

all: 000 030 040 060 deb mil

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

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

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

060: $(TARGET).060
	@echo '#building a 060 kernel ...'
	$(MAKE) build MINT="../bin/mint060.prg" DEFS="-DONLY030 -DCPU060" MODEL="-m68060"

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

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

vmx: $(TARGET).vmx
	@echo '# building a vmx kernel ...'
	$(MAKE) build MINT="../bin/mintvmx.prg" DEFS="-DVM_EXTENSION -DONLY030 -DCPU030" MODEL="-m68030"

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

my2: $(TARGET).my2
	@echo '# building a special kernel ...'
	$(MAKE) build MINT="../bin/mintnp.prg" DEFS="-DONLY030 -DCPU040 -DDEBUG_INFO -DMILAN" MODEL="-m68040"

$(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 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
# add -DVM_DEBUGGING for a VMX kernel with debugging code
# add -DST_ESCC for ESCC support
#
DEFAULTDEFS = -DDIRSEP_SLASH -DMULTITOS -DVERBOSE_BOOT

OPTS =	-finline-functions \
	-fno-defer-pop \
	-fomit-frame-pointer \
	-fstrength-reduce \
	-O3

#OPTS = -O

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

CFLAGS = -mshort -Wall -Wmissing-prototypes -Winline $(OPTS) $(MODEL) $(DEFAULTDEFS) $(DEFS)
ASFLAGS = -mshort -m68030 $(DEFAULTDEFS) $(DEFS)


# 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 \
	proc.h \
	signal.h \
	time.h \
	timeout.h \
	tty.h \
	util.h \
	unifs.h \
	biosfs.h \
	pipefs.h \
	procfs.h \
	tosfs.h \
	shmfs.h \
	rendez.h \
	fasttext.h \
	welcome.h \
	nalloc2.h \
	memprot.h \
	update.h \
	resource.h \
	unicode.h \
	pun.h \
	fatfs.h \
	block_IO.h \
	xhdi.h \
	ssystem.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 \
	proc.c \
	signal.c \
	time.c \
	timeout.c \
	tty.c \
	util.c \
	unifs.c \
	biosfs.c \
	pipefs.c \
	procfs.c \
	tosfs.c \
	shmfs.c \
	debug.c \
	rendez.c \
	fasttext.c \
	welcome.c \
	nalloc2.c \
	memprot.c \
	update.c \
	resource.c \
	unicode.c \
	pun.c \
	fatfs.c \
	block_IO.c \
	xhdi.c \
	ssystem.c

COBJS =	\
	$(OBJDIR)/global.o \
	$(OBJDIR)/cnf.o \
	$(OBJDIR)/bios.o \
	$(OBJDIR)/xbios.o \
	$(OBJDIR)/console.o \
	$(OBJDIR)/dos.o \
	$(OBJDIR)/dosdir.o \
	$(OBJDIR)/dosfile.o \
	$(OBJDIR)/dosmem.o \
	$(OBJDIR)/dossig.o \
	$(OBJDIR)/filesys.o \
	$(OBJDIR)/main.o \
	$(OBJDIR)/memory.o \
	$(OBJDIR)/proc.o \
	$(OBJDIR)/signal.o \
	$(OBJDIR)/time.o \
	$(OBJDIR)/timeout.o \
	$(OBJDIR)/tty.o \
	$(OBJDIR)/util.o \
	$(OBJDIR)/unifs.o \
	$(OBJDIR)/biosfs.o \
	$(OBJDIR)/pipefs.o \
	$(OBJDIR)/procfs.o \
	$(OBJDIR)/tosfs.o \
	$(OBJDIR)/shmfs.o \
	$(OBJDIR)/debug.o \
	$(OBJDIR)/rendez.o \
	$(OBJDIR)/fasttext.o \
	$(OBJDIR)/welcome.o \
	$(OBJDIR)/nalloc2.o \
	$(OBJDIR)/memprot.o \
	$(OBJDIR)/update.o \
	$(OBJDIR)/resource.o \
	$(OBJDIR)/unicode.o \
	$(OBJDIR)/pun.o \
	$(OBJDIR)/fatfs.o \
	$(OBJDIR)/block_IO.o \
	$(OBJDIR)/xhdi.o \
	$(OBJDIR)/ssystem.o

SFILES = \
	context.spp \
	intr.spp \
	syscall.spp \
	quickzer.spp \
	quickmov.spp \
	quickswa.spp \
	cpu.spp \
	vm5.spp \
	kernel.spp \
	magic.i

SOBJS =	$(OBJDIR)/context.o \
	$(OBJDIR)/intr.o \
	$(OBJDIR)/syscall.o \
	$(OBJDIR)/quickzer.o \
	$(OBJDIR)/quickmov.o \
	$(OBJDIR)/quickswa.o \
	$(OBJDIR)/cpu.o \
	$(OBJDIR)/vm5.o \
	$(OBJDIR)/kernel.o

OBJS = $(COBJS) $(SOBJS)

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

BUILD = build
BUILDTIME = $(OBJDIR)/$(BUILD).o

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

$(OBJDIR):
	$(MKDIR) $@

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

#
# for build time
#
MAKEBUILDTIME = mkbuild.tos

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

buildtime: $(MAKEBUILDTIME)
	@echo "# Update build.h ..."
	@$(MAKEBUILDTIME)
	@echo "# Delete $(BUILDTIME) ..."
	@$(RM) $(BUILDTIME)
	@echo "# Compiling $(BUILDTIME) ..."
	@$(CC) $(CFLAGS) -c $(BUILD).c -o $(BUILDTIME)

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

# overwrite the default
# gcc brings errors without -m68030 option
$(OBJDIR)/memprot.o: memprot.c memprot.h $(HFILES)
	$(CC) $(CFLAGS) -m68030 -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) -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
	$(ATRANS) $(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

#
# macros for cleaning up
#
GENFILES = $(OBJS) $(BUILDTIME)
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) $(SFILES) \
#	 $(ATRANSSRC)

#
# dependencies
#

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

-include $(DEPENDENCIES)

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