.PHONY: all prepare install clean version

ifndef BUILDDATE
BUILDDATE=`date +%m%d%H%M%Y`
endif

ifndef BUILDDIR
BUILDDIR := $(realpath ..)
endif

ifeq ($(MAKECMDGOALS),clean)
CLEAN=1
endif
ifeq ($(MAKECMDGOALS),distclean)
CLEAN=1
endif

ifndef CLEAN

ifndef PRODUCT
$(warning PRODUCT is not defined - will use definition from $(BUILDDIR)/conf/current/product.mk)
include $(BUILDDIR)/conf/current/product.mk
endif

include $(BUILDDIR)/common.mk

ifndef PRODUCT_VERSION
$(error PRODUCT_VERSION is not defined!)
endif

endif

ifndef build_install_directory
$(warning build_install_directory is not defined - will use ./ROOT directory!)
build_install_directory := ./ROOT
endif

instdir := ${build_install_directory}
stagingdir := $(build_install_directory)-staging

export BUILDDIR CONFDIR build_install_directory FW_INFOFILE BUILDCAPS instdir stagingdir

ifndef CLEAN
include Makefile.inc
endif

all: prepare preinstall

version:
	echo $(FULL_VERSION) > ${instdir}/usr/lib/version

preinstall: version
	make -C ${PRODUCT} preinstall

prepare:
	@echo "Creating $(PRODUCT) filesystem skeleton at ${instdir}"
	@mkdir -p ${instdir} || (echo "Failed creating ${instdir}" && exit 2)
	# clean old symlinks
	rm -rf $(instdir)/sbin
	rm -rf $(instdir)/etc
	rm -rf $(instdir)/tmp
	rm -rf $(instdir)/lib/modules/2.4.27-ubnt0
	# create the dirs
	@mkdir -p ${instdir}/bin
	@mkdir -p ${instdir}/dev
	@mkdir -p ${instdir}/lib/modules/net
	@cd ${instdir}/lib/modules && \
	ln -sf . 2.4.27-ubnt0
	@mkdir -p ${instdir}/proc
	@mkdir -p ${instdir}/var/etc
	@mkdir -p ${instdir}/var/tmp
	@mkdir -p ${instdir}/usr/etc/rc.d
	@mkdir -p ${instdir}/usr/etc/udhcpc
	@mkdir -p ${instdir}/usr/lib
	@mkdir -p ${instdir}/usr/www/images
	@mkdir -p ${instdir}/usr/www/lib
	# create symlinks
	@cd ${instdir} && \
	ln -sf var/etc etc && \
	ln -sf var/tmp tmp && \
	ln -s bin sbin
	echo $(FULL_VERSION) > ${instdir}/usr/lib/version

uclibc:
	for i in ld-uClibc libc libcrypt libdl libm libnsl libresolv libuClibc libutil; do \
		cp -fd ${build_toolchain_dir}/lib/$$i*.so* ${instdir}/lib; \
	done

postinstall:
	make -C ${PRODUCT} postinstall

$(MKSQUASHFS):
	$(MAKE) -C ${build_kernel_directory}/scripts/squashfs
	cp -f ${build_kernel_directory}/scripts/squashfs/mksquashfs $(MKSQUASHFS)

$(MKFWIMAGE):
	$(MAKE) DESTDIR=${TOOLDIR} -C ${MKFWIMAGE_HOME} install

FAKE_DEBUG_DIR:=DEBUG-$(VER)
export FAKE_DEBUG_DIR

