#
# 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 = -nostdlib

# used tools
MV    = mv
CP    = cp
RM    = rm -f
TOUCH = touch
MKDIR = mkdir
MAKE  = make
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 '# - 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 -fstrength-reduce" LIBS=""

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

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

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 -g"

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

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 -g"

$(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 -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 -DCRYPTO_CODE for including the cryptographic filesystem stuff
#
DEFAULTDEFS = \
	-DMULTITOS \
	-DVERBOSE_BOOT \
	-DTRAPS_PRIVATE \
	-DCRYPTO_CODE

DEFINITIONS = $(DEFAULTDEFS) $(DEFS)

#
# optimizations
# 
OPTS =	-fomit-frame-pointer \
	-O2

# -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) $(DEFINITIONS) -m68030

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

%.o: %.c
	@echo "$(CC) $(CFLAGS) $(MODEL) -c $< -o $@"; \
	$(CC) -Wp,-MD,.deps/$(@:.o=.P) $(CFLAGS) $(MODEL) -c $< -o $@

#
# files
#

STARTUP = startup.o

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

HEADER = *.h

CFILES = \
	global.c \
	cnf.c \
	bios.c \
	xbios.c \
	console.c \
	cookie.c \
	dev-mouse.c \
	dev-null.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 \
	nullfs.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 \
	crypt_IO.c \
	dma.c \
	xhdi.c \
	ssystem.c \
	random.c \
	syscall_vectors.c \
	slb.c \
	blowfish.c \
	md5.c

COBJS =	$(CFILES:.c=.o)

SFILES = \
	context.spp \
	cpu.spp \
	detect.spp \
	intr.spp \
	kernel.spp \
	memset.spp \
	mmu030.spp \
	mmu040.spp \
	quickzero.spp \
	quickmove.spp \
	quickswap.spp \
	slb_util.spp \
	syscall.spp \
	vm5.spp \
#	peekpoke.spp

SIFILES = $(SFILES) magic.i

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

OBJS = $(STARTUP) $(COBJS) $(SOBJS)

DEPENDENCIES = $(addprefix ./.deps/, $(patsubst %.c,%.P,$(CFILES) genmagic.c))

BUILD = info
BUILDINFO = $(BUILD).o

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

$(MINT): $(OBJS) buildtime
	$(CC) $(CFLAGS) -o $@ $(OBJS) $(BUILDINFO) $(LIBS)

#
# for build time
#
MAKEBUILDTIME = ./mkbuild.tos

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

buildtime: $(MAKEBUILDTIME)
	$(MAKEBUILDTIME) && \
	CC="$(CC)" && \
	OPTS="$(OPTS) $(MODEL)" && \
	DEFS="$(DEFINITIONS)" && \
	export CC OPTS DEFS && \
	sh cdef.sh && \
	$(RM) $(BUILDINFO) && \
	$(CC) $(CFLAGS) -c $(BUILD).c -o $(BUILDINFO)

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

# overwrite the default
# gcc brings errors without -m68030 option
mprot030.o: mprot030.c mprot.h $(HFILES)
	@echo "$(CC) $(CFLAGS) -m68030 -c $< -o $@"; \
	$(CC) -Wp,-MD,.deps/$(@:.o=.P) $(CFLAGS) -m68030 -c $< -o $@

# overwrite the default
# gcc brings errors without -m68040 option
mprot040.o: mprot040.c mprot.h $(HFILES)
	@echo "$(CC) $(CFLAGS) -m68040 -c $< -o $@"; \
	$(CC) -Wp,-MD,.deps/$(@:.o=.P) $(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.o
	$(CC) -o $(GENMAGICPRG) genmagic.o

genmagic.o:
	@echo "$(CC) -O3 -DGENMAGIC -c genmagic.c -o $@"; \
	$(CC) -Wp,-MD,.deps/$(@:.o=.P) -O3 -DGENMAGIC -c genmagic.c -o $@

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

#
# assembler source files
#
%.o: %.spp
	$(ATRANS) $(DEFINITIONS) -gas -o $*.s $<
	$(CRLF) $*.s
	$(AS) $(ASFLAGS) -c $*.s -o $@
	$(RM) $*.s	

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

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

clean:
	$(RM) $(GENFILES)

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

#
# 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)

.PHONY: help all build buildtime boot clean distclean dist

#
# dependencies
#

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

DEPS_MAGIC := $(shell mkdir ./.deps > /dev/null 2>&1 || :)

-include $(DEPENDENCIES)

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