############################################################################
# Configuration

# Root filesystem
IMAGE=image

# CD WRITER device for cdrdao
CD=ATAPI:0,0,0

# Version
CDVERSION=2.6.2

# Boot directory
BOOTAPP=/boot
BOOTINITRD=/boot
BOOTISOLINUX=/boot/isolinux
BOOTISOLINUXNS=boot/isolinux

############################################################################
# Commands

all: app initrd iso

.PHONY: app
app:
	chown -R root:root app
	mkzftree -z 9 app app.zf
	cp -a app/root/*.rc app.zf/root
	cp -a app/root/*.png app.zf/root
	mkisofs -V AdvanceAPP -R -J -z -o app.img app.zf
	rm -r app.zf
	cp app.img $(IMAGE)$(BOOTAPP)

app_extract: $(IMAGE)$(BOOTAPP)/app.img
	mkdir app.fs
	mount -t iso9660 $(IMAGE)$(BOOTAPP)/app.img app.fs -o loop
	cp -a app.fs app
	umount app.fs
	rmdir app.fs

.PHONY: initrd
initrd:
	mkdir initrd.fs
	dd if=/dev/zero of=initrd.raw bs=1024 count=4096
	mke2fs -F -m0 -b1024 initrd.raw
	tune2fs -i0 initrd.raw
	mount -o loop -t ext2 initrd.raw initrd.fs
	chown -R root:root initrd
	cp -a initrd/* initrd.fs
	umount initrd.fs
	rmdir initrd.fs
	gzip -9 < initrd.raw > initrd.img
	rm initrd.raw
	cp initrd.img $(IMAGE)$(BOOTINITRD)

initrd_extract: $(IMAGE)$(BOOTINITRD)/initrd.img
	mkdir initrd.fs
	gzip -d < $(IMAGE)$(BOOTINITRD)/initrd.img > initrd.raw
	mount -t ext2 initrd.raw initrd.fs -o loop
	cp -a initrd.fs initrd
	umount initrd.fs
	rmdir initrd.fs
	rm initrd.raw

extract: initrd_extract app_extract

D2 = advd2
DOC = \
	doc/histcd.txt \
	doc/readcd.txt \
	doc/advcd.txt \
	doc/buildcd.txt \
	doc/cardcd.txt \
	doc/audiocd.txt \
	doc/relecd.txt \
	doc/histcd.html \
	doc/readcd.html \
	doc/advcd.html \
	doc/buildcd.html \
	doc/cardcd.html \
	doc/audiocd.html \
	doc/relecd.html

doc/%.txt : doc/%.d
	$(D2) txt < $< > $@

doc/%.html : doc/%.d
	$(D2) html < $< > $@

doc/%.hh : doc/%.d
	$(D2) frame < $< > $@

doc/%.1 : doc/%.d
	$(D2) man < $< > $@

clean:
	rm -f initrd.img app.img

distclean: clean
	rm -f advcd.iso advcd21.iso advcd74a.iso advcd74b.iso advcd.udf
	rm -f cd.iso

############################################################################
# Dist

CD_DIST_DIR = advancecd-$(CDVERSION)
CD_DIST_FILE = advancecd-$(CDVERSION)

CD_ROOT_SRC = Makefile doc contrib cd.toc

dist: $(DOC)
	mkdir $(CD_DIST_DIR)
	cp doc/readcd.txt $(CD_DIST_DIR)/readme.txt
	cp doc/histcd.txt $(CD_DIST_DIR)/history.txt
	cp doc/buildcd.txt $(CD_DIST_DIR)/buildcd.txt
	cp doc/advcd.txt $(CD_DIST_DIR)/advcd.txt
	cp doc/cardcd.txt $(CD_DIST_DIR)/cardcd.txt
	cp doc/audiocd.txt $(CD_DIST_DIR)/audiocd.txt
	cp doc/relecd.txt $(CD_DIST_DIR)/release.txt
	tar -z -x -C $(CD_DIST_DIR) -f support/makebootfat-*.tar.gz
	cp -a $(CD_ROOT_SRC) $(CD_DIST_DIR)
	-rm $(CD_DIST_DIR)/doc/*.hh
	-rm -r $(CD_DIST_DIR)/doc/CVS
	-rm -r $(CD_DIST_DIR)/contrib/CVS
	rm -f $(CD_DIST_FILE).zip
	chown -R 1000:100 $(CD_DIST_DIR)
	tar zcfo $(CD_DIST_FILE).tar.gz $(CD_DIST_DIR)
	rm -r $(CD_DIST_DIR)

CD_DOC_BIN += $(DOC)

CD_DIST_FILE_BIN = advancecd-$(CDVERSION)-pentium
CD_DIST_DIR_BIN = $(CD_DIST_FILE_BIN)

distbin: $(CD_DOC_BIN)
	mkdir $(CD_DIST_DIR_BIN)
	cp doc/readcd.txt $(CD_DIST_DIR_BIN)/readme.txt
	cp doc/histcd.txt $(CD_DIST_DIR_BIN)/history.txt
	cp doc/advcd.txt $(CD_DIST_DIR_BIN)/advcd.txt
	cp doc/cardcd.txt $(CD_DIST_DIR_BIN)/cardcd.txt
	cp doc/audiocd.txt $(CD_DIST_DIR_BIN)/audiocd.txt
	cp doc/relecd.txt $(CD_DIST_DIR_BIN)/release.txt
	cp -a contrib/makecd.bat $(CD_DIST_DIR_BIN)
	utod $(CD_DIST_DIR_BIN)/makecd.bat
	cp -a contrib/makeusb.bat $(CD_DIST_DIR_BIN)
	utod $(CD_DIST_DIR_BIN)/makeusb.bat
	cp -a contrib/makepart.bat $(CD_DIST_DIR_BIN)
	utod $(CD_DIST_DIR_BIN)/makepart.bat
	cp -a contrib/makecd.sh $(CD_DIST_DIR_BIN)
	cp -a contrib/makeusb.sh $(CD_DIST_DIR_BIN)
	cp -a contrib/makepart.sh $(CD_DIST_DIR_BIN)
	cp -a contrib/checkrom.bat $(CD_DIST_DIR_BIN)
	utod $(CD_DIST_DIR_BIN)/checkrom.bat
	cp -a contrib/checkrom.sh $(CD_DIST_DIR_BIN)
	mkdir $(CD_DIST_DIR_BIN)/$(IMAGE)
	cp doc/readcd.html $(CD_DIST_DIR_BIN)/$(IMAGE)/readme.html
	cp -a $(IMAGE)/free $(CD_DIST_DIR_BIN)/$(IMAGE)/free
	cp -a $(IMAGE)/boot $(CD_DIST_DIR_BIN)/$(IMAGE)/boot
	rm -f $(CD_DIST_DIR_BIN)/$(IMAGE)$(BOOTISOLINUX)/boot.cat
	mkdir $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/rom $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/snap $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/bios $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/software $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/sample $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/hi $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/artwork $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/bezel $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/cabinet $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/crc $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/flyer $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/icon $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/marquee $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/music $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/nvram $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/title $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/image $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	cp -a $(IMAGE)/arcade/diff $(CD_DIST_DIR_BIN)/$(IMAGE)/arcade
	mkdir $(CD_DIST_DIR_BIN)/support
	cp -a contrib/advscan.rc $(CD_DIST_DIR_BIN)/support
	cp -a app/root/AdvanceMAME.xml $(CD_DIST_DIR_BIN)/support/advscan.xml
	cp -a support/sbm36.raw $(CD_DIST_DIR_BIN)/support
	cp -a support/rawwritewin.exe $(CD_DIST_DIR_BIN)/support
	cp -a support/mkisofs.exe $(CD_DIST_DIR_BIN)/support
	cp -a support/makebootfat.exe $(CD_DIST_DIR_BIN)/support
	cp -a support/zlib.dll $(CD_DIST_DIR_BIN)/support
	cp -a support/lowwin.exe $(CD_DIST_DIR_BIN)/support
	cp -a support/detecthw.exe $(CD_DIST_DIR_BIN)/support
	cp -a support/advscan.exe $(CD_DIST_DIR_BIN)/support
	cp -a support/advancescan-*.tar.gz $(CD_DIST_DIR_BIN)/support
	cp -a support/makebootfat-*.tar.gz $(CD_DIST_DIR_BIN)/support
	cp -a contrib/iso.srt $(CD_DIST_DIR_BIN)/support
	rm -f $(CD_DIST_FILE_BIN).zip
	find $(CD_DIST_DIR_BIN) \( -name "*.txt" \) -type f -exec utod {} \;
	chown -R 1000:100 $(CD_DIST_DIR_BIN)
	cd $(CD_DIST_DIR_BIN) && zip -r ../$(CD_DIST_FILE_BIN).zip *
	rm -r $(CD_DIST_DIR_BIN)

############################################################################
# ISO

EXCLUDEUPDATE = \
	-x "$(IMAGE)/arcade/rom74a/update" \
	-x "$(IMAGE)/arcade/snap74a/update" \
	-x "$(IMAGE)/arcade/rom74b/update" \
	-x "$(IMAGE)/arcade/snap74b/update" \
	-x "$(IMAGE)/arcade/rom21/update" \
	-x "$(IMAGE)/arcade/snap21/update"

EXCLUDE74A = \
	-x "$(IMAGE)/arcade/rom74a" \
	-x "$(IMAGE)/arcade/snap74a" \
	-x "$(IMAGE)/arcade/sample74a" \
	-x "$(IMAGE)/arcade/artwork74a" \
	-x "$(IMAGE)/arcade/bios74a" \
	-x "$(IMAGE)/arcade/software74a"

EXCLUDE74B = \
	-x "$(IMAGE)/arcade/rom74b" \
	-x "$(IMAGE)/arcade/snap74b" \
	-x "$(IMAGE)/arcade/sample74b" \
	-x "$(IMAGE)/arcade/artwork74b"

EXCLUDEFREE = \
	-x "$(IMAGE)/free"

EXCLUDE21 = \
	-x "$(IMAGE)/arcade/rom21" \
	-x "$(IMAGE)/arcade/snap21" \
	-x "$(IMAGE)/arcade/sample21"

pre_iso:
	chown -R root:root $(IMAGE)

udf: pre_iso
	mkisofs -udf -o advcd.udf \
		-V "AdvanceCD" \
		-sort contrib/iso.srt -hide-rr-moved \
		-b $(BOOTISOLINUXNS)/isolinux.bin -c $(BOOTISOLINUXNS)/boot.cat \
		-no-emul-boot -boot-load-size 32 -boot-info-table \
		$(EXCLUDEUPDATE) \
		$(EXCLUDE74A) \
		$(EXCLUDE74B) \
		$(EXCLUDE21) \
		$(IMAGE)

iso: pre_iso
	mkisofs -r -J -o advcd.iso \
		-V "AdvanceCD" \
		-sort contrib/iso.srt -hide-rr-moved \
		-b $(BOOTISOLINUXNS)/isolinux.bin -c $(BOOTISOLINUXNS)/boot.cat \
		-no-emul-boot -boot-load-size 32 -boot-info-table \
		$(EXCLUDEUPDATE) \
		$(EXCLUDE74A) \
		$(EXCLUDE74B) \
		$(EXCLUDE21) \
		$(IMAGE)
	rm -f cd.iso
	ln -s advcd.iso cd.iso

iso21: pre_iso
	mkisofs -r -J -o advcd21.iso \
		-V "AdvanceCD" \
		-sort contrib/iso.srt -hide-rr-moved \
		-b $(BOOTISOLINUXNS)/isolinux.bin -c $(BOOTISOLINUXNS)/boot.cat \
		-no-emul-boot -boot-load-size 32 -boot-info-table \
		$(EXCLUDEUPDATE) \
		$(EXCLUDE74A) \
		$(EXCLUDE74B) \
		$(EXCLUDEFREE) \
		$(IMAGE)
	rm -f cd.iso
	ln -s advcd21.iso cd.iso

iso21size: pre_iso
	mkisofs -print-size -r -J -o advcd21.iso \
		-V "AdvanceCD" \
		-sort contrib/iso.srt -hide-rr-moved \
		-b $(BOOTISOLINUXNS)/isolinux.bin -c $(BOOTISOLINUXNS)/boot.cat \
		-no-emul-boot -boot-load-size 32 -boot-info-table \
		$(EXCLUDEUPDATE) \
		$(EXCLUDE74A) \
		$(EXCLUDE74B) \
		$(EXCLUDEFREE) \
		$(IMAGE)

iso74a: pre_iso
	mkisofs -r -J -o advcd74a.iso \
		-V "AdvanceCD" \
		-sort contrib/iso.srt -hide-rr-moved \
		-b $(BOOTISOLINUXNS)/isolinux.bin -c $(BOOTISOLINUXNS)/boot.cat \
		-no-emul-boot -boot-load-size 32 -boot-info-table \
		$(EXCLUDEUPDATE) \
		$(EXCLUDE21) \
		$(EXCLUDE74B) \
		$(EXCLUDEFREE) \
		$(IMAGE)
	rm -f cd.iso
	ln -s advcd74a.iso cd.iso

iso74asize:
	mkisofs -print-size -r -J -o advcd74a.iso \
		-V "AdvanceCD" \
		-sort contrib/iso.srt -hide-rr-moved \
		-b $(BOOTISOLINUXNS)/isolinux.bin -c $(BOOTISOLINUXNS)/boot.cat \
		-no-emul-boot -boot-load-size 32 -boot-info-table \
		$(EXCLUDEUPDATE) \
		$(EXCLUDE21) \
		$(EXCLUDE74B) \
		$(EXCLUDEFREE) \
		$(IMAGE)

iso74b: pre_iso
	mkisofs -r -J -o advcd74b.iso \
		-V "AdvanceCD" \
		-sort contrib/iso.srt -hide-rr-moved \
		-b $(BOOTISOLINUXNS)/isolinux.bin -c $(BOOTISOLINUXNS)/boot.cat \
		-no-emul-boot -boot-load-size 32 -boot-info-table \
		$(EXCLUDEUPDATE) \
		$(EXCLUDE21) \
		$(EXCLUDE74A) \
		$(EXCLUDEFREE) \
		$(IMAGE)
	rm -f cd.iso
	ln -s advcd74b.iso cd.iso

iso74bsize:
	mkisofs -print-size -r -J -o advcd74b.iso \
		-V "AdvanceCD" \
		-sort contrib/iso.srt -hide-rr-moved \
		-b $(BOOTISOLINUXNS)/isolinux.bin -c $(BOOTISOLINUXNS)/boot.cat \
		-no-emul-boot -boot-load-size 32 -boot-info-table \
		$(EXCLUDEUPDATE) \
		$(EXCLUDE21) \
		$(EXCLUDE74A) \
		$(EXCLUDEFREE) \
		$(IMAGE)

MOUNT=/mnt/tmp

mountiso: advcd.iso
	mount -o ro advcd.iso $(MOUNT) -o loop

mountudf: advcd.udf
	mount -o ro advcd.udf $(MOUNT) -o loop

mountiso21: advcd21.iso
	mount -o ro advcd21.iso $(MOUNT) -o loop

mountiso74a: advcd74a.iso
	mount -o ro advcd74a.iso $(MOUNT) -o loop

mountiso74b: advcd74b.iso
	mount -o ro advcd74b.iso $(MOUNT) -o loop

umount:
	umount $(MOUNT)

############################################################################
# Extra

blank:
	cdrdao blank -n --device $(CD) --driver generic-mmc

burn:
	cdrdao write -n --speed 16 --device $(CD) --driver generic-mmc cd.toc

test: blank burn
	reboot

web: doc/histcd.hh doc/readcd.hh doc/relecd.hh doc/advcd.hh doc/cardcd.hh doc/audiocd.hh doc/buildcd.hh

