#
# 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)
RANLIB = ranlib

LIBS = -nostdlib -lgcc


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

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"

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"

$(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

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

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

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

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

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

#
# files
#

STARTUP = startup.o

HFILES = ./mint/*.h
HEADER = *.h

CFILES = \
	bios.c \
	biosfs.c \
	block_IO.c \
	blowfish.c \
	cnf.c \
	cmdline.c \
	console.c \
	cookie.c \
	crypt_IO.c \
	debug.c \
	dev-mouse.c \
	dev-null.c \
	dma.c \
	dos.c \
	dosdir.c \
	dosfile.c \
	dosmem.c \
	dossig.c \
	fasttext.c \
	fatfs.c \
	filesys.c \
	global.c \
	init.c \
	kernfs.c \
	kernget.c \
	kmemory.c \
	md5.c \
	memory.c \
	mprot030.c \
	mprot040.c \
	nullfs.c \
	pipefs.c \
	proc.c \
	procfs.c \
	pun.c \
	random.c \
	rendez.c \
	resource.c \
	scsidrv.c \
	shmfs.c \
	signal.c \
	slb.c \
	ssystem.c \
	sys_emu.c \
	syscall_vectors.c \
	time.c \
	timeout.c \
	tosfs.c \
	tty.c \
	unicode.c \
	unifs.c \
	update.c \
	util.c \
	xbios.c \
	xhdi.c

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

SFILES = \
	context.spp \
	cpu.spp \
	detect.spp \
	intr.spp \
	kernel.spp \
	mmu030.spp \
	mmu040.spp \
	slb_util.spp \
	syscall.spp \
	vm5.spp \
	scsidrv_emu.spp \
	xhdi_emu.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

MKBUILD = mkbuild

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

$(MINT): $(OBJS) libkern.a $(BUILDINFO)
	$(CC) $(CFLAGS) -o $@ $(OBJS) -Llibkern/ -lkern $(BUILDINFO) $(LIBS)

libkern.a:
	cd libkern; \
	$(MAKE) $@ \
	CC="$(CC)" \
	AS="$(AS)" \
	CFLAGS="$(CFLAGS) -I.." \
	ASFLAGS="$(ASFLAGS)" \
	DEFINITIONS="$(DEFINITIONS)" \
	RANLIB=$(RANLIB) \
	ATRANS=$(shell pwd)/$(ATRANS) \
	CRLF="$(CRLF)"

$(BUILDINFO): compiler buildheader buildserial
	$(CC) $(CFLAGS) -o $@ -c $(BUILD).c

compiler:
	cd ./buildinfo; \
	CC="$(CC)" \
	OPTS="$(OPTS) $(MODEL)" \
	DEFS="$(DEFINITIONS)" \
	sh cdef.sh

buildheader: $(MKBUILD)
	cd ./buildinfo; $(MKBUILD)

buildserial: buildinfo/version.h
	cd ./buildinfo; echo 1 >$@

$(MKBUILD): ./buildinfo/$(MKBUILD)

./buildinfo/$(MKBUILD): ./buildinfo/mkbuild.c
	$(NATIVECC) $(NATIVECFLAGS) -o $@ $<

#
# 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
ATRANS = $(ASMTRANS)/$(ATRANSTTP)

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

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

$(GENMAGICPRG): genmagic.o
	$(CC) -mshort -o $@ genmagic.o

genmagic.o:
	@echo "$(CC) -mshort -DGENMAGIC -c genmagic.c -o $@"; \
	$(CC) -Wp,-MD,.deps/$(@:.o=.P) -mshort -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	

context.o:	$(ATRANS) magic.i context.spp
cpu.o:		$(ATRANS)         cpu.spp
detect.o:	$(ATRANS)         detect.spp
intr.o:		$(ATRANS) magic.i intr.spp
kernel.o:	$(ATRANS) magic.i kernel.spp
memset.o:	$(ATRANS)         memset.spp
mmu030.o:	$(ATRANS)         mmu030.spp
mmu040.o:	$(ATRANS)         mmu040.spp
peekpoke.o:	$(ATRANS)         peekpoke.spp
quickzero.o:	$(ATRANS)         quickzero.spp
quickmove.o:	$(ATRANS)         quickmove.spp
quickswap.o:	$(ATRANS)         quickswap.spp
slb_util.o:	$(ATRANS) magic.i slb_util.spp
startup.o:	$(ATRANS)         startup.spp
syscall.o:	$(ATRANS) magic.i syscall.spp
vm5.o:		$(ATRANS)         vm5.spp
xhdi_emu.o:	$(ATRANS)         xhdi_emu.spp


#
# macros for cleaning up
#
GENFILES = $(OBJS) $(BUILDINFO)
EXTRAS = $(MKBUILD) $(GENMAGICPRG) genmagic.o $(MINT)

clean:
	$(RM) $(GENFILES)
	cd libkern; $(MAKE) $@

distclean:
	$(MAKE) clean;
	$(RM) $(TARGET).*
	$(RM) -r .deps
	$(RM) $(EXTRAS) buildserial
	$(RM) *~ mint/*~ ../docu/*~ ../bin/*
	cd $(ASMTRANS); $(MAKE) clean
	cd libkern; $(MAKE) $@

.PHONY: help all build buildtime boot clean distclean dist


#
# dependencies
#

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

-include $(DEPENDENCIES)
