# speedo.mk - Speedo rebuilds speedily.
# Copyright (C) 2008 g10 Code GmbH
# 
# This file is part of speedo.
# 
# speedo is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
# 
# speedo is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.

MKDIR=mkdir
STOW=stow

# These paths must be absolute, as we switch directories pretty often.
root := $(shell pwd)/playground
bdir := $(root)/build
idir := $(root)/install
ipdir := $(root)/install/pkgs

# The playground area is our scratch area, where we unpack, build and
# install the packages.
stamps/stamp-directories:
	$(MKDIR) stamps
	$(MKDIR) playground
	$(MKDIR) $(bdir)
	$(MKDIR) $(idir)
	#$(MKDIR) $(ipdir)
	touch stamps/stamp-directories

# Frob the name $1 by converting all '-' and '+' characters to '_'.
define FROB_macro
$(subst +,_,$(subst -,_,$(1)))
endef

# Get the variable $(1) (which may contain '-' and '+' characters).
define GETVAR
$($(call FROB_macro,$(1)))
endef

# Set a couple of common variables.
define SETVARS
	pkg="$(1)";							\
	svn="$(call GETVAR,speedo_pkg_$(1)_svn)";			\
	tar="$(call GETVAR,speedo_pkg_$(1)_tar)";			\
	pkgsdir="$(bdir)/$(1)";						\
	pkgbdir="$(bdir)/$(1)-build";					\
	pkgidir="$(ipdir)/$(1)";					\
	pkgcfg="$(call GETVAR,speedo_pkg_$(1)_configure)";		\
	pkgmkargs="$(call GETVAR,speedo_pkg_$(1)_make_args)";           \
	pkgmkargs_inst="$(call GETVAR,speedo_pkg_$(1)_make_args_inst)"; \
	export PATH="$(idir)/bin:$${PATH}";				\
	export LD_LIBRARY_PATH="$(idir)/lib:$${LD_LIBRARY_PATH}"
endef


# Template for source packages.

define SPKG_template

stamps/stamp-$(1)-00-unpack: stamps/stamp-directories 
	(cd $(bdir);					\
	 $(call SETVARS,$(1));				\
	 if [ -n "$$$${svn}" ]; then			\
           svn checkout "$$$${svn}" "$$$${pkg}";	\
	   cd "$$$${pkg}";				\
	   ./autogen.sh;				\
         elif [ -n "$$$${tar}" ]; then			\
           case "$$$${tar}" in				\
             (*.gz) opt=z ;;				\
             (*.bz2) opt=j ;;				\
             (*) opt= ;;				\
           esac;					\
           case "$$$${tar}" in				\
	     (/*) cmd=cat ;;				\
	     (*) cmd="wget -q -O -" ;;			\
	   esac;					\
	   $$$${cmd} "$$$${tar}" | tar x$$$${opt}f - ;	\
	   base=`echo "$$$${tar}" | sed -e 's,^.*/,,'   \
                 | sed -e 's,\.tar.*$$$$,,'`;		\
	   mv $$$${base} $(1);				\
         fi)
	touch stamps/stamp-$(1)-00-unpack

stamps/stamp-$(1)-01-configure: stamps/stamp-$(1)-00-unpack
	($(call SETVARS,$(1));				\
	 mkdir "$$$${pkgbdir}";				\
	 cd "$$$${pkgbdir}";				\
	 eval "../$$$${pkg}/configure"			\
		--enable-maintainer-mode		\
		--prefix="$(idir)"		\
		--host=i586-mingw32msvc		\
		$$$${pkgcfg})
	touch stamps/stamp-$(1)-01-configure

stamps/stamp-$(1)-02-make: stamps/stamp-$(1)-01-configure
	($(call SETVARS,$(1));				\
	  cd "$$$${pkgbdir}";				\
	  $(MAKE) $$$${pkgmkargs})
	touch stamps/stamp-$(1)-02-make

# Note that post_install must come last because it may be empty and
# "; ;" is a syntax error.
stamps/stamp-$(1)-03-install: stamps/stamp-$(1)-02-make
	($(call SETVARS,$(1));				\
	  cd "$$$${pkgbdir}";				\
	  $(MAKE) $$$${pkgmkargs_inst} install-strip ; \
	  $(call gpg4win_pkg_$(call FROB_macro,$(1))_post_install))
	touch stamps/stamp-$(1)-03-install

stamps/stamp-final-$(1): stamps/stamp-$(1)-03-install
	touch stamps/stamp-final-$(1)

.PHONY : clean-$(1)
clean-$(1):
	($(call SETVARS,$(1));				\
	 (cd $(ipdir) &&				\
	  ($(STOW) -D "$$$${pkg}";			\
	   rm -fR "$$$${pkg}"));			\
	 rm -fR "$$$${pkgsdir}" "$$$${pkgbdir}")
	rm -f stamps/stamp-final-$(1) stamps/stamp-$(1)-*

.PHONY : report-$(1)
report-$(1):
	@($(call SETVARS,$(1));				\
	 echo -n $(1):\  ;				\
	 if [ -n "$$$${svn}" ]; then			\
           if [ -e .svn ]; then				\
	     cd $(bdir)/$(1) &&				\
             svn info | grep Repository ;		\
	   else						\
             echo missing;				\
	   fi						\
         elif [ -n "$$$${tar}" ]; then			\
	   base=`echo "$$$${tar}" | sed -e 's,^.*/,,'   \
                 | sed -e 's,\.tar.*$$$$,,'`;		\
	   echo $$$${base} ;				\
         fi)

endef


# Insert the template for each source package.
$(foreach spkg, $(speedo_spkgs), $(eval $(call SPKG_template,$(spkg))))

stamps/stamp-final: stamps/stamp-directories
stamps/stamp-final: $(addprefix stamps/stamp-final-,$(speedo_build_list))
	touch stamps/stamp-final

all-speedo: stamps/stamp-final

report-speedo: $(addprefix report-,$(speedo_build_list))

# Just to check if we catched all stamps.
clean-stamps:
	$(RM) -fR $(stamps)

clean-speedo:
	$(RM) -fR playground stamps

.PHONY : all-speedo report-speedo clean-stamps clean-speedo