# This top-level Makefile can *not* be executed in parallel
.NOTPARALLEL:

CONFIG_CONFIG_SELECT_IN:=Config.select.in
CONFIG_CONFIG_LINUXGIT_SELECT_IN:=Config.linuxgit.select.in
.PHONY: default all preconfig postconfig xconfig gconfig menuconfig build \
        cfg_save cfg_load clean $(CONFIG_CONFIG_SELECT_IN) $(CONFIG_CONFIG_IN).menuconfig $(CONFIG_CONFIG_IN).gconfig $(CONFIG_CONFIG_IN).menuconfig $(CONFIG_CONFIG_LINUXGIT_SELECT_IN)

TOP:=$(PWD)
include common.mk

CFGDIR:=$(TOP)/gaisler/kconfig
CFGBINDIR:=$(CFGDIR)/build
CURRCFG:=$(TOP)/gaisler/currcfg
CONFIG_CONFIG_IN:=Config.in
CFGAPP=

# Needed by kconfig GUI
ifndef HOSTCC
HOSTCC:=gcc
else
endif
ifndef HOSTCXX
HOSTCXX:=g++
endif
HOSTCC:=$(shell which $(HOSTCC) || type -p $(HOSTCC) || echo gcc)
HOSTCXX:=$(shell which $(HOSTCXX) || type -p $(HOSTCXX) || echo g++)

export HOSTCC HOSTCXX

default:
	@echo
	@echo " LINUX BUILD TARGETS"
	@echo " ==================="
	@echo
	@echo "  xconfig      - Configure/Upgrade LINUXBUILD using QT GUI"
	@echo "  gconfig      - same as xconfig but GTK GUI"
	@echo "  menuconfig   - same as xconfig but terminal menu config"
	@echo "  build        - build all enabled packages"
	@echo
	@echo " Run 'make xconfig first to download/install (upgrade) and configure"
	@echo " the LINUXBUILD packages. Then do 'make build' to build all selected"
	@echo " packages. Images will be available in output/images/:"
	@echo "  image        - Linux Kernel Virtual Addresses (do 'sym image' in"
	@echo "                 GRMON to load symbols)"
	@echo "  image.ram    - Linux Kernel RAM Image (use with GRMON/MKPROM2)"
	@echo "  image.prom   - Linux Kernel PROM Image. Boots from FLASH."
	@echo "  uImage       - Linux Kernel Image for U-Boot"
	@echo "  fs/          - Optional file systems images"
	@echo

all: xconfig build

# configuration
# ---------------------------------------------------------------------------

$(CFGBINDIR)/%onf:
	mkdir -p $(@D)/lxdialog
	$(MAKE) CC="$(HOSTCC)" obj=$(@D) -C $(CFGDIR) -f Makefile.lb $(@F)

COMMON_CONFIG_ENV = \
	ARCH=sparc \
	KERNELVERSION=$(shell cd linux/linux-2.6-git/; make kernelversion) \
	BR2_VERSION_FULL=$(shell cd dist/buildroot/buildroot-git; make -p help | grep BR2_VERSION_FULL | grep ":=" | awk '{ print $$3 }' ) \
	KCONFIG_AUTOCONFIG=$(CURRCFG)/auto.conf \
	KCONFIG_AUTOHEADER=$(CURRCFG)/autoconf.h \
	KCONFIG_TRISTATE=$(CURRCFG)/tristate.config \
	LINUXBUILD_CONFIG=$(TOP)/.config

# Prepare Packages and others on a comming configuration, typcially
# prepare auto-generated menus etc.
preconfig:
	@echo PRERECONFIG
	if [ ! -e boot/mklinuximg/mklinuximg ]; then \
		(cd boot/mklinuximg/; ln -s mklinuximg-empty mklinuximg); \
	fi
ifeq ($(LB_LINUX),y)
	cd linux; make preconfig;
endif
ifeq ($(LB_BUILDROOT),y)
	cd dist/buildroot; make preconfig
endif

# Execute stuff based on changes made to configuration.
postconfig:
	@echo POSTCONFIG

