# do not edit this file
# all user configuration options are in
#
#		Makefile.config
#
# Use "make clean" to tidy up the source directory
#
# Use "make check_linux" to get some basic info about your Linux
#
# Use "make trial_patch" to see if the kernel patch would apply
#
# Use "make apply_patch" to patch the kernel
#
# Use "make devices" to create the ppdd devices
#
# Use "make" or "make all" to compile the user programs
#            (note you must patch the kernel first)
# 
# Use "make initrd" to create an initrd for root filesystems
#            (note you need ram disc in the running kernel too)
#
# Use "make install" to install the user programs
#
# Use "make tests" to test everything
#            (note you must install the programs first and 
#             reboot and run from the ppdd patched kernel)   
#
# Use "make bootdisk" to make a bootable floppy for use with
#			root filesystem encryption
#
# You must modify your lilo configuation yourself !!!!
#
# If you are going to run ppdd on the root filesystem
# you must modify your init scripts yourself !!!!
#
# Please do not use any of the other make functions directly
#

include Makefile.config

PPDD_REVISION = 1.10
INITRD_SIZE=800
CC = gcc
AR = ar
ARFLAGS = -r
CFLAGS = -O2
SLDFLAGS = -static
WARNFLAGS = -Wall -Wstrict-prototypes -Wmissing-prototypes

# End of configuration section.

KSOURCE_PATH = $(KERNEL_PATH)/linux

COMPILE = $(CC) -c $(WARNFLAGS) $(CFLAGS) $(DEFINES)
ARCH = $(AR) $(ARFLAGS)
LINK = $(CC) $(LDFLAGS)
SLINK = $(CC) $(SLDFLAGS)

SBINPROGS = ppddsetup ppddinit ppddpassw ppddreopen ppdecrypt ppdncrypt\
 ppddcsum ppdduprev ppddmchk
SBINSCRIPTS = ppdddown
IRDPROGS = linuxrc 
PROGS = $(SBINPROGS) $(IRDPROGS)

LO_OBJS = bf-i386.o pass.o setppdd.o crc32.o intro.o bfcrypt.o md5.o errors.o

 
all: check_before_all $(PROGS)

%.o: %.c
	$(COMPILE) $<

ppddlib.a : $(LO_OBJS)
	$(AR) $(ARFLAGS) ppddlib.a $(LO_OBJS)

linuxrc: linuxrc.o  ppddlib.a
	$(SLINK) $^ -o $@

ppdduprev: ppdduprev.o ppddlib.a 
	$(LINK) $^ -o $@

ppddreopen: ppddreopen.o ppddlib.a 
	$(LINK) $^ -o $@

ppddcsum: ppddcsum.o ppddlib.a
	$(LINK) $^ -o $@

ppdncrypt: ppdncrypt.o ppddlib.a
	$(LINK) $^ -o $@

ppdecrypt: ppdecrypt.o ppddlib.a
	$(LINK) $^ -o $@

ppddinit: ppddinit.o ppddlib.a
	$(LINK) $^ -o $@

ppddsetup: ppddsetup.o ppddlib.a
	$(LINK) $^ -o $@

ppddpassw: ppddpassw.o  ppddlib.a
	$(LINK) $^ -o $@

linuxrc.o: ppddmount.h md5.h errors.h
ppdduprev.o: ppddmount.h errors.h
ppddreopen.o: ppddmount.h errors.h
ppddcsum.o: ppddmount.h md5.h errors.h
ppdncrypt.o: ppddmount.h md5.h errors.h
ppdecrypt.o: ppddmount.h md5.h errors.h
ppddinit.o: ppddmount.h errors.h
ppddsetup.o: ppddmount.h md5.h errors.h
ppddpassw.o: ppddmount.h errors.h
pass.o: ppddmount.h errors.h
setppdd.o: ppddmount.h md5.h errors.h
errors.o: errors.h


clean:
	@rm -f ppddlib.a initrd.rd a.out core *~ *.o $(PROGS) 
	@(umount /dev/ram0 2>/dev/null; exit 0)
	@rm -rf initrd
	@(umount /dev/ppdd0 2>/dev/null;umount test_dir/mnt 2>/dev/null;exit 0)
	@sleep 1
	@(ppddsetup -d /dev/ppdd0 2>/dev/null >/dev/null;exit 0)
	@rm -rf test_dir
	@echo Clean


