# ------------------------------------------------------------------------------
#
# Copyright 2010 Intel Corporation.  All Rights Reserved.
#
# The source code contained or described herein and all documents related to
# the source code ("Material") are owned by Intel Corporation or its
# suppliers or licensors.  Title to the Material remains with
# Intel Corporation or its suppliers and licensors.  The Material contains
# trade secrets and proprietary and confidential information of Intel or its
# suppliers and licensors.  The Material is protected by worldwide copyright
# and trade secret laws and treaty provisions.  No part of the Material may
# be used, copied, reproduced, modified, published, uploaded, posted,
# transmitted, distributed, or disclosed in any way without Intels prior
# express written permission.
#
# No license under any patent, copyright, trade secret or other intellectual
# property right is granted to or conferred upon you by disclosure or
# delivery of the Materials,  either expressly, by implication, inducement,
# estoppel or otherwise.  Any license under such intellectual property
# rights must be express and approved by Intel in writing.
#
#-----------------------------------------------------------------------------

# Constants
APP = remotedrivemount
APP_ISO = $(APP).iso
BUSYBOX = busybox-1.22.1
LINUX = linux-3.12.13
SYSLINUX = syslinux-4.03
ZLIB = zlib-1.2.5
ISCSI = iscsitarget-code-499-trunk
GRUB2 = grub-2.00
all: clean init busybox kernel iscsi syslinux grub2 grub2image zlib iso 

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

clean:
	-rm -rf _install
	-rm -rf kernel
	-rm $(APP_ISO)

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

#Initialize
init:
	-mkdir _install
	
	#Setup Init
	-cp -R collateral/etc/ _install/

	#create necessary default directories
	-mkdir _install/mnt
	-mkdir _install/proc
	-mkdir _install/root
	-mkdir _install/tmp
	-mkdir _install/sys
	-mkdir _install/sys/class
	-mkdir _install/dev
	-mkdir _install/lib
	-mkdir _install/lib/modules
	-mkdir _install/lib/tls
	-mkdir _install/lib/tls/i686/
	-mkdir _install/var
	-mkdir _install/var/run
	-mkdir _install/var/log


	#create block devices for login
	-mknod -m 600 _install/dev/console c 5 1

	#copy udhcpc script
	-mkdir _install/usr
	-mkdir _install/usr/share
	-mkdir _install/usr/share/udhcpc
	-cp collateral/default.script _install/usr/share/udhcpc/default.script

	#copy main script
	-mkdir _install/usr/bin
	-cp collateral/usr/bin/runscript _install/usr/bin/runscript
	-ln -s  /lib /lib/tls/i686/cmov

	#unmount directory contains autoumount script
	-cp collateral/usr/bin/autoumount _install/usr/bin/autoumount

	#NOTE: The following two libraries are required for DNS resolution.
	-cp collateral/libs/libnss_dns-2.12.1.so _install/lib/libnss_dns.so.2
	-cp collateral/libs/libresolv-2.12.1.so _install/lib/libresolv.so.2

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

#iscsi
.PHONY: iscsi
iscsi: init
		
	#make required directories
	-mkdir _install/etc
	-mkdir _install/etc/init.d	
	
	#copy libs from rds libs directory
	-cp collateral/libs/libc.so.6 _install/lib/x86_64-linux-gnu/libc.so.6
	-cp collateral/libs/ld-linux-x86-64.so.2 _install/lib64/ld-linux-x86-64.so.2
	
	#install fresh
	-rm -rf iscsi
	-tar -xf tars/$(ISCSI).tar.bz2
	-mv $(ISCSI) iscsi

	touch _install/var/log/syslog
	touch _install/var/log/sys.log
	touch _install/var/log/messages

	cd iscsi; make KSRC=../linux kernel
	cd iscsi; make KSRC=../linux usr

	cp iscsi/kernel/iscsi_trgt.ko _install/lib/modules/
	cp iscsi/usr/ietd _install/usr/sbin
	cp iscsi/usr/ietadm _install/usr/sbin
	cp iscsi/etc/initd/initd _install/etc/init.d/iscsi-target

	strip _install/usr/sbin/ietadm
	upx -9 -q _install/usr/sbin/ietadm

	strip _install/usr/sbin/ietd
	upx -9 -q _install/usr/sbin/ietd

