# Top-level Makefile for boot-floppies
#   see README* for information

# @@ Marcel FIXME: resc*.bin target for i386 make both resc*.bin and root*.bin:
#                  update scripts and clean make rules

all::	build

# Configurable variables reside in the config file.
# Note: see README for notes on how to build boot-floppies for just one language.
include config

# common variables
include make/vars

# architecture-specific variables
-include make/$(architecture).vars

# documentation rules live in documentation/Makefile*
include documentation/Makefile.docs

# i18n stuff -- must come after arch stuff
include make/i18n

# shell needs to be set to base for the release target, at least
SHELL = bash

# [ED] avoid direct compilation of C programs from the utilities subdir
# (see the root.bin dependencies).  BTW utils target does the right job.
.SUFFIXES:

null:
	: Null target for testing Makefile with "make -p null"

#---------------------------------------------------------------------------

localfiles:: updates
	set -e; \
	if [ -d $(incoming) ]; then \
	    cd $(incoming) ;\
	    find . -name '*_all.deb' -exec cp {} $(CURDIR)/updates/ \; ;\
	    find . -name '*_$(architecture).deb' -exec cp {} $(CURDIR)/updates/ \; ;\
	fi
	set -e; \
	if [ -d $(local_dir) ]; then \
	    cd $(local_dir) ;\
	    find . -name '*.deb' -exec cp {} $(CURDIR)/updates/ \; ;\
	fi
#	 it is better for the apt-get archives to be owned by user, not root
	[ -d $(archive) ] || mkdir -p $(archive)
	[ -d $(tmpdir)/boot-floppies ] || mkdir -p $(tmpdir)/boot-floppies

# dependency for the files that have to be copied
updates::
	[ -d updates ] || mkdir -p updates

build::	localfiles
	$(MAKE) utils
ifeq ($(architecture), i386)
	i18n_low_space=true make resc1200.bin resc1200-s.bin
	$(MAKE) resc1440.bin resc1440-s.bin
	$(MAKE) resc1440compact.bin
	$(MAKE) resc1440idepci.bin
	$(MAKE) resc1440bf2.4.bin
	$(MAKE) drivers.tgz
	$(MAKE) driverscompact.tgz
	$(MAKE) driversidepci.tgz
	$(MAKE) driversbf2.4.tgz
	$(MAKE) resc2880.bin
	$(MAKE) resc2880compact.bin
	$(MAKE) resc2880idepci.bin
	$(MAKE) resc2880bf2.4.bin
	$(MAKE) tftpboot.img
	$(MAKE) tftpboot-compact.img
	$(MAKE) tftpboot-idepci.img
	$(MAKE) tftpboot-bf2.4.img
else 
ifeq ($(architecture), m68k)
	$(MAKE) resc1440atari.bin driversatari.tgz
	$(MAKE) resc1440amiga.bin driversamiga.tgz
	$(MAKE) resc1440mac.bin driversmac.tgz
	$(MAKE) resc2880bvme6000.bin resc1440bvme6000.bin driversbvme6000.tgz
	$(MAKE) resc1440mvme16x.bin driversmvme16x.tgz
	$(MAKE) resc1440mvme147.bin driversmvme147.tgz
else 
ifeq ($(architecture), powerpc)
	$(MAKE) resc1440apus.bin driversapus.tgz
	$(MAKE) resc1440chrp.bin driverschrp.tgz
#	$(MAKE) resc1440mbx.bin driversmbx.tgz
	$(MAKE) resc1440pmac.bin driverspmac.tgz
	$(MAKE) resc2880newpmac.bin driversnewpmac.tgz
	$(MAKE) resc1440prep.bin driversprep.tgz bootprep.bin
#-----------------------------------------------------
#	$(MAKE) tftpboot-apus.img root.tar.gz
#	$(MAKE) tftpboot-chrp.img root.tar.gz
#	$(MAKE) tftpboot-mbx.img root.tar.gz
#	$(MAKE) tftpboot-pmac.img root.tar.gz
#	$(MAKE) tftpboot-prep.img root.tar.gz
else
ifeq ($(architecture), sparc)
	$(MAKE) resc1440sun4cdm.bin resc1440sun4u.bin
	$(MAKE) driverssun4cdm.tgz driverssun4u.tgz
	$(MAKE) tftpboot root.tar.gz
