PACKAGE=r2l-package
VERSION = 1.0.0

R2LLIB_CONFIG_LOCAL = bin/r2llib-config
REFRESHD_LIB_CONFIG_LOCAL = bin/refreshd_cnt-config
REFRESHD_LIB_CONFIG = $(REFRESHD_LIB_CONFIG_LOCAL)

BIDITEXT_DIR = src/biditext
PLUGINS_DIR = src/r2l-plugins
R2LLIB_DIR = src/r2llib
REFRESHD_MAIN_DIR = src/refreshd
REFRESHD_LIB_DIR = $(REFRESHD_MAIN_DIR)/src/refreshd_cnt
REFRESHD_DIR = $(REFRESHD_MAIN_DIR)/src/refreshd
REFRESHD_HOOK_DIR = $(REFRESHD_MAIN_DIR)/src/refreshd_hook
REFRESHD_TESTS_DIR = $(REFRESHD_MAIN_DIR)/src/test
PUBLISH_DIR=aluf:public_html/R2L/r2l-tarball

# to allow overriding with 'gmake MAKE=gmake':
SCP=scp
GZIP = gzip
TAR = tar
LN = ln
RM = rm -f
MV = mv
INSTALL = install

# #########################
#
#  Will be overriden in make.defs
MAKE = make
BUILD_REFRESHD = 1
BUILD_PLUGINS = 1
R2LLIB_CONFIG = 

# include 'make.defs' if it exists 
-include make.defs

LOCAL_AC_MACROS=aclocal/ac_path_generic.m4 aclocal/check_gnu_make.m4 

# for the packaging:
PACKAGE_FILES_LIST = README ChangeLog Makefile configure.in r2l.spec \
		     configure install-sh $(LOCAL_AC_MACROS) \
		     make.defs.in r2l.spec.in 

PACKAGES_DIR=..
R2LLIB_VERSION=0.38
BIDITEXT_VERSION=1.0.0
PLUGINS_VERSION=0.60
REFRESHD_VERSION=0.1.4
R2LLIB_TARBALL=$(PACKAGES_DIR)/r2llib-$(R2LLIB_VERSION).tar.gz
BIDITEXT_TARBALL=$(PACKAGES_DIR)/biditext-$(BIDITEXT_VERSION).tar.gz
PLUGINS_TARBALL=$(PACKAGES_DIR)/r2l-plugins-$(PLUGINS_VERSION).tar.gz
REFRESHD_TARBALL=$(PACKAGES_DIR)/refreshd-$(REFRESHD_VERSION).tar.gz
PACKAGES=$(R2LLIB_TARBALL) $(BIDITEXT_TARBALL) $(PLUGINS_TARBALL) \
         $(REFRESHD_TARBALL)

RPM_ARCH=i586
RPM_REVESION=5
RPM_PACKAGE_NAMES=r2l r2l-gnome
RPMS_DIR=$(HOME)/RPM/RPMS/i586
RPM_PACKAGES=\
 $(RPM_PACKAGE_NAMES:%=$(RPMS_DIR)/%-$(VERSION)-$(RPM_REVESION).$(RPM_ARCH).rpm)

#TAR_BALL_DIR=$(PACKAGE)-$(VERSION)
#TAR_BALL=$(TAR_BALL_DIR).tar.gz
TAR_BALL_DIR=r2l-$(VERSION)
TAR_BALL=$(PACKAGES_DIR)/$(PACKAGE)-$(VERSION).tar.gz



# application files.
ifeq ($(BUILD_REFRESHD),1)
  REFRESHD_TARGET = refreshd refreshd_hook
else
  REFRESHD_TARGET = 
endif

ifeq ($(BUILD_PLUGINS),1)
  PLUGINS_TARGET = plugins
else
  PLUGINS_TARGET = 
endif