# UPGRADE PACKAGES?
ifeq ($(LB_BUILDROOT_UPGRADE),y)
	@echo "Trying to upgrade Buildroot...";
	@sed -i 's/LB_BUILDROOT_UPGRADE=y/# LB_BUILDROOT_UPGRADE is not set/g' $(CONFIG);
	@cd dist/buildroot; make upgrade;
endif
ifeq ($(LB_LINUX_UPGRADE),y)
	@echo "Trying to upgrade Linux..."
	@sed -i 's/LB_LINUX_UPGRADE=y/# LB_LINUX_UPGRADE is not set/g' $(CONFIG);
	@cd linux; make upgrade;
endif
ifeq ($(LB_MKLI_UPGRADE),y)
	@echo "Trying to upgrade Linux Loader Wrapper..."
	@sed -i 's/LB_MKLI_UPGRADE=y/# LB_MKLI_UPGRADE is not set/g' $(CONFIG);
	@cd boot/mklinuximg; make upgrade;
endif

# After LB configuration utility but before and sub-diretory configuration
# utilities start.
	@echo PRE-SUBCONFIG
ifeq ($(LB_LINUX),y)
	cd linux; make pre_postconfig;
endif
ifeq ($(LB_BUILDROOT),y)
	cd dist/buildroot; make pre_postconfig
endif
ifeq ($(LB_DEBIAN),y)
	cd dist/debian; make pre_postconfig
endif

# Enter Configuration GUIs?
ifeq ($(LB_BUILDROOT_CONFIGURE),y)
	@echo "Configuring Buildroot..."
	@sed -i 's/LB_BUILDROOT_CONFIGURE=y/# LB_BUILDROOT_CONFIGURE is not set/g' $(CONFIG)
	@cd dist/buildroot; make $(CFGAPP)
endif
ifeq ($(LB_LINUX_CONFIGURE),y)
	@echo "Configuring Linux kernel..."
	@sed -i 's/LB_LINUX_CONFIGURE=y/# LB_LINUX_CONFIGURE is not set/g' $(CONFIG)
	@cd linux; make $(CFGAPP)
endif


# Run Post Configuration
ifeq ($(LB_LINUX),y)
	 cd linux; make postconfig;
endif
ifeq ($(LB_BUILDROOT),y)
	 cd dist/buildroot; make postconfig;
endif


# SAVE/LOAD Configuration
ifeq ($(LB_CFG_SAVE),y)
	@sed -i 's/LB_CFG_SAVE=y/# LB_CFG_SAVE is not set/g' $(CONFIG)
	make cfg_save CFG_FILE="gaisler/configs/$(subst ",,$(LB_CFG_NAME)).tar.bz2"
endif
ifeq ($(LB_CFG_LOAD),y)
	@sed -i 's/LB_CFG_LOAD=y/# LB_CFG_LOAD is not set/g' $(CONFIG)
	make cfg_load CFG_FILE="gaisler/configs/$(subst ",,$(LB_CFG_NAME)).tar.bz2"
endif

	@echo
	@echo "Now do 'make build' to build the configuration"

