#!/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.

# 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.in | 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 's/^[ 	]*\#[ 	]*define[ 	]*U_ICU_VERSION[ 	]*"\([^"]*\)".*/\1/p' $(srcdir)/common/unicode/utypes.h)
lib_version := $(shell echo $(version) | sed -e 's/\.//' -e 's/^\([^.]*\)$$/\1.0/')
lib_version_major := $(shell echo $(lib_version) | 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

# shared library versions, option 1
version:=$(shell sed -n 's/^[ 	]*\#[ 	]*define[ 	]*U_ICU_VERSION[ 	]*"\([^"]*\)".*/\1/p' $(srcdir)/common/unicode/utypes.h)
major:=$(shell echo $(version) | sed -e 's/\.//' -e 's/\..*//')

# option 2, assuming the library is created as src/.libs/libfoo.so.2.0.5 or so
#version=`ls src/.libs/lib*.so.* | \
# awk '{if (match($$0,/[0-9]+\.[0-9]+\.[0-9]+$$/)) print substr($$0,RSTART)}'`
#major=`ls src/.libs/lib*.so.* | \
# awk '{if (match($$0,/\.so\.[0-9]+$$/)) print substr($$0,RSTART+4)}'`

# 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)' $(builddir_relative_srcdir)/configure --srcdir=$(builddir_relative_srcdir) --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --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=control icu.conffiles postinst prerm icu.postinst icu.prerm libicu$(lib_version_major).postinst

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

debian/libicu$(lib_version_major).%: 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:
	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))

	if test -d $(builddir) -a $(builddir) != $(srcdir); then rmdir `find $(builddir) -type d -print | sort -r`; 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
# We have nothing to do by default.

# Build architecture-dependent files here.
binary-arch: build install
#	dh_testversion
	dh_testdir
	dh_testroot
	rm debian/tmp/usr/sbin/gentest
	#
	# build libicu${major} package by moving files from icu-dev
	#
	dh_movefiles -plibicu$(major) \
	    usr/lib/libicuuc.so.* \
	    usr/lib/libicui18n.so.* \
	    usr/lib/libicutoolutil.so.* \
	    usr/lib/libustdio.so.*
	mkdir debian/libicu$(major)/usr/lib/icu
	#
	# build icu package by moving files from icu-dev
	#
	dh_movefiles -picu \
	    etc \
	    usr/sbin \
	    $(icudatadir)/README \
	    $(iculibdir)/*.cnv \
	    $(iculibdir)/u*.dat \
	    $(iculibdir)/tz.dat \
	    usr/share/man
	rm debian/tmp/$(pkglibdir)/current
	rm debian/tmp/$(iculibdir)/cnvalias.dat
	#
	# build icu-locales package by moving files from icu-dev
	#
	dh_movefiles -picu-locales \
	    $(iculibdir)/*.res \
	    $(iculibdir)/*.brk
	#
	# build icu-data from the source data
	#
	test -d debian/icu-data/$(datasrcdir) || \
	    mkdir -p debian/icu-data/$(datasrcdir)
	install -m 644 $(srcdir)/../data/ucname.txt \
	    $(srcdir)/../data/*.ucm \
	    debian/icu-data/$(datasrcdir)
	test -d debian/icu-data/$(datasrcdir)/unidata || \
	    mkdir -p debian/icu-data/$(datasrcdir)/unidata
	install -m 644 $(srcdir)/../data/unidata/*.* \
	    debian/icu-data/$(datasrcdir)/unidata
	unidatafile=`(cd $(srcdir)/../data; ls UnicodeData*.txt)`; cd debian/icu-data/$(datasrcdir) && ln -s unidata/UnicodeData.txt $$unidatafile
	#
	# build icu-i18ndata from the source data
	#
	test -d debian/icu-i18ndata/$(datasrcdir) || \
	    mkdir -p debian/icu-i18ndata/$(datasrcdir)
	install -m 644 $(srcdir)/../data/*.txt \
	    $(srcdir)/../data/*.brk \
	    debian/icu-i18ndata/$(datasrcdir)
	cd debian/icu-i18ndata/$(datasrcdir) && \
	    $(RM) convrtrs.txt UnicodeData*.txt ucname.txt
	#
	# move the rest of the development files
	# in their package
	#
	dh_movefiles usr
	#
	# do a bit of cleanup
	#
	rm -rf debian/tmp/etc debian/tmp/usr/sbin \
	    debian/tmp/usr/share/man
	#
	# continue to prepare packages
	#
#	dh_installdebconf
	dh_installdocs
	dh_installexamples $(srcdir)/samples/*
	dh_installmenu
#	dh_installemacsen
#	dh_installpam
#	dh_installinit
	dh_installcron
	dh_installmanpages -picu
	dh_installinfo
	dh_undocumented -picu genccode.8 gencmn.8 gennames.8 \
	    genprops.8 gentz.8 pkgdata.8
	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$(lib_version_major)/usr/lib && \
	    sed 's/ libicu$(lib_version_major)[^,]*,//' debian/libicu$(major).substvars >debian/libicu$(major).substvars.new && mv debian/libicu$(major).substvars.new debian/libicu$(major).substvars
	dh_gencontrol -- -Vversion=$(version) -Vmajor=$(major)
	dh_md5sums
	dh_builddeb

# Automatically update changelog
update-changelog:
	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)."; \
 	fi

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