# Set the following variables to suit your system:

# The Linux source archive, binary archive, diff, build sub-directory.
LINUX_SRC=linux-2.4.27.tar.bz2
LINUX_SRC_UNPACK=tar xjf
LINUX_BIN=
LINUX_BIN_UNPACK=
LINUX_DIFF=linux-2.4.27.diff
LINUX_DIR=linux-2.4.27
LINUX_BUILD_FROM=source

# The memtest86 source archive, binary archive, diff, build sub-directory.
MEMTEST_SRC=memtest86-3.2.tar.gz
MEMTEST_SRC_UNPACK=tar xzf
MEMTEST_BIN=memt32.zip
MEMTEST_BIN_UNPACK=unzip
#MEMTEST_DIFF=memtest86-3.2.diff
MEMTEST_DIR=memtest86-3.2
# Source will no longer compile on my system, so use binary.
MEMTEST_BUILD_FROM=binary

# The mprime source archive, binary archive, diff, build sub-directory.
MPRIME_DIR=source23
MPRIME_SRC=source23.zip
MPRIME_SRC_UNPACK=unzip -d $(MPRIME_DIR)
MPRIME_BIN=sprime239.tar.gz
MPRIME_BIN_UNPACK=tar xzf
#MPRIME_DIFF=source23.diff
# Leave the following option set to binary unless you know what you are
# doing. Compiling mprime from source will often require editing the
# mprime makefile.
MPRIME_BUILD_FROM=binary

# The BusyBox source archive, binary archive, diff, build sub-directory.
BUSYBOX_SRC=busybox-0.60.5.tar.bz2
BUSYBOX_SRC_UNPACK=tar xjf
BUSYBOX_BIN=
BUSYBOX_BIN_UNPACK=
BUSYBOX_DIFF=busybox-0.60.5.diff
BUSYBOX_DIR=busybox-0.60.5
BUSYBOX_BUILD_FROM=source

# Choose a filesystem type for the initrd ramdisk. It must be suitable
# for mounting as root (i.e. not msdos).
#FILESYSTEM=ext2
FILESYSTEM=minix

# Options to use when creating the above filesystem with mkfs.
#MKFS_FLAGS=-F -m 0
MKFS_FLAGS=-i 64 -n 14

# For some reason mkfs is in /sbin on my system, as if normal users have
# no use for it.
MKFS=/sbin/mkfs

# The size of the initial ramdisk in 1k blocks.
INITRD_SIZE=3584

# The prefix for commands that need superuser access.
AS_ROOT=su root

# The loop device to use during the build.
LOOP_DEV=/dev/loop0

# Change the version numer if you have changed any source files.
VERSION=1.3

# No more changes should be needed.


.DELETE_ON_ERROR:

.PHONY: rootfs bootloader unmount clean realclean

SRC_FILES=README.src Makefile $(BUSYBOX_DIFF) $(LINUX_DIFF) \
          $(MEMTEST_DIFF) $(MPRIME_DIFF) check-mapfile
BIN_FILES=README MD5SUM floppy.bin

all: binary

binary: mmdisk-$(VERSION).zip

source: mmdisk-src-$(VERSION).zip

ifeq ($(BUSYBOX_BUILD_FROM),source)
busybox: $(BUSYBOX_SRC) $(BUSYBOX_DIFF)
	rm -rf $(BUSYBOX_DIR)
	$(BUSYBOX_SRC_UNPACK) $(BUSYBOX_SRC)
	patch -u -p0 -i $(BUSYBOX_DIFF)
	make -C $(BUSYBOX_DIR) busybox
	cp $(BUSYBOX_DIR)/busybox busybox
	rm -r $(BUSYBOX_DIR)
else
busybox: $(BUSYBOX_BIN)
	$(BUSYBOX_BIN_UNPACK) $(BUSYBOX_BIN)
	false # Not implemented
endif

ifeq ($(LINUX_BUILD_FROM),source)
linux: $(LINUX_SRC) $(LINUX_DIFF)
	rm -rf $(LINUX_DIR)
	$(LINUX_SRC_UNPACK) $(LINUX_SRC)
	patch -u -p0 -i $(LINUX_DIFF)
	make -C $(LINUX_DIR) oldconfig bzImage
	cp $(LINUX_DIR)/arch/i386/boot/bzImage ./linux
	rm -r $(LINUX_DIR)
else
linux: $(LINUX_BIN)
	$(LINUX_BIN_UNPACK) $(LINUX_BIN)
	false # Not implemented
endif