#--------------------------------------------------------------------------------------
#busybox
.PHONY: busybox
busybox: init
	
	-mkdir _install/bin
	-mkdir _install/lib
	-mkdir _install/lib/tls
	-mkdir _install/lib/tls/i686
	-mkdir _install/lib/x86_64-linux-gnu
	-mkdir _install/lib64
	-mkdir _install/sys
	-mkdir _install/sys/class
	
	#copy libs from rds libs directory
	-cp collateral/libs/libm.so.6 _install/lib/x86_64-linux-gnu/libm.so.6
	-cp collateral/libs/libc.so.6 _install/lib/x86_64-linux-gnu/libc.so.6
	-cp collateral/libs/ld-linux-x86-64.so.2 _install/lib64/ld-linux-x86-64.so.2

	#install fresh
	-rm -rf busybox
	-tar -xf tars/$(BUSYBOX).tar.bz2
	-mv $(BUSYBOX) busybox
	
	cd busybox; make distclean; cp -a ../collateral/busybox/.busyboxconfig .config;	make install
#----------------------------------------------------------------------------------------------

#KERNEL
.PHONY: kernel
kernel: init
	#install fresh
	-rm -rf linux
	#-tar -xf tars/$(LINUX).tar.bz2
	-tar -xf tars/$(LINUX).tar.xz
	-mv $(LINUX) linux

	-rm -rf kernel
	-mkdir kernel
	cd linux; make distclean; make mrproper
	-cp -a collateral/linux/.config linux/.config

	cd linux; make bzImage
	-cp -a linux/arch/x86/boot/bzImage kernel/vmlinuz-rds
	-cp -a linux/usr/gen_init_cpio kernel/gen_init_cpio

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

#Syslinux
.PHONY: syslinux
syslinux: init
	#install fresh
	-rm -rf syslinux
	-tar -xf tars/$(SYSLINUX).tar.gz
	-mv $(SYSLINUX) syslinux
	
	-rm collateral/iso/isolinux.bin
	cd syslinux; make clean
	cd syslinux; make
	cp -a syslinux/core/isolinux.bin collateral/iso/isolinux.bin

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

#Grub2
.PHONY: grub2
grub2: init
	#install fresh
	-rm -rf grub2
	-tar -xf tars/$(GRUB2).tar.xz
	-mv $(GRUB2) grub2
	mkdir -p grub2/compiled/
	cd grub2; sudo ./configure --prefix=$(CURDIR)/grub2/compiled/ --with-platform=efi
	cd grub2; make install

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

