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

.PHONY: default all preconfig postconfig xconfig gconfig menuconfig build
.PHONY: cfg_save cfg_load clean

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 = \
	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
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

# 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"

xconfig: preconfig $(CFGBINDIR)/qconf
	@mkdir -p $(CURRCFG)
	@if ! $(COMMON_CONFIG_ENV) $(CFGBINDIR)/qconf $(CONFIG_CONFIG_IN); then \
		test -f $(CURRCFG)/.config.cmd || rm -f $(CURRCFG)/.config; \
	fi
# reread .config configuration
	$(MAKE) postconfig CFGAPP=xconfig

gconfig: preconfig $(CFGBINDIR)/gconf
	@mkdir -p $(CURRCFG)
	@if ! $(COMMON_CONFIG_ENV) srctree=$(PWD) \
		$(CFGBINDIR)/gconf $(CONFIG_CONFIG_IN); then \
		test -f $(CURRCFG)/.config.cmd || rm -f $(CURRCFG)/.config; \
	fi
# reread .config configuration
	$(MAKE) postconfig CFGAPP=gconfig

menuconfig: preconfig $(CFGBINDIR)/mconf
	@mkdir -p $(CURRCFG)
	@if ! $(COMMON_CONFIG_ENV) $(CFGBINDIR)/mconf $(CONFIG_CONFIG_IN); then \
		test -f $(CURRCFG)/.config.cmd || rm -f $(CURRCFG)/.config; \
	fi
# reread .config configuration
	$(MAKE) postconfig CFGAPP=menuconfig

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_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)
	@if [ -f $(CFG_FILE) -o -d $(CFG_DIR) ]; then \
	 echo ; \
	 echo "!!! Configuration file $(CFG_FILE) already exist" ; \
	 echo ; \
	 exit 1 ; \
	 fi;
	@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
