#
# Makefile - kboot main Makefile
#
# Written 2005, 2007 by Werner Almesberger
#


include VERSIONS
ifeq (config/answers,$(wildcard config/answers))
include config/answers
endif



# ----- Local configuration data ----------------------------------------------

# set to false for glibc or true for uclibc!
config_uclibc=true

# Set Target architecture
TARGET_ARCH=powerpc
KERNEL_ARCH=powerpc64
KEXEC_ARCH=ppc64
CROSS_TOOLCHAIN_PATH_PREFIX=/opt/ppc64-redhat-linux
CROSS_ARCH_PREFIX=ppc64-redhat-linux-
LDFLAGS=-m elf32ppclinux

# internal define
OPTIMIZE_FOR_CPU=$(TARGET_ARCH)

REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux-uclibc
GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux

HOSTCC=gcc

HOST_ARCH:=$(shell $(HOSTCC) -dumpmachine | sed -e s'/-.*//' \
	-e 's/sparc.*/sparc/' \
	-e 's/arm.*/arm/g' \
	-e 's/m68k.*/m68k/' \
	-e 's/ppc/powerpc/g' \
	-e 's/v850.*/v850/g' \
	-e 's/sh[234]/sh/' \
	-e 's/mips-.*/mips/' \
	-e 's/mipsel-.*/mipsel/' \
	-e 's/cris.*/cris/' \
	-e 's/i[3-9]86/i386/' \
	)
GNU_HOST_NAME:=$(HOST_ARCH)-pc-linux-gnu

ifeq ($(HOST_ARCH),$(KERNEL_ARCH))
  ifeq ($(config_uclibc),false)
  TARGET_CROSS=
  TARGET_PATH=/bin:/sbin:/usr/bin:/usr/sbin
  else
  TARGET_CROSS=$(PWD)/build/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-
  TARGET_PATH=$(PWD)/build/bin:/bin:/sbin:/usr/bin:/usr/sbin
  endif
KEXEC_CROSS=
KEXEC_CC = $(KEXEC_CROSS)gcc
KEXEC_LD = $(KEXEC_CROSS)ld
KEXEC_AR = $(KEXEC_CROSS)ar
KEXEC_STRIP = $(KEXEC_CROSS)strip
else
  ifeq ($(config_uclibc),false)
  TARGET_CROSS=$(CROSS_ARCH_PREFIX)
  TARGET_PATH=$(CROSS_TOOLCHAIN_PATH_PREFIX)/bin:/bin:/sbin:/usr/bin:/usr/sbin
  else
  TARGET_CROSS=$(PWD)/build/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-
  TARGET_PATH=$(PWD)/build/bin:/bin:/sbin:/usr/bin:/usr/sbin
  endif
TARGET_KERNEL_CROSS = $(CROSS_ARCH_PREFIX)
KEXEC_CROSS = $(CROSS_ARCH_PREFIX)
using_kexec_cross=PATH=$(CROSS_TOOLCHAIN_PATH_PREFIX)/bin:$$PATH 
KEXEC_CC = $(KEXEC_CROSS)gcc
KEXEC_LD = $(KEXEC_CROSS)ld
KEXEC_AR = $(KEXEC_CROSS)ar
KEXEC_STRIP = $(KEXEC_CROSS)strip
endif