image: $(MKFWIMAGE) rootfs
	mkdir -p $(VER)
	rm -f $(LATEST_LINK)
	ln -s $(VER)/ $(LATEST_LINK)
	cp ${build_kernel_directory}/arch/mips/boot/bzImage ${VER}/
	cp ${build_kernel_directory}/vmlinux ${VER}/
	cp ${build_kernel_directory}/vmlinux.notstripped ${VER}/
	# lzma has different swiches in different versions
	# try first newer version
	lzma -f ${VER}/vmlinux || lzma e ${VER}/vmlinux ${VER}/vmlinux.lzma
	mv squashfs.bin ${VER}/
	for FW_INFOFILE in $(wildcard $(BUILDDIR)/conf/current/fw-layout*.txt); do \
		LAYOUT_SUFFIX="$$(echo "$${FW_INFOFILE}" | sed -n -r -e "s/^.*[/]fw-layout(-.*).txt$$/\1/p")"; \
		cd ${VER}; \
		$(MKFWIMAGE) -i $${FW_INFOFILE} -v $(VER) -o ${VER}$${LAYOUT_SUFFIX}.bin; \
		if [ "$(BUILD_ALL_XS_FW)" = "yes" ] && [ "$${LAYOUT_SUFFIX}" = "" ]; then \
			$(MKFWIMAGE) -i $${FW_INFOFILE} -v $(VER_LS) -o ${VER_LS}$${LAYOUT_SUFFIX}.bin; \
			$(MKFWIMAGE) -i $${FW_INFOFILE} -v $(VER_PS) -o ${VER_PS}$${LAYOUT_SUFFIX}.bin; \
			$(MKFWIMAGE) -i $${FW_INFOFILE} -v $(VER_NS) -o ${VER_NS}$${LAYOUT_SUFFIX}.bin; \
			[ ! "$(PRODUCT)." = "xs5." ] || $(MKFWIMAGE) -i $${FW_INFOFILE} -v $(VER_MS) -o ${VER_MS}$${LAYOUT_SUFFIX}.bin; \
			[ ! "$(PRODUCT)." = "xs5." ] || $(MKFWIMAGE) -i $${FW_INFOFILE} -v $(VER_WS) -o ${VER_WS}$${LAYOUT_SUFFIX}.bin; \
			[ ! "$(PRODUCT)." = "xs5." ] || $(MKFWIMAGE) -i $${FW_INFOFILE} -v $(VER_pS) -o ${VER_PICO}$${LAYOUT_SUFFIX}.bin; \
		fi; \
		if [ "$${LAYOUT_SUFFIX}" = "-8M" ]; then \
			$(MKFWIMAGE) -i $${FW_INFOFILE} -v $(VER) -o ${VER_PICO}$${LAYOUT_SUFFIX}.bin; \
		fi; \
		cd ..; \
	done
	-@rm -f DEBUG-* >/dev/null
	-@ln -s $(instdir)/ $(FAKE_DEBUG_DIR)
	-@tar czf $(VER)/$(VER).debug_binaries.notstripped.tgz $$(find $(FAKE_DEBUG_DIR)/ -type f | xargs file | sed -n -r -e "s/^([^:]*)[:].*not stripped.*/\1/p")
	-@rm $(FAKE_DEBUG_DIR)

rootfs: $(MKSQUASHFS) squashfs.bin

STRIP=${build_toolchain_prefix}strip -g --remove-section=.note --remove-section=.comment
squashfs.bin:
	@rm -rf $(stagingdir)
	@(build_date=$(BUILDDATE); sed -i "s/BUILD_DATE/$${build_date}/" $(instdir)/linuxrc)
	@cp -ar $(instdir) $(stagingdir)
	@find $(stagingdir) -type f | xargs file | sed -n -r -e "s/^([^:]*)[:].*executable, MIPS.*not stripped.*/\1/p" | xargs --no-run-if-empty $(STRIP)
	@find $(stagingdir) -type f | xargs file | sed -n -r -e "s/^([^:]*)[:].*MIPS.*not stripped.*/\1/p" | xargs --no-run-if-empty $(STRIP)
	@env stagingdir=${stagingdir} fakeroot ./create_image.sh $@ || exit 1

clean:
	@if [ -z "$(stagingdir)" ]; then echo "ERROR: stagingdir is not set."; exit 1; fi;
	-@rm -rf squashfs.bin
	@echo "Cleaning $(stagingdir)..."
	-@rm -rf $(stagingdir)

distclean: clean
	@if [ -z "$(instdir)" ]; then echo "ERROR: instdir is not set."; exit 1; fi;
	@echo "Cleaning $(instdir)..."
	-@rm -rf $(instdir)

