# Shag/OS boot Makefile
# for 386/486/Pentium based PC machines

REQUIRES += $(BINDIR)/genofs

# bootprep:	
#	Build everything needed to make a bootdisk, but
#	don't attempt to actually create the disk
# bootdisk:
#	Build everything and create a bootdisk, on
#	device $(BOOTDEV), size $(BOOTSIZE)K,
#	using the $(BOOTFS) filesystem.

Extensions += S86 o86
Rule_S86_o86 = S86
#Command_S86 = $$CPP $$(Includes) $$*.S86 | \
#		sed 's/\("$$\)\|\(^"\)//g' >$$*.s86; \
#		as86 $$(Flags) -o $$*.o86 $$*.s86
Command_S86 = $$CPP $$(Includes) $$*.S86 | \
		sed 's/^"//' >$$*.s86; \
		as86 $$(Flags) -o $$*.o86 $$*.s86


Flags_Wanted_S86 = -0 -a 
Includes_Wanted_S86 = -DASM

#.SUFFIXES: .S86 .bin

XINCPATH = boot
XINCFILES += chunk.h boot.h \
		device.h keyboard.h table.h \
		make/boot.ofs
INCFILES += macro.h debug.h vmem.h devio.h bios.h ArgParse.h
SRCFILES += shagboot.S86 solo.S86 chunk.S86 exec.S86 device.S86 \
		argv.S86 string.S86 date.S86 environ.S86 error.S86 \
		cpuinfo.S86 stdio.S86 lboot.S86 mapfile.S86 devio.S86 \
		a_out.S86 elf.S86 table.S86 dumpboot.S86 video.S86 \
		solo_ver.S86
SRCFILES += mksolo.C dump.c readmap.C ArgParse.C
SRCFILES += solotest.C fdisk.C hello.C shuffle.C lsboot.C
LINKFILES += m-pc/solo.hlp m-pc/solo.cmd m-pc/solo.cnf m-pc/mkboot
SFILES += solotest.x fdisk.x hello.x shuffle.x lsboot.x
STFILES += solotest fdisk hello 
LXFILES += mksolo dump readmap 
TARGETS += shagboot.bin solo.bin 
CONFIGFILES += $(LINKFILES)

#MKBOOT = $(SRC)$(SPATH)/m-pc/mkboot
MKBOOT = ./mkboot

CGENOFS = $(BINDIR)/cgenofs "$(CPP) \
$(Includes_Wanted) $(Includes_Wanted_c) $(Includes_Wanted_C)" "$(CXX)"


mksolo_OBJS += mksolo.o ArgParse.o 
mksolo_FLAGS += -Wl,-s 
mksolo: $(mksolo_OBJS)

dump_OBJS += dump.o
dump_FLAGS += -Wl,-s
dump: $(dump_OBJS)

readmap_OBJS += readmap.o
readmap_FLAGS += -Wl,-s 
readmap: $(readmap_OBJS)

solotest.x_OBJS += solotest.o 
solotest.x_LIBS += -lsolo -lstdc
solotest.x: $(solotest.x_OBJS) 
solotest: $(solotest.x_OBJS)

fdisk.x_OBJS += fdisk.o
fdisk.x_LIBS += -lsolo -lstdc 
fdisk.x: $(fdisk.x_OBJS) 
fdisk: $(fdisk.x_OBJS)

hello.x_OBJS += hello.o
hello.x_LIBS += -lsolo -lstdc
hello.x: $(hello.x_OBJS)
hello: $(hello.x_OBJS)

shuffle.x_OBJS += shuffle.o
shuffle.x_LIBS += -lsolo -lstdc
shuffle.x: $(shuffle.x_OBJS)

lsboot.x_OBJS += lsboot.o
lsboot.x_LIBS += -lsolo -lstdc
lsboot.x: $(lsboot.x_OBJS)

COMMANDS += bootprep allbootprep allboot 

bootprep: solo.bin shagboot.bin dumpboot.sec \
		mksolo readmap \
		solotest.x fdisk.x hello.x shuffle.x lsboot.x
allbootprep: $(BASE)/sys/mkern/mkern.all bootprep
allboot: $(BASE)/sys/mkern/mkern.all bootdisk


COMMANDS += newbootdisk bootdisk bootdisk_hda5 bootdisk_sys

newbootdisk: bootprep 
	$(MKBOOT) /mnt /dev/fd0 msdos

bootdisk: bootprep 
	$(MKBOOT) /mnt /dev/fd0

bootdisk_a: bootprep
	$(MKBOOT) /a /dev/fd0

bootdisk_fd0: bootprep
	$(MKBOOT) /fd0 /dev/fd0

bootdisk_hda5: bootprep
	$(MKBOOT) /hda5 /dev/hda5

bootdisk_sys: bootprep
	$(MKBOOT) / /dev/hda

uninstall: bootprep
	mount /a; ./mksolo -u -d -b /dev/fd0 -r /a sys/solo.cnf; umount /a

uninstall_sys: bootprep
	mount /sys; ./mksolo -u -d -b /dev/hda4 -r /sys sys/solo.cnf; umount /sys

 
shagboot.bin_OBJS = shagboot.o86
shagboot.bin_FLAGS = -T `cat BOOTCODE_ADR`
shagboot.bin: BOOTCODE_ADR $(shagboot.bin_OBJS)

solo.bin_OBJS = solo.o86 stdio.o86 cpuinfo.o86 device.o86 \
		argv.o86 string.o86 environ.o86 date.o86 error.o86 \
		devio.o86 mapfile.o86 chunk.o86 video.o86 \
		exec.o86 elf.o86 table.o86 lboot.o86 a_out.o86 \
		solo_ver.o86
solo.bin_VER = solo_ver.o86
solo.bin_FLAGS = -T `cat LOAD_ADR`
solo.bin: LOAD_ADR $(solo.bin_OBJS) 


dumpboot.sec_OBJS = dumpboot.o86 
dumpboot.sec_FLAGS = -T `cat BOOT_ADR`
dumpboot.sec: BOOT_ADR $(dumpboot.sec_OBJS)


solo.bin shagboot.bin dumpboot.sec: 
	@if [ x$(@_VER) != x ] ; then \
		rm -f $(@_VER); \
		$(MAKE) $(@_VER); \
	fi
	@cmd="ld86 -0 -s -M $($@_FLAGS) -o $@.1 $($@_OBJS)"; \
	echo $$cmd; ($$cmd > $@.rsym); \
	if [ $$? != 0 ] ; then \
		grep : $@.rsym; \
		exit 1; \
	fi; \
	sort +3 $@.rsym > $@.sym; \
	dd if=$@.1 of=$@ bs=32 skip=1 conv=sync; \
	rm -f $@.1 

boot.ofs: boot.h #config.var
	$(CGENOFS) boot.h boot.ofs DiskParam Partition BootBlock 

BOOTCODE_ADR: boot.h; $(BINDIR)/extract BOOTCODE_ADR boot.h > BOOTCODE_ADR
LOAD_ADR: boot.h; $(BINDIR)/extract LOAD_ADR boot.h > LOAD_ADR
BOOT_ADR: boot.h; $(BINDIR)/extract BOOT_ADR boot.h > BOOT_ADR