else
ifeq ($(architecture), alpha)
	mkdir -p $(alpha_milo_dir)
	for f in alcor xl book1 avanti cabriolet			\
		eb164 eb64p eb66 eb66p lx164 miata mikasa noname	\
		p2k sx164 takara; do					\
	    [ -f $(alpha_milo_dir)/milo-$(milo_version)-$$f ]		\
		|| (cd $(alpha_milo_dir)				\
			&& wget $(milo_url)/milo-$(milo_version)-$$f )  \
		|| exit 1;						\
	done
	for f in xlt pc164 ruffian; do					\
	    [ -f $(alpha_milo_dir)/milo-$$f ]				\
		|| (cd $(alpha_milo_dir)				\
			&& wget $(milo_url2)/milo-$$f )			\
		|| exit 1;						\
	done
# this is spelled out because for 2.2-18, subarch names don't fit
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-alcor	milo_alcor
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-xl	milo_xl
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-book1	milo_book1
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-avanti	milo_avanti
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-cabriolet	milo_cabriolet
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-eb164	milo_eb164
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-eb64p	milo_eb64p
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-eb66	milo_eb66
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-eb66p	milo_eb66p
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-lx164	milo_lx164
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-miata	milo_miata
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-mikasa	milo_mikasa
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-noname	milo_noname
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-p2k	milo_p2k
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-sx164	milo_sx164
	ln -sf $(alpha_milo_dir)/milo-$(milo_version)-takara	milo_takara

	ln -sf $(alpha_milo_dir)/milo-pc164			milo_pc164
	ln -sf $(alpha_milo_dir)/milo-ruffian			milo_ruffian
	ln -sf $(alpha_milo_dir)/milo-xlt			milo_xlt

	[ -f $(alpha_tools_dir)/linload.exe ] || \
	    ( cd $(alpha_tools_dir) && wget $(alpha_linload_url) )
	[ -f $(alpha_tools_dir)/ldmilo.exe ] || \
	    ( cd $(alpha_tools_dir) && wget $(alpha_ldmilo_url) -O ldmilo.exe )

	ln -sf $(alpha_tools_dir)/linload.exe
	ln -sf $(alpha_tools_dir)/ldmilo.exe

