#!/usr/bin/make -f
# ICU debian/rules that uses debhelper.

# The Debian packages for ICU are created and maintained by
# Yves Arrouye <yves@debian.org>. They are part of Debian GNU/Linux
# since the Debian woody release.

# Decide whether we want to automatically manage the repackaging of
# the common data from individual files or not.
ICU_AUTO_COMMON=NO

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

# This is the debhelper compatability version to use.
export DH_COMPAT=2
#firstdir := $(shell sed -n 's/Package: \(.*\)/\1/p' debian/control | head -1)else

# Where the source for ICU is, where to build
srcdir = source
builddir = build
# How to get to $(srcdir) from $(builddir)
builddir_relative_topdir = ..
builddir_relative_srcdir = $(builddir_relative_topdir)/$(srcdir)

# Getting the ICU version numbers, stolen from configure.in (that's okay, I
# wrote the configure.in part anyway)

version := $(shell sed -n -e 's/^[ 	]*\#[ 	]*define[ 	]*U_ICU_VERSION[ 	]*"\([^"]*\)".*/\1/p' $(srcdir)/common/unicode/uversion.h)
libversion := $(shell echo $(version) | sed -e 's/\.//' -e 's/^\([^.]*\)$$/\1.0/')
major := $(shell echo $(libversion) | sed 's/\..*//')

# ICU installation directories, w/o the initial slash
pkgdatadir = usr/share/icu
icudatadir = $(pkgdatadir)/$(version)
pkglibdir = usr/lib/icu
iculibdir = $(pkglibdir)/$(version)
datasrcdir = usr/share/icu/$(version)/data
# This is where data needs to be moved
ifeq ($(ICU_AUTO_COMMON),YES)
icufildir = $(iculibdir)/files
else
icufildir = $(iculibdir)
endif

# Build flags

CFLAGS = -O2 # -Wall
CXXFLAGS = -O2 # -Wall
INSTALL_PROGRAM = /usr/bin/install

ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
CFLAGS += -g
CXXFLAGS += -g
endif
ifneq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
INSTALL_PROGRAM += -s
endif

all: build

configure: $(builddir)/configure-stamp
$(builddir)/configure-stamp:
	# Add here commands to configure the package.
	test -d $(builddir) || mkdir $(builddir)
	cd $(builddir); CFLAGS='$(CFLAGS)' CXXFLAGS='$(CFLAGS)' INSTALL_PROGRAM='$(INSTALL_PROGRAM)' $(SHELL) $(builddir_relative_srcdir)/configure --srcdir=$(builddir_relative_srcdir) --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var --with-data-packaging=files --disable-rpath --enable-shared --enable-static --disable-samples
	touch $@

build: $(builddir)/configure-stamp debian-files $(builddir)/build-stamp

# Build some Debian files
DEBIAN_FILES=icu.conffiles postinst prerm icu.postinst icu.prerm libicu$(major).postinst README.Debian.libicu$(major)-dev