ifeq ($(strip $(R2LLIB_CONFIG)),)
  R2LLIB_CONFIG=$(R2LLIB_CONFIG_LOCAL)
  R2LLIB_INSTALL_PROGS = install_r2llib_progs
  R2LLIB_UNINSTALL_PROGS = uninstall_r2llib_progs
else
  R2LLIB_INSTALL_PROGS =
  R2LLIB_UNINSTALL_PROGS =
endif


all: biditext $(PLUGINS_TARGET) $(REFRESHD_TARGET)

# this builds and installs a local copy of r2llib
$(R2LLIB_CONFIG_LOCAL): $(R2LLIB_DIR)/Makefile 
	topdir=$$PWD; \
	cd $(R2LLIB_DIR); \
	$(MAKE) PREFIX=$$topdir install

# this builds and installs a local copy of refreshd_cnt
$(REFRESHD_LIB_CONFIG_LOCAL): $(R2LLIB_CONFIG) $(REFRESHD_LIB_DIR)/Makefile
	topdir=$$PWD; \
	cd $(REFRESHD_LIB_DIR); \
	$(MAKE) PREFIX=$$topdir install

biditext: $(R2LLIB_CONFIG) $(BIDITEXT_DIR)/Makefile
	topdir=$$PWD; \
	cd $(BIDITEXT_DIR) ; \
	$(MAKE) R2LLIB_CONFIG=$$topdir/$(R2LLIB_CONFIG)

refreshd: $(R2LLIB_CONFIG) $(REFRESHD_LIB_CONFIG) $(REFRESHD_DIR)/Makefile
	topdir=$$PWD; \
	cd $(REFRESHD_DIR) ; \
	$(MAKE) R2LLIB_CONFIG=$$topdir/$(R2LLIB_CONFIG) \
	        REFRESHD_LIB_CONFIG=$$topdir/$(REFRESHD_LIB_CONFIG)

refreshd_hook: $(R2LLIB_CONFIG) $(REFRESHD_LIB_CONFIG) \
               $(REFRESHD_HOOK_DIR)/Makefile
	topdir=$$PWD; \
	cd $(REFRESHD_HOOK_DIR) ; \
	$(MAKE) R2LLIB_CONFIG=$$topdir/$(R2LLIB_CONFIG) \
	        REFRESHD_LIB_CONFIG=$$topdir/$(REFRESHD_LIB_CONFIG)

refreshd_tests: $(R2LLIB_CONFIG) $(REFRESHD_LIB_CONFIG) \
               $(REFRESHD_TESTS_DIR)/Makefile refreshd
	topdir=$$PWD; \
	cd $(REFRESHD_TESTS_DIR) ; \
	$(MAKE) R2LLIB_CONFIG=$$topdir/$(R2LLIB_CONFIG) \
	        REFRESHD_LIB_CONFIG=$$topdir/$(REFRESHD_LIB_CONFIG)

refreshd_test_comm:

plugins: $(R2LLIB_CONFIG) $(PLUGINS_DIR)/Makefile
	topdir=$$PWD; \
	cd $(PLUGINS_DIR) ; \
	$(MAKE) R2LLIB_CONFIG=$$topdir/$(R2LLIB_CONFIG)

install: install_biditext install_plugins install_refreshd \
         install_refreshd_hook $(R2LLIB_INSTALL_PROGS)

install_biditext: biditext $(BIDITEXT_DIR)/Makefile
	cd $(BIDITEXT_DIR) ; \
	$(MAKE) install

install_plugins: plugins $(PLUGINS_DIR)/Makefile
	cd $(PLUGINS_DIR) ; \
	$(MAKE) install

install_refreshd: refreshd $(REFRESHD_DIR)/Makefile
	cd $(REFRESHD_DIR) ; \
	$(MAKE) install

install_refreshd_hook: refreshd_hook $(REFRESHD_HOOK_DIR)/Makefile
	cd $(REFRESHD_HOOK_DIR) ; \
	$(MAKE) install

install_refreshd_tests: refreshd_hook $(REFRESHD_TESTS_DIR)/Makefile
	cd $(REFRESHD_TESTS_DIR) ; \
	$(MAKE) install

