ifndef BOARD_TYPE
$(error "Please DO setenv.sh first!")
endif

#
# Include the specific configuration files from the config.boardtype file
# here.  This removes the need to set environmental variables through a
# script before building
#

include scripts/$(BOARD_TYPE)/config.$(BOARD_TYPE)

#
# Put in safety checks here to ensure all required variables are defined in
# the configuration file
#

#ifndef TOOLPREFIX
#$(error "Must specify TOOLPREFIX value")
#endif

export WPA_ENTERPRISE=1

ifndef TOOLCHAIN
$(error "Must specify TOOLCHAIN value")
endif

ifndef TOOLARCH
$(error "Must specify TOOLARCH value")
endif

ifndef KERNEL
$(error "Must specify KERNEL value")
endif

ifndef KERNELVER
$(error "Must specify KERNELVER value")
endif

ifndef KERNELTARGET
$(error "Must specify KERNELTARGET value")
endif

ifndef KERNELARCH
$(error "Must specify KERNELARCH value")
endif

ifndef BUSYBOX
$(error "Must specify BUSYBOX value")
endif

ifndef TFTPPATH
export TFTPPATH=$(TOPDIR)/images/
endif

ifndef  BUILD_OPTIMIZED
export BUILD_OPTIMIZED=n
export STRIP=$(TOOLPREFIX)strip
endif

ifeq ($(BUILD_OPTIMIZED), y)
export OLDSTRIP=$(TOOLPREFIX)strip
export STRIP=$(TOOLPREFIX)sstrip
endif 

ifndef COMPRESSED_UBOOT
export COMPRESSED_UBOOT=0
endif

ifndef ATH_CONFIG_NVRAM
export ATH_CONFIG_NVRAM=0
endif

ifndef ATH_SINGLE_CFG
export ATH_SINGLE_CFG=0
endif

export JFFS2FILE=$(BOARD_TYPE)$(BUILD_CONFIG)-jffs2
export INFOFILE=vmlinux$(BUILD_CONFIG).info
export KTFILE=$(KERNELTARGET:.bin=$(BUILD_CONFIG).bin)

ifneq ($(COMPRESSED_UBOOT),1)
export UBOOTFILE=$(BOARD_TYPE)_u-boot$(BUILD_CONFIG).bin
export UBOOT_BINARY=u-boot.bin
else
export UBOOTFILE=tuboot$(BUILD_CONFIG).bin
export UBOOT_BINARY=tuboot.bin
endif
#
# Other environmental variables that are configured as per the configuration file
# specified above.  These contain all platform specific configuration items.
#

export TOPDIR=$(PWD)/..
export INSTALL_ROOT=$(TOPDIR)/rootfs-$(BOARD_TYPE)$(BUILD_CONFIG).build
$(shell mkdir -p $(INSTALL_ROOT))
$(shell mkdir -p $(INSTALL_ROOT)/sbin)
$(shell mkdir -p $(INSTALL_ROOT)/lib)
$(shell mkdir -p $(INSTALL_ROOT)/etc)
export IMAGE_ROOT=$(TOPDIR)/rootfs-$(BOARD_TYPE)$(BUILD_CONFIG).optbuild
export IMAGEPATH=$(TOPDIR)/images
export FWINFO=firmware.info
temp_BOARD_TYPE = $(strip $(subst fus, , $(BOARD_TYPE)))

export STRIP=$(TOOLPREFIX)strip
export KERNELPATH=$(TOPDIR)/linux/kernels/$(KERNEL)
export MAKEARCH=$(MAKE) ARCH=$(KERNELARCH) CROSS_COMPILE=$(TOOLPREFIX)

export TOOLPATH=$(TOPDIR)/build/$(TOOLCHAIN)/$(TOOLARCH)/
export BOOTLOADERDIR=$(TOPDIR)/boot/redboot

export UBOOTDIR=$(TOPDIR)/boot/u-boot