ifeq ($(MEMTEST_BUILD_FROM),source)
memtest: $(MEMTEST_SRC) $(MEMTEST_DIFF)
	rm -rf $(MEMTEST_DIR)
	$(MEMTEST_SRC_UNPACK) $(MEMTEST_SRC)
#	patch -u -p0 -i $(MEMTEST_DIFF)
	make -C $(MEMTEST_DIR) memtest.bin
	cp $(MEMTEST_DIR)/memtest.bin memtest
	rm -r $(MEMTEST_DIR)
else
memtest: $(MEMTEST_BIN)
	$(MEMTEST_BIN_UNPACK) $(MEMTEST_BIN) memtest.bin
	mv memtest.bin memtest
	touch memtest
endif

ifeq ($(MPRIME_BUILD_FROM),source)
mprime: $(MPRIME_SRC) $(MPRIME_DIFF) check-mapfile
	rm -rf $(MPRIME_DIR)
	$(MPRIME_SRC_UNPACK) $(MPRIME_SRC)
#	patch -u -p0 -i $(MPRIME_DIFF)
	make -C $(MPRIME_DIR)/linux sprime
	./check-mapfile
	cp $(MPRIME_DIR)/linux/sprime mprime
	strip mprime
	rm -r $(MPRIME_DIR)
else
mprime: $(MPRIME_BIN)
	$(MPRIME_BIN_UNPACK) $(MPRIME_BIN) mprime
	touch mprime
endif

rootfs: unmount
	mkdir mnt
	mount -t $(FILESYSTEM) -o loop initrd mnt
	cp -r src/root/* mnt
	mknod -m 0600 mnt/dev/console c 5 1
	mknod -m 0600 mnt/dev/tty0 c 4 0
	mknod -m 0600 mnt/dev/tty1 c 4 1
	mknod -m 0600 mnt/dev/tty2 c 4 2
	mknod -m 0600 mnt/dev/tty3 c 4 3
	mknod -m 0600 mnt/dev/tty4 c 4 4
	mknod -m 0600 mnt/dev/tty5 c 4 5
	mknod -m 0600 mnt/dev/ttyS0 c 4 64
	mknod -m 0600 mnt/dev/ttyS1 c 4 65
	mknod -m 0660 mnt/dev/ram0 b 1 0
	mknod -m 0660 mnt/dev/ram1 b 1 1
	mknod -m 0660 mnt/dev/fd0 b 2 0
	mknod -m 0660 mnt/dev/fd1 b 2 1
	mknod -m 0666 mnt/dev/null c 1 3
	mknod -m 0666 mnt/dev/zero c 1 5
	ln -s busybox mnt/bin/init
	ln -s busybox mnt/bin/sh
	@echo "# If the following command fails then increase INITRD_SIZE"
	cp busybox mprime mnt/bin
	umount -d mnt
	rmdir mnt

initrd.gz: src/root/* src/root/etc/* busybox mprime
	dd if=/dev/zero of=initrd bs=1024 count=$(INITRD_SIZE)
	$(MKFS) -t $(FILESYSTEM) $(MKFS_FLAGS) initrd
	@echo "# Superuser access is needed for the next part."
	$(AS_ROOT) make rootfs
	@echo "# Finished superuser part."
	gzip -9 initrd

bootloader:
	losetup $(LOOP_DEV) floppy.bin
	syslinux $(LOOP_DEV)
	losetup -d $(LOOP_DEV)

floppy.bin: initrd.gz src/boot/* linux memtest
	mformat -f 1440 -C -i floppy.bin ::
	@echo "# Superuser access is needed for the next part."
	$(AS_ROOT) make bootloader
	@echo "# Finished superuser part."
	mcopy -i floppy.bin src/boot/* linux initrd.gz memtest ::

MD5SUM: floppy.bin
	md5sum floppy.bin > MD5SUM

README: src/doc/README
	cp -p $< $@

mmdisk-$(VERSION).zip: $(BIN_FILES)
	rm -f $@
	zip -9 -o $@ $(BIN_FILES)

mmdisk-src-$(VERSION).zip: $(SRC_FILES) src/root/* src/boot/* src/doc/*
	rm -f $@
	zip -9 -r -o $@ $(SRC_FILES) src

unmount:
	-umount -d mnt
	-rmdir mnt

clean: unmount
	rm -f initrd.gz $(BIN_FILES)
	rm -rf $(BUSYBOX_DIR)
	rm -rf $(LINUX_DIR)
	rm -rf $(MEMTEST_DIR)
	rm -rf $(MPRIME_DIR)
	rm -f mmdisk-$(VERSION).zip mmdisk-src-$(VERSION).zip

realclean: clean
	rm -f busybox linux memtest mprime
