diff options
author | jlam <jlam> | 2006-04-13 16:35:57 +0000 |
---|---|---|
committer | jlam <jlam> | 2006-04-13 16:35:57 +0000 |
commit | d065f9a8442fe522404bb2be2e1547b54ae46821 (patch) | |
tree | 05edb3a0d35814dcd46fc6d587c479a7a041b561 /mk/tools | |
parent | e7f6ab298c22340dca574f8d0349b24c9b80c59b (diff) | |
download | pkgsrc-d065f9a8442fe522404bb2be2e1547b54ae46821.tar.gz |
Overhaul the way packages can ask for "msgfmt". If a package needs
msgfmt, then it should set the following in the package Makefile:
USE_TOOLS+= msgfmt
To deal with message files that use the "msgid_plural" statement,
which isn't supported in NetBSD<=3.x and also in gettext<=0.10.35, we
determine if the built-in "msgfmt" is sufficiently new enough to
understand "msgid_plural". If it isn't, then we use the msgfmt.sh
script to transform the msgid_plural statements to an equivalent
construct that's understood by older msgfmt tools.
The msgfmt.sh script is a straightforward translation of the original
perl script msgfmt.pl script by Julio M. Merino Vidal into shell and
awk, which are more lightweight dependencies than perl.
We remove the USE_MSGFMT_PLURALS bits in gettext-lib/builtin.mk as they
are made obsolete by the new code in mk/tools/msgfmt.mk.
BUILD_USE_MSGFMT is still supported but will be removed in a separate
commit.
Diffstat (limited to 'mk/tools')
-rw-r--r-- | mk/tools/bsd.tools.mk | 3 | ||||
-rw-r--r-- | mk/tools/msgfmt.mk | 86 | ||||
-rwxr-xr-x | mk/tools/msgfmt.sh | 189 | ||||
-rw-r--r-- | mk/tools/replace.mk | 18 | ||||
-rw-r--r-- | mk/tools/tools.Linux.mk | 5 | ||||
-rw-r--r-- | mk/tools/tools.NetBSD.mk | 5 |
6 files changed, 291 insertions, 15 deletions
diff --git a/mk/tools/bsd.tools.mk b/mk/tools/bsd.tools.mk index f12695bcb9a..ef4c5b2dbda 100644 --- a/mk/tools/bsd.tools.mk +++ b/mk/tools/bsd.tools.mk @@ -1,4 +1,4 @@ -# $NetBSD: bsd.tools.mk,v 1.32 2005/08/10 20:56:20 jlam Exp $ +# $NetBSD: bsd.tools.mk,v 1.33 2006/04/13 16:35:58 jlam Exp $ # # Copyright (c) 2005 The NetBSD Foundation, Inc. # All rights reserved. @@ -111,6 +111,7 @@ USE_TOOLS?= # empty .include "../../mk/tools/automake.mk" .include "../../mk/tools/autoconf.mk" .include "../../mk/tools/texinfo.mk" +.include "../../mk/tools/msgfmt.mk" .include "../../mk/tools/ldconfig.mk" .include "../../mk/tools/rpcgen.mk" .include "../../mk/tools/strip.mk" diff --git a/mk/tools/msgfmt.mk b/mk/tools/msgfmt.mk new file mode 100644 index 00000000000..36a973aec6f --- /dev/null +++ b/mk/tools/msgfmt.mk @@ -0,0 +1,86 @@ +# $NetBSD: msgfmt.mk,v 1.1 2006/04/13 16:35:58 jlam Exp $ +# +# Copyright (c) 2006 The NetBSD Foundation, Inc. +# All rights reserved. +# +# This code is derived from software contributed to The NetBSD Foundation +# by Johnny C. Lam. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by the NetBSD +# Foundation, Inc. and its contributors. +# 4. Neither the name of The NetBSD Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +.if !defined(TOOLS_IGNORE.msgfmt) && !empty(USE_TOOLS:C/:.*//:Mmsgfmt) +. if !empty(PKGPATH:Mdevel/gettext-tools) +MAKEFLAGS+= TOOLS_IGNORE.msgfmt= +. else +. if defined(TOOLS_PLATFORM.msgfmt) && !empty(TOOLS_PLATFORM.msgfmt) +. if !defined(_TOOLS_USE_PKGSRC.msgfmt) +# +# Discover if the version on the builtin msgfmt is new enough to handle +# msgid_plural (at least 0.10.35). +# +_TOOLS_VERSION.msgfmt!= ${TOOLS_PLATFORM.msgfmt} --version | \ + ${AWK} '{ print $$4; exit }' +_TOOLS_USE_PKGSRC.msgfmt!= \ + if ${PKG_ADMIN} pmatch "gettext>=0.10.35" \ + gettext-${_TOOLS_VERSION.msgfmt:Q}; then \ + ${ECHO} no; \ + else \ + ${ECHO} yes; \ + fi +. endif +MAKEVARS+= _TOOLS_USE_PKGSRC.msgfmt +. else +_TOOLS_USE_PKGSRC.msgfmt= yes +. endif + +# If we're not using the builtin gettext implementation, then we should +# definitely be using the pkgsrc version of msgfmt (gettext-tools). +# +CHECK_BUILTIN.gettext:= yes +. include "../../devel/gettext-lib/builtin.mk" +CHECK_BUILTIN.gettext:= no +. if !empty(USE_BUILTIN.gettext:M[nN][oO]) +_TOOLS_USE_PKGSRC.msgfmt= yes +. endif + +. if !empty(_TOOLS_USE_PKGSRC.msgfmt:M[yY][eE][sS]) +TOOLS_CREATE+= msgfmt +TOOLS_DEPENDS.msgfmt?= {gettext>=0.10.36,gettext-tools>=0.14.5}:../../devel/gettext-tools +TOOLS_FIND_PREFIX+= TOOLS_PREFIX.msgfmt=${TOOLS_DEPENDS.msgfmt:C/:.*//} +TOOLS_PATH.msgfmt= ${TOOLS_PREFIX.msgfmt}/bin/msgfmt +. else +USE_TOOLS+= awk sh +TOOLS_PATH.msgfmt= ${PKGSRCDIR}/mk/tools/msgfmt.sh +TOOLS_SCRIPT.msgfmt= AWK=${TOOLS_AWK:Q} \ + MSGFMT=${TOOLS_PLATFORM.msgfmt:Q} \ + ${TOOLS_SH} ${TOOLS_PATH.msgfmt} "$$@" +. endif +. endif +.endif diff --git a/mk/tools/msgfmt.sh b/mk/tools/msgfmt.sh new file mode 100755 index 00000000000..cb09303168c --- /dev/null +++ b/mk/tools/msgfmt.sh @@ -0,0 +1,189 @@ +#!/bin/sh +# +# $NetBSD: msgfmt.sh,v 1.1 2006/04/13 16:35:58 jlam Exp $ +# +# Copyright (c) 2004, 2005, 2006 Julio M. Merino Vidal <jmmv@NetBSD.org> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name of author nor the names of its contributors may +# be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +: ${AWK=awk} +: ${MSGFMT=/usr/bin/msgfmt} + +case "${MSGFMT}" in +/*) ;; +*) echo 1>&2 "$0: \`\`${MSGFMT}'' must be an absolute pathname." + exit 1 + ;; +esac +if test ! -x "${MSGFMT}"; then + echo 1>&2 "$0: \`\`${MSGFMT}'' does not exist." + exit 1 +fi + +# Parse the command line options. +version= +cmd="${MSGFMT}" +while test $# -gt 0; do + case "$1" in + --version) + version="$1" + cmd="$cmd $1"; shift + ;; + -[aDo]|--alignment|--directory|--output-file) + cmd="$cmd $1 $2"; shift; shift; + ;; + [!-]*) + pofile="$1" + cmd="$cmd -"; shift + ;; + *) + cmd="$cmd $1"; shift + ;; + esac +done + +# If we are asked for just the version, then avoid spawning awk. +test -z "$version" || exec $cmd + +cat $pofile | ${AWK} ' +{ + s = 0 + p = 0 + + sub("^#~", "") + + # Buffer any "msgid" statements into the singular array. + if ($0 ~ /^msgid[ ]+/) { + sub("^msgid[ ]+", ""); + singular[s++] = $0 + while (getline) { + if ($0 ~ /^$/) continue + if ($0 ~ /^[ ]*"/) + singular[s++] = $0 + else + break + } + } + + # Buffer any "msgid_plural" statements into the plural array. + if ($0 ~ /^msgid_plural[ ]+/) { + sub("^msgid_plural[ ]+", ""); + plural[p++] = $0 + while (getline) { + if ($0 ~ /^[ ]*"/) + plural[p++] = $0 + else + break + } + } + + # If we see "msgstr", then we are outputting the translation + # of a singular form of a message, so dump the contents of the + # singular array and output the "msgstr" translation. + # + if ($0 ~ /^msgstr[ ]+/) { + sub("^msgstr[ ]+", ""); + if (s > 0) { + print "msgid " singular[0] + for (i = 1; i < s; i++) print singular[i] + } + print "msgstr " $0 + while (getline) { + if ($0 ~ /^[ ]*"/) + print $0 + else + break + } + } + + # If we see "msgstr[0]", then we are outputting the translation + # of a singular form of a message, so dump the contents of the + # singular array and output the "msgstr[0]" translation. + # + if ($0 ~ /^msgstr\[0\][ ]+/) { + sub("^msgstr...[ ]+", ""); + if (s > 0) { + print "msgid " singular[0] + for (i = 1; i < s; i++) print singular[i] + } + print "msgstr " $0 + while (getline) { + if ($0 ~ /^[ ]*"/) + print $0 + else + break + } + } + + # If we see "msgstr[1]", then we are outputting the translation + # of a plural form of a message, so dump the contents of the + # plural array and output the "msgstr[1]" translation. + # + if ($0 ~ /^msgstr\[1\][ ]+/) { + # + # Check if the singular and plural arrays are equal. + # If they are, then we do not need to output an + # additional plural translation at all since the + # "singular" form is already correct. + # + equal = 0 + if (s == p) { + equal = 1; + for (i = 0; i < s; i++) { + if (singular[i] != plural[i]) { + equal = 0; break + } + } + } + if (equal == 1) { + while (getline) { + if ($0 !~ /^[ ]*"/) break + } + s = 0; p = 0 + next + } + + sub("^msgstr...[ ]+", ""); + if (p > 0) { + print "msgid " plural[0] + for (i = 1; i < p; i++) print plural[i] + } + print "msgstr " $0 + while (getline) { + if ($0 ~ /^[ ]*"/) + print $0 + else + break + } + } + + # Skip comments and blank lines. + if ($0 ~ /^#/ || $0 ~ /^[ ]*$/) { + print $0 + next + } +} +' | $cmd diff --git a/mk/tools/replace.mk b/mk/tools/replace.mk index 5a8d897923a..b0191e26b84 100644 --- a/mk/tools/replace.mk +++ b/mk/tools/replace.mk @@ -1,4 +1,4 @@ -# $NetBSD: replace.mk,v 1.164 2006/04/06 06:23:06 reed Exp $ +# $NetBSD: replace.mk,v 1.165 2006/04/13 16:35:58 jlam Exp $ # # Copyright (c) 2005 The NetBSD Foundation, Inc. # All rights reserved. @@ -79,13 +79,6 @@ # USE_TOOLS+= perl:run # -# XXX Keep this hack here until the day that msgfmt and msgfmt-plurals -# XXX is handled directly by the tools framework. -# XXX -.if defined(USE_MSGFMT_PLURALS) && !empty(USE_MSGFMT_PLURALS:M[yY][eE][sS]) -USE_TOOLS+= perl -.endif - # bison implies "bison-yacc" .if !empty(USE_TOOLS:Mbison) || !empty(USE_TOOLS:Mbison\:*) USE_TOOLS+= bison-yacc @@ -885,17 +878,18 @@ TOOLS_PATH.${_t_}= ${TOOLS_PREFIX.${_t_}}/bin/${GNU_PROGRAM_PREFIX}${_t_} ###################################################################### # These tools are all supplied by the devel/gettext-tools package if there -# is no native tool available. +# is no native tool available. Don't add "msgfmt" to this list since it +# needs special handling -- see mk/tools/msgfmt.mk. # -_TOOLS.gettext-tools= gettext msgfmt xgettext -_TOOLS_DEP.gettext-tools= gettext<0.14.5,gettext-tools>=0.14.5 +_TOOLS.gettext-tools= gettext xgettext +_TOOLS_DEP.gettext-tools= {gettext>0.10.35,gettext-tools>=0.14.5} .for _t_ in ${_TOOLS.gettext-tools} . if !defined(TOOLS_IGNORE.${_t_}) && !empty(_USE_TOOLS:M${_t_}) . if !empty(PKGPATH:Mdevel/gettext-tools) MAKEFLAGS+= TOOLS_IGNORE.${_t_}= . elif !empty(_TOOLS_USE_PKGSRC.${_t_}:M[yY][eE][sS]) -TOOLS_DEPENDS.${_t_}?= {${_TOOLS_DEP.gettext-tools}}:../../devel/gettext-tools +TOOLS_DEPENDS.${_t_}?= ${_TOOLS_DEP.gettext-tools}:../../devel/gettext-tools TOOLS_CREATE+= ${_t_} TOOLS_FIND_PREFIX+= TOOLS_PREFIX.${_t_}=${TOOLS_DEPENDS.${_t_}:C/:.*//} TOOLS_PATH.${_t_}= ${TOOLS_PREFIX.${_t_}}/bin/${_t_} diff --git a/mk/tools/tools.Linux.mk b/mk/tools/tools.Linux.mk index cc1c8ce8d9c..791c336fa96 100644 --- a/mk/tools/tools.Linux.mk +++ b/mk/tools/tools.Linux.mk @@ -1,4 +1,4 @@ -# $NetBSD: tools.Linux.mk,v 1.30 2006/03/06 05:25:45 jlam Exp $ +# $NetBSD: tools.Linux.mk,v 1.31 2006/04/13 16:35:59 jlam Exp $ # # System-supplied tools for the Linux operating system. @@ -123,6 +123,9 @@ TOOLS_PLATFORM.mkdir?= /bin/mkdir -p .if exists(/usr/bin/mktemp) TOOLS_PLATFORM.mktemp?= /usr/bin/mktemp .endif +.if exists(/usr/bin/msgfmt) +TOOLS_PLATFORM.msgfmt?= /usr/bin/msgfmt +.endif TOOLS_PLATFORM.mv?= /bin/mv .if exists(/bin/nice) TOOLS_PLATFORM.nice?= /bin/nice diff --git a/mk/tools/tools.NetBSD.mk b/mk/tools/tools.NetBSD.mk index aab10c426af..ecfaf01d89e 100644 --- a/mk/tools/tools.NetBSD.mk +++ b/mk/tools/tools.NetBSD.mk @@ -1,4 +1,4 @@ -# $NetBSD: tools.NetBSD.mk,v 1.26 2006/03/06 05:25:45 jlam Exp $ +# $NetBSD: tools.NetBSD.mk,v 1.27 2006/04/13 16:35:59 jlam Exp $ # # System-supplied tools for the NetBSD operating system. @@ -59,6 +59,9 @@ TOOLS_PLATFORM.makeinfo?= /usr/bin/makeinfo .endif TOOLS_PLATFORM.mkdir?= /bin/mkdir -p TOOLS_PLATFORM.mktemp?= /usr/bin/mktemp +.if exists(/usr/bin/msgfmt) +TOOLS_PLATFORM.msgfmt?= /usr/bin/msgfmt +.endif TOOLS_PLATFORM.mtree?= /usr/sbin/mtree TOOLS_PLATFORM.mv?= /bin/mv TOOLS_PLATFORM.nice?= /usr/bin/nice |