]> git.saurik.com Git - bison.git/blob - m4/gettext.m4
* lib/tempname.c, lib/mkstemp.c, m4/mkstemp.m4: New, stolen from
[bison.git] / m4 / gettext.m4
1 # Macro to add for using GNU gettext.
2 # Ulrich Drepper <drepper@cygnus.com>, 1995.
3 #
4 # This file can be copied and used freely without restrictions. It can
5 # be used in projects which are not available under the GNU General Public
6 # License or the GNU Library General Public License but which still want
7 # to provide support for the GNU gettext functionality.
8 # Please note that the actual code of the GNU gettext library is covered
9 # by the GNU Library General Public License, and the rest of the GNU
10 # gettext package package is covered by the GNU General Public License.
11 # They are *not* in the public domain.
12
13 # serial 10
14
15 dnl Usage: AM_WITH_NLS([TOOLSYMBOL], [NEEDSYMBOL], [LIBDIR]).
16 dnl If TOOLSYMBOL is specified and is 'use-libtool', then a libtool library
17 dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static,
18 dnl depending on --{enable,disable}-{shared,static} and on the presence of
19 dnl AM-DISABLE-SHARED). Otherwise, a static library
20 dnl $(top_builddir)/intl/libintl.a will be created.
21 dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
22 dnl implementations (in libc or libintl) without the ngettext() function
23 dnl will be ignored.
24 dnl LIBDIR is used to find the intl libraries. If empty,
25 dnl the value `$(top_builddir)/intl/' is used.
26 dnl
27 dnl The result of the configuration is one of three cases:
28 dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
29 dnl and used.
30 dnl Catalog format: GNU --> install in $(datadir)
31 dnl Catalog extension: .mo after installation, .gmo in source tree
32 dnl 2) GNU gettext has been found in the system's C library.
33 dnl Catalog format: GNU --> install in $(datadir)
34 dnl Catalog extension: .mo after installation, .gmo in source tree
35 dnl 3) No internationalization, always use English msgid.
36 dnl Catalog format: none
37 dnl Catalog extension: none
38 dnl The use of .gmo is historical (it was needed to avoid overwriting the
39 dnl GNU format catalogs when building on a platform with an X/Open gettext),
40 dnl but we keep it in order not to force irrelevant filename changes on the
41 dnl maintainers.
42 dnl
43 AC_DEFUN([AM_WITH_NLS],
44 [AC_MSG_CHECKING([whether NLS is requested])
45 dnl Default is enabled NLS
46 AC_ARG_ENABLE(nls,
47 [ --disable-nls do not use Native Language Support],
48 USE_NLS=$enableval, USE_NLS=yes)
49 AC_MSG_RESULT($USE_NLS)
50 AC_SUBST(USE_NLS)
51
52 BUILD_INCLUDED_LIBINTL=no
53 USE_INCLUDED_LIBINTL=no
54 INTLLIBS=
55
56 dnl If we use NLS figure out what method
57 if test "$USE_NLS" = "yes"; then
58 AC_DEFINE(ENABLE_NLS, 1,
59 [Define to 1 if translation of program messages to the user's native language
60 is requested.])
61 AC_MSG_CHECKING([whether included gettext is requested])
62 AC_ARG_WITH(included-gettext,
63 [ --with-included-gettext use the GNU gettext library included here],
64 nls_cv_force_use_gnu_gettext=$withval,
65 nls_cv_force_use_gnu_gettext=no)
66 AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
67
68 nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
69 if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
70 dnl User does not insist on using GNU NLS library. Figure out what
71 dnl to use. If GNU gettext is available we use this. Else we have
72 dnl to fall back to GNU NLS library.
73 CATOBJEXT=NONE
74
75 dnl Add a version number to the cache macros.
76 define(gt_cv_func_gnugettext_libc, [gt_cv_func_gnugettext]ifelse([$2], need-ngettext, 2, 1)[_libc])
77 define(gt_cv_func_gnugettext_libintl, [gt_cv_func_gnugettext]ifelse([$2], need-ngettext, 2, 1)[_libintl])
78
79 AC_CHECK_HEADER(libintl.h,
80 [AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,
81 [AC_TRY_LINK([#include <libintl.h>
82 extern int _nl_msg_cat_cntr;],
83 [bindtextdomain ("", "");
84 return (int) gettext ("")]ifelse([$2], need-ngettext, [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr],
85 gt_cv_func_gnugettext_libc=yes,
86 gt_cv_func_gnugettext_libc=no)])
87
88 if test "$gt_cv_func_gnugettext_libc" != "yes"; then
89 AC_CACHE_CHECK([for GNU gettext in libintl],
90 gt_cv_func_gnugettext_libintl,
91 [gt_save_LIBS="$LIBS"
92 LIBS="$LIBS -lintl $LIBICONV"
93 AC_TRY_LINK([#include <libintl.h>
94 extern int _nl_msg_cat_cntr;],
95 [bindtextdomain ("", "");
96 return (int) gettext ("")]ifelse([$2], need-ngettext, [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr],
97 gt_cv_func_gnugettext_libintl=yes,
98 gt_cv_func_gnugettext_libintl=no)
99 LIBS="$gt_save_LIBS"])
100 fi
101
102 dnl If an already present or preinstalled GNU gettext() is found,
103 dnl use it. But if this macro is used in GNU gettext, and GNU
104 dnl gettext is already preinstalled in libintl, we update this
105 dnl libintl. (Cf. the install rule in intl/Makefile.in.)
106 if test "$gt_cv_func_gnugettext_libc" = "yes" \
107 || { test "$gt_cv_func_gnugettext_libintl" = "yes" \
108 && test "$PACKAGE" != gettext; }; then
109 AC_DEFINE(HAVE_GETTEXT, 1,
110 [Define if the GNU gettext() function is already present or preinstalled.])
111
112 if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
113 dnl If iconv() is in a separate libiconv library, then anyone
114 dnl linking with libintl{.a,.so} also needs to link with
115 dnl libiconv.
116 INTLLIBS="-lintl $LIBICONV"
117 fi
118
119 gt_save_LIBS="$LIBS"
120 LIBS="$LIBS $INTLLIBS"
121 AC_CHECK_FUNCS(dcgettext)
122 LIBS="$gt_save_LIBS"
123
124 dnl Search for GNU msgfmt in the PATH.
125 AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
126 [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1], :)
127 AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
128
129 dnl Search for GNU xgettext in the PATH.
130 AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
131 [$ac_dir/$ac_word --omit-header /dev/null >/dev/null 2>&1], :)
132
133 CATOBJEXT=.gmo
134 fi
135 ])
136
137 if test "$CATOBJEXT" = "NONE"; then
138 dnl GNU gettext is not found in the C library.
139 dnl Fall back on GNU gettext library.
140 nls_cv_use_gnu_gettext=yes
141 fi
142 fi
143
144 if test "$nls_cv_use_gnu_gettext" = "yes"; then
145 dnl Mark actions used to generate GNU NLS library.
146 INTLOBJS="\$(GETTOBJS)"
147 AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
148 [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1], :)
149 AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
150 AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
151 [$ac_dir/$ac_word --omit-header /dev/null >/dev/null 2>&1], :)
152 AC_SUBST(MSGFMT)
153 BUILD_INCLUDED_LIBINTL=yes
154 USE_INCLUDED_LIBINTL=yes
155 CATOBJEXT=.gmo
156 INTLLIBS="ifelse([$3],[],\$(top_builddir)/intl,[$3])/libintl.ifelse([$1], use-libtool, [l], [])a $LIBICONV"
157 LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
158 fi
159
160 dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
161 dnl Test whether we really found GNU msgfmt.
162 if test "$GMSGFMT" != ":"; then
163 dnl If it is no GNU msgfmt we define it as : so that the
164 dnl Makefiles still can work.
165 if $GMSGFMT --statistics /dev/null >/dev/null 2>&1; then
166 : ;
167 else
168 AC_MSG_RESULT(
169 [found msgfmt program is not GNU msgfmt; ignore it])
170 GMSGFMT=":"
171 fi
172 fi
173
174 dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
175 dnl Test whether we really found GNU xgettext.
176 if test "$XGETTEXT" != ":"; then
177 dnl If it is no GNU xgettext we define it as : so that the
178 dnl Makefiles still can work.
179 if $XGETTEXT --omit-header /dev/null >/dev/null 2>&1; then
180 : ;
181 else
182 AC_MSG_RESULT(
183 [found xgettext program is not GNU xgettext; ignore it])
184 XGETTEXT=":"
185 fi
186 fi
187
188 dnl We need to process the po/ directory.
189 POSUB=po
190 fi
191 AC_OUTPUT_COMMANDS(
192 [for ac_file in $CONFIG_FILES; do
193 # Support "outfile[:infile[:infile...]]"
194 case "$ac_file" in
195 *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
196 esac
197 # PO directories have a Makefile.in generated from Makefile.in.in.
198 case "$ac_file" in */Makefile.in)
199 # Adjust a relative srcdir.
200 ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
201 ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
202 ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
203 # In autoconf-2.13 it is called $ac_given_srcdir.
204 # In autoconf-2.50 it is called $srcdir.
205 test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
206 case "$ac_given_srcdir" in
207 .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
208 /*) top_srcdir="$ac_given_srcdir" ;;
209 *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
210 esac
211 if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
212 rm -f "$ac_dir/POTFILES"
213 test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
214 sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," -e "\$s/\(.*\) \\\\/\1/" < "$ac_given_srcdir/$ac_dir/POTFILES.in" > "$ac_dir/POTFILES"
215 test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
216 sed -e "/POTFILES =/r $ac_dir/POTFILES" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
217 fi
218 ;;
219 esac
220 done])
221
222
223 dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
224 dnl to 'yes' because some of the testsuite requires it.
225 if test "$PACKAGE" = gettext; then
226 BUILD_INCLUDED_LIBINTL=yes
227 fi
228
229 dnl intl/plural.c is generated from intl/plural.y. It requires bison,
230 dnl because plural.y uses bison specific features. It requires at least
231 dnl bison-1.26 because earlier versions generate a plural.c that doesn't
232 dnl compile.
233 dnl bison is only needed for the maintainer (who touches plural.y). But in
234 dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
235 dnl the rule in general Makefile. Now, some people carelessly touch the
236 dnl files or have a broken "make" program, hence the plural.c rule will
237 dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
238 dnl present or too old.
239 AC_CHECK_PROGS([INTLBISON], [bison])
240 if test -z "$INTLBISON"; then
241 ac_verc_fail=yes
242 else
243 dnl Found it, now check the version.
244 AC_MSG_CHECKING([version of bison])
245 changequote(<<,>>)dnl
246 ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
247 case $ac_prog_version in
248 '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
249 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
250 changequote([,])dnl
251 ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
252 *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
253 esac
254 AC_MSG_RESULT([$ac_prog_version])
255 fi
256 if test $ac_verc_fail = yes; then
257 INTLBISON=:
258 fi
259
260 dnl These rules are solely for the distribution goal. While doing this
261 dnl we only have to keep exactly one list of the available catalogs
262 dnl in configure.in.
263 for lang in $ALL_LINGUAS; do
264 GMOFILES="$GMOFILES $lang.gmo"
265 POFILES="$POFILES $lang.po"
266 done
267
268 dnl Make all variables we use known to autoconf.
269 AC_SUBST(BUILD_INCLUDED_LIBINTL)
270 AC_SUBST(USE_INCLUDED_LIBINTL)
271 AC_SUBST(CATALOGS)
272 AC_SUBST(CATOBJEXT)
273 AC_SUBST(GMOFILES)
274 AC_SUBST(INTLLIBS)
275 AC_SUBST(INTLOBJS)
276 AC_SUBST(POFILES)
277 AC_SUBST(POSUB)
278
279 dnl For backward compatibility. Some configure.ins may be using this.
280 nls_cv_header_intl=
281 nls_cv_header_libgt=
282
283 dnl For backward compatibility. Some Makefiles may be using this.
284 DATADIRNAME=share
285 AC_SUBST(DATADIRNAME)
286
287 dnl For backward compatibility. Some Makefiles may be using this.
288 INSTOBJEXT=.mo
289 AC_SUBST(INSTOBJEXT)
290
291 dnl For backward compatibility. Some Makefiles may be using this.
292 GENCAT=gencat
293 AC_SUBST(GENCAT)
294 ])
295
296 dnl Usage: Just like AM_WITH_NLS, which see.
297 AC_DEFUN([AM_GNU_GETTEXT],
298 [AC_REQUIRE([AC_PROG_MAKE_SET])dnl
299 AC_REQUIRE([AC_PROG_CC])dnl
300 AC_REQUIRE([AC_CANONICAL_HOST])dnl
301 AC_REQUIRE([AC_PROG_RANLIB])dnl
302 AC_REQUIRE([AC_ISC_POSIX])dnl
303 AC_REQUIRE([AC_HEADER_STDC])dnl
304 AC_REQUIRE([AC_C_CONST])dnl
305 AC_REQUIRE([AC_C_INLINE])dnl
306 AC_REQUIRE([AC_TYPE_OFF_T])dnl
307 AC_REQUIRE([AC_TYPE_SIZE_T])dnl
308 AC_REQUIRE([AC_FUNC_ALLOCA])dnl
309 AC_REQUIRE([AC_FUNC_MMAP])dnl
310 AC_REQUIRE([jm_GLIBC21])dnl
311
312 AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
313 stdlib.h string.h unistd.h sys/param.h])
314 AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getcwd getegid geteuid \
315 getgid getuid mempcpy munmap putenv setenv setlocale stpcpy strchr strcasecmp \
316 strdup strtoul tsearch __argz_count __argz_stringify __argz_next])
317
318 AM_ICONV
319 AM_LANGINFO_CODESET
320 AM_LC_MESSAGES
321 AM_WITH_NLS([$1],[$2],[$3])
322
323 if test "x$CATOBJEXT" != "x"; then
324 if test "x$ALL_LINGUAS" = "x"; then
325 LINGUAS=
326 else
327 AC_MSG_CHECKING(for catalogs to be installed)
328 NEW_LINGUAS=
329 for presentlang in $ALL_LINGUAS; do
330 useit=no
331 for desiredlang in ${LINGUAS-$ALL_LINGUAS}; do
332 # Use the presentlang catalog if desiredlang is
333 # a. equal to presentlang, or
334 # b. a variant of presentlang (because in this case,
335 # presentlang can be used as a fallback for messages
336 # which are not translated in the desiredlang catalog).
337 case "$desiredlang" in
338 "$presentlang"*) useit=yes;;
339 esac
340 done
341 if test $useit = yes; then
342 NEW_LINGUAS="$NEW_LINGUAS $presentlang"
343 fi
344 done
345 LINGUAS=$NEW_LINGUAS
346 AC_MSG_RESULT($LINGUAS)
347 fi
348
349 dnl Construct list of names of catalog files to be constructed.
350 if test -n "$LINGUAS"; then
351 for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
352 fi
353 fi
354
355 dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
356 dnl find the mkinstalldirs script in another subdir but $(top_srcdir).
357 dnl Try to locate is.
358 MKINSTALLDIRS=
359 if test -n "$ac_aux_dir"; then
360 MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
361 fi
362 if test -z "$MKINSTALLDIRS"; then
363 MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
364 fi
365 AC_SUBST(MKINSTALLDIRS)
366
367 dnl Enable libtool support if the surrounding package wishes it.
368 INTL_LIBTOOL_SUFFIX_PREFIX=ifelse([$1], use-libtool, [l], [])
369 AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
370 ])