#Grub2image
.PHONY: grub2image
grub2image: init

	#build a grub2 efi standalone image
	#Grub 2 has a builtin script for this but I made my own so I had more control on what is included and where.
	-rm -rf g2/
	-rm -f collateral/grub2/grub2.efi	
	mkdir -p g2/boot/grub/x86_64-efi/
	mkdir -p g2/boot/grub/locale/
	mkdir -p g2/boot/grub/fonts/
	#cp -f grub2/compiled/lib/grub/x86_64-efi/*.mod g2/boot/grub/x86_64-efi/
	# only the required modules to stay small	
	cp -f grub2/compiled/lib/grub/x86_64-efi/efi_gop.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/efi_uga.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/gfxterm.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/font.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/memdisk.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/tar.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/iso9660.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/normal.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/boot.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/extcmd.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/crypto.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/terminal.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/gettext.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/linux.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/relocator.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/video.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/mmap.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/bufio.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/video_fb.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/bitmap_scale.mod g2/boot/grub/x86_64-efi/
	cp -f grub2/compiled/lib/grub/x86_64-efi/fshelp.mod g2/boot/grub/x86_64-efi/

	#cp -f grub2/compiled/lib/grub/x86_64-efi/efi_gop.mod g2/boot/grub/x86_64-efi/

	cp -f grub2/compiled/lib/grub/x86_64-efi/*.lst g2/boot/grub/x86_64-efi/
	cp -f collateral/grub2/unicode.pf2 g2/boot/grub/fonts/
	cp -f collateral/grub2/grub.cfg g2/boot/grub/

	cd g2; tar -cf g2mdsk.tar *
	grub2/compiled/bin/grub-mkimage -O x86_64-efi -m g2/g2mdsk.tar -o collateral/grub2/grub2.efi --prefix='(memdisk)/boot/grub' memdisk tar
	#collateral/grub2/bin/grub-mkimage -O x86_64-efi -C xz -m g2/g2mdsk.tar -o collateral/grub2/grub2.efi --prefix='(memdisk)/boot/grub' memdisk tar
	-rm -rf g2/

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

#Zlib Library
.PHONY: zlib
zlib: init
	#install fresh
	-rm -rf zlib
	-tar -xf tars/$(ZLIB).tar.gz
	-mv $(ZLIB) zlib
	

#Clean old zlib
	-rm _install/lib/libz.so.1
	-rm -rf zlib/_install

#Create necessary directories
	-mkdir zlib/_install
	-mkdir zlib/_install/libdir
	-mkdir _install/lib
	
#make zlib
	path=`pwd`; cd zlib; ./configure --prefix="$$path"/zlib/_install --libdir="$$path"/zlib/_install/libdir --shared
	cd zlib; make
	cd zlib; make install

#copy zlib lib to _install
	cp -a zlib/_install/libdir/libz.so.1.2.5 _install/lib/libz.so.1
 
#--------------------------------------------------------------------------------------


#ISO
iso:
	rm -f $(APP)
	rm -f $(APP_ISO)
	rm -rf isoimage/
	rm -rf cdrom
	rm -rf efi
	rm -rf images

	mkdir -p images cdrom isoimage efi
	cp -a collateral/license/COPYING.ZLIB isoimage/
	cp -a collateral/license/LICENSE.RTF isoimage/
	cp -a collateral/license/COPYING isoimage/
	cp -a collateral/license/COPYING.LIB isoimage/
	cp -a collateral/iso/isolinux.bin isoimage/
	cp -a collateral/iso/isolinux.cfg isoimage/
	cp -a kernel/vmlinuz-rds isoimage/vmlinuz

	dd if=/dev/zero of=images/initrd.img bs=1k count=160000
	/sbin/mke2fs -F -v -m0 images/initrd.img
	mount -o loop images/initrd.img ./cdrom
	chmod 4755 ./_install/bin/busybox
	cp -av _install/* ./cdrom/.
	sleep 1s
	umount ./cdrom
	lzma -9 < images/initrd.img > isoimage/initrd.bin

	# Make EFI boot.img
	dd if=/dev/zero of=images/efiboot.img bs=1k count=3100
	mkdosfs -F 12 images/efiboot.img
	mount -o loop images/efiboot.img ./efi
	-mkdir -p ./efi/EFI/BOOT

	# Grub2
	-cp collateral/grub2/grub2.efi efi/EFI/BOOT/bootx64.efi

	sleep 1s
	umount ./efi

	cp -a images/efiboot.img isoimage/
	#mkisofs -R -o ./$(APP_ISO) -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table isoimage/
	mkisofs -R -o ./$(APP_ISO) -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e efiboot.img -no-emul-boot isoimage/
	rm -rf isoimage/
	rm -rf cdrom
	rm -rf images
	rm -rf $(APP).tar.gz

	tar -cvzf $(APP).tar.gz collateral tars makefile $(APP_ISO)
	cp $(APP_ISO) /mnt/$(APP_ISO)

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