# Save PATH for later use for compiling host-only tools etc.
export ORIGINAL_PATH:=$(PATH)
# Set PATH so we find target compiler when say "gcc", etc.
# as well as other tools we expect to find.
export PATH:=$(TOPDIR)/build/util:$(TOOLPATH)/bin:$(TOPDIR)/linux:$(TOPDIR)/build:$(BOOTLOADERDIR)/ecos/tools/bin:`pwd`:${PATH}

# madwifi
export HAL=$(TOPDIR)/module/wlan/madwifi/hal/main
export ATH_PHYERR=$(TOPDIR)/module/wlan/madwifi/dfs
export ATH_RATE=$(TOPDIR)/module/wlan/madwifi/ratectrl11n/
export MODULEPATH=$(INSTALL_ROOT)/lib/modules/$(KERNELVER)/net

#
# This is to allow the target file system size to be specified on the command
# line, if desired
#

ifndef TARGETFSSIZE
export TARGETFSSIZE=2621440
endif


ENTRY=`readelf -a $(KERNELPATH)/vmlinux|grep "Entry"|cut -d":" -f 2`
LDADR=`readelf -a $(KERNELPATH)/vmlinux|grep "\[ 1\]"|cut -d" " -f 26`

all:$(PRODUCT_NAME)

#
# Include the board specific make file
#
include Makefile.inc
ifndef WIRELESSTOOLNAMES
WIRELESSTOOLNAMES :=
endif

$(PRODUCT_NAME):rom_prep toolchain_prep
	$(MAKE) common_fusion 
	$(MAKE) apps_build
	$(MAKE) fusion_build 
	$(MAKE) module_build 
	$(MAKE) install 
	$(MAKE) $(BUILD_TYPE)_build
	$(MAKE) image_build

rom_prep:
	cp $(KERNELPATH)/arch/mips/configs/$(BOARD_TYPE)_defconfig.rom $(KERNELPATH)/arch/mips/configs/$(BOARD_TYPE)_defconfig
ram_prep:
	cp $(KERNELPATH)/arch/mips/configs/$(BOARD_TYPE)_defconfig.ram $(KERNELPATH)/arch/mips/configs/$(BOARD_TYPE)_defconfig

art_ram: ram_prep rootfs_prep lzma_uimage kernel_info enet_build busybox_build art_build enet_build
	make -C $(WATCHDOG_DIR) && make -C $(WATCHDOG_DIR) dist
	$(TOPDIR)/build/util/ext2.sh $(INSTALL_ROOT) $(IMAGEPATH)/initrd.bin
	$(TOPDIR)/build/util/merge.ram -r $(IMAGEPATH)/initrd.bin \
		-u $(IMAGEPATH)/vmlinux.bin -e ${ENTRY} --padtotal 0xa00000 -o $(IMAGEPATH)/$(BOARD_TYPE)-art.bin
	@rm $(IMAGEPATH)/initrd.bin -f
	@echo ART image name: $(IMAGEPATH)/$(BOARD_TYPE)-art.bin


#
# Common targts
#

