From: Bruno Haible Date: Fri, 25 Apr 2025 08:15:08 +0000 (+0200) Subject: examples: Add hello-modula2 example. X-Git-Tag: v0.25~44 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e7650ab0fac57133fa2d08efd4e1a670e11df920;p=thirdparty%2Fgettext.git examples: Add hello-modula2 example. * gettext-tools/examples/hello-modula2/INSTALL: New file. * gettext-tools/examples/hello-modula2/autogen.sh: New file. * gettext-tools/examples/hello-modula2/autoclean.sh: New file. * gettext-tools/examples/hello-modula2/hello.mod.in: New file. * gettext-tools/examples/hello-modula2/Makefile.am: New file. * gettext-tools/examples/hello-modula2/configure.ac: New file. * gettext-tools/examples/hello-modula2/m4/Makefile.am: New file. * gettext-tools/examples/hello-modula2/po/LINGUAS: New file. * gettext-tools/examples/hello-modula2/po/Makefile.am: New file. * gettext-tools/examples/installpaths.in: Define also libdir. * gettext-tools/m4/Makefile.am (examplesbuildaux_DATA): Add modula2comp.m4. * gettext-tools/examples/Makefile.am (EXAMPLESFILES, EXAMPLESDIRS): Add hello-modula2. * gettext-tools/examples/po/Makefile.am (POTFILES, SMALLPOTS): Update for hello-modula2. (hello-modula2.pot): New target. (SMALLPOFILES_FOR_lang): Update for hello-modula2. ($(srcdir)/../hello-modula2/po/$(LL).po): New rule. * gettext-tools/examples/check-examples (func_check_autoclean_all, func_check_distclean_all, func_check_maintainerclean_all, func_check_maintainerclean_vpath_all, func_check_dist_all, func_check_dist_vpath_all, func_check_install_all, func_check_uninstall_all, func_check_distcheck_all, func_check_all): Handle hello-modula2 as well. * gettext-tools/examples/README: Mention hello-modula2. * gettext-tools/doc/lang-modula2.texi: Likewise. * NEWS: Likewise. --- diff --git a/NEWS b/NEWS index 2f0d95634..d630fc9aa 100644 --- a/NEWS +++ b/NEWS @@ -22,6 +22,7 @@ Version 0.25 - April 2025 - xgettext now supports Modula-2. - 'msgfmt -c' now verifies the syntax of translations of Modula-2 format strings. + - A new example 'hello-modula2' has been added. Version 0.24.1 - April 2025 diff --git a/gettext-tools/doc/lang-modula2.texi b/gettext-tools/doc/lang-modula2.texi index 4b5a8fed6..8af96eaab 100644 --- a/gettext-tools/doc/lang-modula2.texi +++ b/gettext-tools/doc/lang-modula2.texi @@ -53,3 +53,5 @@ fully portable to all platforms supported by GNU Modula-2 @item po-mode marking --- @end table + +An example is available in the @file{examples} directory: @code{hello-modula2}. diff --git a/gettext-tools/examples/Makefile.am b/gettext-tools/examples/Makefile.am index 1e895b630..3b9fcabca 100644 --- a/gettext-tools/examples/Makefile.am +++ b/gettext-tools/examples/Makefile.am @@ -400,6 +400,15 @@ EXAMPLESFILES = \ hello-pascal/m4/Makefile.am \ hello-pascal/po/Makefile.am \ \ + hello-modula2/INSTALL \ + hello-modula2/autogen.sh \ + hello-modula2/autoclean.sh \ + hello-modula2/hello.mod.in \ + hello-modula2/Makefile.am \ + hello-modula2/configure.ac \ + hello-modula2/m4/Makefile.am \ + hello-modula2/po/Makefile.am \ + \ hello-d/INSTALL \ hello-d/autogen.sh \ hello-d/autoclean.sh \ @@ -500,6 +509,7 @@ EXAMPLESDIRS = \ hello-sh \ hello-gawk \ hello-pascal \ + hello-modula2 \ hello-d \ hello-smalltalk \ hello-tcl \ diff --git a/gettext-tools/examples/README b/gettext-tools/examples/README index bbd6359b4..16bbfb395 100644 --- a/gettext-tools/examples/README +++ b/gettext-tools/examples/README @@ -36,6 +36,7 @@ environment. hello-sh Shell hello-gawk awk hello-pascal Pascal + hello-modula2 Modula-2 hello-d D hello-smalltalk Smalltalk hello-tcl Tcl @@ -84,6 +85,7 @@ Makefile types: hello-sh .gmo Makefile.am hello-gawk .gmo Makefile.am hello-pascal .gmo Makefile.am + hello-modula2 .gmo Makefile.am hello-d .gmo Makefile.am hello-smalltalk .gmo Makefile.am hello-perl .gmo Makefile.am diff --git a/gettext-tools/examples/check-examples b/gettext-tools/examples/check-examples index 3cae3186e..c3cea0c6d 100755 --- a/gettext-tools/examples/check-examples +++ b/gettext-tools/examples/check-examples @@ -159,6 +159,7 @@ func_check_autoclean_all () func_check_autoclean hello-sh func_check_autoclean hello-gawk func_check_autoclean hello-pascal + func_check_autoclean hello-modula2 func_check_autoclean hello-d func_check_autoclean hello-smalltalk func_check_autoclean hello-tcl @@ -238,6 +239,7 @@ func_check_distclean_all () func_check_distclean hello-sh func_check_distclean hello-gawk func_check_distclean hello-pascal + func_check_distclean hello-modula2 func_check_distclean hello-d func_check_distclean hello-smalltalk func_check_distclean hello-tcl @@ -319,6 +321,7 @@ func_check_maintainerclean_all () func_check_maintainerclean hello-sh func_check_maintainerclean hello-gawk func_check_maintainerclean hello-pascal + func_check_maintainerclean hello-modula2 func_check_maintainerclean hello-d func_check_maintainerclean hello-smalltalk func_check_maintainerclean hello-tcl @@ -403,6 +406,7 @@ func_check_maintainerclean_vpath_all () func_check_maintainerclean_vpath hello-sh func_check_maintainerclean_vpath hello-gawk func_check_maintainerclean_vpath hello-pascal + func_check_maintainerclean_vpath hello-modula2 func_check_maintainerclean_vpath hello-d func_check_maintainerclean_vpath hello-smalltalk func_check_maintainerclean_vpath hello-tcl @@ -494,6 +498,7 @@ func_check_dist_all () func_check_dist hello-sh func_check_dist hello-gawk func_check_dist hello-pascal + func_check_dist hello-modula2 func_check_dist hello-d func_check_dist hello-smalltalk func_check_dist hello-tcl @@ -585,6 +590,7 @@ func_check_dist_vpath_all () func_check_dist_vpath hello-sh func_check_dist_vpath hello-gawk func_check_dist_vpath hello-pascal + func_check_dist_vpath hello-modula2 func_check_dist_vpath hello-d func_check_dist_vpath hello-smalltalk func_check_dist_vpath hello-tcl @@ -668,6 +674,7 @@ func_check_install_all () func_check_install hello-sh func_check_install hello-gawk func_check_install hello-pascal + func_check_install hello-modula2 func_check_install hello-d func_check_install hello-smalltalk func_check_install hello-tcl @@ -748,6 +755,7 @@ func_check_uninstall_all () func_check_uninstall hello-sh func_check_uninstall hello-gawk func_check_uninstall hello-pascal + func_check_uninstall hello-modula2 func_check_uninstall hello-d func_check_uninstall hello-smalltalk func_check_uninstall hello-tcl @@ -830,6 +838,7 @@ func_check_distcheck_all () func_check_distcheck hello-sh func_check_distcheck hello-gawk func_check_distcheck hello-pascal + func_check_distcheck hello-modula2 func_check_distcheck hello-d func_check_distcheck hello-smalltalk func_check_distcheck hello-tcl @@ -895,6 +904,7 @@ func_check_all () func_check hello-sh func_check hello-gawk func_check hello-pascal + func_check hello-modula2 func_check hello-d func_check hello-smalltalk func_check hello-tcl diff --git a/gettext-tools/examples/hello-modula2/INSTALL b/gettext-tools/examples/hello-modula2/INSTALL new file mode 100644 index 000000000..e3e11d2ff --- /dev/null +++ b/gettext-tools/examples/hello-modula2/INSTALL @@ -0,0 +1,10 @@ +This example relies on the GNU Modula-2 compiler (gm2). + +Installation: + ./autogen.sh + ./configure --prefix=/some/prefix [--with-m2-libraries-prefix=/some/prefix] + make + make install +Cleanup: + make distclean + ./autoclean.sh diff --git a/gettext-tools/examples/hello-modula2/Makefile.am b/gettext-tools/examples/hello-modula2/Makefile.am new file mode 100644 index 000000000..058516974 --- /dev/null +++ b/gettext-tools/examples/hello-modula2/Makefile.am @@ -0,0 +1,37 @@ +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Makefile configuration - processed by automake. + +# General automake options. +AUTOMAKE_OPTIONS = foreign +ACLOCAL_AMFLAGS = -I m4 + +# The list of subdirectories containing Makefiles. +SUBDIRS = m4 po + +# The list of programs that are built. +bin_PROGRAMS = hello + +# The source files of the 'hello' program. +nodist_hello_SOURCES = hello.mod + +# Compile time dependencies. +if HAVE_M2_LIBRARIES_PREFIX +# Use the prefix specified as configure option. +m2includedir = $(M2_LIBRARIES_PREFIX)/include/m2 +m2libdir = $(M2_LIBRARIES_EXECPREFIX)/lib +else +# Use the prefix determined by autogen.sh. +include $(srcdir)/m2dirs.mk +endif + +# Link time dependencies. +LDADD = -lintl_m2 @LIBINTL@ + +hello$(EXEEXT): hello.mod + $(M2C) -I$(m2includedir) -L$(m2libdir) -Wl,-rpath,$(m2libdir) $(M2FLAGS) \ + -o hello$(EXEEXT) hello.mod $(LDADD) + +# Additional files to be distributed. +EXTRA_DIST = autogen.sh autoclean.sh diff --git a/gettext-tools/examples/hello-modula2/autoclean.sh b/gettext-tools/examples/hello-modula2/autoclean.sh new file mode 100755 index 000000000..db13b81bc --- /dev/null +++ b/gettext-tools/examples/hello-modula2/autoclean.sh @@ -0,0 +1,50 @@ +#!/bin/sh +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Script for cleaning all autogenerated files. + +test ! -f Makefile || make distclean +rm -rf autom4te.cache + +# Generated by autogen.sh. +rm -f m2dirs.mk + +# Brought in by autopoint. +rm -f ABOUT-NLS +rm -f config.rpath +rm -f m4/gettext.m4 +rm -f m4/build-to-host.m4 +rm -f m4/host-cpu-c-abi.m4 +rm -f m4/iconv.m4 +rm -f m4/intlmacosx.m4 +rm -f m4/lib-ld.m4 +rm -f m4/lib-link.m4 +rm -f m4/lib-prefix.m4 +rm -f m4/nls.m4 +rm -f m4/po.m4 +rm -f m4/progtest.m4 +rm -f po/Makefile.in.in +rm -f po/remove-potcdate.sed + +# Brought in by explicit copy. +rm -f m4/modula2comp.m4 + +# Generated by aclocal. +rm -f aclocal.m4 + +# Generated by autoconf. +rm -f configure + +# Generated or brought in by automake. +rm -f Makefile.in +rm -f m4/Makefile.in +rm -f po/Makefile.in +rm -f compile +rm -f install-sh +rm -f missing +rm -f config.guess +rm -f config.sub +rm -f po/*.pot +rm -f po/stamp-po +rm -f po/*.gmo diff --git a/gettext-tools/examples/hello-modula2/autogen.sh b/gettext-tools/examples/hello-modula2/autogen.sh new file mode 100755 index 000000000..3ad9cf86c --- /dev/null +++ b/gettext-tools/examples/hello-modula2/autogen.sh @@ -0,0 +1,59 @@ +#!/bin/sh +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Script for regenerating all autogenerated files. + +if test -r ../Makefile.am || test -r ../Makefile; then + if test -r ../Makefile.am; then + # Inside the gettext source directory. + GETTEXT_TOPSRCDIR=../../.. + else + # Inside a gettext build directory. + GETTEXT_TOOLS_SRCDIR=`sed -n -e 's,^top_srcdir *= *\(.*\)$,\1,p' ../Makefile` + # Adjust a relative top_srcdir. + case $GETTEXT_TOOLS_SRCDIR in + /*) ;; + *) GETTEXT_TOOLS_SRCDIR=../$GETTEXT_TOOLS_SRCDIR ;; + esac + GETTEXT_TOPSRCDIR=$GETTEXT_TOOLS_SRCDIR/../.. + fi + { echo "m2includedir = "`cd $GETTEXT_TOPSRCDIR/gettext-runtime/intl-modula2 && pwd`; + echo "m2libdir = "`cd $GETTEXT_TOPSRCDIR/gettext-runtime/intl-modula2/.libs && pwd`; + } > m2dirs.mk +else + # Installed under ${prefix}/share/doc/gettext/examples. + . ../installpaths + { echo "m2includedir = ${includedir}/m2"; + echo "m2libdir = ${libdir}"; + } > m2dirs.mk +fi + +autopoint -f # was: gettextize -f -c +rm po/Makefile.in.in +rm po/Makevars.template +rm po/Rules-quot +rm po/boldquot.sed +rm po/en@boldquot.header +rm po/en@quot.header +rm po/insert-header.sed +rm po/quot.sed + +cp -p ${EXAMPLESCONFIGDIR-$GETTEXT_TOPSRCDIR/gettext-tools/gnulib-m4}/modula2comp.m4 m4/modula2comp.m4 + +aclocal -I m4 + +autoconf + +automake -a -c + +rm -rf autom4te.cache + +cd po +for f in *.po; do + if test -r "$f"; then + lang=`echo $f | sed -e 's,\.po$,,'` + msgfmt -c -o $lang.gmo $lang.po + fi +done +cd .. diff --git a/gettext-tools/examples/hello-modula2/configure.ac b/gettext-tools/examples/hello-modula2/configure.ac new file mode 100644 index 000000000..ffc07dad2 --- /dev/null +++ b/gettext-tools/examples/hello-modula2/configure.ac @@ -0,0 +1,49 @@ +dnl Example for use of GNU gettext. +dnl This file is in the public domain. +dnl +dnl Configuration file - processed by autoconf. + +AC_INIT([hello-modula2], [0]) +AC_CONFIG_SRCDIR([hello.mod.in]) +AM_INIT_AUTOMAKE([1.11]) + +gt_MODULA2COMP +if test -z "$M2C"; then + echo "*** Modula-2 compiler not found" 1>&2 + exit 1 +fi + +M2_LIBRARIES_PREFIX= +M2_LIBRARIES_EXECPREFIX= +AC_ARG_WITH([m2-libraries-prefix], + [[ --with-m2-libraries-prefix=DIR search for Modula-2 libraries in DIR/include/m2, DIR/lib]], + [if test "X$withval" != "X" && test "X$withval" != "Xno"; then + M2_LIBRARIES_PREFIX="$withval" + M2_LIBRARIES_EXECPREFIX="$M2_LIBRARIES_PREFIX" + fi + ]) +AC_SUBST([M2_LIBRARIES_PREFIX]) +AC_SUBST([M2_LIBRARIES_EXECPREFIX]) +AM_CONDITIONAL([HAVE_M2_LIBRARIES_PREFIX], [test -n "$M2_LIBRARIES_PREFIX"]) + +dnl The installed program must know where to find its message catalogs. +dnl Unfortunately, prefix gets only finally determined at the end of configure. +if test "X$prefix" = "XNONE"; then + final_prefix="$ac_default_prefix" +else + final_prefix="$prefix" +fi +save_prefix="$prefix" +prefix="$final_prefix" +eval "datarootdir=\"${datarootdir}\"" +eval "localedir=\"${datarootdir}/locale\"" +prefix="$save_prefix" +AC_SUBST([localedir]) + +AM_GNU_GETTEXT([external]) +AM_GNU_GETTEXT_VERSION([0.24]) + +AC_CONFIG_FILES([Makefile hello.mod]) +AC_CONFIG_FILES([m4/Makefile]) +AC_CONFIG_FILES([po/Makefile], [AM_POSTPROCESS_PO_MAKEFILE]) +AC_OUTPUT diff --git a/gettext-tools/examples/hello-modula2/hello.mod.in b/gettext-tools/examples/hello-modula2/hello.mod.in new file mode 100644 index 000000000..9ce72fed8 --- /dev/null +++ b/gettext-tools/examples/hello-modula2/hello.mod.in @@ -0,0 +1,40 @@ +(* Example for use of GNU gettext. + This file is in the public domain. + + Source code of the Modula-2 program. *) + + +MODULE Hello; + +FROM DynamicStrings IMPORT String, Length, char; +FROM Terminal IMPORT Write, WriteLn; +FROM Libintl IMPORT SetLocale, LC_ALL, TextDomain, BindTextDomain, Gettext; +FROM FormatStrings IMPORT Sprintf1; +FROM libc IMPORT getpid; + +(* Like Terminal.WriteString, except that it takes a String, not an ARRAY OF CHAR. *) +PROCEDURE WriteString (s: String); +VAR + l, i: CARDINAL; +BEGIN + l := Length(s); + i := 0; + WHILE i < l DO + Write(char(s, i)); + INC (i); + END; +END WriteString; + +BEGIN + + SetLocale(LC_ALL, ""); + TextDomain("hello-modula2"); + BindTextDomain("hello-modula2", "@localedir@"); + + WriteString(Gettext("Hello, world!")); + WriteLn; + + WriteString(Sprintf1(Gettext("This program is running as process number %d."), getpid())); + WriteLn; + +END Hello. diff --git a/gettext-tools/examples/hello-modula2/m4/Makefile.am b/gettext-tools/examples/hello-modula2/m4/Makefile.am new file mode 100644 index 000000000..9dc24c302 --- /dev/null +++ b/gettext-tools/examples/hello-modula2/m4/Makefile.am @@ -0,0 +1,3 @@ +EXTRA_DIST = \ + nls.m4 po.m4 \ + modula2comp.m4 diff --git a/gettext-tools/examples/hello-modula2/po/LINGUAS b/gettext-tools/examples/hello-modula2/po/LINGUAS new file mode 100644 index 000000000..dc4a82afb --- /dev/null +++ b/gettext-tools/examples/hello-modula2/po/LINGUAS @@ -0,0 +1,5 @@ +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Set of available languages. +af ast bg ca cs da de el eo es fi fr ga gl hr hu id it ja ka ky lv ms mt nb nl nn pl pt pt_BR ro ru sk sl sq sr sv ta tr uk vi zh_CN zh_HK zh_TW diff --git a/gettext-tools/examples/hello-modula2/po/Makefile.am b/gettext-tools/examples/hello-modula2/po/Makefile.am new file mode 100644 index 000000000..ee396b8ae --- /dev/null +++ b/gettext-tools/examples/hello-modula2/po/Makefile.am @@ -0,0 +1,434 @@ +# Example for use of GNU gettext. +# This file is in the public domain. +# +# Makefile configuration - processed by automake. + +# List of files which contain translatable strings. +POTFILES = \ + hello.mod.in + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgid strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Yoyodyne, Inc. + +# This tells whether or not to prepend "GNU " prefix to the package +# name that gets inserted into the header of the $(DOMAIN).pot file. +# Possible values are "yes", "no", or empty. If it is empty, try to +# detect it automatically by scanning the files in $(top_srcdir) for +# "GNU packagename" string. +PACKAGE_GNU = no + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +MSGID_BUGS_ADDRESS = bug-gettext@gnu.org + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = + +# These options get passed to msgmerge. +# Useful options are in particular: +# --previous to keep previous msgids of translated messages +MSGMERGE_OPTIONS = + +# These options get passed to msginit. +# If you want to disable line wrapping when writing PO files, add +# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and +# MSGINIT_OPTIONS. +MSGINIT_OPTIONS = + +MSGMERGE = @MSGMERGE@ +MSGMERGE_UPDATE = @MSGMERGE@ --update +MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@ +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +# This is computed as $(foreach file, $(POTFILES), $(top_srcdir)/$(file)) +POTFILES_DEPS != for file in $(POTFILES); do echo $(top_srcdir)/$$file; done + +# The set of available translations. +ALL_LINGUAS != if test -f $(srcdir)/LINGUAS; then \ + sed -e '/^\#/d' < $(srcdir)/LINGUAS; \ + else \ + echo $(LINGUAS); \ + fi +# This is computed as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) +POFILES != for lang in $(ALL_LINGUAS); do echo $(srcdir)/$$lang.po; done +# This is computed as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) +GMOFILES != for lang in $(ALL_LINGUAS); do echo $(srcdir)/$$lang.gmo; done +# This is computed as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) +UPDATEPOFILES != for lang in $(ALL_LINGUAS); do echo $$lang.po-update; done +# This is computed as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) +DUMMYPOFILES != for lang in $(ALL_LINGUAS); do echo $$lang.nop; done + +# The set of desired translations, as specified by the installer or distributor. +DESIRED_LINGUAS = @DESIRED_LINGUAS@ +# The set of translations to install. This is computed based on $(ALL_LINGUAS) +# and $(DESIRED_LINGUAS). It is a subset of $(ALL_LINGUAS). +# We use the presentlang catalog if desiredlang is +# a. equal to presentlang, or +# b. a variant of presentlang (because in this case, presentlang can be used +# as a fallback for messages which are not translated in the desiredlang +# catalog). +INST_LINGUAS != for presentlang in $(ALL_LINGUAS); do \ + useit=false; \ + for desiredlang in $(DESIRED_LINGUAS); do \ + case "$$desiredlang" in \ + "$$presentlang" | "$$presentlang"_* | "$$presentlang".* | "$$presentlang"@*) \ + useit=true ;; \ + esac; \ + done; \ + if $$useit; then echo $$presentlang; fi; \ + done +# This is computed as $(foreach lang, $(INST_LINGUAS), $(lang).gmo) +CATALOGS != for lang in $(INST_LINGUAS); do echo $$lang.gmo; done + +SUFFIXES = .po .gmo .nop .po-create .po-update + +# The .pot file, stamp-po, .po files, and .gmo files appear in release tarballs. +# The GNU Coding Standards say in +# : +# "GNU distributions usually contain some files which are not source files +# ... . Since these files normally appear in the source directory, they +# should always appear in the source directory, not in the build directory. +# So Makefile rules to update them should put the updated files in the +# source directory." +# Therefore we put these files in the source directory, not the build directory. + +# During .po -> .gmo conversion, take into account the most recent changes to +# the .pot file. This eliminates the need to update the .po files when the +# .pot file has changed, which would be troublesome if the .po files are put +# under version control. +$(GMOFILES): $(srcdir)/$(DOMAIN).pot +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(MSGMERGE) $(MSGMERGE_FOR_MSGFMT_OPTION) -o $${lang}.1po $${lang}.po $(DOMAIN).pot && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.1po && rm -f $${lang}.1po"; \ + cd $(srcdir) && \ + rm -f $${lang}.gmo && \ + $(MSGMERGE) $(MSGMERGE_FOR_MSGFMT_OPTION) -o $${lang}.1po $${lang}.po $(DOMAIN).pot && \ + $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.1po && \ + mv t-$${lang}.gmo $${lang}.gmo && \ + rm -f $${lang}.1po + + +all-local: all-local-@USE_NLS@ + +all-local-yes: $(srcdir)/stamp-po +all-local-no: + +# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no +# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because +# we don't want to bother translators with empty POT files). We assume that +# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. +# In this case, $(srcdir)/stamp-po is a nop (i.e. a phony target). + +# $(srcdir)/stamp-po is a timestamp denoting the last time at which the CATALOGS +# have been loosely updated. Its purpose is that when a developer or translator +# checks out the package from a version control system, and the $(DOMAIN).pot +# file is not under version control, "make" will update the $(DOMAIN).pot and +# the $(CATALOGS), but subsequent invocations of "make" will do nothing. This +# timestamp would not be necessary if updating the $(CATALOGS) would always +# touch them; however, the rule for $(POFILES) has been designed to not touch +# files that don't need to be changed. +$(srcdir)/stamp-po: $(srcdir)/$(DOMAIN).pot + test ! -f $(srcdir)/$(DOMAIN).pot || \ + test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) + @test ! -f $(srcdir)/$(DOMAIN).pot || { \ + echo "touch $(srcdir)/stamp-po" && \ + echo timestamp > $(srcdir)/stamp-poT && \ + mv $(srcdir)/stamp-poT $(srcdir)/stamp-po; \ + } + +# This target rebuilds $(DOMAIN).pot; it is an expensive operation. +# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. +# The determination of whether the package xyz is a GNU one is based on the +# heuristic whether some file in the top level directory mentions "GNU xyz". +# If GNU 'find' is available, we avoid grepping through monster files. +$(DOMAIN).pot-update: $(POTFILES_DEPS) + package_gnu="$(PACKAGE_GNU)"; \ + test -n "$$package_gnu" || { \ + if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \ + LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f -size -10000000c -exec grep -i 'GNU $(PACKAGE)' /dev/null '{}' ';' 2>/dev/null; \ + else \ + LC_ALL=C grep -i 'GNU $(PACKAGE)' $(top_srcdir)/* 2>/dev/null; \ + fi; \ + } | grep -v 'libtool:' >/dev/null; then \ + package_gnu=yes; \ + else \ + package_gnu=no; \ + fi; \ + }; \ + if test "$$package_gnu" = "yes"; then \ + package_prefix='GNU '; \ + else \ + package_prefix=''; \ + fi; \ + if test -n '$(MSGID_BUGS_ADDRESS)'; then \ + msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ + else \ + msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ + fi; \ + case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ + $(POTFILES) \ + ;; \ + *) \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --package-name="$${package_prefix}$(PACKAGE)" \ + --package-version='$(VERSION)' \ + --msgid-bugs-address="$$msgid_bugs_address" \ + $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ + $(POTFILES) \ + ;; \ + esac + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot-header; then \ + sed -e '1,/^#$$/d' < $(DOMAIN).po > $(DOMAIN).1po && \ + cat $(srcdir)/$(DOMAIN).pot-header $(DOMAIN).1po > $(DOMAIN).po && \ + rm -f $(DOMAIN).1po \ + || exit 1; \ + fi; \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f $(srcdir)/remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f $(srcdir)/remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +# This rule has no dependencies: we don't need to update $(DOMAIN).pot at +# every "make" invocation, only create it when it is missing. +# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +# This target rebuilds a PO file if $(DOMAIN).pot has changed. +# Note that a PO file is not touched if it doesn't need to be changed. +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + if test -f "$(srcdir)/$${lang}.po"; then \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) --quiet $(MSGMERGE_OPTIONS) --lang=$${lang} --previous $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) \ + && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.10 | 0.10.*) \ + $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ + 0.1[1-5] | 0.1[1-5].*) \ + $(MSGMERGE_UPDATE) --quiet $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ + 0.1[6-7] | 0.1[6-7].*) \ + $(MSGMERGE_UPDATE) --quiet $(MSGMERGE_OPTIONS) --previous $${lang}.po $(DOMAIN).pot;; \ + *) \ + $(MSGMERGE_UPDATE) --quiet $(MSGMERGE_OPTIONS) --lang=$${lang} --previous $${lang}.po $(DOMAIN).pot;; \ + esac; \ + }; \ + else \ + $(MAKE) $${lang}.po-create; \ + fi + + +install-data-local: install-data-local-@USE_NLS@ +install-data-local-no: all-local +install-data-local-yes: all-local + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(MKDIR_P) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +installdirs-local: installdirs-local-@USE_NLS@ +installdirs-local-no: +installdirs-local-yes: + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(MKDIR_P) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +uninstall-local: uninstall-local-@USE_NLS@ +uninstall-local-no: +uninstall-local-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +html ID: + +MOSTLYCLEANFILES = +MOSTLYCLEANFILES += stamp-poT +MOSTLYCLEANFILES += core core.* *.stackdump $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po +MOSTLYCLEANFILES += *.o + +MAINTAINERCLEANFILES = $(DOMAIN).pot stamp-po $(GMOFILES) + +EXTRA_DIST = remove-potcdate.sed LINGUAS $(POFILES) $(GMOFILES) + +# Hidden from automake, but really activated. Works around an automake-1.5 bug. +#distdir: distdir1 +distdir1: + $(MAKE) update-po + $(MAKE) $(srcdir)/stamp-po + @if test -f $(srcdir)/$(DOMAIN).pot; then \ + for file in $(DOMAIN).pot stamp-po; do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + cp -p $$d/$$file $(distdir)/$$file || exit 1; \ + done; \ + else \ + case $(XGETTEXT) in \ + :) echo "Warning: Creating a tarball without '$(DOMAIN).pot', because a suitable 'xgettext' program was not found in PATH." 1>&2;; \ + *) echo "Warning: Creating a tarball without '$(DOMAIN).pot', because 'xgettext' found no strings to extract. Check the POTFILES and the XGETTEXT_OPTIONS in the Makefile.am file." 1>&2;; \ + esac; \ + fi + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for creating PO files. + +.nop.po-create: + @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ + echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ + exit 1 + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) --quiet $(MSGMERGE_OPTIONS) --lang=$$lang --previous $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ + '' | 0.[0-9] | 0.[0-9].* | 0.10 | 0.10.*) \ + $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + 0.1[1-5] | 0.1[1-5].*) \ + $(MSGMERGE) --quiet $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + 0.1[6-7] | 0.1[6-7].*) \ + $(MSGMERGE) --quiet $(MSGMERGE_OPTIONS) --previous -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + *) \ + $(MSGMERGE) --quiet $(MSGMERGE_OPTIONS) --lang=$$lang --previous -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ + esac; \ + }; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: diff --git a/gettext-tools/examples/installpaths.in b/gettext-tools/examples/installpaths.in index d2163a64e..635cc2111 100644 --- a/gettext-tools/examples/installpaths.in +++ b/gettext-tools/examples/installpaths.in @@ -17,6 +17,7 @@ prefix='@prefix@' exec_prefix="@exec_prefix@" +libdir="@libdir@" datarootdir="@datarootdir@" datadir="@datadir@" docdir="@docdir@" diff --git a/gettext-tools/examples/po/Makefile.am b/gettext-tools/examples/po/Makefile.am index 384ce47ef..5764d84fb 100644 --- a/gettext-tools/examples/po/Makefile.am +++ b/gettext-tools/examples/po/Makefile.am @@ -68,6 +68,7 @@ POTFILES = \ hello-sh/hello.sh \ hello-gawk/hello.awk \ hello-pascal/hello.pas \ + hello-modula2/hello.mod.in \ hello-d/hello.d.in \ hello-smalltalk/hello.st.in \ hello-tcl/hello.tcl \ @@ -110,6 +111,7 @@ SMALLPOTS = \ hello-sh.pot \ hello-gawk.pot \ hello-pascal.pot \ + hello-modula2.pot \ hello-d.pot \ hello-smalltalk.pot \ hello-tcl.pot \ @@ -354,6 +356,9 @@ hello-gawk.pot : $(POTFILES_DEPS) hello-pascal.pot : $(POTFILES_DEPS) $(USE_BUILT_PROGS) $(SHELL) '$(srcdir)/xsmallpot.sh' '$(srcdir)' hello-pascal +hello-modula2.pot : $(POTFILES_DEPS) + $(USE_BUILT_PROGS) $(SHELL) '$(srcdir)/xsmallpot.sh' '$(srcdir)' hello-modula2 + hello-d.pot : $(POTFILES_DEPS) $(USE_BUILT_PROGS) $(SHELL) '$(srcdir)/xsmallpot.sh' '$(srcdir)' hello-d @@ -482,6 +487,7 @@ SMALLPOFILES_FOR_lang = \ $(srcdir)/../hello-sh/po/$$lang.po \ $(srcdir)/../hello-gawk/po/$$lang.po \ $(srcdir)/../hello-pascal/po/$$lang.po \ + $(srcdir)/../hello-modula2/po/$$lang.po \ $(srcdir)/../hello-d/po/$$lang.po \ $(srcdir)/../hello-smalltalk/po/$$lang.po \ $(srcdir)/../hello-tcl/po/$$lang.po \ @@ -583,6 +589,9 @@ $(srcdir)/../hello-gawk/po/$(LL).po: $(srcdir)/hello-gawk.pot $(srcdir)/$(LL).po $(srcdir)/../hello-pascal/po/$(LL).po: $(srcdir)/hello-pascal.pot $(srcdir)/$(LL).po $(USE_BUILT_PROGS) cd $(srcdir) && $(SHELL) mmsmallpo.sh hello-pascal $(LL) +$(srcdir)/../hello-modula2/po/$(LL).po: $(srcdir)/hello-modula2.pot $(srcdir)/$(LL).po + $(USE_BUILT_PROGS) cd $(srcdir) && $(SHELL) mmsmallpo.sh hello-modula2 $(LL) + $(srcdir)/../hello-d/po/$(LL).po: $(srcdir)/hello-d.pot $(srcdir)/$(LL).po $(USE_BUILT_PROGS) cd $(srcdir) && $(SHELL) mmsmallpo.sh hello-d $(LL) diff --git a/gettext-tools/m4/Makefile.am b/gettext-tools/m4/Makefile.am index a804b3dde..ba74da97b 100644 --- a/gettext-tools/m4/Makefile.am +++ b/gettext-tools/m4/Makefile.am @@ -44,7 +44,8 @@ examplesbuildaux_DATA = \ ../gnulib-m4/javacomp.m4 ../gnulib-m4/javaexec.m4 \ ../gnulib-m4/csharp.m4 ../gnulib-m4/csharpcomp.m4 ../gnulib-m4/csharpexec.m4 csharpexec-test.exe \ ../gnulib-m4/gocomp.m4 \ - ../gnulib-m4/dcomp.m4 + ../gnulib-m4/dcomp.m4 \ + ../gnulib-m4/modula2comp.m4 # Generate this list with # find . -type f -name '*.m4' -printf ' %f\n' | sort | tr '\012' @ | sed 's/@$/%/;s/@/ \\@/g' | tr @% '\012\012'