#!/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 | head -1)

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

# 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:
	dh_testdir
	# 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 $(builddir)/build-stamp
$(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`
	$(RM) $(addprefix debian/,$(DEBIAN_FILES))
	dh_clean
	$(RM) debian/*docs

	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 some Debian files
debian/%: debian/%.in
	cd $(builddir) \
	  && CONFIG_FILES=../$@ CONFIG_HEADERS= $(SHELL) ./config.status

DEBIAN_FILES = icu.conffiles icu.postinst icu.prerm libicu16.prerm

# Build architecture-dependent files here.
binary-arch: build install $(addprefix debian/,$(DEBIAN_FILES))
#	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.*
	#
	# 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 docs
	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_suidregister
	dh_makeshlibs
	dh_installdeb
#	dh_perl
	dh_shlibdeps && \
	    sed 's/ libicu16[^,]*,//' 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

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install
