TOP:=$(abspath ..)
-include $(TOP)/common.mk

LINUXDIR:=$(shell if [ -e linux-work ]; then echo linux-work; else echo linux-2.6-git; fi)
TOOLCHAIN:=sparc-linux-
FTP_KERNEL:=$(FTP_BASE)/linux/linux-2.6/kernel
BASENAME:=leon-linux-2.6

# Build Directory Config
ifeq ($(LB_LINUX_BUILDDIR),)
 BUILDDIR=build-linux
else
 BUILDDIR=$(subst ",,$(LB_LINUX_BUILDDIR))
#"
endif

.PHONY: download unpack upgrade preconfig postconfig build clean

default: build

# Find Latest Linux dist from Gaisler FTP server
download:
	@$(SCRIPTS)/download.sh $(FTP_KERNEL) $(PWD)/reference $(BASENAME)

# Install latest Linux distribution in reference directory, make sure
# to do download target first...
install:
# Stop if package already installed.
	@if [ -f reference/CURRENT.$(BASENAME) ]; then \
	 if diff -q reference/CURRENT.$(BASENAME) reference/LATEST.$(BASENAME) > /dev/null; then \
	  echo ; \
	  echo "!!! Latest LEON Linux package already installed" ; \
	  echo ; \
	  exit 0 ; \
	  fi; \
	 fi; \
	 $(SCRIPTS)/unpack.sh $(PWD)/reference $(PWD) $(BASENAME) || exit 1; \
	 echo INSTALLING...; \
	 newname=`sed -n -e 's/^NAME=//gp' reference/LATEST.$(BASENAME)`; \
	 echo NEWNAME=$$newname ; \
	 rm -f leon-linux; \
	 ln -s $(BASENAME)-$$newname leon-linux; \
	 mv reference/LATEST.$(BASENAME) reference/CURRENT.$(BASENAME); \
	 if [ -x leon-linux/pkg/install.sh ]; then \
	  leon-linux/pkg/install.sh; \
	  fi; \
	 cd leon-linux; $(if $(LB_TRY_USE_TAR),LINUX_INSTALL_METHOD=-tar,) make install;

upgrade: download install

# install a specific version (archive) and create a new rep for it, the
# available versions come from linux/Config.versioned.in
upgrade_versioned:
	$(if $(strip $(ARCH_NAME)),,echo "No archive name specified"; exit 1;)
	$(if $(strip $(REP_NAME)),,echo "No rep name specified"; exit 1;)
	wget $(FTP_KERNEL)/$(ARCH_NAME) -O reference/$(ARCH_NAME)
	d=`tar -tf reference/$(ARCH_NAME)  | sed -n 1p`; \
	tar -C $(PWD) -xvjf reference/$(ARCH_NAME); \
	cd $$d; make LINUX_TREE=../$(REP_NAME) install; \

switch_linux_rep:
	if [ ! -d $(REP_DIR) ]; then echo "Repository $(REP_DIR) not present"; exit 1; fi
	if [ -e linux-work ]; then \
		if [ ! -L linux-work ]; then echo "linux/linux-work should be a symbolic link."; exit 1; fi \
	fi
	-rm linux-work
	ln -sf $(REP_DIR) linux-work

# Create build directory and initialize a default LEON config if no
# configuration is present
mkbuilddir:
	-@if [ ! -d $(BUILDDIR) ]; then \
	 mkdir -p $(BUILDDIR); \
	 fi;
	-@if [ ! -f $(BUILDDIR)/.config ]; then \
	 cp leon-linux/config/defconfig $(BUILDDIR)/.config ; \
	 fi;

# Generate menu/xconfig configuration file
preconfig:

# Fixup before buildroot/linux etc. configuration
pre_postconfig: mkbuilddir
# Update Linux Configuration with PATH to CPIO Image if not updated before
ifeq ($(LB_LINUX_SET_CPIO),y)
	sed 's/^CONFIG_INITRAMFS_SOURCE=.*/CONFIG_INITRAMFS_SOURCE=\"..\/..\/dist\/.rootfs.cpio\"/g' \
	 $(BUILDDIR)/.config > $(BUILDDIR)/.config.tmp
	if diff -q $(BUILDDIR)/.config $(BUILDDIR)/.config.tmp > /dev/null ; then \
	 rm -f $(BUILDDIR)/.config.tmp ; \
	 else \
	 mv $(BUILDDIR)/.config.tmp $(BUILDDIR)/.config ; \
	 fi;
endif

# Fixup after configuration
postconfig:

build:
	@if [ ! -d $(BUILDDIR) -o ! -f $(BUILDDIR)/.config ] ; then \
	 echo ; \
	 echo "!!! Build directory missing or Linux configuration not created." ; \
	 echo ; \
	 exit 1 ; \
	 fi;
# Update Linux Configuration with PATH to CPIO Image if not updated before
ifeq ($(LB_LINUX_SET_CPIO),y)
	sed 's/^CONFIG_INITRAMFS_SOURCE=.*/CONFIG_INITRAMFS_SOURCE=\"..\/..\/dist\/.rootfs.cpio\"/g' \
	 $(BUILDDIR)/.config > $(BUILDDIR)/.config.tmp
	@if diff -q $(BUILDDIR)/.config $(BUILDDIR)/.config.tmp > /dev/null ; then \
	 rm -f $(BUILDDIR)/.config.tmp ; \
	 else \
	 mv $(BUILDDIR)/.config.tmp $(BUILDDIR)/.config ; \
	 fi;
endif
	cd $(BUILDDIR); \
	 make -C $(PWD)/$(LINUXDIR) ARCH=sparc O=`pwd` CROSS_COMPILE=$(TOOLCHAIN);
	cp -fa $(BUILDDIR)/arch/sparc/boot/image $(TOP)/output/images/
# Build U-boot Image?
ifeq ($(LB_LINUX_UBOOT),y)
	cd $(BUILDDIR); \
	 make -C $(PWD)/$(LINUXDIR) ARCH=sparc O=`pwd` CROSS_COMPILE=$(TOOLCHAIN) \
	      UIMAGE_LOADADDR=$(LB_LINUX_UBOOT_LOADADDR) uImage;
	cp -fa $(BUILDDIR)/arch/sparc/boot/uImage $(TOP)/output/images/uImage
endif

clean:
	cd $(BUILDDIR); \
	 make -C $(PWD)/$(LINUXDIR) ARCH=sparc O=`pwd` clean;

xconfig: mkbuilddir
	cd $(BUILDDIR); make -C $(PWD)/$(LINUXDIR) ARCH=sparc O=`pwd` xconfig

gconfig: mkbuilddir
	cd $(BUILDDIR); make -C $(PWD)/$(LINUXDIR) ARCH=sparc O=`pwd` gconfig

menuconfig: mkbuilddir
	cd $(BUILDDIR); make -C $(PWD)/$(LINUXDIR) ARCH=sparc O=`pwd` menuconfig

cfg_save:
	@if [ ! -d $(BUILDDIR) ] ; then \
	  echo ; \
	  echo "!!! No Linux Configuration created in project" ; \
	  echo ; \
	  exit 1; \
	  fi;
	mkdir -p $(CFG_BASE)/linux/$(BUILDDIR)
	cp -a $(BUILDDIR)/.config $(CFG_BASE)/linux/$(BUILDDIR)/.config

cfg_load:
	cp -fR $(CFG_BASE)/linux/* .