install_r2llib_progs: $(R2LLIB_CONFIG_LOCAL) $(R2LLIB_DIR)/Makefile
	cd $(R2LLIB_DIR) ; \
	$(MAKE) install_progs

uninstall: uninstall_biditext uninstall_plugins uninstall_refreshd \
           uninstall_refreshd_hook $(R2LLIB_UNINSTALL_PROGS)

uninstall_biditext: $(BIDITEXT_DIR)/Makefile
	cd $(BIDITEXT_DIR) ; \
	$(MAKE) uninstall

uninstall_plugins: $(PLUGINS_DIR)/Makefile
	cd $(PLUGINS_DIR) ; \
	$(MAKE) uninstall

uninstall_refreshd: $(REFRESHD_DIR)/Makefile
	cd $(REFRESHD_DIR) ; \
	$(MAKE) uninstall

uninstall_refreshd_hook: $(REFRESHD_HOOK_DIR)/Makefile
	cd $(REFRESHD_HOOK_DIR) ; \
	$(MAKE) uninstall

uninstall_refreshd_tests: $(REFRESHD_HOOK_DIR)/Makefile
	cd $(REFRESHD_TESTS_DIR) ; \
	$(MAKE) uninstall

uninstall_r2llib_progs: $(R2LLIB_DIR)/Makefile
	cd $(R2LLIB_DIR) ; \
	$(MAKE) uninstall_progs


clean: clean_biditext clean_r2llib clean_plugins clean_refreshd_lib \
       clean_refreshd clean_refreshd_hook clean_package

clean_package:
	$(RM) r2l.spec

clean_r2llib: $(R2LLIB_DIR)/Makefile
	topdir=$$PWD; \
	cd $(R2LLIB_DIR); \
	$(MAKE) PREFIX=$$topdir uninstall clean
	
clean_refreshd_lib: $(REFRESHD_LIB_DIR)/Makefile
	topdir=$$PWD; \
	cd $(REFRESHD_LIB_DIR); \
	$(MAKE) PREFIX=$$topdir uninstall clean
	
clean_biditext: $(BIDITEXT_DIR)/Makefile
	cd $(BIDITEXT_DIR) ; \
	$(MAKE) clean
	
clean_plugins: $(PLUGINS_DIR)/Makefile
	cd $(PLUGINS_DIR) ; \
	$(MAKE) clean

clean_refreshd: $(REFRESHD_DIR)/Makefile
	cd $(REFRESHD_DIR) ; \
	$(MAKE) clean

clean_refreshd_hook: $(REFRESHD_HOOK_DIR)/Makefile 
	cd $(REFRESHD_HOOK_DIR) ; \
	$(MAKE) clean

clean_refreshd_tests: $(REFRESHD_TESTS_DIR)/Makefile 
	cd $(REFRESHD_TESTS_DIR) ; \
	$(MAKE) clean

# 'unpack' and 'pack' are totally different.
# 'pack' only unpacks this package. 'unpack' is for unpacking the other
# packages, and prepare src/

test: refreshd_tests
	@echo "This target only built the tests. "
	@echo "See the programs that were created in $(REFRESHD_TESTS_DIR)"

unpack: $(PACKAGES)
	# initilize 'src/'
	if [ -e src ] ; then \
	  $(RM) -rf src;     \
	fi
	$(INSTALL) -d src
	# unpack tarballs
	for tarball in $(PACKAGES); do    \
	  $(GZIP) -d <$$tarball | $(TAR) -xvf - -C src ; \
	done
	# remove the version numbers 
	$(MV) $$PWD/$(R2LLIB_DIR)-$(R2LLIB_VERSION) $$PWD/$(R2LLIB_DIR) 
	$(MV) $$PWD/$(BIDITEXT_DIR)-$(BIDITEXT_VERSION) $$PWD/$(BIDITEXT_DIR) 
	$(MV) $$PWD/$(PLUGINS_DIR)-$(PLUGINS_VERSION) $$PWD/$(PLUGINS_DIR) 
	$(MV) $$PWD/$(REFRESHD_MAIN_DIR)-$(REFRESHD_VERSION) \
	         $$PWD/$(REFRESHD_MAIN_DIR) 