TARGET_CC=$(TARGET_CROSS)gcc
TARGET_CXX=$(TARGET_CROSS)g++
TARGET_RANLIB=$(TARGET_CROSS)ranlib
STRIP=$(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note

INSTALL=/usr/bin/install

TARGET_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \
		AR=$(TARGET_CROSS)ar \
		AS=$(TARGET_CROSS)as \
		LD=$(TARGET_CROSS)ld \
		NM=$(TARGET_CROSS)nm \
		CC=$(TARGET_CROSS)gcc \
		GCC=$(TARGET_CROSS)gcc \
		CXX=$(TARGET_CROSS)g++ \
		CPP=$(TARGET_CROSS)cpp \
		RANLIB=$(TARGET_CROSS)ranlib \
		STRIP=$(TARGET_CROSS)strip \
		OBJCOPY=$(TARGET_CROSS)objcopy
#

LOCAL_KERNEL_CONFIG=$(PWD)/config/kernel-config
LOCAL_UCLIBC_CONFIG=$(PWD)/config/uClibc.config
LOCAL_HOSTS=$(PWD)/config/hosts
LOCAL_PASSWD=$(PWD)/config/passwd
LOCAL_FILESYSTEMS=$(PWD)/config/filesystems
LOCAL_KBOOT_CONF=$(PWD)/config/kboot.conf
LOCAL_OPENSSH_RSA=$(PWD)/config/ssh_host_rsa_key
LOCAL_OPENSSH_DSA=$(PWD)/config/ssh_host_dsa_key
LOCAL_DROPBEAR_RSA=$(PWD)/config/dropbear_rsa_host_key
LOCAL_DROPBEAR_DSS=$(PWD)/config/dropbear_dss_host_key
LOCAL_AUTHORIZED_KEYS=$(PWD)/config/authorized_keys
KBOOT_MESSAGE=$(PWD)/config/message


# ----- Naming conversions ----------------------------------------------------


KERNEL_DIR=linux-$(KERNEL_VERSION)
KERNEL_PACKAGE=linux-$(KERNEL_VERSION).tar.bz2
KERNEL_URL=http://ftp.kernel.org/pub/linux/kernel/v2.6/$(KERNEL_PACKAGE)

GCC_DIR=gcc-$(GCC_VERSION)
GCC_PACKAGE=gcc-core-$(GCC_VERSION).tar.bz2
GCC_URL=http://ftp.gnu.org/gnu/gcc/gcc-$(GCC_VERSION)/$(GCC_PACKAGE)

BINUTILS_DIR=binutils-$(BINUTILS_VERSION)
BINUTILS_PACKAGE=binutils-$(BINUTILS_VERSION).tar.bz2
BINUTILS_URL= \
  http://ftp.gnu.org/gnu/binutils/binutils-$(BINUTILS_VERSION).tar.bz2

UCLIBC_DIR=uClibc-$(UCLIBC_VERSION)
UCLIBC_PACKAGE=uClibc-$(UCLIBC_VERSION).tar.bz2
UCLIBC_URL=http://www.uclibc.org/downloads/$(UCLIBC_PACKAGE)

BUSYBOX_DIR=busybox-$(BUSYBOX_VERSION)
BUSYBOX_PACKAGE=busybox-$(BUSYBOX_VERSION).tar.bz2
BUSYBOX_URL=http://www.busybox.net/downloads/$(BUSYBOX_PACKAGE)

UDEV_DIR=udev-$(UDEV_VERSION)
UDEV_PACKAGE=udev-$(UDEV_VERSION).tar.bz2
UDEV_URL=http://www.kernel.org/pub/linux/utils/kernel/hotplug/$(UDEV_PACKAGE)

KEXEC_TOOLS_PACKAGE=kexec-tools-$(KEXEC_TOOLS_VERSION).tar.gz
KEXEC_TOOLS_DIR=kexec-tools-$(KEXEC_TOOLS_VERSION)
KEXEC_TOOLS_URL= \
  http://www.xmission.com/~ebiederm/files/kexec/$(KEXEC_TOOLS_PACKAGE)

DROPBEAR_PACKAGE=dropbear-$(DROPBEAR_VERSION).tar.gz
DROPBEAR_DIR=dropbear-$(DROPBEAR_VERSION)
DROPBEAR_URL=http://matt.ucc.asn.au/dropbear/releases/$(DROPBEAR_PACKAGE)

SCHEDUTILS_DIR=schedutils-$(SCHEDUTILS_VERSION)
SCHEDUTILS_PACKAGE=schedutils-$(SCHEDUTILS_VERSION).tar.gz
SCHEDUTILS_URL=http://rlove.org/schedutils/$(SCHEDUTILS_PACKAGE)

NFS_UTILS_DIR=nfs-utils-$(NFS_UTILS_VERSION)
NFS_UTILS_PACKAGE=nfs-utils-$(NFS_UTILS_VERSION).tar.gz
NFS_UTILS_URL=http://superb-west.dl.sourceforge.net/sourceforge/nfs/$(NFS_UTILS_PACKAGE)

COREUTILS_DIR=coreutils-$(COREUTILS_VERSION)
COREUTILS_PACKAGE=coreutils-$(COREUTILS_VERSION).tar.bz2
COREUTILS_URL=http://ftp.gnu.org/pub/gnu/coreutils/$(COREUTILS_PACKAGE)

NCURSES_DIR=ncurses-$(NCURSES_VERSION)
NCURSES_PACKAGE=ncurses-$(NCURSES_VERSION).tar.gz
NCURSES_URL=http://ftp.gnu.org/pub/gnu/ncurses/$(NCURSES_PACKAGE)

UTIL_LINUX_DIR=util-linux-$(UTIL_LINUX_VERSION)
UTIL_LINUX_PACKAGE=util-linux-$(UTIL_LINUX_VERSION).tar.bz2
UTIL_LINUX_URL=http://www.kernel.org/pub/linux/utils/util-linux/$(UTIL_LINUX_PACKAGE)

PS3PF_UTILS_DIR=ps3pf_utils-$(PS3PF_UTILS_VERSION)
PS3PF_UTILS_PACKAGE=ps3pf_utils-$(PS3PF_UTILS_VERSION).tar.bz2
PS3PF_UTILS_URL=

KBD_PACKAGE=kbd-$(KBD_VERSION).tar.gz
KBD_DIR=kbd-$(KBD_VERSION)
KBD_URL=ftp://ftp.win.tue.nl/pub/linux-local/utils/kbd/$(KBD_PACKAGE)

LILO_PACKAGE=lilo-$(LILO_VERSION).src.tar.gz
LILO_DIR=lilo-$(LILO_VERSION)
LILO_URL=http://home.san.rr.com/johninsd/pub/linux/lilo/$(LILO_PACKAGE)

DL=$(if $(wildcard ../dl/.),../dl,dl)


# ----- Macros ----------------------------------------------------------------


define edit_config
	scripts/edit-config $(1)
endef


# ----- Files to include in distribution --------------------------------------


FILES=VERSIONS CHANGES README TODO COPYING.GPL \
      Makefile \
      scripts/kboot scripts/udhcpc.script \
      scripts/common-all scripts/common-config \
      scripts/find-features scripts/update-fstab \
      scripts/find-shlibs scripts/edit-config \
      utils/Makefile utils/readline.c utils/getctty.c utils/fsbyname.c \
      config/README \
      patches/README \
      patches/kexec-tools-1.101-fix-real-mode-entry-vivek.patch \
      patches/kbd-bkeymap.patch patches/busybox-noshadow.patch \
      patches/busybox-htons.patch


# ----- General settings ------------------------------------------------------


.PHONY:	all reconfig config download packages keymaps
.PHONY:	try reset clean spotless dist upload

ifeq ($(config_uclibc),false)
all:    initrd.bin linux
UTILS_PREFIX=$(TARGET_CROSS)
else
all:	initrd.bin linux

using_uclibc_cross=PATH=$(PWD)/build/bin:$$PATH
using_uclibc=PATH=$(PWD)/build/bin:$(PWD)/build/$(OPTIMIZE_FOR_CPU)-linux-uclibc/bin:$$PATH
root_meta_inst_ncurses = root-meta/installed/ncurses
root_meta_inst_uclibc = root-meta/installed/uclibc
build_inst_uclibc = build/installed/uclibc
build_inst_gcc_uclibc = build/installed/gcc-uclibc
UTILS_PREFIX=$(OPTIMIZE_FOR_CPU)-linux-uclibc-
endif


# ----- (Re)Configuration -----------------------------------------------------


reconfig:
	rm -f config/answers
	make config

config:
	scripts/update-fstab
	scripts/find-features


# ----- Download 3rd party packages -------------------------------------------


download: \
	$(DL)/$(KERNEL_PACKAGE).ok \
	  $(DL)/$(GCC_PACKAGE).ok \
	  $(DL)/$(BINUTILS_PACKAGE).ok \
	  $(DL)/$(UCLIBC_PACKAGE).ok \
	  $(DL)/$(BUSYBOX_PACKAGE).ok \
	  $(DL)/$(UDEV_PACKAGE).ok \
	  $(DL)/$(KEXEC_TOOLS_PACKAGE).ok \
	  $(DL)/$(DROPBEAR_PACKAGE).ok \
	  $(DL)/$(SCHEDUTILS_PACKAGE).ok \
	  $(DL)/$(NFS_UTILS_PACKAGE).ok \
	  $(DL)/$(COREUTILS_PACKAGE).ok \
	  $(DL)/$(NCURSES_PACKAGE).ok \
	  $(DL)/$(UTIL_LINUX_PACKAGE).ok \
	  $(DL)/$(PS3PF_UTILS_PACKAGE).ok \
	  $(DL)/$(KBD_PACKAGE).ok \
#	  $(DL)/$(LILO_PACKAGE).ok

packages:
	@echo $(KERNEL_PACKAGE)
	@echo $(GCC_PACKAGE)
	@echo $(BINUTILS_PACKAGE)
	@echo $(UCLIBC_PACKAGE)
	@echo $(BUSYBOX_PACKAGE)
	@echo $(UDEV_PACKAGE)
	@echo $(KEXEC_TOOLS_PACKAGE)
	@echo $(DROPBEAR_PACKAGE)
	@echo $(SCHEDUTILS_PACKAGE)
	@echo $(NFS_UTILS_PACKAGE)
	@echo $(COREUTILS_PACKAGE)
	@echo $(NCURSES_PACKAGE)
	@echo $(UTIL_LINUX_PACKAGE)
	@echo $(PS3PF_UTILS_PACKAGE)
	@echo $(KBD_PACKAGE)
#	@echo $(LILO_PACKAGE)

$(DL)/$(KERNEL_PACKAGE).ok:
	mkdir -p dl
#	wget -c -O $(DL)/$(KERNEL_PACKAGE) $(KERNEL_URL)
	tar jcf $(DL)/$(KERNEL_PACKAGE) -C dl linux-$(KERNEL_VERSION)
	touch $@

$(DL)/$(LILO_PACKAGE).ok:
	mkdir -p dl
	wget -c -O $(DL)/$(LILO_PACKAGE) $(LILO_URL)
	touch $@

$(DL)/$(GCC_PACKAGE).ok:
	mkdir -p dl
ifeq ($(config_uclibc),true)
	wget -c -O $(DL)/$(GCC_PACKAGE) $(GCC_URL)
endif
	touch $@

$(DL)/$(BINUTILS_PACKAGE).ok:
	mkdir -p dl
ifeq ($(config_uclibc),true)
	wget -c -O $(DL)/$(BINUTILS_PACKAGE) $(BINUTILS_URL)
endif
	touch $@

$(DL)/$(UCLIBC_PACKAGE).ok:
	mkdir -p dl
ifeq ($(config_uclibc),true)
	wget -c -O $(DL)/$(UCLIBC_PACKAGE) $(UCLIBC_URL)
endif
	touch $@

$(DL)/$(BUSYBOX_PACKAGE).ok:
	mkdir -p dl
	wget -c -O $(DL)/$(BUSYBOX_PACKAGE) $(BUSYBOX_URL)
	touch $@

$(DL)/$(UDEV_PACKAGE).ok:
	mkdir -p dl
	wget -c -O $(DL)/$(UDEV_PACKAGE) $(UDEV_URL)
	touch $@

$(DL)/$(DROPBEAR_PACKAGE).ok:
	mkdir -p dl
	wget -c -O $(DL)/$(DROPBEAR_PACKAGE) $(DROPBEAR_URL)
	touch $@

$(DL)/$(SCHEDUTILS_PACKAGE).ok:
	mkdir -p dl
	wget -c -O $(DL)/$(SCHEDUTILS_PACKAGE) $(SCHEDUTILS_URL)
	touch $@

$(DL)/$(NFS_UTILS_PACKAGE).ok:
	mkdir -p dl
	wget -c -O $(DL)/$(NFS_UTILS_PACKAGE) $(NFS_UTILS_URL)
	touch $@

$(DL)/$(COREUTILS_PACKAGE).ok:
	mkdir -p dl
	wget -c -O $(DL)/$(COREUTILS_PACKAGE) $(COREUTILS_URL)
	touch $@

$(DL)/$(NCURSES_PACKAGE).ok:
	mkdir -p dl
	wget -c -O $(DL)/$(NCURSES_PACKAGE) $(NCURSES_URL)
	touch $@

$(DL)/$(UTIL_LINUX_PACKAGE).ok:
	mkdir -p dl
	wget -c -O $(DL)/$(UTIL_LINUX_PACKAGE) $(UTIL_LINUX_URL)
	touch $@

$(DL)/$(PS3PF_UTILS_PACKAGE).ok:
	mkdir -p dl
	tar jcvf $(DL)/$(PS3PF_UTILS_PACKAGE) -C dl ps3pf_utils-$(PS3PF_UTILS_VERSION)
	touch $@

$(DL)/$(KEXEC_TOOLS_PACKAGE).ok:
	mkdir -p dl
#	wget -c -O $(DL)/$(KEXEC_TOOLS_PACKAGE) $(KEXEC_TOOLS_URL)
	tar zcvf $(DL)/$(KEXEC_TOOLS_PACKAGE) -C dl kexec-tools-$(KEXEC_TOOLS_VERSION)
	touch $@

$(DL)/$(KBD_PACKAGE).ok:
	mkdir -p dl
	wget -c -O $(DL)/$(KBD_PACKAGE) $(KBD_URL)
	touch $@


# ----- The root file system --------------------------------------------------


root/etc/kboot-features: \
	  scripts/find-features root/etc/fstab # ...
	scripts/find-features make
	touch $@	# may be cached

root/etc/fstab: \
	  scripts/update-fstab # ...
	scripts/update-fstab
	touch $@	# may be cached

root:	root/etc/kboot-features root/etc/fstab \
	$(root_meta_inst_uclibc) \
	root-meta/installed/busybox \
	  root-meta/installed/udev \
	  $(if $(subst false,,$(ssh_client)),root-meta/installed/dropbear) \
	  $(if $(subst false,,$(ssh_server)),root-meta/installed/dropbear) \
	  $(if $(subst false,,$(ssh_generate_keys)),\
	    $(DROPBEAR_DIR)-host/.kboot-built) \
	  $(if $(subst false,,$(ssh_convert_keys)),\
	    $(DROPBEAR_DIR)-host/.kboot-built) \
	  root-meta/installed/kexec-tools \
	  root-meta/installed/linux \
	  root-meta/installed/schedutils \
	  root-meta/installed/nfs-utils \
	  root-meta/installed/coreutils \
	  $(root_meta_inst_ncurses) \
	  root-meta/installed/util-linux \
	  $(if $(subst i386,,$(TARGET_ARCH)),root-meta/installed/ps3pf_utils ) \
	  scripts/yaboot2kboot.awk \
	  Makefile scripts/kboot scripts/common-all \
	  $(if $(subst false,,$(use_dhcp)),scripts/udhcpc.script) \
	  utils/$(UTILS_PREFIX)readline utils/$(UTILS_PREFIX)getctty utils/$(UTILS_PREFIX)fsbyname \
	  $(if $(wildcard $(LOCAL_HOSTS)),$(LOCAL_HOSTS)) \
	  $(if $(wildcard $(LOCAL_PASSWD)),$(LOCAL_PASSWD)) \
	  $(if $(wildcard $(LOCAL_KBOOT_CONF)),$(LOCAL_KBOOT_CONF)) \
	  $(if $(wildcard $(KBOOT_MESSAGE)),$(KBOOT_MESSAGE)) \
	  $(if $(wildcard $(LOCAL_OPENSSH_RSA)),$(LOCAL_OPENSSH_RSA)) \
	  $(if $(wildcard $(LOCAL_OPENSSH_DSA)),$(LOCAL_OPENSSH_DSA)) \
	  $(if $(wildcard $(LOCAL_DROPBEAR_RSA)),$(LOCAL_DROPBEAR_RSA)) \
	  $(if $(wildcard $(LOCAL_DROPBEAR_DSS)),$(LOCAL_DROPBEAR_DSS)) \
	  $(if $(wildcard $(LOCAL_AUTHORIZED_KEYS)),$(LOCAL_AUTHORIZED_KEYS)) \
	  $(if $(wildcard config/*.bkeymap),config/*.bkeymap)
	rm -f root/etc/{hosts,passwd,kboot.conf,message}
	rm -rf root/tmp root/dev
	mkdir -p root/etc root/tmp root/proc root/dev root/sys
	mkdir -p root/mnt/tmp root/mnt/root root/bin root/sbin
	mkdir -p root/usr/share
	[ -e root/dev/console ] || mknod root/dev/console c 5 1
	[ -e root/dev/null ] || mknod root/dev/null c 1 3
	[ -e root/dev/tty ] || mknod root/dev/tty c 5 0
	[ -e root/dev/tty1 ] || mknod root/dev/tty1 c 4 1
	ln -s sr0 root/dev/cdrom
	[ ! -r "$(LOCAL_HOSTS)" ] || cp "$(LOCAL_HOSTS)" root/etc/
	if [ -r "$(LOCAL_PASSWD)" ]; then \
	    cp "$(LOCAL_PASSWD)" root/etc/; \
	else \
	    echo 'kboot:*:0:0:kboot user:/:/sbin/kboot' >root/etc/passwd; \
	fi
	[ ! -r "$(LOCAL_KBOOT_CONF)" ] || cp "$(LOCAL_KBOOT_CONF)" root/etc/
	[ ! -r "$(KBOOT_MESSAGE)" ] || cp "$(KBOOT_MESSAGE)" root/etc/
	[ ! -r "$(LOCAL_FILESYSTEMS)" ] || cp "$(LOCAL_FILESYSTEMS)" root/etc/
	touch root/etc/mtab
	cp scripts/kboot scripts/common-all root/sbin/	# stupid place ...
    ifeq ($(use_dhcp),true)
	cp scripts/udhcpc.script root/sbin/
    endif
    ifeq ($(ssh_generate_keys),true)
	[ -r $(LOCAL_DROPBEAR_RSA) ] || \
	  $(DROPBEAR_DIR)-host/dropbearkey -t rsa -f $(LOCAL_DROPBEAR_RSA)
	[ -r $(LOCAL_DROPBEAR_DSS) ] || \
	  $(DROPBEAR_DIR)-host/dropbearkey -t dss -f $(LOCAL_DROPBEAR_DSS)
    else
      ifeq ($(ssh_convert_keys),true)
	[ ! -r $(LOCAL_OPENSSH_RSA) -o -r $(LOCAL_DROPBEAR_RSA) ] || \
	    $(DROPBEAR_DIR)-host/dropbearconvert openssh dropbear \
	      $(LOCAL_OPENSSH_RSA) $(LOCAL_DROPBEAR_RSA)
	[ ! -r $(LOCAL_OPENSSH_DSA) -o -r $(LOCAL_DROPBEAR_DSS) ] || \
	    $(DROPBEAR_DIR)-host/dropbearconvert openssh dropbear \
	      $(LOCAL_OPENSSH_DSA) $(LOCAL_DROPBEAR_DSS)
      endif
    endif
	if [ -r $(LOCAL_DROPBEAR_RSA) ]; then \
	    mkdir -p root/etc/dropbear; \
	    cp $(LOCAL_DROPBEAR_RSA) root/etc/dropbear/; \
	fi
	if [ -r $(LOCAL_DROPBEAR_DSS) ]; then \
	    mkdir -p root/etc/dropbear; \
	    cp $(LOCAL_DROPBEAR_DSS) root/etc/dropbear/; \
	fi
	if [ -r $(LOCAL_AUTHORIZED_KEYS) ]; then \
	    mkdir -p root/.ssh; \
	    cp $(LOCAL_AUTHORIZED_KEYS) root/.ssh/; \
	fi
    ifeq ($(ssh_server),true)
	echo /sbin/kboot >root/etc/shells
	touch root/etc/group
	mkdir -p root/dev/pts root/var/run
    endif
	rm -f root/etc/default.bkeymap
	if [ "`echo config/*.bkeymap`" != 'config/*.bkeymap' ]; then \
	    if [ ! -r "`echo config/*.bkeymap`" ]; then \
		echo "please put only one keymap into config/" 1>&2; \
		exit 1; \
	    fi; \
	    cp config/*.bkeymap root/etc/default.bkeymap; \
	fi
	cp utils/$(UTILS_PREFIX)readline root/bin/readline
	$(TARGET_CROSS)strip root/bin/readline
	cp utils/$(UTILS_PREFIX)getctty root/sbin/getctty
	$(TARGET_CROSS)strip root/sbin/getctty
	cp utils/$(UTILS_PREFIX)fsbyname root/sbin/fsbyname
	$(TARGET_CROSS)strip root/sbin/fsbyname
	ln -sf /sbin/kboot root/init
ifeq ($(TARGET_ARCH),powerpc)
	cp scripts/yaboot2kboot.awk root/sbin/
	ln -sf /sbin/ps3-boot-game-os root/sbin/game
endif
ifeq ($(config_uclibc),false)
  ifeq ($(HOST_ARCH),$(KERNEL_ARCH))
	for FILE in $$( find root/bin root/sbin root/usr/bin root/usr/sbin \
	    -type f -perm -100 ) ; do \
	    LIBS=$$( ldd $$FILE | awk '/=>.*\.so/ { print $$3 }' ) ; \
	    for LIB in $$LIBS ; do \
		LIB_PATH=$$( echo $$LIB | sed -e 's/[^/]*$$//' ) ; \
	    mkdir -p root/$$LIB_PATH ; \
	    cp $$LIB root/$$LIB_PATH ; \
	    done ; \
	done
	LIB=$$( ldd root/bin/busybox | tail -n1 | awk '{ print $$1 }' ) ; \
	LIB_PATH=$$( echo $$LIB | sed -e 's/[^/]*$$//' ) ; \
	mkdir -p root/$$LIB_PATH ; \
	cp $$LIB root/$$LIB_PATH
	mkdir -p root/usr/share/terminfo
	cp -a /usr/share/terminfo/a root/usr/share/terminfo
	cp -a /usr/share/terminfo/l root/usr/share/terminfo
	cp -a /usr/share/terminfo/v root/usr/share/terminfo
	cp -a /usr/share/terminfo/x root/usr/share/terminfo
	touch root/etc/ld.so.conf
	/sbin/ldconfig -r root
  else
	for FILE in $$( find root/bin root/sbin root/usr/bin root/usr/sbin \
	    -type f -perm -100 ) ; do \
	    if [ "$$FILE" = "root/sbin/kboot" -o \
		 "$$FILE" = "root/sbin/ps3-boot-game-os" -o \
		 "$$FILE" = "root/sbin/game" -o \
		 "$$FILE" = "root/sbin/yaboot2kboot.awk" -o \
		 "$$FILE" = "root/sbin/udhcpc.script" ] ; then \
	        continue ; \
	    fi ; \
	    LIBS=$$( $(TARGET_CROSS)readelf -d $$FILE | awk '/NEEDED/ { print substr($$5, 2, length($$5)-2) }' ) ; \
	    for LIB in $$LIBS ; do \
	        LIB_FULL_NAME=$$( $(TARGET_CROSS)gcc -print-file-name=$$LIB ) ; \
		LIB_PATH_FROM=$$( echo $$LIB_FULL_NAME | sed -e 's/[^/]*$$//' ) ; \
	        LIB_PATH=/lib ; \
	        mkdir -p root/$$LIB_PATH ; \
	        cp $$LIB_PATH_FROM/$$LIB root/$$LIB_PATH ; \
	        LIBS2=$$( $(TARGET_CROSS)readelf -d $$LIB_FULL_NAME | awk '/NEEDED/ { print substr($$5, 2, length($$5)-2) }' ) ; \
		for LIB2 in $$LIBS2 ; do \
	            LIB_FULL_NAME=$$( $(TARGET_CROSS)gcc -print-file-name=$$LIB2 ) ; \
		    LIB_PATH_FROM=$$( echo $$LIB_FULL_NAME | sed -e 's/[^/]*$$//' ) ; \
	            cp $$LIB_PATH_FROM/$$LIB2 root/$$LIB_PATH ; \
		done ; \
	    done ; \
	done
	mkdir -p root/usr/share/terminfo
	cp -a $(CROSS_TOOLCHAIN_PATH_PREFIX)/sysroot/usr/share/terminfo/a root/usr/share/terminfo
	cp -a $(CROSS_TOOLCHAIN_PATH_PREFIX)/sysroot/usr/share/terminfo/l root/usr/share/terminfo
	cp -a $(CROSS_TOOLCHAIN_PATH_PREFIX)/sysroot/usr/share/terminfo/v root/usr/share/terminfo
	cp -a $(CROSS_TOOLCHAIN_PATH_PREFIX)/sysroot/usr/share/terminfo/x root/usr/share/terminfo
	touch root/etc/ld.so.conf
	/sbin/ldconfig -r root 2> /dev/null
  endif
endif

kboot-root.cpio.gz: \
	  root
	rm -f kboot-root.cpio.gz # make sure we get the right permissions
	(umask 077; cd root && find . | cpio -o -H newc | \
	  gzip >../kboot-root.cpio.gz; ) || \
	  { rm -f kboot-root.cpio.gz; exit 1; }

kboot-root-glibc.cpio.gz: \
	  root
	rm -f kboot-root-glibc.cpio.gz # make sure we get the right permissions
	(umask 077; cd root && find . | cpio -o -H newc | \
	  gzip >../kboot-root-glibc.cpio.gz; ) || \
	  { rm -f kboot-root-glibc.cpio.gz; exit 1; }

initrd.bin: \
	  root
	rm -f initrd.bin # make sure we get the right permissions
	(umask 077; cd root && find . | cpio -o -H newc | \
	  gzip >../initrd.bin; ) || \
	  { rm -f initrd.bin; exit 1; }

initrd.bin-with-install-fc: \
	  root
	rm -f initrd.bin-with-install-fc # make sure we get the right permissions
ifeq ($(TARGET_ARCH),powerpc)
	cp config/kudzu config/xorg.conf-vfb root/etc
	cp config/ifcfg-eth0 config/ifcfg-eth1 config/PS3.conf root/etc
	cp scripts/fc6-full.txt scripts/fc6-minimum.txt root/usr/share
	cp scripts/install-fc scripts/install-rpm root/sbin/
endif
	rm -rf root/init
	ln -sf /sbin/install-fc root/init
	(umask 077; cd root && find . | cpio -o -H newc | \
	  gzip >../initrd.bin-with-install-fc; ) || \
	  { rm -f initrd.bin; exit 1; }


# ----- Build the kernel ------------------------------------------------------


$(KERNEL_DIR)/.kboot-extracted: \
	  $(DL)/$(KERNEL_PACKAGE).ok
	rm -f $@ $(KERNEL_DIR)/.kboot-configured $(KERNEL_DIR)/.kboot-built
	tar xfj $(DL)/$(KERNEL_PACKAGE)
	for i in `ls patches/linux/$(KERNEL_VERSION)/*patch*` ; do \
	  patch -d $(KERNEL_DIR) -p1 < $$i ; \
	done
	touch $@

$(KERNEL_DIR)/.kboot-configured: \
	  $(KERNEL_DIR)/.kboot-extracted $(LOCAL_KERNEL_CONFIG)
	rm -f $@ $(KERNEL_DIR)/.kboot-built
	cp $(LOCAL_KERNEL_CONFIG) $(KERNEL_DIR)/.config
	$(edit_config) $(KERNEL_DIR)/.config \
	  CONFIG_KEXEC=y \
	  CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_INITRD=y \
	  +CONFIG_BLK_DEV_RAM_COUNT=1 \
	  +CONFIG_BLK_DEV_RAM_SIZE=4096
ifneq ($(HOST_ARCH),$(KERNEL_ARCH))
	MAKEFLAGS="ARCH=$(TARGET_ARCH) CFLAGS_KERNEL=-g CROSS32_COMPILE=$(TARGET_KERNEL_CROSS) CROSS_COMPILE=$(TARGET_KERNEL_CROSS)" make -C $(KERNEL_DIR) oldconfig include/asm
else
	make -C $(KERNEL_DIR) oldconfig include/asm
endif
	touch $@

$(KERNEL_DIR)/.kboot-built: \
	  $(KERNEL_DIR)/.kboot-configured
	rm -f $@
ifneq ($(HOST_ARCH),$(KERNEL_ARCH))
	MAKEFLAGS="ARCH=$(TARGET_ARCH) CFLAGS_KERNEL=-g CROSS32_COMPILE=$(TARGET_KERNEL_CROSS) CROSS_COMPILE=$(TARGET_KERNEL_CROSS)" make -C $(KERNEL_DIR) 
else
	make -C $(KERNEL_DIR)
endif
	touch $@

root-meta/installed/linux: \
	  $(KERNEL_DIR)/.kboot-built
	rm -rf $@
	mkdir -p root-meta/installed
	touch $@

linux: \
	  root-meta/installed/linux initrd.bin
	rm -rf linux
	cp initrd.bin $(KERNEL_DIR)/arch/$(TARGET_ARCH)/boot/ramdisk.image.gz
ifneq ($(HOST_ARCH),$(KERNEL_ARCH))
	MAKEFLAGS="ARCH=$(TARGET_ARCH) CFLAGS_KERNEL=-g CROSS32_COMPILE=$(TARGET_KERNEL_CROSS) CROSS_COMPILE=$(TARGET_KERNEL_CROSS)" make -C $(KERNEL_DIR) zImage.initrd
else
	make -C $(KERNEL_DIR) zImage.initrd
endif
	cp $(KERNEL_DIR)/arch/$(TARGET_ARCH)/boot/otheros.bld .


# ----- Build binutils --------------------------------------------------------


$(BINUTILS_DIR)/.kboot-extracted: \
	  $(DL)/$(BINUTILS_PACKAGE).ok
ifeq ($(config_uclibc),true)
	rm -f $@ $(BINUTILS_DIR)/.kboot-configured \
	  $(BINUTILS_DIR)/.kboot-built build/installed/binutils
	tar xfj $(DL)/$(BINUTILS_PACKAGE)
	for i in `ls patches/binutils/$(BINUTILS_VERSION)/*patch*` ; do \
	  patch -d $(BINUTILS_DIR) -p1 < $$i ; \
	done
else
	mkdir $(BINUTILS_DIR)
endif
	touch $@

$(BINUTILS_DIR)/.kboot-configured: \
	  $(BINUTILS_DIR)/.kboot-extracted
ifeq ($(config_uclibc),true)
	rm -f $@ $(BINUTILS_DIR)/.kboot-built build/installed/binutils
	( cd $(BINUTILS_DIR) && ./configure --prefix=$(PWD)/build \
	  --build=$(GNU_HOST_NAME) \
	  --host=$(GNU_HOST_NAME) \
	  --target=$(REAL_GNU_TARGET_NAME) \
	  --disable-nls \
	  --enable-multilib ; )
endif
	touch $@

$(BINUTILS_DIR)/.kboot-built: \
	  $(BINUTILS_DIR)/.kboot-configured
ifeq ($(config_uclibc),true)
	rm -f $@ build/installed/binutils
	make -C $(BINUTILS_DIR)
endif
	touch $@

build/installed/binutils: \
	  $(BINUTILS_DIR)/.kboot-built
ifeq ($(config_uclibc),true)
	rm -f $@
	mkdir -p build/installed
	make -C $(BINUTILS_DIR) install
	( cd build/bin && \
	  for app in $(REAL_GNU_TARGET_NAME)-* ; do \
		ln -snf $${app} \
		$(GNU_TARGET_NAME)$${app##$(REAL_GNU_TARGET_NAME)}; \
	  done; \
	  for n in *; do \
	    if [ "x$${n#*-}" = "x$$n" ]; then \
	      ln -sf $$n host-$$n || exit 1; \
	      ln -sf $$n uclibc-$$n || exit 1; \
	    fi; \
	  done; )
else
	mkdir -p build/installed
endif
	touch $@


# ----- Build gcc (using host libc, typically glibc) --------------------------


$(GCC_DIR)/.kboot-extracted: \
	  $(DL)/$(GCC_PACKAGE).ok
ifeq ($(config_uclibc),true)
	rm -f $@ \
	  $(GCC_DIR)-host/.kboot-configured $(GCC_DIR)-host/.kboot-built \
	  build/installed/gcc-host $(GCC_DIR)-uclibc/.kboot-configured \
	  $(GCC_DIR)-uclibc/.kboot-built build/installed/gcc-uclibc
	tar xfj $(DL)/$(GCC_PACKAGE)
	for i in `ls patches/gcc/$(GCC_VERSION)/*patch*` ; do \
	  patch -d $(GCC_DIR) -p1 < $$i ; \
	done
else
	mkdir $(GCC_DIR)
endif
	touch $@

$(GCC_DIR)-host/.kboot-configured: \
	  $(GCC_DIR)/.kboot-extracted build/installed/binutils
ifeq ($(config_uclibc),true)
	rm -f $@ $(GCC_DIR)-host/.kboot-built build/installed/gcc-host
	mkdir -p $(GCC_DIR)-host
	mkdir -p $(PWD)/build/usr/include
	( cd $(GCC_DIR)-host && $(using_uclibc_cross) CC="gcc" \
	  ../$(GCC_DIR)/configure \
	  --prefix=$(PWD)/build \
	  --build=$(GNU_HOST_NAME) \
	  --host=$(GNU_HOST_NAME) \
	  --target=$(REAL_GNU_TARGET_NAME) \
	  --disable-shared \
	  --disable-__cxa_atexit \
	  --enable-target-optspace \
	  --with-gnu-ld \
	  --disable-nls \
	  --enable-multilib \
	  --disable-threads \
	  --enable-languages=c; )
endif
	touch $@

$(GCC_DIR)-host/.kboot-built: \
	  $(GCC_DIR)-host/.kboot-configured
ifeq ($(config_uclibc),true)
	rm -f $@ build/installed/gcc-host
	$(using_uclibc_cross) make -C $(GCC_DIR)-host
endif
	touch $@

build/installed/gcc-host: \
	  $(GCC_DIR)-host/.kboot-built
ifeq ($(config_uclibc),true)
	rm -f $@
	mkdir -p build/installed
	$(using_uclibc_cross) make -C $(GCC_DIR)-host install
	(cd build/bin && \
	  for n in gcc cpp; do ln -sf $(OPTIMIZE_FOR_CPU)-linux-uclibc-$$n $(OPTIMIZE_FOR_CPU)-linux-$$n || exit 1; \
	    done; )
else
	mkdir -p build/installed
endif
	touch $@


# ----- Build gcc (using uClibc) ----------------------------------------------


$(GCC_DIR)-uclibc/.kboot-configured: \
	  $(GCC_DIR)/.kboot-extracted build/installed/binutils
	rm -f $@ $(GCC_DIR)-uclibc/.kboot-built build/installed/gcc-uclibc
	mkdir -p $(GCC_DIR)-uclibc
ifeq ($(config_uclibc),true)
	( cd $(GCC_DIR)-uclibc && \
	  ../$(GCC_DIR)/configure \
	  --with-sysroot=$(PWD)/build \
	  --prefix=$(PWD)/build \
	  --build=$(GNU_HOST_NAME) \
	  --host=$(GNU_HOST_NAME) \
	  --target=$(REAL_GNU_TARGET_NAME) \
	  --disable-shared \
	  --disable-__cxa_atexit \
	  --enable-target-optspace \
	  --with-gnu-ld \
	  --disable-nls \
	  --enable-multilib \
	  --disable-threads \
	  --enable-languages=c; )
endif
	touch $@

$(GCC_DIR)-uclibc/.kboot-built: \
	  $(GCC_DIR)-uclibc/.kboot-configured
ifeq ($(config_uclibc),true)
	rm -f $@ build/installed/gcc-uclibc
	$(using_uclibc_cross) make -C $(GCC_DIR)-uclibc
endif
	touch $@

build/installed/gcc-uclibc: \
	  $(GCC_DIR)-uclibc/.kboot-built
	rm -f $@
	mkdir -p build/installed
ifeq ($(config_uclibc),true)
	$(using_uclibc_cross) make -C $(GCC_DIR)-uclibc install
	# @@@ ugly hack. I wonder how to make gcc pick of the right linker ...
	perl -pi -e 's|/lib/ld-linux.so.\d+|/lib/ld-uClibc.so.0|g' \
	  build/lib/gcc/*/$(GCC_VERSION)/specs
endif
	touch $@


# ----- Build uClibc ----------------------------------------------------------


$(UCLIBC_DIR)/.kboot-extracted: \
	  $(DL)/$(UCLIBC_PACKAGE).ok
	rm -f $@ $(UCLIBC_DIR)/.kboot-configured $(UCLIBC_DIR)/.kboot-built \
	  build/installed/uclibc root-meta/installed/uclibc
ifeq ($(config_uclibc),true)
	tar xfj $(DL)/$(UCLIBC_PACKAGE)
	for i in `ls patches/uClibc/$(UCLIBC_VERSION)/*patch*` ; do \
	  patch -d $(UCLIBC_DIR) -p1 < $$i ; \
	done
endif
	touch $@

$(UCLIBC_DIR)/.kboot-configured: \
	  $(UCLIBC_DIR)/.kboot-extracted $(KERNEL_DIR)/.kboot-built
	rm -f $@ $(UCLIBC_DIR)/.kboot-built build/installed/uclibc
ifeq ($(config_uclibc),true)
	cp $(LOCAL_UCLIBC_CONFIG) $(UCLIBC_DIR)/.config
	$(edit_config) $(UCLIBC_DIR)/.config \
	  'CROSS_COMPILER_PREFIX="$(PWD)/build/bin/$(OPTIMIZE_FOR_CPU)-linux-"' \
	  'TARGET_$(TARGET_ARCH)=y' \
	  'TARGET_ARCH="$(TARGET_ARCH)"' \
	  'KERNEL_SOURCE="$(PWD)/$(KERNEL_DIR)"' \
	  'RUNTIME_PREFIX="/"' \
	  'DEVEL_PREFIX="/usr"' \
	  'UCLIBC_HAS_THREADS=y' \
	  'PTHREADS_DEBUG_SUPPORT=y' \
	  'SHARED_LIB_LOADER_PREFIX="/lib"'
    ifeq ($(nfs_client),true)
	$(edit_config) $(UCLIBC_DIR)/.config \
	  UCLIBC_HAS_RPC=y UCLIBC_HAS_FULL_RPC=n
    endif
	make -C $(UCLIBC_DIR) oldconfig 
endif
	touch $@

$(UCLIBC_DIR)/.kboot-built: \
	  $(UCLIBC_DIR)/.kboot-configured build/installed/gcc-host
	rm -f $@ build/installed/uclibc root-meta/installed/uclibc
ifeq ($(config_uclibc),true)
	$(using_uclibc_cross) make -C $(UCLIBC_DIR)
endif
	touch $@

build/installed/uclibc: \
	  $(UCLIBC_DIR)/.kboot-built
	rm -f $@
	mkdir -p build/installed
ifeq ($(config_uclibc),true)
	make -C $(UCLIBC_DIR) PREFIX=$(PWD)/build install_runtime
	make -C $(UCLIBC_DIR) PREFIX=$(PWD)/build install_dev
endif
	touch $@

root-meta/installed/uclibc: \
	  $(UCLIBC_DIR)/.kboot-built
	rm -f $@
	mkdir -p root root-meta/installed
ifeq ($(config_uclibc),true)
	make -C $(UCLIBC_DIR) PREFIX=$(PWD)/root install_runtime
	rm -f root/lib/lib{dl,m,nsl,pthread,rt}[.-]*
endif
	touch $@


# ----- Build BusyBox ---------------------------------------------------------


$(BUSYBOX_DIR)/.kboot-extracted: \
	  $(DL)/$(BUSYBOX_PACKAGE).ok
	rm -f $@ $(BUSYBOX_DIR)/.kboot-configured $(BUSYBOX_DIR)/.kboot-built \
	  root-meta/installed/busybox
	tar xfj $(DL)/$(BUSYBOX_PACKAGE)
	for i in `ls patches/busybox/$(BUSYBOX_VERSION)/*patch*` ; do \
	  patch -d $(BUSYBOX_DIR) -p1 < $$i ; \
	done
	touch $@

$(BUSYBOX_DIR)/.kboot-configured: \
	  $(BUSYBOX_DIR)/.kboot-extracted \
	  $(build_inst_uclibc)
	rm -f $@ $(BUSYBOX_DIR)/.kboot-built root-meta/installed/busybox
	make -C $(BUSYBOX_DIR) allnoconfig
	# General Configuration
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_FEATURE_VERBOSE_USAGE=y \
	  CONFIG_LFS=y \
	  CONFIG_FEATURE_DEVPTS=y
	# Installation Options
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  'CONFIG_PREFIX="$(PWD)/root"'
	# Busybox Library Tuning
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_MD5_SIZE_VS_SPEED=3
	# Archival Utilities
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_BUNZIP2=y \
	  CONFIG_GUNZIP=y \
	  CONFIG_GZIP=y \
	  CONFIG_TAR=y CONFIG_FEATURE_TAR_CREATE=y CONFIG_FEATURE_TAR_BZIP2=y \
	  CONFIG_FEATURE_TAR_GZIP=y CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY=y \
	  CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y \
	  CONFIG_UNZIP=y
	# Coreutils
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_CAT=y CONFIG_CHROOT=y CONFIG_CP=y \
	  CONFIG_CUT=y \
	  CONFIG_DD=y CONFIG_DF=y \
	  CONFIG_DU=y CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y \
	  CONFIG_ECHO=y CONFIG_FEATURE_FANCY_ECHO=y \
	  CONFIG_EJECT=y \
	  CONFIG_ENV=y \
	  CONFIG_EXPR=y \
	  CONFIG_HEAD=y \
	  CONFIG_LN=y \
	  CONFIG_LS=y CONFIG_FEATURE_LS_FILETYPES=y \
	  CONFIG_FEATURE_LS_FOLLOWLINKS=y CONFIG_FEATURE_LS_RECURSIVE=y \
	  CONFIG_FEATURE_LS_SORTFILES=y CONFIG_FEATURE_LS_TIMESTAMPS=y \
	  CONFIG_FEATURE_LS_USERNAME=y \
	  CONFIG_MD5SUM=y CONFIG_MKDIR=y CONFIG_MKNOD=y CONFIG_MV=y \
	  CONFIG_RM=y CONFIG_RMDIR=y \
	  CONFIG_SHA1SUM=y CONFIG_SORT=y CONFIG_SYNC=y \
	  CONFIG_SLEEP=y \
	  CONFIG_TAIL=y CONFIG_FEATURE_FANCY_TAIL=y \
	  CONFIG_TR=y \
	  CONFIG_TOUCH=y CONFIG_TRUE=y \
	  CONFIG_UNAME=y \
	  CONFIG_GREP=y \
	  CONFIG_AWK=y \
	  CONFIG_FEATURE_PRESERVE_HARDLINKS=y \
	  CONFIG_FEATURE_HUMAN_READABLE=y
	# Console Utilities
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_LOADKMAP=y
	# Debian Utilities
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_WHICH=y
	# Init Utilities
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_HALT=y
	# Linux System Utilities
    ifeq ($(nfs_client),true)
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_FEATURE_MOUNT_NFS=y
    endif
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_HWCLOCK=y \
	  CONFIG_FDISK=y \
	  FDISK_SUPPORT_LARGE_DISKS=y \
	  CONFIG_FEATURE_FDISK_WRITABLE=y \
	  CONFIG_DMESG=y \
	  CONFIG_HEXDUMP=y \
	  CONFIG_MORE=y CONFIG_FEATURE_USE_TERMIOS=y \
	  CONFIG_MOUNT=y \
	  CONFIG_FEATURE_MTAB_SUPPORT=y \
	  CONFIG_SWITCH_ROOT=y \
	  CONFIG_UMOUNT=y \
	  CONFIG_FEATURE_UMOUNT_ALL=y \
	  CONFIG_FEATURE_MOUNT_LOOP=y
	# Networking Utilities
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_IFCONFIG=y CONFIG_FEATURE_IFCONFIG_STATUS=y \
	  CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y \
	  CONFIG_PING=y CONFIG_FEATURE_FANCY_PING=y \
	  CONFIG_ROUTE=y \
	  CONFIG_TFTP=y CONFIG_FEATURE_TFTP_GET=y \
	  CONFIG_WGET=y CONFIG_FEATURE_WGET_STATUSBAR=y \
	  CONFIG_FEATURE_WGET_AUTHENTICATION=y
    ifeq ($(use_dhcp),true)
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_APP_UDHCPC=y
    endif
	# Process Utilities
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_FREE=y
	# Shells
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_FEATURE_SH_IS_ASH=y \
	  CONFIG_FEATURE_SH_IS_NONE=n \
	  CONFIG_ASH_MATH_SUPPORT=y \
	  CONFIG_ASH=y CONFIG_ASH_JOB_CONTROL=y \
	  CONFIG_ASH_OPTIMIZE_FOR_SIZE=y CONFIG_ASH_EXPAND_PRMT=y \
	  CONFIG_FEATURE_COMMAND_EDITING=y \
	  CONFIG_FEATURE_COMMAND_HISTORY=15 \
	  CONFIG_FEATURE_COMMAND_TAB_COMPLETION=y \
	  CONFIG_FEATURE_SH_FANCY_PROMPT=y
	# FS Progs
	$(edit_config) $(BUSYBOX_DIR)/.config \
	  CONFIG_MKE2FS=y \
	  CONFIG_TUNE2FS=y \
	  CONFIG_E2LABEL=y \
	  CONFIG_FINDFS=y
	make -C $(BUSYBOX_DIR) oldconfig
	touch $@

$(BUSYBOX_DIR)/.kboot-built: \
	  $(BUSYBOX_DIR)/.kboot-configured \
	  $(build_inst_gcc_uclibc)
	rm -f $@ root-meta/installed/busybox
ifeq ($(config_uclibc),false)
	$(using_uclibc_cross) make -C $(BUSYBOX_DIR) CROSS_COMPILE=$(TARGET_CROSS) ARCH=$(TARGET_ARCH) LD="$(TARGET_CROSS)ld $(LDFLAGS)"
else
	$(using_uclibc_cross) make -C $(BUSYBOX_DIR) CROSS_COMPILE=$(OPTIMIZE_FOR_CPU)-linux-uclibc- ARCH=$(TARGET_ARCH)
endif
	touch $@

root-meta/installed/busybox: \
	  $(BUSYBOX_DIR)/.kboot-built \
	  $(root_meta_inst_uclibc)
	rm -f $@
	mkdir -p root root-meta/installed
ifeq ($(config_uclibc),false)
	$(using_uclibc_cross) make -C $(BUSYBOX_DIR) CROSS_COMPILE=$(TARGET_CROSS) V=1 ARCH=$(TARGET_ARCH) LD="$(TARGET_CROSS)ld $(LDFLAGS)" install
else
	$(using_uclibc_cross) make -C $(BUSYBOX_DIR) CROSS_COMPILE=$(OPTIMIZE_FOR_CPU)-linux-uclibc- ARCH=$(TARGET_ARCH) install
endif
	touch $@


# ----- Build udev -----------------------------------------------------------


$(UDEV_DIR)/.kboot-extracted: \
	  $(DL)/$(UDEV_PACKAGE).ok
	rm -f $@ $(UDEV_DIR)/.kboot-built root-meta/udev/installed
	tar xfj $(DL)/$(UDEV_PACKAGE)
	touch $@

$(UDEV_DIR)/.kboot-built: \
	  $(UDEV_DIR)/.kboot-extracted $(KERNEL_DIR)/.kboot-built \
	  $(build_inst_gcc_uclibc)
	rm -f $@ root-meta/udev/installed
ifeq ($(config_uclibc),false)
	$(using_uclibc_cross) make -C $(UDEV_DIR) CROSS_COMPILE=$(TARGET_CROSS) \
	  prefix=$(PWD)/root \
	  KERNEL_DIR=$(PWD)/$(KERNEL_DIR) \
	  USE_KLIBC=false USE_LOG=false
else
	$(using_uclibc_cross) make -C $(UDEV_DIR) CROSS_COMPILE=$(OPTIMIZE_FOR_CPU)-linux-uclibc- \
	  DESTDIR=$(PWD)/root \
	  KERNEL_DIR=$(PWD)/$(KERNEL_DIR) \
	  USE_KLIBC=false USE_LOG=false
endif
	touch $@

root-meta/installed/udev: \
	  $(UDEV_DIR)/.kboot-built \
        $(build_inst_gcc_uclibc) \
        $(root_meta_inst_uclibc)
	rm -f $@
	mkdir -p root root-meta/installed
ifeq ($(config_uclibc),false)
	$(using_uclibc_cross) make -C $(UDEV_DIR) \
	  DESTDIR=$(PWD)/root V=true install
else
	$(using_uclibc_cross) make -C $(UDEV_DIR) CROSS_COMPILE=$(OPTIMIZE_FOR_CPU)-linux-uclibc- \
	  DESTDIR=$(PWD)/root V=true install
endif
	cp $(UDEV_DIR)/udevstart root/sbin/
	rm -f root/usr/bin/udev{test,info}
	rm -f root/usr/sbin/udev{monitor,info}
	rm -f root/sbin/udevcontrol
	rm -rf root/usr/share  # man pages
	$(TARGET_CROSS)strip root/sbin/udev*
	touch $@


# ----- Build Dropbear SSH (using host libc, typically glibc) -----------------

#
# We really only care about the key generator and converter
#

$(DROPBEAR_DIR)-host/.kboot-extracted: \
	  $(DL)/$(DROPBEAR_PACKAGE).ok
	rm -f $@ $(DROPBEAR_DIR)-host/.kboot-configured \
	  $(DROPBEAR_DIR)-host/.kboot-built
	# don't use --strip-components et al. for compatibility with older tar
	tar xfz $(DL)/$(DROPBEAR_PACKAGE)
	mv $(DROPBEAR_DIR) $(DROPBEAR_DIR)-host
	touch $@

$(DROPBEAR_DIR)-host/.kboot-configured: \
	  $(DROPBEAR_DIR)-host/.kboot-extracted
	rm -f $@ $(DROPBEAR_DIR)-host/.kboot-built
	( cd $(DROPBEAR_DIR)-host && \
	  ./configure --disable-zlib --disable-syslog; )
	touch $@

$(DROPBEAR_DIR)-host/.kboot-built: \
	  $(DROPBEAR_DIR)-host/.kboot-configured
	rm -f $@
	# dropbear won't build if we don't select client or server
	make -C $(DROPBEAR_DIR)-host \
	  PROGRAMS="dbclient dropbearkey dropbearconvert"
	touch $@


# ----- Build Dropbear SSH (using uClibc) -------------------------------------


$(DROPBEAR_DIR)-uclibc/.kboot-extracted: \
	  $(DL)/$(DROPBEAR_PACKAGE).ok
	rm -f $@ $(DROPBEAR_DIR)-uclibc/.kboot-configured
	rm -f $(DROPBEAR_DIR)-uclibc/.kboot-built root-meta/installed/dropbear
	# don't use --strip-components et al. for compatibility with older tar
	tar xfz $(DL)/$(DROPBEAR_PACKAGE)
	mv $(DROPBEAR_DIR) $(DROPBEAR_DIR)-uclibc
	touch $@

$(DROPBEAR_DIR)-uclibc/.kboot-configured: \
	  $(DROPBEAR_DIR)-uclibc/.kboot-extracted build/installed/gcc-uclibc
	rm -f $@ $(DROPBEAR_DIR)-uclibc/.kboot-built
	rm -f root-meta/installed/dropbear
	( cd $(DROPBEAR_DIR)-uclibc && \
	  $(using_uclibc) ./configure --host=`uname -m` \
	  --prefix=$(PWD)/root --disable-zlib --disable-syslog \
	  --disable-lastlog --disable-utmp --disable-utmpx --disable-wtmp \
	  --disable-wtmpx; )
	perl -pi -e 's/#define.ENABLE_X11FWD/#undef ENABLE_X11FWD/' \
	  $(DROPBEAR_DIR)-uclibc/options.h
	touch $@

DROPBEAR_PROGRAMS :=
ifeq ($(ssh_client),true)
DROPBEAR_PROGRAMS += dbclient
endif
ifeq ($(ssh_server),true)
DROPBEAR_PROGRAMS += dropbear
endif
ifeq ($(ssh_update_keys),true)
DROPBEAR_PROGRAMS += dropbearconvert
endif

$(DROPBEAR_DIR)-uclibc/.kboot-built: \
	  $(DROPBEAR_DIR)-uclibc/.kboot-configured build/installed/gcc-uclibc
	rm -f $@ root-meta/installed/dropbear
	$(using_uclibc) make -C $(DROPBEAR_DIR)-uclibc \
	  PROGRAMS="$(DROPBEAR_PROGRAMS)" MULTI=1
	touch $@

root-meta/installed/dropbear: \
	  $(DROPBEAR_DIR)-uclibc/.kboot-built
	rm -f $@
	mkdir -p root/bin root/sbin root-meta/installed
	install -s $(DROPBEAR_DIR)-uclibc/dropbearmulti root/bin
    ifeq ($(ssh_client),true)
	ln -sf /bin/dropbearmulti root/bin/ssh
    endif
    ifeq ($(ssh_server),true)
	ln -sf /bin/dropbearmulti root/sbin/dropbear
    endif
    ifeq ($(ssh_update_keys),true)
	ln -sf /bin/dropbearmulti root/bin/dropbearconvert
    endif
	touch $@

# ----- Build the schedutils ---------------------------------------------------

$(SCHEDUTILS_DIR)/.kboot-extracted: \
	  $(DL)/$(SCHEDUTILS_PACKAGE).ok
	rm -f $@ $(SCHEDUTILS_DIR)/.kboot-configured \
	  $(SCHEDUTILS_DIR)/.kboot-built root-meta/installed/schedutils
	tar xfz $(DL)/$(SCHEDUTILS_PACKAGE)
	touch $@

$(SCHEDUTILS_DIR)/.kboot-configured: \
	  $(SCHEDUTILS_DIR)/.kboot-extracted build/installed/gcc-uclibc
	rm -f $@ $(SCHEDUTILS_DIR)/.kboot-built \
	  root-meta/installed/schedutils
	touch $@

$(SCHEDUTILS_DIR)/.kboot-built: \
	  $(SCHEDUTILS_DIR)/.kboot-configured build/installed/gcc-uclibc
	rm -f $@ root-meta/installed/schedutils
ifeq ($(config_uclibc),false)
	make -C $(SCHEDUTILS_DIR) taskset CC="$(TARGET_CC)"
else
	$(using_uclibc_cross) make -C $(SCHEDUTILS_DIR) CC=$(OPTIMIZE_FOR_CPU)-linux-uclibc-gcc INCLUDEDIR=$(PWD)/build/usr/include taskset
endif
	touch $@

root-meta/installed/schedutils: \
	  $(SCHEDUTILS_DIR)/.kboot-built \
        $(root_meta_inst_uclibc)
	rm -f $@
	mkdir -p root root-meta/installed
	cp $(SCHEDUTILS_DIR)/taskset $(PWD)/root/usr/bin
	$(TARGET_CROSS)strip $(PWD)/root/usr/bin/taskset
	touch $@

# ----- Build the nfs-utils ---------------------------------------------------

$(NFS_UTILS_DIR)/.kboot-extracted: \
	  $(DL)/$(NFS_UTILS_PACKAGE).ok
	rm -f $@ $(NFS_UTILS_DIR)/.kboot-configured \
	  $(NFS_UTILS_DIR)/.kboot-built root-meta/installed/nfs-utils
	tar xfz $(DL)/$(NFS_UTILS_PACKAGE)
	for i in `ls patches/nfs-utils/$(NFS_UTILS_VERSION)/*patch*` ; do \
	  patch -d $(NFS_UTILS_DIR) -p1 < $$i ; \
	done
	touch $@

$(NFS_UTILS_DIR)/.kboot-configured: \
	  $(NFS_UTILS_DIR)/.kboot-extracted build/installed/gcc-uclibc
	rm -f $@ $(NFS_UTILS_DIR)/.kboot-built \
	  root-meta/installed/nfs-utils
ifneq ($(HOST_ARCH),$(KERNEL_ARCH))
	( cd $(NFS_UTILS_DIR) && export knfsd_cv_bsd_signals=yes && \
	  $(using_uclibc) ./configure --build=$(GNU_HOST_NAME) \
	  --host=$(KERNEL_ARCH) \
	  --includedir=$(PWD)/$(KERNEL_DIR)/include --prefix=$(PWD)/root \
	  --without-tcp-wrappers --disable-uuid --disable-nfsv4 --disable-gss; )
else
	( cd $(NFS_UTILS_DIR) && export knfsd_cv_bsd_signals=yes && \
	  ./configure \
	  --includedir=$(PWD)/$(KERNEL_DIR)/include --prefix=$(PWD)/root \
	  --without-tcp-wrappers --disable-uuid --disable-nfsv4 --disable-gss; )
endif

	touch $@

$(NFS_UTILS_DIR)/.kboot-built: \
	  $(NFS_UTILS_DIR)/.kboot-configured build/installed/gcc-uclibc
	rm -f $@ root-meta/installed/nfs-utils
ifeq ($(config_uclibc),false)
	make -C $(NFS_UTILS_DIR) CC="$(TARGET_CC)"
else
	$(using_uclibc_cross) make -C $(NFS_UTILS_DIR) CC=$(OPTIMIZE_FOR_CPU)-linux-uclibc-gcc INCLUDEDIR=$(PWD)/build/usr/include 
endif
	touch $@

root-meta/installed/nfs-utils: \
	  $(NFS_UTILS_DIR)/.kboot-built \
        $(root_meta_inst_uclibc)
	rm -f $@
	mkdir -p root root-meta/installed
	cp $(NFS_UTILS_DIR)/utils/showmount/showmount $(PWD)/root/usr/sbin
	$(TARGET_CROSS)strip $(PWD)/root/usr/sbin/showmount
	touch $@

# ----- Build the coreutils ---------------------------------------------------

$(COREUTILS_DIR)/.kboot-extracted: \
	  $(DL)/$(COREUTILS_PACKAGE).ok
	rm -f $@ $(COREUTILS_DIR)/.kboot-configured \
	  $(COREUTILS_DIR)/.kboot-built root-meta/installed/coreutils
	tar xfj $(DL)/$(COREUTILS_PACKAGE)
	touch $@

$(COREUTILS_DIR)/.kboot-configured: \
	  $(COREUTILS_DIR)/.kboot-extracted build/installed/gcc-uclibc
	rm -f $@ $(COReUTILS_DIR)/.kboot-built \
	  root-meta/installed/coreutils
ifneq ($(HOST_ARCH),$(KERNEL_ARCH))
	( cd $(COREUTILS_DIR) && \
	  export ac_cv_func_strtod=yes \
                ac_fsusage_space=yes \
                fu_cv_sys_stat_statfs2_bsize=yes \
                ac_cv_func_closedir_void=no \
                ac_cv_func_getloadavg=no \
                ac_cv_lib_util_getloadavg=no \
                ac_cv_lib_getloadavg_getloadavg=no \
                ac_cv_func_getgroups=yes \
                ac_cv_func_getgroups_works=yes \
                ac_cv_func_chown_works=yes \
                ac_cv_have_decl_euidaccess=no \
                ac_cv_func_euidaccess=no \
                ac_cv_have_decl_strnlen=yes \
                ac_cv_func_strnlen_working=yes \
                ac_cv_func_lstat_dereferences_slashed_symlink=yes \
                ac_cv_func_lstat_empty_string_bug=no \
                ac_cv_func_stat_empty_string_bug=no \
                vb_cv_func_rename_trailing_slash_bug=no \
                ac_cv_have_decl_nanosleep=yes \
                jm_cv_func_nanosleep_works=yes \
                gl_cv_func_working_utimes=yes \
                ac_cv_func_utime_null=yes \
                ac_cv_have_decl_strerror_r=yes \
                ac_cv_func_strerror_r_char_p=no \
                jm_cv_func_svid_putenv=yes \
                ac_cv_func_getcwd_null=yes \
                ac_cv_func_getdelim=yes \
                ac_cv_func_mkstemp=yes \
                utils_cv_func_mkstemp_limitations=no \
                utils_cv_func_mkdir_trailing_slash_bug=no \
                ac_cv_func_memcmp_working=yes \
                ac_cv_have_decl_malloc=yes \
                gl_cv_func_malloc_0_nonnull=yes \
                ac_cv_func_malloc_0_nonnull=yes \
                ac_cv_func_calloc_0_nonnull=yes \
                ac_cv_func_realloc_0_nonnull=yes \
                jm_cv_func_gettimeofday_clobber=no \
                am_cv_func_working_getline=yes \
                gl_cv_func_working_readdir=yes \
                jm_ac_cv_func_link_follows_symlink=no \
                utils_cv_localtime_cache=no \
                ac_cv_struct_st_mtim_nsec=no \
                gl_cv_func_tzset_clobber=no \
                gl_cv_func_getcwd_null=yes \
                gl_cv_func_getcwd_path_max=yes \
                ac_cv_func_fnmatch_gnu=yes \
                am_getline_needs_run_time_check=no \
                am_cv_func_working_getline=yes \
                gl_cv_func_mkdir_trailing_slash_bug=no \
                gl_cv_func_mkstemp_limitations=no \
                ac_cv_func_working_mktime=yes \
                jm_cv_func_working_re_compile_pattern=yes \
                gl_cv_c_restrict=__restrict \
                ac_use_included_regex=no && \
	  $(using_uclibc) ./configure \
	  --host=$(GNU_HOST_NAME) \
	  --target=$(REAL_GNU_TARGET_NAME) \
	  --includedir=$(PWD)/$(KERNEL_DIR)/include --prefix=$(PWD)/root \
	  --disable-nls; )
else
	( cd $(COREUTILS_DIR) && \
	  export ac_cv_func_strtod=yes \
                ac_fsusage_space=yes \
                fu_cv_sys_stat_statfs2_bsize=yes \
                ac_cv_func_closedir_void=no \
                ac_cv_func_getloadavg=no \
                ac_cv_lib_util_getloadavg=no \
                ac_cv_lib_getloadavg_getloadavg=no \
                ac_cv_func_getgroups=yes \
                ac_cv_func_getgroups_works=yes \
                ac_cv_func_chown_works=yes \
                ac_cv_have_decl_euidaccess=no \
                ac_cv_func_euidaccess=no \
                ac_cv_have_decl_strnlen=yes \
                ac_cv_func_strnlen_working=yes \
                ac_cv_func_lstat_dereferences_slashed_symlink=yes \
                ac_cv_func_lstat_empty_string_bug=no \
                ac_cv_func_stat_empty_string_bug=no \
                vb_cv_func_rename_trailing_slash_bug=no \
                ac_cv_have_decl_nanosleep=yes \
                jm_cv_func_nanosleep_works=yes \
                gl_cv_func_working_utimes=yes \
                ac_cv_func_utime_null=yes \
                ac_cv_have_decl_strerror_r=yes \
                ac_cv_func_strerror_r_char_p=no \
                jm_cv_func_svid_putenv=yes \
                ac_cv_func_getcwd_null=yes \
                ac_cv_func_getdelim=yes \
                ac_cv_func_mkstemp=yes \
                utils_cv_func_mkstemp_limitations=no \
                utils_cv_func_mkdir_trailing_slash_bug=no \
                ac_cv_func_memcmp_working=yes \
                ac_cv_have_decl_malloc=yes \
                gl_cv_func_malloc_0_nonnull=yes \
                ac_cv_func_malloc_0_nonnull=yes \
                ac_cv_func_calloc_0_nonnull=yes \
                ac_cv_func_realloc_0_nonnull=yes \
                jm_cv_func_gettimeofday_clobber=no \
                am_cv_func_working_getline=yes \
                gl_cv_func_working_readdir=yes \
                jm_ac_cv_func_link_follows_symlink=no \
                utils_cv_localtime_cache=no \
                ac_cv_struct_st_mtim_nsec=no \
                gl_cv_func_tzset_clobber=no \
                gl_cv_func_getcwd_null=yes \
                gl_cv_func_getcwd_path_max=yes \
                ac_cv_func_fnmatch_gnu=yes \
                am_getline_needs_run_time_check=no \
                am_cv_func_working_getline=yes \
                gl_cv_func_mkdir_trailing_slash_bug=no \
                gl_cv_func_mkstemp_limitations=no \
                ac_cv_func_working_mktime=yes \
                jm_cv_func_working_re_compile_pattern=yes \
                gl_cv_c_restrict=__restrict \
                ac_use_included_regex=no && \
	  $(using_uclibc) ./configure \
	  --host=$(GNU_HOST_NAME) \
	  --includedir=$(PWD)/$(KERNEL_DIR)/include --prefix=$(PWD)/root \
	  --disable-nls; )
endif
	touch $@

$(COREUTILS_DIR)/.kboot-built: \
	  $(COREUTILS_DIR)/.kboot-configured build/installed/gcc-uclibc
	rm -f $@ root-meta/installed/coreutils
ifeq ($(config_uclibc),false)
	make -C $(COREUTILS_DIR) CC="$(TARGET_CC)"
else
	$(using_uclibc_cross) make -C $(COREUTILS_DIR) CC=$(OPTIMIZE_FOR_CPU)-linux-uclibc-gcc INCLUDEDIR=$(PWD)/build/usr/include
endif
	touch $@

root-meta/installed/coreutils: \
	  $(COREUTILS_DIR)/.kboot-built \
        $(root_meta_inst_uclibc)
	rm -f $@
	mkdir -p root root-meta/installed
	cp $(COREUTILS_DIR)/src/date $(PWD)/root/bin
	$(TARGET_CROSS)strip $(PWD)/root/bin/date
	touch $@

# ----- Build the ncurses ---------------------------------------------------

$(NCURSES_DIR)/.kboot-extracted: \
	  $(DL)/$(NCURSES_PACKAGE).ok
	rm -f $@ $(NCURSES_DIR)/.kboot-configured \
	  $(NCURSES_DIR)/.kboot-built root-meta/installed/ucurses
	tar xfz $(DL)/$(NCURSES_PACKAGE)
	touch $@

$(NCURSES_DIR)/.kboot-configured: \
	  $(NCURSES_DIR)/.kboot-extracted build/installed/gcc-uclibc
	rm -f $@ $(NCURSES_DIR)/.kboot-built \
	  root-meta/installed/ncurses
ifneq ($(HOST_ARCH),$(KERNEL_ARCH))
	( cd $(NCURSES_DIR) && \
	  $(using_uclibc) BUILD_CC=$(HOSTCC) CC=$(TARGET_CC) ./configure \
	  --host=$(GNU_HOST_NAME) \
	  --target=$(REAL_GNU_TARGET_NAME) \
	  --includedir=$(PWD)/$(KERNEL_DIR)/include --prefix=$(PWD)/root \
	  --with-terminfo-dirs=/usr/share/terminfo \
	  --with-default-terminfo-dir=/usr/share/terminfo \
	  --libdir=$(PWD)/build/lib \
	  --with-shared --without-cxx --without-cxx-binding \
	  --without-ada --without-progs \
	  --without-profile --without-debug --disable-rpath \
	  --enable-echo --enable-const --enable-overwrite \
	  --enable-broken_linker \
	  --disable-nls; )
else
	( cd $(NCURSES_DIR) && \
	  $(using_uclibc) BUILD_CC=$(HOSTCC) CC=$(TARGET_CC) ./configure \
	  --host=$(GNU_HOST_NAME) \
	  --includedir=$(PWD)/$(KERNEL_DIR)/include --prefix=$(PWD)/root \
	  --with-terminfo-dirs=/usr/share/terminfo \
	  --with-default-terminfo-dir=/usr/share/terminfo \
	  --libdir=$(PWD)/build/lib \
	  --with-shared --without-cxx --without-cxx-binding \
	  --without-ada --without-progs \
	  --without-profile --without-debug --disable-rpath \
	  --enable-echo --enable-const --enable-overwrite \
	  --enable-broken_linker \
	  --disable-nls; )
endif
	touch $@

$(NCURSES_DIR)/.kboot-built: \
	  $(NCURSES_DIR)/.kboot-configured build/installed/gcc-uclibc
	rm -f $@ root-meta/installed/ncurses
ifeq ($(config_uclibc),false)
	make -C $(NCURSES_DIR) CC="$(TARGET_CC)" DESTDIR=$(PWD)/build libs panel menu form headers
else
	$(using_uclibc_cross) make -C $(NCURSES_DIR) CC=$(OPTIMIZE_FOR_CPU)-linux-uclibc-gcc INCLUDEDIR=$(PWD)/build/usr/include DESTDIR=$(PWD)/build libs panel menu form headers
endif
	touch $@

root-meta/installed/ncurses: \
	  $(NCURSES_DIR)/.kboot-built \
	$(root_meta_inst_uclibc)
	rm -f $@
	mkdir -p root root-meta/installed
	make \
	    prefix=$(PWD)/build \
	    exec_prefix=$(PWD)/build \
	    bindir=$(PWD)/build/bin \
	    sbindir=$(PWD)/build/sbin \
	    libexecdir=$(PWD)/build/lib \
	    datadir=$(PWD)/build/usr/share \
	    sysconfdir=$(PWD)/build/etc \
	    localstatedir=$(PWD)/build/var \
	    libdir=$(PWD)/build/usr/lib \
	    infodir=$(PWD)/build/usr/info \
	    mandir=$(PWD)/build/usr/man \
	    includedir=$(PWD)/build/usr/include \
	    gxx_include_dir=$(PWD)/build/usr/include/c++ \
	    ticdir=$(PWD)/build/usr/share/terminfo \
	    -C $(NCURSES_DIR) install;
	    chmod a-x $(NCURSES_DIR)/lib/libncurses.so*
	    touch -c $(PWD)/build/usr/lib/libncurses.a
	    cp -dpf $(NCURSES_DIR)/lib/libncurses.so* root/lib
	    cp -dpf $(PWD)/build/usr/lib/terminfo root/usr/lib
	    mkdir -p root/usr/share/terminfo/x
	    cp -dpf $(PWD)/build/usr/share/terminfo/x/xterm root/usr/share/terminfo/x
	    cp -dpf $(PWD)/build/usr/share/terminfo/x/xterm-color root/usr/share/terminfo/x
	    cp -dpf $(PWD)/build/usr/share/terminfo/x/xterm-xfree86 root/usr/share/terminfo/x
	    mkdir -p root/usr/share/terminfo/v
	    cp -dpf $(PWD)/build/usr/share/terminfo/v/vt100 root/usr/share/terminfo/v
	    cp -dpf $(PWD)/build/usr/share/terminfo/v/vt200 root/usr/share/terminfo/v
	    mkdir -p root/usr/share/terminfo/a
	    cp -dpf $(PWD)/build/usr/share/terminfo/a/ansi root/usr/share/terminfo/a
	    mkdir -p root/usr/share/terminfo/l
	    cp -dpf $(PWD)/build/usr/share/terminfo/l/linux root/usr/share/terminfo/l
	    $(TARGET_CROSS)strip --strip-unneeded root/lib/libncurses.so.*
	    touch -c root/usr/lib/libncurses.so.*
	touch $@

# ----- Build the util-linux ---------------------------------------------------

$(UTIL_LINUX_DIR)/.kboot-extracted: \
	  $(DL)/$(UTIL_LINUX_PACKAGE).ok
	rm -f $@ $(UTIL_LINUX_DIR)/.kboot-configured \
	  $(UTIL_LINUX_DIR)/.kboot-built root-meta/installed/util-linux
	tar xfj $(DL)/$(UTIL_LINUX_PACKAGE)
	for i in `ls patches/util-linux/$(UTIL_LINUX_VERSION)/*patch*` ; do \
	  patch -d $(UTIL_LINUX_DIR) -p1 < $$i ; \
	done
	touch $@

$(UTIL_LINUX_DIR)/.kboot-configured: \
	  $(UTIL_LINUX_DIR)/.kboot-extracted build/installed/gcc-uclibc
	rm -f $@ $(UTIL_LINUX_DIR)/.kboot-built \
	  root-meta/installed/util-linux
ifneq ($(HOST_ARCH),$(KERNEL_ARCH))
	( cd $(UTIL_LINUX_DIR) && \
	  $(using_uclibc) CC=$(TARGET_CC) ./configure \
	  --host=$(GNU_HOST_NAME) \
	  --target=$(REAL_GNU_TARGET_NAME) \
	  --includedir=$(PWD)/$(KERNEL_DIR)/include --prefix=$(PWD)/root \
	  --disable-nls; )
else
	( cd $(UTIL_LINUX_DIR) && \
	  $(using_uclibc) CC=$(TARGET_CC) ./configure \
	  --host=$(GNU_HOST_NAME) \
	  --includedir=$(PWD)/$(KERNEL_DIR)/include --prefix=$(PWD)/root \
	  --disable-nls; )
endif
	touch $@

$(UTIL_LINUX_DIR)/.kboot-built: \
	  $(UTIL_LINUX_DIR)/.kboot-configured build/installed/gcc-uclibc
	rm -f $@ root-meta/installed/util-linux
ifeq ($(config_uclibc),false)
	make -C $(UTIL_LINUX_DIR) CC="$(TARGET_CC)" CPU=$(TARGET_ARCH) ADD_RAW=yes HAVE_SLANG=no OPT="-pipe -O2"
else
	$(using_uclibc_cross) make -C $(UTIL_LINUX_DIR) CC=$(OPTIMIZE_FOR_CPU)-linux-uclibc-gcc INCLUDEDIR=$(PWD)/build/usr/include CPU=$(TARGET_ARCH) ADD_RAW=yes HAVE_SLANG=no OPT="-pipe -O2"
endif
	touch $@

root-meta/installed/util-linux: \
	  $(UTIL_LINUX_DIR)/.kboot-built \
	$(root_meta_inst_uclibc) \
	$(root_meta_inst_ncurses)
	rm -f $@
	mkdir -p root root-meta/installed
	cp $(UTIL_LINUX_DIR)/misc-utils/setterm $(PWD)/root/bin
	$(TARGET_CROSS)strip $(PWD)/root/bin/setterm
	touch $@

# ----- Build the ps3pf_utils ---------------------------------------------------

ifeq ($(TARGET_ARCH),powerpc)
$(PS3PF_UTILS_DIR)/.kboot-extracted: \
	  $(DL)/$(PS3PF_UTILS_PACKAGE).ok
	rm -f $@ $(PS3PF_UTILS_DIR)/.kboot-configured \
	  $(PS3PF_UTILS_DIR)/.kboot-built root-meta/installed/ps3pf_utils
	tar xfj $(DL)/$(PS3PF_UTILS_PACKAGE)
	touch $@

$(PS3PF_UTILS_DIR)/.kboot-configured: \
	  $(PS3PF_UTILS_DIR)/.kboot-extracted build/installed/gcc-uclibc
	rm -f $@ $(PS3PF_UTILS_DIR)/.kboot-built \
	  root-meta/installed/ps3pf_utils
ifneq ($(HOST_ARCH),$(KERNEL_ARCH))
	( cd $(PS3PF_UTILS_DIR) && \
	  ./bootstrap && \
	  ./configure \
	  --host=$(KERNEL_ARCH) \
	  --prefix=""; )
else
	( cd $(PS3PF_UTILS_DIR) && \
	  ./bootstrap && \
	  ./configure \
	  --host=$(KERNEL_ARCH) \
	   --prefix=""; )
endif
	touch $@

$(PS3PF_UTILS_DIR)/.kboot-built: \
	  $(PS3PF_UTILS_DIR)/.kboot-configured build/installed/gcc-uclibc
	rm -f $@ root-meta/installed/ps3pf_utils
ifeq ($(config_uclibc),false)
	make -C $(PS3PF_UTILS_DIR) CC="$(TARGET_CC)"
else
	$(using_uclibc_cross) make -C $(PS3PF_UTILS_DIR) CC=$(OPTIMIZE_FOR_CPU)-linux-uclibc-gcc INCLUDEDIR=$(PWD)/build/usr/include 
endif
	touch $@

root-meta/installed/ps3pf_utils: \
	  $(PS3PF_UTILS_DIR)/.kboot-built \
	$(root_meta_inst_uclibc)
	rm -f $@
	mkdir -p root root-meta/installed
	cp $(PS3PF_UTILS_DIR)/{ps3-flash-util,ps3-boot-game-os} $(PWD)/root/sbin
	$(TARGET_CROSS)strip $(PWD)/root/sbin/ps3-flash-util
	touch $@
endif

# ----- Build the kexec tools -------------------------------------------------


$(KEXEC_TOOLS_DIR)/.kboot-extracted: \
	  $(DL)/$(KEXEC_TOOLS_PACKAGE).ok
	rm -f $@ $(KEXEC_TOOLS_DIR)/.kboot-configured \
	  $(KEXEC_TOOLS_DIR)/.kboot-built root-meta/installed/kexec-tools
	tar xfz $(DL)/$(KEXEC_TOOLS_PACKAGE)
	rm -f kexec-tools-$(KEXEC_TOOLS_VERSION).spec
#	for i in `ls patches/kexec/$(KEXEC_TOOLS_VERSION)/*patch*` ; do \
#	  patch -d $(KEXEC_TOOLS_DIR) -p1 < $$i ; \
#	done
#ifneq ($(HOST_ARCH),$(KERNEL_ARCH))
#	for i in `ls patches/kexec/$(KEXEC_TOOLS_VERSION)/cross/*patch*` ; do \
#	  patch -d $(KEXEC_TOOLS_DIR) -p1 < $$i ; \
#	done
#endif
	touch $@


$(KEXEC_TOOLS_DIR)/.kboot-configured: \
	  $(KEXEC_TOOLS_DIR)/.kboot-extracted build/installed/gcc-uclibc
	rm -f $@ $(KEXEC_TOOLS_DIR)/.kboot-built \
	  root-meta/installed/kexec-tools
ifneq ($(HOST_ARCH),$(KERNEL_ARCH))
	( cd $(KEXEC_TOOLS_DIR) && \
	  autoheader && \
	  autoconf && \
	  $(using_kexec_cross) ./configure --build=$(GNU_HOST_NAME) \
	  --host=$(KERNEL_ARCH) --target=$(KERNEL_ARCH) \
	  CC='$(KEXEC_CC) -m64' TARGET_CC='$(KEXEC_CC) -m64' \
	  CFLAGS='-Wall -O2 -static -fno-strict-aliasing $(CPPFLAGS) ' \
	  LDFLAGS='-static' AR=$(KEXEC_AR) --without-zlib \
	  --includedir=$(PWD)/$(KERNEL_DIR)/include --prefix=$(PWD)/root; )
else
	( cd $(KEXEC_TOOLS_DIR) && \
	  autoheader && \
	  autoconf && \
	  ./configure \
	  --host=$(KERNEL_ARCH) \
	  CC='$(KEXEC_CC) -m64' TARGET_CC='$(KEXEC_CC) -m64' \
	  CFLAGS='-Wall -O2 -static -fno-strict-aliasing $(CPPFLAGS) ' \
	  LDFLAGS='-static' AR=$(KEXEC_AR) --without-zlib \
	  --includedir=$(PWD)/$(KERNEL_DIR)/include --prefix=$(PWD)/root; )
endif
	touch $@

$(KEXEC_TOOLS_DIR)/.kboot-built: \
	  $(KEXEC_TOOLS_DIR)/.kboot-configured build/installed/gcc-uclibc
	rm -f $@ root-meta/installed/kexec-tools
	$(using_kexec_cross) make -C $(KEXEC_TOOLS_DIR) ARCH=$(KEXEC_ARCH)
	touch $@

root-meta/installed/kexec-tools: \
	  $(KEXEC_TOOLS_DIR)/.kboot-built \
	$(root_meta_inst_uclibc)
	rm -f $@
	mkdir -p root root-meta/installed
	$(using_uclibc_cross) make -C $(KEXEC_TOOLS_DIR) ARCH=$(KEXEC_ARCH) install
	$(KEXEC_STRIP) root/sbin/kexec
	rm -f root/sbin/kdump
	rm -rf root/lib/kexec-tools  # kexec_test
	rm -rf root/usr/share  # man pages
	touch $@


# ----- Build kbd -------------------------------------------------------------


$(KBD_DIR)/.kboot-extracted: \
	  $(DL)/$(KBD_PACKAGE).ok
	rm -f $@ $(KBD_DIR)/.kboot-configured $(KBD_DIR)/.kboot-built
	tar xfz $(DL)/$(KBD_PACKAGE)
	patch -d $(KBD_DIR) -p1 -s \
	  <patches/kbd-bkeymap.patch
	touch $@

$(KBD_DIR)/.kboot-configured: \
	  $(KBD_DIR)/.kboot-extracted
	rm -f $@ $(KBD_DIR)/.kboot-built
	cd $(KBD_DIR) && ./configure
	touch $@

$(KBD_DIR)/.kboot-built: \
	  $(KBD_DIR)/.kboot-configured
	make -C $(KBD_DIR)
	touch $@

# ----- Build LILO ------------------------------------------------------------


# ----- kboot's utilities -----------------------------------------------------


utils/$(OPTIMIZE_FOR_CPU)-linux-uclibc-readline: \
	  utils/readline.c build/installed/gcc-uclibc
	$(using_uclibc_cross) make -C utils CROSS=$(OPTIMIZE_FOR_CPU)-linux-uclibc- $(OPTIMIZE_FOR_CPU)-linux-uclibc-readline

utils/$(OPTIMIZE_FOR_CPU)-linux-uclibc-getctty: \
	  utils/getctty.c build/installed/gcc-uclibc
	$(using_uclibc_cross) make -C utils CROSS=$(OPTIMIZE_FOR_CPU)-linux-uclibc- $(OPTIMIZE_FOR_CPU)-linux-uclibc-getctty

utils/$(OPTIMIZE_FOR_CPU)-linux-uclibc-fsbyname: \
	  utils/fsbyname.c build/installed/gcc-uclibc
	$(using_uclibc_cross) make -C utils CROSS=$(OPTIMIZE_FOR_CPU)-linux-uclibc- $(OPTIMIZE_FOR_CPU)-linux-uclibc-fsbyname

utils/$(TARGET_CROSS)readline: \
	  utils/readline.c
	$(using_uclibc_cross) make -C utils CROSS=$(TARGET_CROSS) $(TARGET_CROSS)readline

utils/$(TARGET_CROSS)getctty: \
	  utils/getctty.c
	$(using_uclibc_cross) make -C utils CROSS=$(TARGET_CROSS) $(TARGET_CROSS)getctty

utils/$(TARGET_CROSS)fsbyname: \
	  utils/fsbyname.c
	$(using_uclibc_cross) make -C utils CROSS=$(TARGET_CROSS) $(TARGET_CROSS)fsbyname


# ----- keymaps ---------------------------------------------------------------


keymaps: \
	keymaps/.built

keymaps/.built: \
	  $(KBD_DIR)/.kboot-built
	mkdir -p keymaps
	find $(KBD_DIR)/data/keymaps -name '*.map' \
	  -exec sh -c '$(KBD_DIR)/src/loadkeys -b {} \
	  >keymaps/`basename {} .map`.bkeymap' ';'


# ----- Test-run the kboot shell ----------------------------------------------


try:
	-umount root/proc root/sys root/mnt/root root/mnt/root/boot \
	  root/mnt/tmp/*
	-umount root/dev/pts
	-rmdir root/mnt/tmp/*
	-stty_saved=`stty -g`; \
	  chroot root /init --dry-run; \
	  stty $$stty_saved
	-umount root/proc root/sys root/mnt/root root/mnt/root/boot \
	  root/mnt/tmp/*
	-umount root/dev/pts
	-rmdir root/mnt/tmp/*
	-pid=`cat root/var/run/dropbear.pid` && kill $$pid


# ---- Cleanup ----------------------------------------------------------------


reset:
	rm -f $(KERNEL_DIR)/.kboot-{extracted,configured,built}
	rm -f $(BINUTILS)/.kboot-{extracted,configured,built}
	rm -f $(GCC_DIR)/.kboot-extracted
	rm -f $(GCC_DIR)-host/.kboot-{configured,built}
	rm -f $(GCC_DIR)-uclibc/.kboot-{configured,built}
	rm -f $(UCLIBC_DIR)/.kboot-{extracted,configured,built}
	rm -f $(BUSYBOX_DIR)/.kboot-{extracted,configured,built}
	rm -f $(UDEV_DIR)/.kboot-{extracted,configured,built}
	rm -f $(KEXEC_TOOLS_DIR)/.kboot-{extracted,configured,built}
	rm -f $(DROPBEAR_DIR)-host/.kboot-{extracted,configured,built}
	rm -f $(DROPBEAR_DIR)-uclibc/.kboot-{extracted,configured,built}
#	rm -f $(LILO_DIR)/.kboot-{extracted,configured,built}
	rm -rf {root-meta,build}/installed root-meta/cache
	$(MAKE) -C utils clean

kernelupdate:
	cd $(DL)/linux-$(KERNEL_VERSION); cvs update -d; cd ..

kernelclean:
	rm -rf linux
	rm -rf $(KERNEL_DIR)
	rm -rf $(DL)/$(KERNEL_PACKAGE)
	rm -rf $(DL)/$(KERNEL_PACKAGE).ok
	rm -rf root-meta/installed/linux

clean:
	rm -rf $(KERNEL_DIR)
	rm -rf $(BINUTILS_DIR)
	rm -rf $(GCC_DIR) $(GCC_DIR)-host $(GCC_DIR)-uclibc
	rm -rf $(UCLIBC_DIR)
	rm -rf $(BUSYBOX_DIR)
	rm -rf $(UDEV_DIR)
	rm -rf $(KEXEC_TOOLS_DIR)
	rm -rf $(SCHEDUTILS_DIR)
	rm -rf $(NFS_UTILS_DIR)
	rm -rf $(COREUTILS_DIR)
	rm -rf $(NCURSES_DIR)
	rm -rf $(UTIL_LINUX_DIR)
	rm -rf $(PS3PF_UTILS_DIR)
	rm -rf $(DROPBEAR_DIR) $(DROPBEAR_DIR)-host $(DROPBEAR_DIR)-uclibc
#	rm -rf $(LILO_DIR)
	rm -rf build root root-meta keymaps
	$(MAKE) -C utils clean

spotless: \
	clean
	rm -f config/[abcdefghijklmnopqrstuvwxyz]*
	$(MAKE) -C utils spotless


# ----- Distribution ----------------------------------------------------------


SF_ACCOUNT=almesber@kboot.sourceforge.net
SF_DIR=/home/groups/k/kb/kboot/htdocs
SF_UPLOAD=$(SF_ACCOUNT):$(SF_DIR)/


dist:	kboot-$(KBOOT_VERSION).tar.gz

kboot-$(KBOOT_VERSION).tar.gz: \
	  $(FILES)
	rm -f kboot-$(KBOOT_VERSION)
	ln -sf . kboot-$(KBOOT_VERSION)
	tar cf - `for n in $(FILES); do \
	  echo kboot-$(KBOOT_VERSION)/$$n; done` | \
	  gzip -9 >kboot-$(KBOOT_VERSION).tar.gz || \
	  { rm -f kboot-$(KBOOT_VERSION).tar.gz; exit 1; }
	rm -f kboot-$(KBOOT_VERSION)

upload:	dist
	@echo -n "md5sum " && \
	  md5sum kboot-$(KBOOT_VERSION).tar.gz | sed 's/ .*//'
	@echo -n "sha1sum " && \
	  sha1sum kboot-$(KBOOT_VERSION).tar.gz | sed 's/ .*//'
	scp kboot-$(KBOOT_VERSION).tar.gz CHANGES $(SF_UPLOAD)
	ssh $(SF_ACCOUNT) $(SF_DIR)/release.sh $(SF_DIR) $(KBOOT_VERSION)
