link = gcc -o
#link = gcc -mwindows -o
#arch = -march=athlon
arch = -march=pentiumpro
compile = gcc -c -ansi -pedantic -Wall -O3 -fomit-frame-pointer $(arch)
lib = -Lc:\mingw\lib -L. -lz123 -lgdi32 -lwinmm -lkernel32 -ldsound -ldinput -ldxguid -lddraw
rm = @rm -f -v
md = -mkdir

obj = obj
exe = exe
objects = $(obj)\apu.o $(obj)\cartridge.o $(obj)\cpu.o $(obj)\cpu_memorymap.o $(obj)\crystal.o $(obj)\draw.o $(obj)\file.o $(obj)\input.o $(obj)\ioapi.o $(obj)\log.o $(obj)\main.o $(obj)\mapper.o $(obj)\palette.o $(obj)\ppu.o $(obj)\ppu_memorymap.o $(obj)\resource.o $(obj)\sound.o $(obj)\unzip.o $(obj)\version.o


all : makedirs timestamp.exe version_timestamp $(exe)\Sega_Li.exe

makedirs : $(obj) $(exe)
$(obj) :
	$(md) $(obj)
$(exe) :
	$(md) $(exe)

timestamp.exe : $(obj)\timestamp.o
	$(link) timestamp.exe $(obj)\timestamp.o $(lib)
$(obj)\timestamp.o : timestamp.c global.h makefile
	$(compile) timestamp.c -o $(obj)\timestamp.o
version_timestamp :
	./timestamp.exe > ./version_timestamp.h

$(exe)\Sega_Li.exe : $(objects) makefile
	$(link) $(exe)\Sega_Li.exe $(objects) $(lib)

$(obj)\apu.o : apu.c apu.h cpu.h global.h crystal.h log.h makefile
	$(compile) apu.c -o $(obj)\apu.o
$(obj)\cartridge.o : cartridge.c global.h file.h crc32.h mapper.h cartridge.h log.h makefile
	$(compile) cartridge.c -o $(obj)\cartridge.o
$(obj)\cpu.o : cpu.c apu.h crystal.h mapper.h ppu.h cpu_memorymap.h cpu.h log.h global.h cartridge.h makefile
	$(compile) cpu.c -o $(obj)\cpu.o
$(obj)\cpu_memorymap.o : cpu_memorymap.c cpu_memorymap.h cpu.h apu.h input.h mapper.h cpu_memorymap.h log.h ppu.h cartridge.h global.h makefile
	$(compile) cpu_memorymap.c -o $(obj)\cpu_memorymap.o
$(obj)\crystal.o : crystal.c log.h crystal.h global.h makefile
	$(compile) crystal.c -o $(obj)\crystal.o
$(obj)\draw.o : draw.c draw.h log.h global.h makefile
	$(compile) draw.c -o $(obj)\draw.o
$(obj)\file.o : file.c unzip.h global.h log.h file.h crc32.h makefile
	$(compile) file.c -o $(obj)\file.o
$(obj)\input.o : input.c log.h input.h global.h makefile
	$(compile) input.c -o $(obj)\input.o
$(obj)\log.o : log.c crystal.h log.h global.h makefile
	$(compile) log.c -o $(obj)\log.o
$(obj)\main.o : main.c version.h draw.h resource.h apu.h log.h file.h input.h cpu.h ppu.h palette.h crystal.h global.h mapper.h cartridge.h ppu_memorymap.h cpu_memorymap.h makefile
	$(compile) main.c -o $(obj)\main.o
$(obj)\mapper.o : mapper.c mapper_mmc1.c mapper_mmc2.c mapper_mmc3.c mapper_mmc5.c mapper_irem.c mapper_jaleco.c mapper_bandai.c mapper_konami.c mapper_namco.c mapper_sunsoft.c mapper_simple.c mapper_taito.c mapper_pirate.c mapper_ave.c mapper.h file.h crc32.h cpu.h crystal.h ppu.h log.h global.h cartridge.h cpu_memorymap.h ppu_memorymap.h makefile
	$(compile) mapper.c -o $(obj)\mapper.o
$(obj)\palette.o : palette.c ppu.h cartridge.h file.h crystal.h log.h palette.h palette_hardcoded.h global.h makefile
	$(compile) palette.c -o $(obj)\palette.o
$(obj)\ppu.o : ppu.c global.h palette.h ppu_memorymap.h cpu_memorymap.h log.h ppu.h cpu.h crystal.h makefile
	$(compile) ppu.c -o $(obj)\ppu.o
$(obj)\ppu_memorymap.o : ppu_memorymap.c ppu_memorymap.h global.h log.h ppu.h cartridge.h makefile
	$(compile) ppu_memorymap.c -o $(obj)\ppu_memorymap.o
$(obj)\sound.o : sound.c sound.h log.h global.h makefile
	$(compile) sound.c -o $(obj)\sound.o
$(obj)\version.o : version.c version.h version_timestamp.h global.h makefile
	$(compile) version.c -o $(obj)\version.o

$(obj)\resource.o : resource.rc resource.h icon.ico splash.bmp makefile
	windres resource.rc -o $(obj)\resource.o

$(obj)\ioapi.o : ioapi.c zlib.h zconf.h ioapi.h makefile
	$(compile) ioapi.c -o $(obj)\ioapi.o
$(obj)\unzip.o : unzip.c zlib.h zconf.h unzip.h ioapi.h crypt.h makefile
	$(compile) unzip.c -o $(obj)\unzip.o


clean :
	$(rm) $(obj)\apu.o
	$(rm) $(obj)\cartridge.o
	$(rm) $(obj)\cpu.o
	$(rm) $(obj)\cpu_memorymap.o
	$(rm) $(obj)\crystal.o
	$(rm) $(obj)\draw.o
	$(rm) $(obj)\file.o
	$(rm) $(obj)\input.o
	$(rm) $(obj)\ioapi.o
	$(rm) $(obj)\log.o
	$(rm) $(obj)\main.o
	$(rm) $(obj)\mapper.o
	$(rm) $(obj)\palette.o
	$(rm) $(obj)\ppu.o
	$(rm) $(obj)\ppu_memorymap.o
	$(rm) $(obj)\resource.o
	$(rm) $(obj)\sound.o
	$(rm) $(obj)\unzip.o
	$(rm) $(obj)\version.o
	
	$(rm) $(obj)\timestamp.o

	$(rm) $(exe)\Sega_Li.exe
	$(rm) timestamp.exe