# create a list of predefined configurations that are available in the gaisler/config subdirectory
$(CONFIG_CONFIG_SELECT_IN):
	echo  "choice" > $@.tmp
	echo "-tab-prompt \"Available predefined configurations\"" >> $@.tmp;\
	def=""; brs=""; lns="";\
	for f in `find gaisler/configs -type f -name lb_config*tar.bz2 | sort`; do \
		fc="BR_`echo $${f//\./_} | sed -e 's/\//_/g' | tr '[a-z]' '[A-Z]'`"; \
		brl="`tar tf $${f} | grep 'dist/buildroot/.*/.config'`"; \
		brd="`expr \"$${brl}\" : '.*/dist/buildroot/\(.*\)/.config'`"; \
		lnl="`tar tf $${f} | grep 'linux/.*/.config'`"; \
		lnd="`expr \"$${lnl}\" : '.*/linux/\(.*\)/.config'`"; \
		echo "config $${fc}" >> $@.tmp; \
		def="$${def}-tab-default \"$${f}\" if $${fc}-n-";\
		brs="$${brs}-tab-default \"$${brd}\" if $${fc}-n-";\
		lns="$${lns}-tab-default \"$${lnd}\" if $${fc}-n-";\
		echo  "-tab-bool \"$$f\"" >> $@.tmp; \
	done; \
	echo "endchoice" >> $@.tmp; \
	echo    "config BR_SELECTED_AVAILABLE_CONFIG" >> $@.tmp; \
	echo  "-tab-string" >> $@.tmp;\
	echo  "$${def}" >> $@.tmp;\
	echo    "config BR_SELECTED_BUILDROOT_DIR" >> $@.tmp; \
	echo  "-tab-string" >> $@.tmp;\
	echo  "$${brs}-tab-default \"build-br\"" >> $@.tmp;\
	echo    "config BR_SELECTED_LINUX_DIR" >> $@.tmp; \
	echo  "-tab-string" >> $@.tmp;\
	echo  "$${lns}-tab-default \"build-linux\"" >> $@.tmp;
	cat $@.tmp | sed -e 's@-tab-@\t@g' | sed -e 's@-n-@\n@g' > $@

CURRENT_REP=$(shell basename `readlink -f linux/linux-work`)
CURRENT_REP_OR_2.6=$(shell if [ -e linux/linux-work ]; then echo $(shell basename `readlink -f linux/linux-work`); else echo linux-2.6-git; fi)

#create a list of linux git repositories under ./linux
$(CONFIG_CONFIG_LINUXGIT_SELECT_IN):
	echo  "choice" > $@.tmp
	echo "-tab-prompt \"Available linux repositories\"" >> $@.tmp;\
	def=""; brs=""; lns="";\
	for f in `cd linux; find . -maxdepth 1 | sort | grep -v ^./linux_work$$`; do \
		if [ -d $$(readlink -f linux/$$f) ]; then \
			echo "Scanning: linux/$$f"; \
			if [ -d "linux/$${f}/.git" ]; then \
				fc="LB_`echo $${f//\./_} | sed -e 's/\//_/g' | tr '[a-z]' '[A-Z]'`"; \
				fd="`echo $${f} | sed -e 's@^./@@g' `"; \
				echo "config $${fc}" >> $@.tmp; \
				lns="$${lns}-tab-default \"$${fd}\" if $${fc}-n-";\
				echo  "-tab-bool \"$$fd\"" >> $@.tmp; \
			fi; \
		fi; \
	done; \
	echo "endchoice" >> $@.tmp; \
	echo    "config LB_SELECTED_LINUXREP_DIR" >> $@.tmp; \
	echo  "-tab-string" >> $@.tmp;\
	echo  "$${lns}-tab-default \"linux-git\"" >> $@.tmp;
	cat $@.tmp | sed -e 's@-tab-@\t@g' | sed -e 's@-n-@\n@g' > $@

CONFIG_PROCESS=sed -e 's@-current-rep-@$(CURRENT_REP)@g' | sed -e 's@-linux-rep-@$(CURRENT_REP_OR_2.6)@g'

# activate the "execute" and "subsource" entries
$(CONFIG_CONFIG_IN).xconfig: $(CONFIG_CONFIG_IN) $(CONFIG_CONFIG_SELECT_IN) $(CONFIG_CONFIG_LINUXGIT_SELECT_IN) 
	awk 'BEGIN {p=1};/\+deactivate\-xconfig/ {p=0};/\-deactivate\-xconfig/ {p=1};//{if(p){print($$0);}};' $< | $(CONFIG_PROCESS) > $@
xconfig: preconfig $(CFGBINDIR)/qconf 
	mkdir -p $(CURRCFG)
	# start xconfig until xconfig returns a value != 129, 129 means to execute a command and restart
	source path_prepare.sh; returnval=129; \
	until ! [ "$${returnval}" = "129" ]; do \
		make $(CONFIG_CONFIG_IN).xconfig; \
		$(COMMON_CONFIG_ENV) $(CFGBINDIR)/qconf $(CONFIG_CONFIG_IN).xconfig; \
		returnval=$$?; \
		echo "Return value is $${returnval}";\
		if ! [ "$${returnval}" = "0" ]; then \
			test -f $(CURRCFG)/.config.cmd || rm -f $(CURRCFG)/.config; \
		fi; \
		$(MAKE) postconfig CFGAPP=xconfig;\
        done