TAR_BALL_ALL=$(PACKAGES_DIR)/r2l-$(VERSION).tar.gz
TAR_BALL_ALL_DIR=$(PACKAGES_DIR)/r2l-$(VERSION)

pack-all: $(TAR_BALL_ALL)

$(TAR_BALL_ALL): $(TAR_BALL) $(PACKAGES)
	if [ -e $(TAR_BALL_ALL_DIR) ]; then \
	  $(RM) -rf $(TAR_BALL_ALL_DIR);     \
	fi
	$(GZIP) -d <$(TAR_BALL) |$(TAR) -xf - -C $(PACKAGES_DIR)
	$(INSTALL) -d $(TAR_BALL_ALL_DIR)/src
	
	cd $(TAR_BALL_ALL_DIR); for tarball in $(PACKAGES); do    \
	  $(GZIP) -d <$$tarball | $(TAR) -xf - -C src ;          \
	done

	# remove the version numbers 
	$(MV) $(TAR_BALL_ALL_DIR)/$(R2LLIB_DIR)-$(R2LLIB_VERSION) \
	      $(TAR_BALL_ALL_DIR)/$(R2LLIB_DIR) 
	$(MV) $(TAR_BALL_ALL_DIR)/$(BIDITEXT_DIR)-$(BIDITEXT_VERSION) \
	      $(TAR_BALL_ALL_DIR)/$(BIDITEXT_DIR) 
	$(MV) $(TAR_BALL_ALL_DIR)/$(PLUGINS_DIR)-$(PLUGINS_VERSION) \
	      $(TAR_BALL_ALL_DIR)/$(PLUGINS_DIR) 
	$(MV) $(TAR_BALL_ALL_DIR)/$(REFRESHD_MAIN_DIR)-$(REFRESHD_VERSION) \
	      $(TAR_BALL_ALL_DIR)/$(REFRESHD_MAIN_DIR) 

	# pack the tarball: (note the use of TAR_BALL_DIR)
	$(TAR) cf - -C $(PACKAGES_DIR) $(TAR_BALL_DIR) |\
	       $(GZIP) >$(TAR_BALL_ALL)

pack: $(TAR_BALL)

# is $(?D) a standard feature?
$(TAR_BALL): $(PACKAGE_FILES_LIST)
	if [ -e $(TAR_BALL_DIR) ] ; then \
	  $(RM) -rf $(TAR_BALL_DIR);     \
	fi
	mkdir $(TAR_BALL_DIR)
	# create subdirectories if necessary. $(?D) is the directory parts of
	# $(?) . TODO: remove "." and remove duplicates
	for dir in $(^D) ; do             \
	  mkdir -p $(TAR_BALL_DIR)/$$dir; \
	done
	# copy the files
	for file in $^; do                  \
	  cp $$file $(TAR_BALL_DIR)/$$file; \
	done
	#cp $(PACKAGE_FILES_LIST) $(TAR_BALL_DIR)
	$(TAR) cvzf $(TAR_BALL) $(TAR_BALL_DIR)

rpm: $(RPM_PACKAGES)
$(RPM_PACKAGES): $(TAR_BALL_ALL)
	rpm -tb $(TAR_BALL_ALL)

configure: configure.in $(LOCAL_AC_MACROS)
	autoconf

make.defs: make.defs.in configure
	./configure

r2l.spec: r2l.spec.in
	cat $< |sed -e 's#PACKAGE_VERSION#$(VERSION)#g' \
	       > $@

publish: $(TAR_BALL_ALL) $(RPM_PACKAGES) README r2l.spec
	$(SCP) $^ $(PUBLISH_DIR)
