#############################################################################
#                         ALMOS-MKH Global Makefile                         #
#############################################################################

-include params-soft.mk
ifeq ($(ARCH_NAME),)
$(error Please define in ARCH_NAME parameter in params-soft.mk!)
endif

-include params-hard.mk

# Default values for hardware parameters.
# These parameters should be defined in the 'params-hard.mk' file.
ARCH		?= /users/alain/soc/tsar-trunk-svn-2013/platforms/tsar_generic_iob
X_SIZE		?= 2
Y_SIZE		?= 2
NB_PROCS	?= 2
NB_TTYS		?= 3
FBF_WIDTH	?= 256
IOC_TYPE	?= IOC_BDV

# Checking hardware platform definition.
ifeq ($(wildcard $(ARCH)),)
$(error Please define in ARCH parameter the path to the hardware platform!)
endif

# Rules that don't build target files
# always out-of-date, need to be regenerated everytime they are called
.PHONY: compile		     	               \
        hard_config.h                      \
		dirs				               \
		list				               \
		extract				               \
		fsck				               \
		clean				               \
		build_libs                         \
		build-disk			               \
		$(BOOTLOADER_PATH)/build/boot.elf  \
		kernel/build/kernel.elf            \
		user/init/build/init.elf           \
		user/ksh/build/ksh.elf             \
		user/pgdc/build/pgcd.elf           \
		user/idbg/build/idbg.elf           \
		user/sort/build/sort.elf           \
        user/fft/build/fft.elf

# Virtual disk path
DISK_IMAGE	:= hdd/virt_hdd.dmg

# The Mtools used to build the FAT32 disk image perfom a few sanity checks, to
# make sure that the disk is indeed an MS-DOS disk. However, the size of the
# disk image used by ALMOS-MKH is not MS-DOS compliant.
# Setting this variable prevents these checks.
MTOOLS_SKIP_CHECK := 1

# Rule to generate boot.elf, kernel.elf, all user.elf files, and update virtual disk.
compile: dirs                              \
         build_disk                        \
         hard_config.h                     \
         build_libs                        \
         $(BOOTLOADER_PATH)/build/boot.elf \
         kernel/build/kernel.elf           \
         user/init/build/init.elf          \
         user/ksh/build/ksh.elf            \
         user/pgcd/build/pgcd.elf          \
         user/idbg/build/idbg.elf          \
         user/sort/build/sort.elf          \
         user/fft/build/fft.elf           \
         list

# Rule to create the hdd directory
dirs:
	@mkdir -p hdd

# Rule to make a recursive list of the virtual disk content.
list:
	mdir -/ -b -i $(DISK_IMAGE) ::/

##############################################################
# Rule to copy the files generated by the virtual prototype
# from the virtual disk 'home' directory to the current directory.
extract:
	mcopy -o -i $(DISK_IMAGE) ::/home .

# Rules to delete all binary files from Unix File System
# without modifying the virtual disk.
clean:
	rm -f hard_config.h arch_info.xml arch_info.bin
	rm -rf build
	$(MAKE) -C kernel clean
	$(MAKE) -C $(BOOTLOADER_PATH) clean
	$(MAKE) -C $(LIBC_PATH) clean
	$(MAKE) -C $(LIBPTHREAD_PATH) clean
	$(MAKE) -C $(LIBSEMAPHORE_PATH) clean
	$(MAKE) -C $(LIBALMOSMKH_PATH) clean
	$(MAKE) -C user/init clean
	$(MAKE) -C user/ksh clean
	$(MAKE) -C user/sort clean
	$(MAKE) -C user/pgcd clean
	$(MAKE) -C user/idbg clean
	$(MAKE) -C user/fft clean
	$(MAKE) -C $(HAL_ARCH) clean