# de-activate the "execute" and "subsource" entries, not implemented for gconfig yet
$(CONFIG_CONFIG_IN).gconfig: $(CONFIG_CONFIG_IN) $(CONFIG_CONFIG_SELECT_IN) $(CONFIG_CONFIG_LINUXGIT_SELECT_IN) 
	awk 'BEGIN {p=1};/\+deactivate\-xconfig/ {p=0};/\-deactivate\-xconfig/ {p=1};//{if(p){print($$0);}};' $< | $(CONFIG_PROCESS) > $@
gconfig: preconfig $(CFGBINDIR)/gconf
	@mkdir -p $(CURRCFG)
	@cp gaisler/kconfig/gconf.glade $(CFGBINDIR)/gconf.glade
	# start xconfig until xconfig returns a value != 129, 129 means to execute a command and restart
	source path_prepare.sh; returnval=129; \
	until [ ! "$${returnval}" == "129" ]; do \
		make $(CONFIG_CONFIG_IN).gconfig; \
		$(COMMON_CONFIG_ENV) $(CFGBINDIR)/gconf $(CONFIG_CONFIG_IN).gconfig; \
		returnval=$$?; \
		echo "Return value is $${returnval}";\
		if ! [ "$${returnval}" = "0" ]; then \
			test -f $(CURRCFG)/.config.cmd || rm -f $(CURRCFG)/.config; \
		fi; \
		$(MAKE) postconfig CFGAPP=xconfig;\
        done

# de-activate the "execute" and "subsource" entries, not implemented for menuconfig yet
$(CONFIG_CONFIG_IN).menuconfig: $(CONFIG_CONFIG_IN) $(CONFIG_CONFIG_SELECT_IN) $(CONFIG_CONFIG_LINUXGIT_SELECT_IN) 
	awk 'BEGIN {p=1};/\+deactivate\-xconfig/ {p=0};/\-deactivate\-xconfig/ {p=1};//{if(p){print($$0);}};' $< | $(CONFIG_PROCESS) > $@
menuconfig: preconfig $(CFGBINDIR)/mconf
	@mkdir -p $(CURRCFG)
	# start xconfig until xconfig returns a value != 129, 129 means to execute a command and restart
	source path_prepare.sh; returnval=129; \
	until ! [ "$${returnval}" = "129" ]; do \
		make $(CONFIG_CONFIG_IN).menuconfig; \
		$(COMMON_CONFIG_ENV) $(CFGBINDIR)/mconf $(CONFIG_CONFIG_IN).menuconfig; \
		returnval=$$?; \
		echo "Return value is $${returnval}";\
		if ! [ "$${returnval}" = "0" ]; then \
			test -f $(CURRCFG)/.config.cmd || rm -f $(CURRCFG)/.config; \
		fi; \
		$(MAKE) postconfig CFGAPP=xconfig;\
        done

unexport KCONFIG_AUTOCONFIG
unexport KCONFIG_AUTOHEADER
unexport KCONFIG_TRISTATE

build:
	@if [ ! -f $(CONFIG) ]; then \
	 echo ; \
	 echo "!!! Aborting: Configuration Missing" ; \
	 echo ; \
	 fi;
#	Build Toolchain First
#	Build Distribution (and toolchain if configured so)
#	Build Linux Kernel
ifeq ($(LB_DEBIAN),y)
	cd dist/debian; make build
endif
ifeq ($(LB_BUILDROOT),y)
	cd dist/buildroot; make build
endif
ifeq ($(LB_LINUX),y)
	cd linux; make build
endif
ifeq ($(LB_UBOOT),y)
#	cd boot/u-boot; make build
endif
ifeq ($(LB_LINUX),y)
	cd boot/mklinuximg; make build
	cd boot/mkprom; make build
