#
# $Id: Makefile,v 1.172 2006/07/27 01:05:44 autobuild Exp $
#
#

#	
# Project environment variables
#

ifeq ($(origin PROJ), undefined)
	PROJ = $(shell pwd)
endif

ifeq ($(origin PROJ_SFX), undefined)
	PROJ_SFX = bin
endif

ifeq ($(origin APPL_DEBUG), undefined)
APPL_DEBUG:=0
endif

BUSYBOX_DIR = $(PROJ)/busybox-1.00
WEBS_DIR = $(PROJ)/webs
RAS_DIR = $(PROJ)/ras2000-12-25
SSH_DIR = $(PROJ)/openssh-4.3p1
OPEN_SSL_DIR = $(PROJ)/openssl-0.9.7d
TSTEST_DIR = $(PROJ)/tstest
SNMP_DIR = $(PROJ)/ucd-snmp-4.2.6
CRON_DIR = $(PROJ)/vixie-cron-3.0.1
ZLIB_DIR = $(PROJ)/zlib-1.2.3
RSYNC_DIR = $(PROJ)/rsync-2.5.5
LDAP_DIR:=$(PROJ)/openldap-2.2.26
PAM_DIR = $(PROJ)/Linux-PAM-0.75
SYSLOG-NG_DIR = $(PROJ)/syslog-ng-1.5.17
LIBOL_DIR = $(PROJ)/libol-0.3.2
FLEX_DIR = $(PROJ)/flex-2.5.4
SENDSMS_DIR = $(PROJ)/sendsms-0.19b
CYCL_DIR = $(PROJ)/src_cycl
DHCP_DIR = $(PROJ)/dhcpcd-1.3.22-pl4
SHADOW_DIR = $(PROJ)/shadow-20000902
NETKIT_DIR = $(PROJ)/netkit-bootparamd-0.17
MV_TARGET = /opt/hardhat/devkit/ppc/8xx/target
MV_TOOLS = /opt/hardhat/devkit/ppc/8xx/bin
PMD_DIR=$(PROJ)/pmd
MTD_DIR=$(PROJ)/mtdutil/util
EVT_DIR=$(PROJ)/event_notif
AIDP_DIR=$(PROJ)/aidpd
ADSAP2_DIR=$(PROJ)/adsap2
SUDO_DIR=$(PROJ)/sudo-1.6.8p12

#
# Insert here any target you've created that is not a file or packagee
#
MAKEFILE_TARGETS = tsxk ts1h ts1h2 sm100 oem1 oem2 oem2_1h default help all crc \
check_targ image gera target_dir clean_target_dir extra_files linux \
clean netkit

#
# Crclinux
#
CRCLINUX_DIR = $(PROJ)/crclinux
CRCLINUX = $(CRCLINUX_DIR)/crclinux

#
# Kernel & Ramdisk variables
#
# All sizes same for now
TARG_RD_SIZE = 10240

KERNEL_DIR = $(PROJ)/linux
KERNEL_CONF = $(KERNEL_DIR)/.config
IMAGE = $(KERNEL_DIR)/arch/ppc/mbxboot/zvmlinux.initrd

#
# Target directories
#

TARGET_DIR = $(PROJ)/target_ppc

ifeq ($(origin BOOT_DIR), undefined)
  BOOT_DIR = /tftpboot
endif

WITH_CDK=no
CROSS_COMPILE := /opt/hardhat/devkit/ppc/8xx//bin/ppc_8xx-

export WITH_CDK BOOT_DIR PROJ TARG DEFTARG PLATFORM TARGET_DIR RAS_DIR OPEN_SSL_DIR TARG_RD_SIZE PAM_DIR ZLIB_DIR WEBS_DIR PMD_DIR MTD_DIR APPL_DEBUG LDAP_DIR CROSS_COMPILE ADSAP2_DIR KERNEL_DIR

# Architecture-specific variables
# *** Warning: Do not include any target before this line !!! ***
#

