# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

inherit cannadic eutils multilib

MY_P="Canna${PV//./}"
MY_P="${MY_P/_/}"

DESCRIPTION="A client-server based Kana-Kanji conversion system"
HOMEPAGE="http://canna.sourceforge.jp/"
SRC_URI="mirror://sourceforge.jp/canna/9565/${MY_P}.tar.bz2"

LICENSE="MIT GPL-2"
SLOT="0"
KEYWORDS="~alpha ~amd64 ~hppa ~ppc ~ppc64 ~sparc ~x86"
IUSE="doc"

DEPEND=">=sys-apps/sed-4
	x11-misc/gccmakedep
	x11-misc/imake
	doc? (
		app-text/ghostscript-gpl
		>=dev-texlive/texlive-langcjk-2010
		dev-texlive/texlive-fontsextra
		dev-texlive/texlive-genericrecommended
		dev-texlive/texlive-latexrecommended
	)"
RDEPEND=""

S="${WORKDIR}/${MY_P}"

src_unpack() {
	unpack ${A}
	cd "${S}"

	find . -name '*.man' -o -name '*.jmn' | xargs sed -i.bak -e 's/1M/8/g' || die
	sed -e "s%@cannapkgver@%${PF}%" \
		"${FILESDIR}"/${PN}-3.7-gentoo.diff.in > "${T}"/${PF}-gentoo.diff || die
	epatch "${T}"/${PF}-gentoo.diff

	# bug #248723
	epatch "${FILESDIR}"/${P}-strip.patch

	# Multilib-strict fix for amd64
	sed -i -e "s:\(DefLibCannaDir.*\)/lib:\1/$(get_libdir):g" Canna.conf* || die
	# fix deprecated sort syntax
	sed -e 's:^\(sortcmd=\".* -s\).*$:\1 -k 1,1\":' \
		-i cmd/mkbindic/mkbindic.cpp || die

	cd "${S}"/dic/phono
	epatch "${FILESDIR}"/${PN}-kpdef-gentoo.diff

}

src_compile() {
	xmkmf || die

	#make libCannaDir=../lib/canna canna || die
	# bug #279706
	emake -j1 CC="$(tc-getCC)" CDEBUGFLAGS="${CFLAGS}" \
		LOCAL_LDFLAGS="${LDFLAGS}" SHLIBGLOBALSFLAGS="${LDFLAGS}" canna || die

	if use doc ; then
		einfo "Compiling DVI, PS (and PDF) document"
		cd doc/man/guide/tex
		xmkmf || die
		emake -j1 CC="$(tc-getCC)" CDEBUGFLAGS="${CFLAGS}" \
			LOCAL_LDFLAGS="${LDFLAGS}" SHLIBGLOBALSFLAGS="${LDFLAGS}" \
			JLATEXCMD=platex \
			DVI2PSCMD="dvips -f" VARTEXFONTS="${T}"/fonts \
			canna.dvi canna.ps || die
		if has_version 'app-text/dvipdfmx' && \
			( has_version 'app-text/acroread' \
			|| has_version 'app-text/xpdf-japanese' ); then
			emake -j1 CC="$(tc-getCC)" CDEBUGFLAGS="${CFLAGS}" \
				LOCAL_LDFLAGS="${LDFLAGS}" SHLIBGLOBALSFLAGS="${LDFLAGS}" \
				JLATEXCMD=platex \
				DVI2PSCMD="dvips -f" VARTEXFONTS="${T}"/fonts \
				canna.pdf || die
		fi
	fi
}

src_install() {
	emake DESTDIR="${D}" install || die
	emake DESTDIR="${D}" install.man || die

	# install default.canna (removed from Canna36p4)
	insinto /usr/share/canna
	newins misc/initfiles/verbose.canna default.canna

	# cannakill should link to /usr/bin/catdic
	dosym ../bin/catdic /usr/sbin/cannakill

	dodir /usr/share/man/man8 /usr/share/man/ja/man8
	for man in cannaserver cannakill ; do
		for mandir in "${D}"/usr/share/man "${D}"/usr/share/man/ja ; do
			mv ${mandir}/man1/${man}.1 ${mandir}/man8/${man}.8
		done
	done

	dodoc CHANGES.jp ChangeLog INSTALL* README* WHATIS*

	if use doc ; then
		insinto /usr/share/doc/${PF}
		doins doc/man/guide/tex/canna.{dvi,ps,pdf}
	fi

	newinitd "${FILESDIR}"/${P}.initd canna || die
	newconfd "${FILESDIR}"/${P}.confd canna || die
	insinto /etc/ ; newins "${FILESDIR}"/canna.hosts hosts.canna || die
	keepdir /var/log/canna/ || die

	# for backward compatibility
	dosbin "${FILESDIR}"/update-canna-dics_dir

	insinto /var/lib/canna/dic/dics.d/
	newins "${D}"/var/lib/canna/dic/canna/dics.dir 00canna.dics.dir

	# fix permission for user dictionary
	keepdir /var/lib/canna/dic/{user,group}
	fowners root:bin /var/lib/canna/dic/{user,group}
	fperms 775 /var/lib/canna/dic/{user,group}
}

pkg_postinst() {
	update-cannadic-dir
	elog
	elog "Canna dictionary format has been changed."
	elog "You should rebuild app-dict/canna-* after emerge."
	elog

	local localearchive="${ROOT}usr/$(get_libdir)/locale/locale-archive"
	if [ -f "${localearchive}" -a -x /usr/bin/localedef ] && \
		! /usr/bin/localedef --list-archive "${localearchive}" | grep -i 'ja_JP.eucjp' >/dev/null 2>&1 ; then
		elog "Some dictionary tools in this package require ja_JP.eucJP locale."
		elog "Please add ja_JP.eucJP locale to /etc/locale.gen:"
		elog
		elog "# echo 'ja_JP.EUC-JP EUC-JP' >> /etc/locale.gen"
		elog "# locale-gen"
		elog
	fi
}

pkg_prerm() {
	if [ -S /tmp/.iroha_unix/IROHA ] ; then
		# make sure cannaserver get stopped because otherwise
		# we cannot stop it with /etc/init.d after emerge -C canna
		einfo
		einfo "Stopping Canna for safe unmerge"
		einfo
		/etc/init.d/canna stop
		touch "${T}"/canna.cookie
	fi
}

pkg_postrm() {
	if [ -f /usr/sbin/cannaserver -a -e "${T}"/canna.cookie ] ; then
		#update-cannadic-dir
		einfo
		einfo "Restarting Canna"
		einfo
		/etc/init.d/canna start
		rm -f "${T}"/canna.cookie
	fi
}