ifneq ($(alpha_apb_arches),)
	[ -f $(alpha_apb_dir)/apb.exe -a -f $(alpha_apb_dir)/up1000.pal ]  \
	    || ( mkdir -p $(alpha_apb_dir); cd $(alpha_apb_dir);	   \
		 wget $(alpha_apb_url) -O -				   \
		     | tar -xz apb.exe up1000.pal README.txt install.txt )

	ln -sf $(alpha_apb_dir)/apb.exe .
	ln -sf $(alpha_apb_dir)/up1000.pal .
	for i in $(alpha_apb_dir)/*.txt; do \
	    ln -sf $$i apb_$$(basename $$i); \
	done
endif
	$(MAKE) $(alpha_rescue_targets) $(alpha_drivers_targets) $(alpha_milo_targets)
ifeq ($(alpha_build_bootp),YES)
	$(MAKE) tftpboot.img root.tar.gz
endif
else
ifeq ($(architecture), arm) 
	for subarch in $(arm_arches); do \
		$(MAKE) kernel-$$subarch drivers$$subarch.tgz \
			rescue$$subarch.bin root$$subarch.bin; \
	done
	for subarch in $(arm_arches_tftp); do \
		$(MAKE) tftpboot-$$subarch.img; \
	done
	for subarch in $(arm_arches_nfsroot); do \
		$(MAKE) root$$subarch.tar.gz; \
	done
else
ifeq ($(architecture), ia64)
	$(MAKE) rootmckinley-smp.bin resc10000mckinley-smp.bin driversmckinley-smp.tgz
else
ifeq ($(architecture), mips)
	$(MAKE) driversr4k-ip22.tgz resc1440r4k-ip22.bin \
		tftpboot-r4k-ip22.img rootr4k-ip22.tar.gz
		 
else
ifeq ($(architecture), mipsel)
	$(MAKE) rootr4k-kn04.bin rootr4k-kn04.tar.gz
	$(MAKE) driversr4k-kn04.tgz resc1440r4k-kn04.bin resc2880r4k-kn04.bin
	$(MAKE) rootr3k-kn02.bin rootr3k-kn02.tar.gz
	$(MAKE) driversr3k-kn02.tgz resc1440r3k-kn02.bin resc2880r3k-kn02.bin
	# $(MAKE) -C mips-specials addinitrd
	# addinitrd does not work with most DECstation firmware revisions
else
ifeq ($(architecture), hppa)
	$(MAKE) resc288032.bin drivers32.tgz
	$(MAKE) resc288064.bin drivers64.tgz
else
ifeq ($(architecture), s390)
	$(MAKE) s390extras
	$(MAKE) roots390.bin roots390.tar.gz
	$(MAKE) resc2880s390.bin driverss390.tgz
	$(MAKE) linuxs390-tape
else
	echo unsupported architecture: $(architecture); false
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
ifeq ($(USE_LANGUAGE_CHOOSER),true)
	$(MAKE) xlp.tgz
endif

release/README.txt: README-Users.m4
#	 make the top-level README
	[ -d release ] || mkdir release
	m4 --define=ARCHITECTURE=$(architecture) \
	   --define=RELNAME=$(debname) \
		$< > $@

release/READ-%.txt: README-Users.%.m4
#	 make the top-level README in any language
	[ -d release ] || mkdir release
	m4 --define=ARCHITECTURE=$(architecture) \
	   --define=RELNAME=$(debname) \
		$< > $@

.PHONY: release
release:	build docs
ifeq ($(architecture),alpha)
	./release.sh $(architecture) $(debname) $(debianversion) $(alpha_arches)	
else
ifeq ($(architecture),sparc)
	./release.sh $(architecture) $(debname) $(debianversion) $(generic_rootdisk_no_wildcard)
else
ifeq ($(architecture),arm)
	TOOLS_DIR=$(tools_dir) arm_arches="$(arm_arches)" arm_arches_tftp="$(arm_arches_tftp)" arm_arches_nfsroot="$(arm_arches_nfsroot)" arm_arches_rootbin="$(arm_arches_rootbin)" arm_arches_linux="$(arm_arches_linux)" ./release.sh $(architecture) $(debname) $(debianversion)
else
	TOOLS_DIR=$(tools_dir) ./release.sh $(architecture) $(debname) $(debianversion)
endif
endif
endif

.PHONY: umount
umount:
	-for d in ${tmpdir}/boot-floppies/mnt.*; do umount $$d; done;
#	 also need to unmount /dev/pts and /proc in base-tmp
#	 directories if the build was interrupted
	-find ${tmpdir}/boot-floppies -path '*/dev/pts' -o -path '*/proc' \
		-a -type d | xargs -r umount

.PHONY: cleanfiles
cleanfiles:
	rm -f *.bin *.tgz sys_map*.gz config*.gz linux* modcont* core	\
		root*.tar.gz *.img *.tmp *.o *.iso $(SFONT) xlp.tgz
	rm -f `find -name \*~` disks-$(architecture)
	rm -f `find -name '.#*'`
	rm -rf release updates

.PHONY: clean
clean:	cleanfiles
	set -e; for dir in utilities scripts/rootdisk/messages documentation \
			   powerpc-specials s390-specials ; \
		do \
		    $(MAKE) -C $$dir $@ ;\
		done
	$(ROOTCMD) $(MAKE) umount
	$(ROOTCMD) rm -rf $(tmpdir)/boot-floppies
# and drop the tarball with device files
#	rm -rf devtarball.tgz

.PHONY: cleanarchive
cleanarchive:
	$(ROOTCMD) rm -rf $(archive)

.PHONY: distclean
distclean:	clean cleanarchive
	$(MAKE) -C utilities distclean
	$(MAKE) -C documentation distclean

include make/keymaps
include make/modules
include make/checks
include make/root
include make/rescue
include make/drivers
include make/tftp
include make/utils

##
## optional file with special rules for this architecture
##
-include make/$(architecture).rules

sign:
	pgp +clearsig=on -fast <release/md5sum.txt >release/md5sum.tmp
	mv release/md5sum.tmp release/md5sum.txt