devices:
	@rm -f /dev/ram0
	@mknod -m 640 /dev/ram0 b 1 0
	@chown root.disk /dev/ram0
	@(for N in 0 1 2 3 4 5 6 7; \
	do \
		rm -f /dev/ppdd$$N; \
		mknod -m 0 /dev/ppdd$$N b ${DEVICE_MAJOR} $$N; \
		chown 0.0 /dev/ppdd$$N; \
	done)
	@echo
	@echo You should have 8 ppdd devices and ram0
	@echo
	@ls -l /dev/ppdd* /dev/ram0


check_rr:
	@(if [ ! -b ${REAL_ROOT_DEVICE} ]; then \
	echo ${REAL_ROOT_DEVICE} is not a block special file; \
	exit 1; \
	fi)


initrd: check_rr
	@(umount /dev/ram0 2>/dev/null; exit 0)
	@rm -rf initrd
	@mkdir initrd
	@mkfs /dev/ram0 ${INITRD_SIZE}
	@mount /dev/ram0 initrd
	@mkdir initrd/proc
	@mkdir initrd/dev
	@mknod initrd/dev/console c 4 0
	@mknod initrd/dev/tty1 c 4 1
	@mknod initrd/dev/tty c 5 0
	@mknod initrd/dev/ppdd0 b ${DEVICE_MAJOR} 0
	@mkdir initrd/etc
	@echo /dev/ppdd / ext2 defaults 1 1 > initrd/etc/fstab
	@echo none /proc proc defaults 0 0 >> initrd/etc/fstab
	@cp linuxrc initrd
	@chmod 700 initrd/*
	@if [ "${ROOT_CHECKSUM}" = "Y" ]; then touch initrd/csum; \
chmod 0 initrd/csum; fi
	@(MAJOR=`ls -l ${REAL_ROOT_DEVICE}|sed -e"s/  */ /g" -e"s/,//"|cut -d" " -f5`; \
	MINOR=`ls -l ${REAL_ROOT_DEVICE}|sed -e"s/  */ /g" -e"s/,//"|cut -d" " -f6`; \
	echo; \
	echo Real root device is ${REAL_ROOT_DEVICE} Major=$${MAJOR} Minor=$${MINOR}; \
	echo; \
	mknod initrd${REAL_ROOT_DEVICE} b $${MAJOR} $${MINOR})
	@echo ${REAL_ROOT_DEVICE} > initrd/dev/rr
	@chmod 0 initrd/dev/*
	@chmod 0 initrd/etc/*
	@chown 0.0 -R initrd/*
	@umount /dev/ram0
	@dd if=/dev/ram0 of=initrd.rd bs=1024 count=${INITRD_SIZE}
	@rm -rf initrd
	@echo
	@echo Initial ram disk created OK


install:
	@(for N in 1 5 ; \
	do \
		cp -f man/*.$$N $(INSTALL_MAN_DIR)/man$$N; \
	done)
	@echo ppdd man pages installed in $(INSTALL_MAN_DIR)
	@cp -f $(SBINPROGS) $(SBINSCRIPTS) $(INSTALL_DIR)
	@(cd $(INSTALL_DIR); \
chown 0.0 $(SBINPROGS) $(SBINSCRIPTS); \
chmod 500 $(SBINPROGS) $(SBINSCRIPTS))
	@echo ppdd programs installed in $(INSTALL_DIR)
ifneq ($(INSTALL_INITRD_DIR),)
	@(if [ -f initrd.rd ]; then \
 cp -f initrd.rd $(INSTALL_INITRD_DIR); \
 echo ppdd initrd installed in $(INSTALL_INITRD_DIR); else \
 echo no initrd available to install in $(INSTALL_INITRD_DIR); fi)
ifeq ($(HAVE_LILO),Y)
	@echo running lilo to install in bootstrap
	@lilo
endif
endif


check_linux:
	@echo You asked for Linux version $(KERNEL_REVISION)
	@echo You are running on Linux version `cat /proc/version|cut -d" " -f3`
	@(MAJOR=`cat /proc/devices|fgrep " ppdd"|cut -dp -f1`; \
if [ "$${MAJOR}" = "" ]; then \
echo ppdd is not installed on the running kernel; else \
echo with ppdd installed as device $${MAJOR}; fi)
	@(if [ -f $(KSOURCE_PATH)/include/linux/version.h ]; then \
echo $(KSOURCE_PATH) contains Linux version \
`cat $(KSOURCE_PATH)/include/linux/version.h|fgrep "UTS"|cut -d'"' -f2`; else \
echo $(KSOURCE_PATH) contains no source or has not been compiled; fi)
	@(if [ -f $(KSOURCE_PATH)/include/linux/ppdd.h ]; then \
echo $(KSOURCE_PATH) contains the ppdd patch; \
diff -q $(KSOURCE_PATH)/include/linux/ppdd.h \
 linux-common-ppdd/include/linux/ppdd.h 2>&1 >/dev/null; \
if [ $$? != 0 ]; then \
echo but it differs from the one in this release; fi; else \
echo $(KSOURCE_PATH) does not contain the ppdd patch; fi)


check_before_all:
	@(if [ ! -f $(KSOURCE_PATH)/include/linux/version.h ]; then \
 echo $(KSOURCE_PATH) contains no source or has not been compiled; \
 exit 1; fi)
	@(SREV=`cat $(KSOURCE_PATH)/include/linux/version.h \
 |fgrep "UTS"|cut -d'"' -f2`; \
 if [ $${SREV} != $(KERNEL_REVISION) ]; then \
 echo You asked me to make ppdd for Linux $(KERNEL_REVISION) but your source is $${SREV}; \
 exit 1; fi)
	@(if [ ! -f $(KSOURCE_PATH)/include/linux/ppdd.h ]; then \
 echo $(KSOURCE_PATH) does not contain the ppdd patch; \
 exit 1; fi)
	@(diff -q $(KSOURCE_PATH)/include/linux/ppdd.h \
 linux-common-ppdd/include/linux/ppdd.h 2>&1 >/dev/null; \
if [ $$? != 0 ]; then \
echo The kernel patch is not the one from this release; exit 1; fi)


check_before_patch:
	@(if [ ! -f $(KSOURCE_PATH)/include/linux/version.h ]; then \
 echo $(KSOURCE_PATH) contains no source or has not been compiled; \
 exit 1; fi)
	@(SREV=`cat $(KSOURCE_PATH)/include/linux/version.h \
 |fgrep "UTS"|cut -d'"' -f2`; \
 if [ $${SREV} != $(KERNEL_REVISION) ]; then \
 echo You asked me to make ppdd for Linux $(KERNEL_REVISION) but your source is $${SREV}; \
 exit 1; fi)
	@(if [ -f $(KSOURCE_PATH)/include/linux/ppdd.h ]; then \
 echo $(KSOURCE_PATH) already contains the ppdd patch; \
 exit 1; fi)
	@(if [ ! -f ./patches/$(KERNEL_REVISION) ]; then \
 echo Sorry - I do not have a patch for $(KERNEL_REVISION); exit 1; fi)


trial_patch: check_before_patch
	@patch --dry-run -d $(KERNEL_PATH) -p0 < patches/$(KERNEL_REVISION)


apply_patch: check_before_patch
	@patch -d $(KERNEL_PATH) -p0 < patches/$(KERNEL_REVISION)	

bootdisk:
	@(umount floppy;exit 0)
	@mke2fs -b1024 $(FLOPPY_DEVICE)
	@rmdir floppy
	@mkdir floppy
	@mount $(FLOPPY_DEVICE) floppy
	@cp $(FLOPPY_KERNEL) floppy/vmlinuz
	@gzip -v9 <initrd.rd >floppy/initrd
	@echo boot=$(FLOPPY_DEVICE) > floppy/lilo.conf
	@echo map=floppy/map >> floppy/lilo.conf
	@echo install=/boot/boot.b >> floppy/lilo.conf
	@echo image=floppy/vmlinuz >> floppy/lilo.conf
	@echo initrd=floppy/initrd >> floppy/lilo.conf
	@echo read-only >> floppy/lilo.conf
	@lilo -C floppy/lilo.conf
	@umount floppy
	@rmdir floppy
	@echo boot floppy written on $(FLOPPY_DEVICE)

include Makefile.tests