endif


# Save all configuarations of all packages into a TAR file
ifeq ($(CFG_FILE),)
cfg_save:
	@echo SAVE CFG: No configuration file specificed
cfg_load:
	@echo LOAD CFG: No configuration file specificed
else
CFG_DIR:=$(subst .tar.bz2,,$(CFG_FILE))
CFG_DIR2:=$(subst .tar.bz2,,$(shell basename $(CFG_FILE)))
cfg_save:
	@echo SAVE $(CFG_FILE)
	@echo CFG_DIR: $(CFG_DIR)
	@echo CFG_DIR2: $(CFG_DIR2)
ifeq ($(LB_OVERWRITE),)
	@if [ -f $(CFG_FILE) -o -d $(CFG_DIR) ]; then \
	 echo ; \
	 echo "!!! Configuration file $(CFG_FILE) already exist" ; \
	 echo ; \
	 exit 1 ; \
	 fi;
endif
	@mkdir $(CFG_DIR)
# Let packages save their configuration files into the directory
ifeq ($(LB_BUILDROOT),y)
	cd dist/buildroot; make cfg_save CFG_BASE=$(abspath $(CFG_DIR))
endif
ifeq ($(LB_LINUX),y)
	cd linux; make cfg_save CFG_BASE=$(abspath $(CFG_DIR))
endif
ifeq ($(LB_UBOOT),y)
#	cd boot/u-boot; make cfg_save CFG_BASE=$(abspath $(CFG_DIR))
endif
ifeq ($(LB_LINUX),y)
	cd boot/mklinuximg; make cfg_save CFG_BASE=$(abspath $(CFG_DIR))
	cd boot/mkprom; make cfg_save CFG_BASE=$(abspath $(CFG_DIR))
endif
	cp -a .config $(CFG_DIR)/
	tar -C $(CFG_DIR)/.. -c $(CFG_DIR2) | bzip2 -9 -c > $(CFG_FILE)
	rm -rf $(CFG_DIR)
	@echo
	@echo Configuration file saved: $(CFG_FILE)
	@echo


# Restore all configuarations of all packages from a TAR file
cfg_load:
	@echo LOAD $(CFG_FILE)
	@if [ ! -f $(CFG_FILE)]; then \
	 echo ; \
	 echo "!!! Configuration file $(CFG_FILE) does not exist" ; \
	 echo ; \
	 exit 1 ; \
	 fi;
	-@rm -rf "gaisler/tmp/$(CFG_DIR2)"
	tar -C gaisler/tmp -xf $(CFG_FILE)
	rm -f .config
	cp -a "gaisler/tmp/$(CFG_DIR2)/.config" .config
# Let packages save their configuration files into the directory
ifeq ($(LB_BUILDROOT),y)
	cd dist/buildroot; make cfg_load CFG_BASE=$(abspath gaisler/tmp/$(CFG_DIR2))
endif
ifeq ($(LB_LINUX),y)
	cd linux; make cfg_load CFG_BASE=$(abspath gaisler/tmp/$(CFG_DIR2))
endif
ifeq ($(LB_UBOOT),y)
#	cd boot/u-boot; make cfg_load CFG_BASE=$(CFG_DIR)
endif
ifeq ($(LB_LINUX),y)
	cd boot/mklinuximg; make cfg_load CFG_BASE=$(abspath gaisler/tmp/$(CFG_DIR2))
	cd boot/mkprom; make cfg_load CFG_BASE=$(abspath gaisler/tmp/$(CFG_DIR2))
endif

	-@rm -rf gaisler/tmp/$(CFG_DIR2)
endif


# Clean target configuration
clean:
ifeq ($(LB_BUILDROOT),y)
	cd dist/buildroot; make clean
endif
ifeq ($(LB_LINUX),y)
	cd linux; make clean
endif
ifeq ($(LB_UBOOT),y)
#	cd boot/u-boot; make clean
endif
ifeq ($(LB_LINUX),y)
	cd boot/mklinuximg; make clean
	cd boot/mkprom; make clean
endif