####################################################	
# Rule for building a new virtual disk from scratch.
# It creates the bin, bin/kernel, bin/user, and home directories.
# This requires the generic Linux/MacOS 'create_dmg' script, that should be
# placed in the same directory as this Makefile.
build_disk: dirs
	rm -f $(DISK_IMAGE)
	./create_dmg  	create $(basename $(DISK_IMAGE))
	dd 				if=$(DISK_IMAGE) of=temp.dmg count=65536
	mv 				temp.dmg $(DISK_IMAGE)
	mmd 			-o -i $(DISK_IMAGE) ::/bin         || true
	mmd 			-o -i $(DISK_IMAGE) ::/bin/kernel  || true
	mmd 			-o -i $(DISK_IMAGE) ::/bin/user    || true
	mmd 			-o -i $(DISK_IMAGE) ::/home        || true
	mdir		 -/ -b -i $(DISK_IMAGE) ::/
	
##############################################################
# Rules to generate hardware description files (hard_config.h,
# arch_info.bin and arch_info.xml), and update the virtual disk.
hard_config.h: build_disk $(ARCH)/arch_info.py
	tools/arch_info/genarch.py	--arch=$(ARCH)			\
								--x_size=$(X_SIZE)		\
								--y_size=$(Y_SIZE)		\
								--nb_cores=$(NB_PROCS)	\
								--nb_ttys=$(NB_TTYS)	\
								--fbf_size=$(FBF_WIDTH)	\
								--ioc_type=$(IOC_TYPE)	\
								--hard=.				\
								--bin=.					\
								--xml=.					
	mcopy -o -i $(DISK_IMAGE) arch_info.bin ::/   || true
	mdir		 -/ -b -i $(DISK_IMAGE) ::/

############################################
# Rules to generate the user level libraries
build_libs: build_hal
	$(MAKE) -C $(LIBALMOSMKH_PATH) headers
	$(MAKE) -C $(LIBPTHREAD_PATH) headers
	$(MAKE) -C $(LIBSEMAPHORE_PATH) headers
	$(MAKE) -C $(LIBMATH_PATH) headers
	$(MAKE) -C $(LIBC_PATH)
	$(MAKE) -C $(LIBALMOSMKH_PATH)
	$(MAKE) -C $(LIBPTHREAD_PATH)
	$(MAKE) -C $(LIBSEMAPHORE_PATH) 
	$(MAKE) -C $(LIBMATH_PATH) 

#####################################################################
# Rule to generate boot.elf and place it in sector #2 of virtual disk
$(BOOTLOADER_PATH)/build/boot.elf:
	$(MAKE) -C $(BOOTLOADER_PATH)
	dd if=$@ of=$(DISK_IMAGE) seek=2 conv=notrunc

######################################################
# Rule to generate HAL objects (depending on HAL_ARCH)
build_hal:
	$(MAKE) -C $(HAL_ARCH)

#############################################################
# Rule to generate kernel.elf and place it on virtual disk
kernel/build/kernel.elf: build_hal
	$(MAKE) -C kernel/
	mcopy -o -i $(DISK_IMAGE) $@ ::/bin/kernel

#####################################################
# Rules to generate user.elf and copy on virtual disk
user/init/build/init.elf: build_libs
	$(MAKE) -C user/init
	mcopy -o -i $(DISK_IMAGE) $@ ::/bin/user
user/ksh/build/ksh.elf: build_libs
	$(MAKE) -C user/ksh
	mcopy -o -i $(DISK_IMAGE) $@ ::/bin/user
user/pgcd/build/pgcd.elf: build_libs
	$(MAKE) -C user/pgcd
	mcopy -o -i $(DISK_IMAGE) $@ ::/bin/user
user/idbg/build/idbg.elf: build_libs
	$(MAKE) -C user/idbg
	mcopy -o -i $(DISK_IMAGE) $@ ::/bin/user
user/sort/build/sort.elf: build_libs
	$(MAKE) -C user/sort
	mcopy -o -i $(DISK_IMAGE) $@ ::/bin/user
user/fft/build/fft.elf: build_libs
	$(MAKE) -C user/fft
	mcopy -o -i $(DISK_IMAGE) $@ ::/bin/user