# Project Values
TARG_IN = $(PROJ)/targ.in
# Try to include the current target machine
-include $(TARG_IN)

none:
	@echo
	@echo
	@echo "============================================="
	@echo "No target defined yet. Run sudo make <target>"
	@echo "============================================="
	@echo
	@echo

#
# Packages
#

PACKAGES:=zlib ssl ldap adsap2 pam ras busybox cp_sh_libs ssh tstest snmp ntpclient inetd configts webs syslog-ng cycl pmd shadow event_notif aidpd llconf libdaemon logpipe sudo

ifeq ($(TARG),ts1h2)
  PACKAGES+=mtd
endif

CLEAN_PACKAGES = $(addprefix clean_,$(PACKAGES)) 

#
# The help message
#

HELP_MSG = " \
Makefile valid targets: \n\
\n\
<default>       : Builds the image for the default target machine \n\
image           : Builds the RamDisk image \n\
tsxk            : Builds the image for TS400/800/1K/2K/3K \n\
ts1h            : Builds the image for TS100/110 \n\
ts1h2           : Builds the image for TS100v2 \n\
sm100           : Builds the image for SM100 \n\
oem1            : Builds the image for OEM1 \n\
oem2           	: Builds the image for TS400/800/1K/2K/3K OEM2 \n\
oem2_1h        	: Builds the image for TS100/110 OEM2 \n\
linux           : Builds linux/vmlinux for the default target machine\n\
<package>       : Builds the <package> package \n\
clean           : Cleans all packages (including linux) \n\
clean_<package> : Issues a cleanup for the <package> package \n\
\n\Where <package> can be:\n\n\
$(PACKAGES) \n\n"

#
# Avoid confusion between makefile targets and  directory & file names
.PHONY: $(PACKAGES) $(CLEAN_PACKAGES) $(MAKEFILE_TARGETS) $(PROJ)/targ.in* openssh

cdk_sm100:
	make -C $(TSTEST_DIR) cdk_sm100
	make -C $(RAS_DIR) -f $(RAS_DIR)/ex_config cdk_sm100
	make clean_cdk_sm100

vers:
	@( maj=`echo $(MAKE_VERSION) | cut -f 1 -d .` ; \
	min=`echo $(MAKE_VERSION) | cut -f 2 -d .` ; \
	if [ $$maj -lt 3 -o \( $$maj -eq 3 -a $$min -lt 79 \) ] ; then \
		echo "Invalid make version. Please update it to 3.79 or newer" ; \
		exit 1 ; \
	fi )

ts1h: 
	@rm -f $(TARG_IN)
	@ln -sf $(PROJ)/targ.in.ts1h $(TARG_IN)
	$(MAKE) all

ts1h2: 
	@rm -f $(TARG_IN)
	@ln -sf $(PROJ)/targ.in.ts1h2 $(TARG_IN)
	$(MAKE) all

sm100: 
	@rm -f $(TARG_IN)
	@ln -sf $(PROJ)/targ.in.sm100 $(TARG_IN)
	$(MAKE) all

tsxk: 
	@rm -f $(TARG_IN)
	@ln -sf $(PROJ)/targ.in.tsxk $(TARG_IN)
	$(MAKE) all

oem1: 
	@rm -f $(TARG_IN)
	@ln -sf $(PROJ)/targ.in.oem1 $(TARG_IN)
	$(MAKE) all

oem2_1h: 
	@rm -f $(TARG_IN)
	@ln -sf $(PROJ)/targ.in.oem2_1h $(TARG_IN)
	$(MAKE) all

oem2: 
	@rm -f $(TARG_IN)
	@ln -sf $(PROJ)/targ.in.oem2 $(TARG_IN)
	$(MAKE) all