debian/%: debian/%.in
	cd $(builddir) \
	  && CONFIG_FILES=$(builddir_relative_topdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status

debian/libicu$(major)%: debian/libicu%
	cp $< $@
debian/README.Debian.libicu$(major)%: debian/README.Debian.libicu%
	cp $< $@

debian-files: $(addprefix debian/,$(DEBIAN_FILES))

$(builddir)/build-stamp:
	dh_testdir

	# Add here commands to compile the package.
	$(MAKE) -C $(builddir)

	touch $@

clean: update-debian-files
	dh_testdir
	dh_testroot
	 $(RM) $(builddir)/build-stamp $(builddir)/configure-stamp

	# Add here commands to clean up after the build process.
	-$(MAKE) -C $(builddir) distclean
	#-$(RM) `find $(builddir)/samples $(builddir)/test -name Makefile -print`
	-$(RM) `find $(builddir) -name Makefile -print`
	dh_clean
	$(RM) $(addprefix debian/,$(DEBIAN_FILES)) debian/control.new

	#if test -d $(builddir) -a $(builddir) != $(srcdir); then rmdir `find $(builddir) -type d -print | sort -r`; fi
	if test -d $(builddir) -a $(builddir) != $(srcdir); then $(RM) -r $(builddir); fi

install: build
	dh_testdir
	dh_testroot
	dh_clean -k
	dh_installdirs

	# Add here commands to install the package into debian/tmp
	$(MAKE) -C $(builddir) install DESTDIR=`pwd`/debian/tmp

# Build architecture-independent files here.
binary-indep: build install
	#
	# build icu-doc package by moving files
	#
	mv debian/tmp/usr/share/doc/icu debian/tmp/usr/share/doc/icu-doc
	dh_movefiles -picu-doc \
	    usr/share/doc/icu-doc
	#
	# build icu-i18ndata from the source data
	#
	for d in locales translit brkitr; do \
	    test -d debian/icu-i18ndata/$(datasrcdir)/$$d || \
	        mkdir -p debian/icu-i18ndata/$(datasrcdir)/$$d; \
	    install -m 644 $(srcdir)/data/$$d/*.* \
	        debian/icu-i18ndata/$(datasrcdir)/$$d; \
	done
	#
	# build icu-data from the source data
	#
	for d in mappings unidata misc; do \
	    test -d debian/icu-data/$(datasrcdir)/$$d || \
	        mkdir -p debian/icu-data/$(datasrcdir)/$$d; \
	    install -m 644 $(srcdir)/data/$$d/*.* \
	        debian/icu-data/$(datasrcdir)/$$d; \
	done
	cd debian/icu-data/$(datasrcdir)/mappings && \
	    $(RM) convrtrs.txt && ln -s /etc/icu/convrtrs.txt .

# Build architecture-dependent files here.
binary-arch: build install
#	dh_testversion
	dh_testdir
	dh_testroot
	#
	# build libicu${major} package by moving files from icu-dev
	#
	$(RM) debian/tmp/usr/lib/libicuctestfw.*
	dh_movefiles -plibicu$(major) \
	    usr/lib/*.so.*
	mkdir debian/libicu$(major)/usr/lib/icu
	#
	# massage data files
	#
	$(RM) debian/tmp/$(iculibdir)/cnvalias.dat
ifneq ($(iculibdir),$(icufildir))
	test -d debian/tmp/$(icufildir) || mkdir debian/tmp/$(icufildir)
	mv debian/tmp/$(iculibdir)/*.* debian/tmp/$(icufildir)
	mv debian/tmp/$(icufildir)/*msg.dat debian/tmp/$(iculibdir)
	mv debian/tmp/$(icufildir)/*.inc debian/tmp/$(iculibdir)
endif
	#
	# build icu package by moving files from icu-dev
	#
	$(RM) debian/tmp/$(iculibdir)/../Makefile.inc debian/tmp/$(iculibdir)/../current
ifneq ($(iculibdir),$(icufildir))
	dh_movefiles -picu \
	    $(iculibdir)/*msg.dat
endif
	dh_movefiles -picu \
	    etc \
	    usr/bin \
	    usr/sbin \
	    $(icudatadir)/README \
	    $(iculibdir)/*.inc \
	    $(icufildir)/*.cnv \
	    $(icufildir)/*.dat \
	    usr/share/man
	#
	# build icu-locales package by moving files from icu-dev
	#
	dh_movefiles -picu-locales \
	    $(icufildir)/*.res \
	    $(icufildir)/*.brk
	#
	# move the rest of the development files
	# in their package
	#
	dh_movefiles usr
	#
	# do a bit of cleanup
	#
	$(RM) -r debian/tmp/etc debian/tmp/usr/sbin \
	    debian/tmp/usr/share/man
	#
	# continue to prepare packages
	#
#	dh_installdebconf
	dh_installdocs
	dh_installexamples $(srcdir)/samples/*
	find debian/libicu$(major)-dev -name CVS -o -name .cvsignore | xargs $(RM) -r
	dh_installmenu
#	dh_installemacsen
#	dh_installpam
#	dh_installinit
	dh_installcron
	dh_installmanpages -picu
	dh_installinfo
	# dh_undocumented -picu
	dh_installchangelogs 
	dh_link
	dh_strip
	dh_compress
	dh_fixperms
	# You may want to make some executables suid here.
	dh_makeshlibs
	dh_installdeb
#	dh_perl
	dh_shlibdeps -ldebian/libicu$(major)/usr/lib
	dh_gencontrol -- -Vversion=$(version) -Vmajor=$(major)
	dh_md5sums
	dh_builddeb

# Automatically update changelog and control
update-debian-files:
	if [ x"$$NO_AUTO_DCH" = x ]; \
	then \
	    cvers=`sed -n 's/^icu (\([^)]*\)).*/\1/p' debian/changelog | head -1`; if dpkg --compare-versions $$cvers lt $(version)-1; then \
	        dch -v $(version)-1 "Update to ICU version $(version). (This comment is generated.)"; \
	        sed 's/libicu[0-9][0-9]*/libicu$(major)/g' debian/control >debian/control.new && mv debian/control.new debian/control; \
	    fi; \
	fi

binary: update-debian-files binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install debian-files update-changelog

