#
# \brief  Checkout and patch L4Linux/L4android source code
# \author Stefan Kalkowski
# \date   2011-03-10

CONTRIB_DIR     = contrib
VERBOSE        ?= @
ECHO            = @echo
TARGET         ?= l4linux

PATCH-l4linux   = $(addprefix patches/,l4lx_genode.patch icmp_align.patch tcp_mem.patch)
REV-l4linux     = 25
REPO-l4linux    = http://svn.tudos.org/repos/oc/l4linux/trunk

PATCH-l4android = patches/l4android_genode.patch
REV-l4android   = 90ca43bd629452ffd38d85fe8c976f069b5bb3d9
REPO-l4android  = git://git.l4android.org/kernel.git

UPDATE_PATCH    = $(word 1, $(PATCH-$(TARGET)))

#
# Utility to check if a tool is installed
#
check_tool = $(if $(shell which $(1)),,$(error Need to have '$(1)' installed.))

$(call check_tool,patch)

ifeq ($(TARGET), l4android)
$(call check_tool,git)
DIFF   = git diff
UPDATE = cd $(REAL_CONTRIB_DIR)/l4android; git fetch; git reset --hard $(REV-l4android)
PATCH  = patch -p1
else
$(call check_tool,svn)
FILTER_DIR = net
DIFF_PATH  = $(filter-out $(FILTER_DIR),$(shell ls $(REAL_CONTRIB_DIR)/l4linux))
DIFF       = svn diff $(DIFF_PATH)
UPDATE     = svn up -r $(REV-l4linux)
PATCH      = patch -p0
endif


# realpath is there to follow symlink; if contrib dir does not exists yet,
# create new directory
REAL_CONTRIB_DIR := $(realpath $(CONTRIB_DIR))
ifeq ($(REAL_CONTRIB_DIR),)
REAL_CONTRIB_DIR := $(CONTRIB_DIR)
endif

#
# Print help information by default
#
help:
	$(ECHO)
	$(ECHO) "Prepare the L4Linux/L4Android repository"
	$(ECHO)
	$(ECHO) "--- available commands ---"
	$(ECHO) "prepare              - checkout and patch the L4Linux/L4Android source code"
	$(ECHO) "update-patch         - updates patch to the original code"
	$(ECHO) "clean                - revert patch from fetched code"
	$(ECHO) "cleanall             - delete all fetched code"
	$(ECHO)
	$(ECHO) "Set the variable TARGET=l4android if you want to checkout,"
	$(ECHO) "update, or clean L4Android in contrast to L4Linux code."
	$(ECHO)

prepare: clean
	$(VERBOSE)$(UPDATE)
	$(ECHO) "applying patches to '$(REAL_CONTRIB_DIR)/$(TARGET)'"
	$(VERBOSE)for i in $(PATCH-$(TARGET)); do $(PATCH) -d $(REAL_CONTRIB_DIR)/$(TARGET) < $$i; done
	$(VERBOSE)ln -s $(shell pwd)/src/drivers $(REAL_CONTRIB_DIR)/$(TARGET)/arch/l4/drivers
	$(ECHO)
	$(ECHO) "Preparation completed!"
	$(ECHO) "Now, go to your Genode build directory and type 'make $(TARGET)'."
	$(ECHO) "Hint: don't forget to put '$(shell pwd)' "
	$(ECHO) "      as a repository into your build.conf"
	$(ECHO)

$(CONTRIB_DIR):
	$(VERBOSE)mkdir -p $@

$(REAL_CONTRIB_DIR)/l4linux:
	$(VERBOSE)svn co $(REPO-l4linux) -r $(REV-l4linux) $@

$(REAL_CONTRIB_DIR)/l4android:
	$(VERBOSE)git clone $(REPO-l4android) $@

update-patch:
	$(ECHO) "Save changes to original code in $(UPDATE_PATCH)"
	$(VERBOSE)(cd $(REAL_CONTRIB_DIR)/$(TARGET); LC_COLLATE=C $(DIFF)) > $(UPDATE_PATCH) || true

clean: clean-$(TARGET)
	$(VERBOSE)rm -f $(CONTRIB_DIR)/$(TARGET)/arch/l4/drivers

clean-l4linux: $(REAL_CONTRIB_DIR)/$(TARGET)
	$(VERBOSE)svn revert -R $(REAL_CONTRIB_DIR)/l4linux
	$(VERBOSE)svn stat $(REAL_CONTRIB_DIR)/l4linux | sed -e 's/? //' | xargs rm -f
	$(VERBOSE)svn up -r $(REV-l4linux) -N $(REAL_CONTRIB_DIR)/l4linux

clean-l4android: $(REAL_CONTRIB_DIR)/$(TARGET)
	$(VERBOSE)cd $(REAL_CONTRIB_DIR)/l4android; git checkout -f

cleanall:
	$(VERBOSE)rm -rf $(CONTRIB_DIR)