check_ln:
	@rm -f linux
	@ln -sd linux-1310 linux
	@ls -la linux
	@echo "Setting the target machine to $(TARG)"
	@case $(DEFTARG) in \
	  OEM1) \
		xf=linux/arch/ppc/mbxboot/cyc_banner.h ; \
		cmp -s $$xf $$xf.$(TARG) || ( cp $$xf.$(TARG) $$xf ; \
			rm -f linux/arch/ppc/mbxboot/embed_config.o ) ; \
		xf=linux/Makefile ; \
		cmp -s $$xf $$xf.$(TARG) || ( cp $$xf.$(TARG) $$xf ) ; \
		xf=ras2000-12-25/src/bootconf.h ; \
		cmp -s $$xf $$xf.$(TARG) || ( cp $$xf.$(TARG) $$xf ) ; \
	  ;; \
	  OEM2) \
		xf=linux/arch/ppc/mbxboot/cyc_banner.h ; \
		cmp -s $$xf $$xf.$(TARG) || ( cp $$xf.$(TARG) $$xf ; \
			rm -f linux/arch/ppc/mbxboot/embed_config.o ) ; \
		xf=linux/Makefile ; \
		cmp -s $$xf $$xf.$(TARG) || ( cp $$xf.$(TARG) $$xf ) ; \
		xf=ras2000-12-25/src/bootconf.h ; \
		cmp -s $$xf $$xf.$(TARG) || ( cp $$xf.$(TARG) $$xf ) ; \
		xf=ras2000-12-25/src/wiz.h ; \
		cmp -s $$xf $$xf.$(TARG) || ( cp $$xf.$(TARG) $$xf ) ; \
	  ;; \
	  sm100) \
		xf=linux/arch/ppc/mbxboot/cyc_banner.h ; \
		cmp -s $$xf $$xf.cyc || ( cp $$xf.cyc $$xf ; \
			rm -f linux/arch/ppc/mbxboot/embed_config.o ) ; \
		xf=linux/Makefile ; \
		cmp -s $$xf $$xf.cyc || ( cp $$xf.cyc $$xf ) ; \
		xf=ras2000-12-25/src/bootconf.h ; \
		cmp -s $$xf $$xf.sm100 || ( cp $$xf.sm100 $$xf ) ; \
		xf=ras2000-12-25/src/wiz.h ; \
		cmp -s $$xf $$xf.cyc || ( cp $$xf.cyc $$xf ) ; \
	  ;; \
	  *) \
		xf=linux/arch/ppc/mbxboot/cyc_banner.h ; \
		cmp -s $$xf $$xf.cyc || ( cp $$xf.cyc $$xf ; \
			rm -f linux/arch/ppc/mbxboot/embed_config.o ) ; \
		xf=linux/Makefile ; \
		cmp -s $$xf $$xf.cyc || ( cp $$xf.cyc $$xf ) ; \
		xf=ras2000-12-25/src/bootconf.h ; \
		cmp -s $$xf $$xf.cyc || ( cp $$xf.cyc $$xf ) ; \
		xf=ras2000-12-25/src/wiz.h ; \
		cmp -s $$xf $$xf.cyc || ( cp $$xf.cyc $$xf ) ; \
	  ;; \
	esac

	@cmp -s $(TARG_IN) targ.curr || ( \
		echo "The target machine was changed to $(TARG)" ; \
		rm -f $(TSTEST_DIR)/*.o ; \
		rm -f $(RAS_DIR)/src/*.o ; \
		rm -f linux/arch/ppc/mbxboot/embed_config.o ; \
		rm -f $(RAS_DIR)/libpsr/*.o ; \
		rm -f $(SSH_DIR)/*.o ; \
		rm -f $(WEBS_DIR)/*.o; \
		rm -f $(WEBS_DIR)/LINUX/*.o; \
		rm -f inetd/inetd ; \
		rm -f configts/configts ; \
		rm -f inetd/*.o ; \
		rm -f configts/*.o ; \
		cp -f $(TARG_IN) targ.curr ; \
	)

FORCE: ;

help:
	@echo -e $(HELP_MSG)

all: check_ln crclinux vers $(IMAGE) crc

crc: FORCE
	[ -d $(BOOT_DIR) ] || mkdir -p $(BOOT_DIR)
	rm -f $(BOOT_DIR)/zvmppc$(TAR).$(PROJ_SFX)
	echo Creating $(BOOT_DIR)/zvmppc$(TAR).$(PROJ_SFX)
	$(CRCLINUX) $(IMAGE) 32 $(TAR1) \
		$(BOOT_DIR)/zvmppc$(TAR).$(PROJ_SFX) 65536
	md5sum $(BOOT_DIR)/zvmppc$(TAR).$(PROJ_SFX) > $(BOOT_DIR)/zvmppc$(TAR).$(PROJ_SFX).md5

crclinux: FORCE
	make -C $(CRCLINUX_DIR)

# It's not needed to build vmlinux, because zImage.initrd will do it

$(IMAGE): check_targ target_dir image

check_targ: 
	@echo "#"
	@echo "# Generating code to $(TARG)"
	@echo "#"
	@sleep 5
	@cmp -s $(TARG_CONF) $(KERNEL_CONF) || ( \
		echo "The target machine was changed/set to $(TARG), reconfiguring kernel"; \
		cp $(TARG_CONF) $(KERNEL_CONF); \
		cd $(KERNEL_DIR); make menuconfig > /dev/null 2>&1 \
			< $(PROJ)/keys_esc_cr; \
		cd $(KERNEL_DIR); make clean dep; )

image: gera zImage crc

gera:
ifeq ($(APPL_DEBUG),1)
	cp -a $(MV_TARGET)/bin/gdbserver $(TARGET_DIR)/bin 
	cp -a $(MV_TARGET)/bin/strace $(TARGET_DIR)/bin 
endif
	cd $(PROJ); ./MakeImage $(TARG)

zImage:
	cd $(KERNEL_DIR); make zImage.initrd

#
# The cleanup of the target directory is forced by clean_target_dir dependency
#

target_dir: clean_target_dir extra_files $(PACKAGES)

cp_sh_libs:
	cp -af $(OPEN_SSL_DIR)/libcrypto.so* $(TARGET_DIR)/lib
	$(MV_TOOLS)/ppc_8xx-strip $(TARGET_DIR)/lib/libcrypto.so*
	cp -af $(OPEN_SSL_DIR)/libssl.so* $(TARGET_DIR)/lib
	$(MV_TOOLS)/ppc_8xx-strip $(TARGET_DIR)/lib/libssl.so*
	if [ -n $(ZLIB_DIR) ]; then \
		cp -af $(ZLIB_DIR)/libz.so* $(TARGET_DIR)/lib ; \
		$(MV_TOOLS)/ppc_8xx-strip $(TARGET_DIR)/lib/libz.so* ; \
	fi

clean_target_dir:
	rm -rf $(TARGET_DIR)
	mkdir $(TARGET_DIR)

extra_files:
	cd $(PROJ); ./build_extra
	make -C what_dir

busybox: FORCE
	make -C $(BUSYBOX_DIR)
	make -C $(BUSYBOX_DIR) PREFIX=$(TARGET_DIR) install
	chmod 4755 $(TARGET_DIR)/bin/busybox

dhcpcd: FORCE
#	if [ ! -f $(DHCP_DIR)/configure ] ; then \
#		cd $(DHCP_DIR); autoconf ; \
#	fi
	if [ ! -f $(DHCP_DIR)/Makefile ] ; then \
		cd $(DHCP_DIR) ; ./ex_config ; \
	fi
	make -C $(DHCP_DIR) all
	make -C $(DHCP_DIR) install-sbinPROGRAMS

shadow: FORCE
	if [ ! -f $(SHADOW_DIR)/Makefile ] ; then \
		cd $(SHADOW_DIR) ; ./ex_config ; \
	fi
	make -C $(SHADOW_DIR) all
	cd $(SHADOW_DIR) ; ./ex_config install

cron: FORCE
	make -C $(CRON_DIR) install

inetd: FORCE
	make -C inetd all

configts: FORCE
	make -C configts all

ntpclient: FORCE
	make -C ntpclient all

ldap: FORCE
	cd $(LDAP_DIR); make -f ex_config;

pam:
	if [ ! -f $(PAM_DIR)/configure -o ! -f $(PAM_DIR)/Make.Rules ] ; then \
		cd $(PAM_DIR) ; ./ex_config ; \
	fi
	make -C $(PAM_DIR)
	make -C $(PAM_DIR) install

netkit:
	make -C $(NETKIT_DIR) MCONFIG
	make -C $(NETKIT_DIR) install

ras: check_ln
	make -C $(RAS_DIR) -f $(RAS_DIR)/ex_config

zlib: FORCE
	if [ -n $(ZLIB_DIR) ]; then \
		if [ ! -f $(ZLIB_DIR)/Makefile ]; then \
			cd $(ZLIB_DIR); ./ex_config ; \
		fi ; \
		make -C $(ZLIB_DIR) ; \
	fi

ssl: FORCE
	$(MAKE) -C $(OPEN_SSL_DIR) -f ssl_make

ssh: FORCE
	cd $(SSH_DIR); make -f ex_config install

tstest:
	make -C $(TSTEST_DIR) all

mtd:
	make -C $(MTD_DIR) all
	cp $(MTD_DIR)/erase $(TARGET_DIR)/bin/erase
	mkdir $(TARGET_DIR)/mnt/flash1 

snmp:
	make -C $(SNMP_DIR) all  install

rsync:
	make -C $(RSYNC_DIR) all

webs: FORCE
	cd $(WEBS_DIR)/LINUX; make

syslog-ng:
	if [ ! -f $(LIBOL_DIR)/Makefile ] ; then \
		cd $(LIBOL_DIR) ; ./cycl.sh.libol; \
	fi
	if [ ! -f $(SYSLOG-NG_DIR)/Makefile ] ; then \
		cd $(SYSLOG-NG_DIR) ; ./cycl.sh.sys; \
	fi
	if [ ! -f $(FLEX_DIR)/Makefile -o ! -f $(FLEX_DIR)/config.h ] ; then \
		cd $(FLEX_DIR) ; ./cycl.sh.flex; \
	fi
	cd $(FLEX_DIR); make
	cd $(LIBOL_DIR); make
	cd $(SYSLOG-NG_DIR)/src; make
	cd $(SYSLOG-NG_DIR)/src ; make install
	cd $(SENDSMS_DIR); make sendsms install

cycl:
	cd $(CYCL_DIR); make all install

pmd: FORCE
	cd $(PMD_DIR); make; make install;

event_notif: FORCE
	cd $(EVT_DIR); make; make install;

aidpd: FORCE
	cd $(AIDP_DIR); make all;

adsap2: FORCE
	cd $(ADSAP2_DIR); make; make install;

llconf:
	(cd llconf; ./buildme)

libdaemon:
	(cd libdaemon-0.10; ./buildme)

logpipe: FORCE
	(cd logpipe/src; make -f Makefile.simple CC=$(CROSS_COMPILE)gcc && $(CROSS_COMPILE)strip logpipe && cp logpipe $(TARGET_DIR)/bin)

sudo: FORCE
	if [ ! -f $(SUDO_DIR)/Makefile ] ; then \
		cd $(SUDO_DIR) ; ./ex_config ; \
	fi
	make -C $(SUDO_DIR) sudo
	cp -af $(SUDO_DIR)/sudo $(TARGET_DIR)/bin
	$(MV_TOOLS)/ppc_8xx-strip $(TARGET_DIR)/bin/sudo
	chmod a+s $(TARGET_DIR)/bin/sudo

clean:  clean_linux $(CLEAN_PACKAGES)

linux: check_ln zImage crc

dep: $(TARG_CONF)

$(TARG_CONF): $(KERNEL_CONF)
	cp $(KERNEL_CONF) $(TARG_CONF)
	make -C $(KERNEL_DIR) dep 

clean_cycl:
	make -C $(CYCL_DIR) -i clean

clean_pmd:
	make -C $(PMD_DIR) clean

clean_sudo:
	make -C $(SUDO_DIR) clean

clean_event_notif:
	make -C $(EVT_DIR) clean

clean_aidpd:
	make -C $(AIDP_DIR) clean

clean_adsap2:
	make -C $(ADSAP2_DIR) clean

clean_syslog-ng:
	make -C $(FLEX_DIR) -i clean
	make -C $(LIBOL_DIR) -i clean
	make -C $(SYSLOG-NG_DIR) -i clean
	make -C $(SENDSMS_DIR) -i clean

clean_zlib:
	make -C $(ZLIB_DIR) -i clean

clean_ldap:
	make -C $(LDAP_DIR) -f $(LDAP_DIR)/ex_config -i clean

clean_pam:
	make -C $(PAM_DIR) -i clean

clean_rsync:
	make -C $(RSYNC_DIR) -i clean

clean_linux:
	make -C $(KERNEL_DIR) -i clean
	rm -f $(KERNEL_DIR)/.config
	rm -f targ.curr targ.in 

clean_cron:
	make -C $(CRON_DIR) clean

clean_shadow:
	make -C $(SHADOW_DIR) mostlyclean

clean_dhcpcd:
	make -C $(DHCP_DIR) mostlyclean-compile

clean_busybox:
	make -C $(BUSYBOX_DIR) -i clean

clean_ras:
	make -C $(RAS_DIR) -i clean

clean_netkit:
	make -C $(NETKIT_DIR) -i distclean

clean_ssl:
	$(MAKE) -C $(OPEN_SSL_DIR) -f ssl_make clean

clean_ssh:
	make -C $(SSH_DIR) -i -f ex_config clean

clean_tstest:
	make -C $(TSTEST_DIR) -i clean

clean_snmp:
	make -C $(SNMP_DIR) -i clean

clean_inetd:
	make -C inetd clean

clean_configts:
	make -C configts clean

clean_ntpclient:
	make -C ntpclient clean

clean_target:
	$(MAKE) clean_target_dir

clean_webs:
	cd $(WEBS_DIR)/LINUX; make clean

clean_configure:
	rm -f $(RAS_DIR)/Makefile
	rm -f $(RAS_DIR)/configure
	rm -f $(SSH_DIR)/Makefile
	rm -f $(SSH_DIR)/configure
	rm -f $(OPEN_SSL_DIR)/Makefile
	rm -f $(OPEN_SSL_DIR)/Makefile.ssl
	rm -f $(LIBOL_DIR)/Makefile
	rm -f $(SYSLOG-NG_DIR)/Makefile
	rm -f $(SHADOW_DIR)/Makefile
	rm -f $(SHADOW_DIR)/configure

clean_pslave:
	rm -f $(RAS_DIR)/src/*.o
	rm -f $(RAS_DIR)/libpsr/*.o
	rm -f $(SSH_DIR)/*.o
	rm -f inetd/*.o
	rm -f configts/*.o
	rm -f $(WEBS_DIR)/LINUX/appl1.o
	rm -f $(WEBS_DIR)/LINUX/appl2.o
	rm -f $(WEBS_DIR)/LINUX/appl4.o
	rm -f $(WEBS_DIR)/LINUX/appl5.o
	rm -f $(WEBS_DIR)/LINUX/appl6.o
	rm -f $(WEBS_DIR)/LINUX/main.o
	rm -f $(WEBS_DIR)/*.o
	make -C $(PMD_DIR) -i clean

clean_librad:
	rm -f $(RAS_DIR)/libpsr/*.o
	rm -f $(SSH_DIR)/sshd
	rm -f $(WEBS_DIR)/LINUX/webs
	rm -f inetd/inetd

clean_cdk_sm100:
	rm -f targ.in 
	rm -f targ.curr
	rm -f $(RAS_DIR)/Makefile
	rm -f $(RAS_DIR)/pslave_cfg.h
	rm -f linux/.config

puconn:
	cd $(RAS_DIR) && make puconn

