CC = ppc-morphos-gcc
LD = ppc-morphos-ld
STRIP = ppc-morphos-strip

CFLAGS = -mcpu=603e -fno-builtin-malloc
FPM = -DFPM_PPC -DOPT_ACCURACY -DBUILD_MORPHOS
CC_OPTS = -O2 -fomit-frame-pointer -noixemul -nostartfiles $(CFLAGS)
CPP_OPTS = -I./mad -DHAVE_CONFIG_H -DNDEBUG $(FPM)
MAD_OPTS = -Wall -O -fforce-mem -fforce-addr -fthread-jumps -fcse-follow-jumps -fcse-skip-blocks -fexpensive-optimizations -fregmove -fstrength-reduce -fschedule-insns2 -fmove-all-movables -fbranch-count-reg $(CFLAGS)
RM = rm -f
MV = mv -f

PROGNAME = mpega.library

LIB_SRC = library_init.c
LIB_OBJ = $(LIB_SRC:.c=.o)

PUP_SRC = support_pup.c
PUP_OBJ = $(PUP_SRC:.c=.o)

STARTUP_SRC = startup_pup.c
STARTUP_OBJ = $(STARTUP_SRC:.c=.o)

WRAP_SRC = support.c wrap_mpega.c
WRAP_OBJ = $(WRAP_SRC:.c=.o)

MAD_SRC = mad/filter.c mad/resample.c mad/tag.c mad/crc.c mad/fixed.c mad/bit.c mad/timer.c mad/stream.c mad/frame.c mad/synth.c mad/layer12.c mad/layer3.c mad/huffman.c
MAD_OBJ = $(MAD_SRC:.c=.o)

%.o: %.c 
	$(CC) $(CPP_OPTS) $(CC_OPTS) -c $< -o $@

.PHONY: mad.stmp mad_build

all: $(PROGNAME)#_PPC $(PROGNAME)_040 $(PROGNAME)_OS4

mad_build: $(MAD_OBJ)

mad.stmp:
	@$(MAKE) mad_build "CC_OPTS = \$$(MAD_OPTS)"

$(PROGNAME): $(LIB_OBJ) $(WRAP_OBJ) mad.stmp
	@$(CC) $(CC_OPTS) -Wl,-Map=$@.map -o $@.db $(LIB_OBJ) $(WRAP_OBJ) $(MAD_OBJ) $(ADD_OBJ)
	@$(STRIP) -s -R .comment $@.db -o $@

elfobject.o: $(STARTUP_OBJ) $(WRAP_OBJ)
	$(LD) -r -fl libnix -o elfobject.elf $(STARTUP_OBJ) $(WRAP_OBJ) $(MAD_OBJ) -lc
	$(STRIP) -s --keep-symbol __LibFuncTable -R .comment elfobject.elf
	Data2Object elfobject.elf elfobject.o SECTION elf SYMBOL __ElfObject

$(PROGNAME)_PUP: $(LIB_OBJ) $(PUP_OBJ)
	$(CC) $(CC_OPTS) -o $(PROGNAME) $(LIB_OBJ) $(PUP_OBJ) elfobject.o
	$(STRIP) -s -R .comment $(PROGNAME)

$(PROGNAME)_040:
	$(MAKE) $(PROGNAME) "CC = m68k-amigaos-gcc" "STRIP = m68k-amigaos-strip" "CFLAGS = -m68040" "FPM = -DFPM_DEFAULT -DOPT_SPEED -DOPT_SSO" "ADD_OBJ = -lm040"
	-$(MV) $(PROGNAME) $(PROGNAME).040
	-$(RM) $(LIB_OBJ) $(WRAP_OBJ) $(MAD_OBJ)

$(PROGNAME)_PPC:
	$(MAKE) $(PROGNAME) "CC = ppc-morphos-gcc" "STRIP = ppc-morphos-strip" "CFLAGS = -mcpu=603e -mmultiple" "FPM = -DFPM_PPC -DOPT_ACCURACY -DBUILD_MORPHOS"
	-$(MV) $(PROGNAME) $(PROGNAME).elf
	-$(RM) $(LIB_OBJ) $(WRAP_OBJ)
	$(MAKE) elfobject.o "CC = ppc-morphos-gcc" "CFLAGS = -mcpu=603e -mmultiple -I/GCCInclude -I/PPCInclude -I/Include" "FPM = -DFPM_PPC -DOPT_ACCURACY -DBUILD_POWERUP"
	$(MAKE) $(PROGNAME)_PUP "CC = m68k-amigaos-gcc" "STRIP = m68k-amigaos-strip" "CFLAGS = -m68040" "FPM = -DBUILD_POWERUP"
	-$(MV) $(PROGNAME) $(PROGNAME).pup
	-$(RM) $(LIB_OBJ) $(WRAP_OBJ) $(MAD_OBJ) $(PUP_OBJ) $(STARTUP_OBJ) elfobject.elf elfobject.o

mpega_68k_os4.o: mpega_68k_os4.S
	ppc-amigaos-gcc -Wa,-mregnames $< -o $@ -c -I/V/src/kickstart/exec_sg/include

$(PROGNAME)_OS4: mpega_68k_os4.o
	$(MAKE) $(PROGNAME) "CC = ppc-amigaos-gcc" "STRIP = ppc-amigaos-strip" "CFLAGS = -D__USE_INLINE__ -D__USE_BASETYPE__ -mcpu=604e -mmultiple" "FPM = -DFPM_PPC -DOPT_ACCURACY -DBUILD_OS4 -I/V/include" "ADD_OBJ = mpega_68k_os4.o -lmoto"
	-$(MV) $(PROGNAME) $(PROGNAME).os4
	-$(RM) $(LIB_OBJ) $(WRAP_OBJ) $(MAD_OBJ)

install: all
	@mkdir -p /SYS/MorphOS/Libs
	cp $(PROGNAME) /SYS/MorphOS/Libs/$(PROGNAME)

install-iso: all
	@mkdir -p $(ISOPATH)MorphOS/Libs
	cp $(PROGNAME) $(ISOPATH)MorphOS/Libs/$(PROGNAME)

source:
	(cd .. && tar --transform "s,^mpega,&.library," -cf $(SOURCEPATH)mpega.library.tar mpega)

clean:
	-$(RM) *.library* $(LIB_OBJ) $(WRAP_OBJ) $(MAD_OBJ) $(PUP_OBJ) $(STARTUP_OBJ) elfobject.elf elfobject.o mpega_68k_os4.o