ifndef AP_TYPE
# The INSTALL_ROOT is similar but not exactly what appears on the
# target filesystem; it is copied and converted into IMAGE_ROOT
# which is space-optimized.
rootfs_prep:	# this is prep of the INSTALL_ROOT, not the final fs directory
	@echo $(NEWPATH)
	rm -rf $(IMAGE_ROOT)
	rm -rf $(INSTALL_ROOT); mkdir $(INSTALL_ROOT)
	cp -R ../rootfs/common/* $(INSTALL_ROOT)
	cp -Rf ../rootfs/$(BOARD_TYPE)/* $(INSTALL_ROOT)
	chmod 755 $(INSTALL_ROOT)/etc/rc.d/*
	chmod 755 $(INSTALL_ROOT)/etc/ath/*
	chmod 755 $(INSTALL_ROOT)/etc/ath/default/*

else
#
# For the retail AP designs, a new common area is used that contains the
# web interface and supporting files.  Also provides a common fusion based
# filesystem.
#

rootfs_prep:
	@echo $(NEWPATH)
	rm -rf $(IMAGE_ROOT)
	rm -rf $(INSTALL_ROOT); mkdir $(INSTALL_ROOT)
	cp -R ../rootfs/cgiCommon/* $(INSTALL_ROOT)
	cp -rf ../rootfs/cgiCommon/etc/ath.$(AP_TYPE)/* $(INSTALL_ROOT)/etc/ath
	rm -rf $(INSTALL_ROOT)/etc/ath.single $(INSTALL_ROOT)/etc/ath.dual
#	cp -rf ../rootfs/cgiCommon/usr/www.$(AP_TYPE)/* $(INSTALL_ROOT)/usr/www
#	if [ \( "$(BOARD_TYPE)" == "ap83fus" \) -o \( "$(BOARD_TYPE)" == "pb90" \) ]; then \
#		cp -rf ../rootfs/cgiCommon/usr/www.$(AP_TYPE)_ABG/*  $(INSTALL_ROOT)/usr/www; \
#	fi
#	rm -rf $(INSTALL_ROOT)/usr/www.single
#	rm -rf $(INSTALL_ROOT)/usr/www.dual
	rm -rf $(INSTALL_ROOT)/usr/www $(INSTALL_ROOT)/bin/cfg
	cp -Rf ../rootfs/$(BOARD_TYPE)/* $(INSTALL_ROOT)
	echo "date `date +"%m%d%H%M%Y"`" > $(INSTALL_ROOT)/etc/rc.d/rcDate
	chmod 755 $(INSTALL_ROOT)/etc/rc.d/*
	chmod 755 $(INSTALL_ROOT)/etc/ath/*
endif
	
apps_build:  
	@echo -e "\nMAKE APPS:\n $(APPS_MAKE)\n"
	@for i in $(APPS_MAKE) ; do \
	if [ -f $$i/Makefile ]; then \
		make -C $$i || exit $? ; \
		echo "MAKE $$i COMPLETE."; \
	fi; \
	done
	@echo -e "MAKE APPS COMPLETE.\n"

module_build: 
	@echo -e "\nMAKE MODULE:\n $(MODULE_MAKE)\n"
	@for i in $(MODULE_MAKE) ; do \
	if [ -f $$i/Makefile ]; then \
		make -C $$i || exit $? ; \
		echo "MAKE $$i COMPLETE."; \
	fi; \
	done
	@echo -e "MAKE MODULE COMPLETE.\n"

apps_install:
	@echo -e "\nINSTALL APPS:\n $(APPS_MAKE)\n"
	@for i in $(APPS_MAKE); do \
	if [ -f $$i/Makefile ]; then \
		make -C $$i dist || exit $? ;\
		echo -e "INSTALL $$i COMPLETE.\n";\
	fi; \
	done
	@echo -e "\nINSTALL APPS COMPLETE.\n"

module_install:
	@echo -e "\nINSTALL MODULE:\n $(MODULE_MAKE)\n"
	@for i in $(MODULE_MAKE); do \
	if [ -f $$i/Makefile ]; then \
		make -C $$i dist || exit $? ;\
		echo -e "INSTALL $$i COMPLETE.\n";\
	fi; \
	done
	cp $(KERNELPATH)/drivers/net/tun.ko $(TARGET_ROOT_DIR)/lib/modules/2.6.15/net

lib_install:
	cd $(TARGET_ROOT_DIR)/lib && \
	cp $(BUILD_TOOLS)/lib/libuClibc-0.9.28.so ./ && \
	ln -s libuClibc-0.9.28.so libc.so.0 && \
	cp $(BUILD_TOOLS)/lib/ld-uClibc-0.9.28.so ./ && \
	ln -s ld-uClibc-0.9.28.so ld-uClibc.so.0 && \
	cp $(BUILD_TOOLS)/lib/libgcc_s.so.1 ./ && \
	ln -s libgcc_s.so.1 libgcc_s.so && \
	cp $(BUILD_TOOLS)/lib/libcrypt-0.9.28.so ./ && \
	ln -s libcrypt-0.9.28.so libcrypt.so.0  && \
	cp $(BUILD_TOOLS)/lib/libdl.so ./ && \
	ln -s libdl.so libdl.so.0 && \
	cp $(BUILD_TOOLS)/lib/libm.so ./ && \
	ln -s libm.so libm.so.0 && \
	cp $(BUILD_TOOLS)/lib/libpthread-0.9.28.so ./ && \
	ln -s libpthread-0.9.28.so libpthread.so.0 && \
	cp $(BUILD_TOOLS)/lib/libssl.so.0.9.8 ./ && \
	cp $(BUILD_TOOLS)/lib/libcrypto.so.0.9.8 ./ && \
	cd - 
	@echo -e "\nINSTALL MODULE COMPLETE.\n"

install:apps_install module_install lib_install

ifeq ($(BUILD_UCLIBC_DEBUG),y)
BUILD_UCLIBC_DEBUG_FILTER = sed -e '/^DODEBUG=n/s/=n/=y/'
else
BUILD_UCLIBC_DEBUG_FILTER = "cat"
endif

toolchain_prep:
	if [ ! -f $(BUILD_TOOLS)/lib/libssl.so ]; then \
		cp $(TOPDIR)/build/lib/* $(BUILD_TOOLS)/lib -f; \
		cd  $(BUILD_TOOLS)/lib \
		&& ln -s libcrypto.so.0.9.8 libcrypto.so \
		&& ln -s libssl.so.0.9.8 libssl.so \
		&& ln -s libz.so.1.2.3 libz.so; \
	fi;

toolchain_build: rootfs_prep
	@echo making toolchain_build
	cd $(TOOLCHAIN) && \
	cp -f $(BOARD_TYPE).config .config && \
	rm -f toolchain/uClibc/uClibc.config && \
	cat toolchain/uClibc/$(BOARD_TYPE).config | $(BUILD_UCLIBC_DEBUG_FILTER) >toolchain/uClibc/uClibc.config && \
	$(MAKE)
	# install libraries
	mkdir -p $(INSTALL_ROOT)/lib
	cd $(TOOLCHAIN) && make PREFIX=$(INSTALL_ROOT) install
	# gdbserver to support debugging (if it has been created)
	if [ -f $(TOOLPATH)/root/usr/bin/gdbserver ] ; then \
	    mkdir -p $(INSTALL_ROOT)/usr/bin ; \
	    cp -f $(TOOLPATH)/root/usr/bin/gdbserver $(INSTALL_ROOT)/usr/bin/. ; \
	    fi
	cp $(TOPDIR)/build/lib/* $(TOOLPATH)/lib
	cd  $(TOOLPATH)/lib \
	&& ln -s libcrypto.so.0.9.8 libcrypto.so \
	&& ln -s libssl.so.0.9.8 libssl.so \
	&& ln -s libz.so.1.2.3 libz.so

check_tftp: image_prep
	mkdir -p $(IMAGEPATH)
	if test -d $(TFTPPATH); then echo $(TFTPPATH) exists; else mkdir $(TFTPPATH); fi;

image_prep:
	if test -d $(TOPDIR)/images; then echo $(TOPDIR)/images exists; \
	else \
	mkdir $(TOPDIR)/images; \
	fi;
	if test -d $(IMAGEPATH); then echo $(IMAGEPATH) exists; \
	else \
	mkdir $(IMAGEPATH); \
	fi;

kernel_clean: 
	cd $(KERNELPATH) &&  $(MAKEARCH) mrproper 

kernel_info:
	cd $(KERNELPATH) && rm -f $(INFOFILE)
	cd $(KERNELPATH) && echo "entry:"${ENTRY} >> $(INFOFILE)
	cd $(KERNELPATH) && echo "link: 0x"${LDADR} >> $(INFOFILE)
	cp $(KERNELPATH)/$(INFOFILE) $(IMAGEPATH)

#
# Use different kernel_build rules depending on the type of target
#

ifeq ($(KERNELTARGET), zImage)
kernel_build: image_prep
	@echo " Making Kernel Build Version $(EXTRAVERSION)"
	exit
	cd $(KERNELPATH) && $(MAKEARCH) $(BOARD_TYPE)_defconfig
	cd $(KERNELPATH) && $(MAKEARCH)
	cd $(KERNELPATH)/arch/$(KERNELARCH)/boot
else	
kernel_build: image_prep
	@echo " Making Kernel Build Version $(EXTRAVERSION)"
	cd $(KERNELPATH) && $(MAKEARCH) $(BOARD_TYPE)$(BUILD_CONFIG)_defconfig
	cd $(KERNELPATH) && $(MAKEARCH)
	cd $(KERNELPATH) && $(MAKEARCH) $(KERNELTARGET)
	cd $(KERNELPATH)/arch/$(KERNELARCH)/boot && \
	cp $(KERNELTARGET) $(IMAGEPATH)/$(KTFILE) && \
	gzip -9c $(KERNELTARGET) > $(KERNELTARGET).gz && \
	cp $(KERNELTARGET).gz $(IMAGEPATH)/$(KTFILE).gz;
endif

redboot_build:
	@echo making redboot...
	cd $(BOOTLOADERDIR) && make $(BOARD_TYPE)_rom
	cp $(BOOTLOADERDIR)/rom_bld/install/bin/redboot.rom $(IMAGEPATH)/redboot.$(BOARD_TYPE).rom
	cd $(BOOTLOADERDIR) && make $(BOARD_TYPE)_ram
	cp $(BOOTLOADERDIR)/ram_bld/install/bin/redboot.bin $(IMAGEPATH)/redboot.$(BOARD_TYPE).bin
	cp $(BOOTLOADERDIR)/ram_bld/install/bin/redboot.srec $(IMAGEPATH)/redboot.$(BOARD_TYPE).srec

uboot:
	cd $(UBOOTDIR) && $(MAKEARCH) mrproper
ifneq ($(BOARD_TYPE), $(temp_BOARD_TYPE))
	echo ====Using $(temp_BOARD_TYPE) config for $(BOARD_TYPE) ===
	cd $(UBOOTDIR) && $(MAKEARCH) $(temp_BOARD_TYPE)_config
else
	cd $(UBOOTDIR) && $(MAKEARCH) $(BOARD_TYPE)_config
endif
	cd $(UBOOTDIR) && $(MAKEARCH) all BUILD_DIR=$(TOPDIR)
	cp -f $(UBOOTDIR)/${UBOOT_BINARY} ${IMAGEPATH}/${UBOOTFILE}

uboot-k31:
	cd $(UBOOTDIR) && $(MAKEARCH) mrproper
	cd $(UBOOTDIR) && $(MAKEARCH) k31_config
	cd $(UBOOTDIR) && $(MAKEARCH) all
	cp -f $(UBOOTDIR)/u-boot.bin ${IMAGEPATH}/${UBOOTFILE}

uboot_clean:
	@echo Cleaning uboot
	cd $(UBOOTDIR) && make clean && make distclean;

busybox_clean:
	@echo Cleaning busybox
	cd ../apps/$(BUSYBOX) && make clean && make distclean;

busybox_build:
	@echo making busybox
	cd ../apps/$(BUSYBOX); $(MAKE) PREFIX=$(INSTALL_ROOT) uninstall; \
	make clean; \
	cp -f defconfig-$(BOARD_TYPE)$(BUILD_DEBUG) .config; \
	$(MAKE); $(MAKE) PREFIX=$(INSTALL_ROOT) install

# TODO: The following for "wireless_tools" should be moved into the 
# Makefile.target files that invoke it...
wireless_tools:
	@echo making wireless_tools
	if test -n "$(WIRELESSTOOLS)"; then \
	cd ../apps/$(WIRELESSTOOLS); make clean; make; \
	mkdir -p $(INSTALL_ROOT)/sbin; \
	cp -f $(WIRELESSTOOLSLIB) $(INSTALL_ROOT)/lib; \
	cp -f iwpriv $(INSTALL_ROOT)/sbin; \
	cp -f iwconfig $(INSTALL_ROOT)/sbin; \
	cp -f iwlist $(INSTALL_ROOT)/sbin; \
	cd $(TOPDIR)/module/wlan/linux/tools && make clean \
	&&  make BUILD_STATIC=$(BUILD_STATIC) &&  \
	cp -f wlanconfig $(INSTALL_ROOT)/sbin && \
	for file in $(WIRELESSTOOLNAMES) ; do \
		if [ -f $$file ] ; then \
			cp -f $$file $(INSTALL_ROOT)/sbin/.; fi; done; \
	fi

wireless_tools_clean:
	@echo Cleaning wireless_tools
	cd ../apps/$(WIRELESSTOOLS) && make clean;

diag_build:
	@echo diag_build
	cd $(HAL)/diag && make 
	
hal_build: 
	@echo making hal
	if test -n "$(MADWIFITARGET)"; then \
	cd $(HAL)/linux && make TARGET=$(MADWIFITARGET) clean &&  \
	make TARGET=$(MADWIFITARGET) && make TARGET=$(MADWIFITARGET) release; \
	fi

madwifi_build: hal_build wireless_tools
	@echo making madwifi
	cd $(TOPDIR)/module/wlan/madwifi/madwifi && \
	$(MAKEARCH) TARGET=$(MADWIFITARGET) clean \
	&&  $(MAKEARCH) TARGET=$(MADWIFITARGET) && \
	$(MAKEARCH) TARGET=$(MADWIFITARGET) install
	$(MAKE) $(BUILD_TYPE)_build
	
# apps/wpa2 provides a second generation (as compared with apps/wpa)
#       of authentication (including WPS) programs:
#       hostapd, wpa_supplicant, etc.
# 	It installs via $(INSTALL_ROOT).
# 	It depends only on header files from the driver, and linux driver
# 	(madwifi) header files specified by $(MADWIFIPATH)

ifndef MADWIFIPATH
# madwifi includes for wpa2 are found below $(MADWIFIPATH) 
# (e.g. #include <net80211/ieee80211.h>)
export MADWIFIPATH=$(TOPDIR)/module/wlan/madwifi/madwifi
endif
wpa2: wpa2_clean rootfs_prep
	ln -fs ../include $(TOPDIR)/module/wlan/linux/include
	cd ../apps/wpa2 && $(MAKE) 	\
		CC=$(TOOLPREFIX)gcc AR=$(TOOLPREFIX)ar LD=$(TOOLPREFIX)ld

wpa2_clean:
	cd ../apps/wpa2 && $(MAKE) clean
clean: wpa2_clean

sar:
	@echo making sar
	cd ../apps/sysstat-6.0.1/ && rm -f sysstat.cron.daily && rm -f sysstat.cron.hourly && $(MAKE) CC=$(TOOLPREFIX)gcc 
	cd ../apps/sysstat-6.0.1/ && cp sar $(INSTALL_ROOT)/usr/bin/
	cd ../apps/sysstat-6.0.1/ && cp sadc $(INSTALL_ROOT)/usr/bin/
sar_clean:
	cd ../apps/sysstat-6.0.1/ && make clean

flash_mac:
	@echo making flash_mac 
	cd ../apps/flash_mac/ && make CC=$(TOOLPREFIX)gcc STRIP=$(TOOLPREFIX)strip && cp read_cfg $(INSTALL_ROOT)/usr/bin/
	
# Optional library optimization (upon IMAGE_ROOT), enable with 
#            BUILD_LIBRARYOPT := y
#
# Library optimization removes unused code from shared libraries.
# Read libraryopt/README-libraryopt.txt for details.
# libraryopt/libopttemp contains the libopt_temp psuedo-target
# which creates $(LIBOPTTEMP) ... we do NOT examine $(INSTALL_ROOT)
# or any other target files at this point and IMAGE_ROOT is not even
# created yet.
LIBOPTTEMP=$(TOPDIR)/build/libopt.temp
#
# Second stage of library optimization is done on the copy of $(INSTALL_ROOT)
# which is $(IMAGE_ROOT) .
# NOTE: $(INSTALL_ROOT) executables must NOT be stripped! 
# that would interfere with debugging and perhaps with library optimization.
#
# The main problems with using library optimizer are:
# -- The build procedure is fragile and can break with any tools
#    or c library upgrade.
# -- Executables not visible at build time but added later may fail
#    unless they have been staticly linked.
#
ifeq ($(BUILD_LIBRARYOPT),y)

include libraryopt/libopttemp.mak
LIBOPTTOOL := $(LIBOPTTEMP)/bin/$(TOOLPREFIX)libopt

else

# If not using library optimizer, remove old junk and don't create new junk.
libopt_temp:
	rm -rf $(LIBOPTTEMP)
LIBOPTTOOL := echo DO NOT libopt

endif

# The IMAGE_ROOT is created from the INSTALL_ROOT by making
# a copy and optimizing the amount of file system space consumed
# through a variety of methods.
# This will be the file system actually installed on target.
image_root: libopt_temp # also depends on all installs done into INSTALL_ROOT!
	@echo making image root $(IMAGE_ROOT)
	rm -rf $(IMAGE_ROOT)
	find $(INSTALL_ROOT) -name ".svn" -and -type d | xargs rm -rf
	cp -a $(INSTALL_ROOT) $(IMAGE_ROOT)
	# Remove unwanted files
	for file in $(INSTALL_BLACKLIST) ; do rm -rf $(IMAGE_ROOT)/$$file ; done
	rm -rf $(IMAGE_ROOT)/include
	rm -rf $(IMAGE_ROOT)/man
	rm -rf $(IMAGE_ROOT)/lib/*.a
	# could be:  rm -f $(IMAGE_ROOT)/usr/bin/gdbserver
	# Apply library optimizer (optional)
	$(LIBOPTTOOL) $(IMAGE_ROOT)
	# Now we can strip executables (also strip libraries if needed)
	cd $(IMAGE_ROOT)/lib && $(STRIP) *.so
	find $(IMAGE_ROOT)/sbin -type f -perm -u+x -exec $(STRIP) '{}' ';'
	find $(IMAGE_ROOT)/bin -type f -perm -u+x -exec $(STRIP) '{}' ';'
	find $(IMAGE_ROOT)/usr/bin -type f -perm -u+x -exec $(STRIP) '{}' ';'
	@echo DONE BUILDING image_root

ram_build: image_root
	@echo making ramfs
	cd util && \
        genext2fs -b 8192 -i 512 -D ../scripts/$(BOARD_TYPE)/dev.txt -d $(IMAGE_ROOT) $(BOARD_TYPE)-ramdisk
	cd util && gzip --best -f $(BOARD_TYPE)-ramdisk
	cd util && cp $(BOARD_TYPE)-ramdisk.gz $(IMAGEPATH) 

uimage:	kernel_build
	@echo making uImage
	cd util && mkuImage.sh ./ $(KERNELPATH) $(BUILD_CONFIG) "lzma"

jffs2_build: image_root
	@echo making jffs2
	cd $(IMAGEPATH) && \
	$(TOPDIR)/build/util/mkfs.jffs2 --root=$(IMAGE_ROOT) --eraseblock=0x10000 -b -D $(TOPDIR)/build/scripts/$(BOARD_TYPE)/dev.txt --squash -o $(JFFS2FILE) --pad=$(TARGETFSSIZE)
	# The file system image is installed in ? /tftpboot/<username>
	# for ? convenience ?

image_build:
	$(TOPDIR)/build/util/checksum $(IMG_ID) $(IMAGEPATH)/$(JFFS2FILE) $(IMAGEPATH)/$(JFFS2FILE).temp
	$(TOPDIR)/build/util/checksum $(IMG_ID) $(IMAGEPATH)/vmlinux.lzma.uImage $(IMAGEPATH)/vmlinux.lzma.uImage.temp
	chmod 777 $(IMAGEPATH)/$(JFFS2FILE).temp $(IMAGEPATH)/vmlinux.lzma.uImage.temp
	$(TOPDIR)/build/util/mking Rimg $(IMAGEPATH)/$(JFFS2FILE).temp $(IMAGEPATH)/$(JFFS2FILE).tmp
	$(TOPDIR)/build/util/mking Kimg $(IMAGEPATH)/vmlinux.lzma.uImage.temp $(IMAGEPATH)/vmlinux.lzma.uImage.tmp
	chmod 666 $(IMAGEPATH)/$(JFFS2FILE).tmp $(IMAGEPATH)/vmlinux.lzma.uImage.tmp
	tar -zcf $(IMAGEPATH)/$(FWINFO).tmp $(FWINFO) && chmod 777 $(IMAGEPATH)/$(FWINFO).tmp 
	$(TOPDIR)/build/util/checksum $(IMG_ID) $(IMAGEPATH)/$(FWINFO).tmp $(IMAGEPATH)/$(FWINFO).temp
	chmod 777 $(IMAGEPATH)/$(FWINFO).temp
	$(TOPDIR)/build/util/mking Info $(IMAGEPATH)/$(FWINFO).temp $(IMAGEPATH)/$(FWINFO).tmp
	chmod 666 $(IMAGEPATH)/$(FWINFO).tmp
	cat $(IMAGEPATH)/vmlinux.lzma.uImage.tmp $(IMAGEPATH)/$(JFFS2FILE).tmp $(IMAGEPATH)/$(FWINFO).tmp > $(IMAGEPATH)/$(OEM_NAME)_$(PRODUCT_NAME).img
	chmod 777 $(IMAGEPATH)/$(OEM_NAME)_$(PRODUCT_NAME).img
	$(TOPDIR)/build/util/checksum $(IMG_ID) $(IMAGEPATH)/$(OEM_NAME)_$(PRODUCT_NAME).img $(IMAGEPATH)/$(OEM_NAME)_$(PRODUCT_NAME).img.tmp
	chmod 777 $(IMAGEPATH)/$(OEM_NAME)_$(PRODUCT_NAME).img.tmp
	$(TOPDIR)/build/util/mking firm $(IMAGEPATH)/$(OEM_NAME)_$(PRODUCT_NAME).img.tmp $(IMAGEPATH)/$(OEM_NAME)_$(PRODUCT_NAME).img
	rm -f $(IMAGEPATH)/*.tmp $(IMAGEPATH)/*.temp
apps_clean:
	@for i in $(APPS_MAKE) ; do \
	if [ -f $$i/Makefile ]; then \
		echo -e "\nCLEAN APPS:\n $$i\n"; \
		make -C $$i clean; \
	fi; \
	done
module_clean: 
	@for i in $(MODULE_MAKE) ; do \
	if [ -f $$i/Makefile ]; then \
		echo -e "\nCLEAN MODULE:\n $$i\n"; \
		make -C $$i clean; \
	fi; \
	done
	@find ../module/ $(RCS_FIND_IGNORE) \
                \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
                -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' -o -name '.tmp_versions' \) \
                -print | xargs rm -rf
clean: apps_clean sar_clean module_clean enet_clean kernel_clean busybox_clean uboot_clean wireless_tools_clean ath_tools_fus_clean
	@echo CAUTION THIS WILL NOT CLEAN EVERYTHING
#	rm -rf $(TOOLPATH)
#	rm -rf $(TOPDIR)/build/$(TOOLCHAIN)/toolchain_$(TOOLARCH)/
	rm -rf $(TOPDIR)/images/*
	rm -rf $(IMAGE_ROOT) 
	rm -rf $(INSTALL_ROOT)
	rm -rf $(LIBOPTTEMP)
	@echo CAUTION THIS WILL NOT CLEAN EVERYTHING

