• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# gettext.m4 serial 60 (gettext-0.17)
2dnl Copyright (C) 1995-2007 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it,
5dnl with or without modifications, as long as this notice is preserved.
6dnl
7dnl This file can can be used in projects which are not available under
8dnl the GNU General Public License or the GNU Library General Public
9dnl License but which still want to provide support for the GNU gettext
10dnl functionality.
11dnl Please note that the actual code of the GNU gettext library is covered
12dnl by the GNU Library General Public License, and the rest of the GNU
13dnl gettext package package is covered by the GNU General Public License.
14dnl They are *not* in the public domain.
15
16dnl Authors:
17dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
18dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2006.
19
20dnl Macro to add for using GNU gettext.
21
22dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
23dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
24dnl    default (if it is not specified or empty) is 'no-libtool'.
25dnl    INTLSYMBOL should be 'external' for packages with no intl directory,
26dnl    and 'no-libtool' or 'use-libtool' for packages with an intl directory.
27dnl    If INTLSYMBOL is 'use-libtool', then a libtool library
28dnl    $(top_builddir)/intl/libintl.la will be created (shared and/or static,
29dnl    depending on --{enable,disable}-{shared,static} and on the presence of
30dnl    AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
31dnl    $(top_builddir)/intl/libintl.a will be created.
32dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
33dnl    implementations (in libc or libintl) without the ngettext() function
34dnl    will be ignored.  If NEEDSYMBOL is specified and is
35dnl    'need-formatstring-macros', then GNU gettext implementations that don't
36dnl    support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
37dnl INTLDIR is used to find the intl libraries.  If empty,
38dnl    the value `$(top_builddir)/intl/' is used.
39dnl
40dnl The result of the configuration is one of three cases:
41dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
42dnl    and used.
43dnl    Catalog format: GNU --> install in $(datadir)
44dnl    Catalog extension: .mo after installation, .gmo in source tree
45dnl 2) GNU gettext has been found in the system's C library.
46dnl    Catalog format: GNU --> install in $(datadir)
47dnl    Catalog extension: .mo after installation, .gmo in source tree
48dnl 3) No internationalization, always use English msgid.
49dnl    Catalog format: none
50dnl    Catalog extension: none
51dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
52dnl The use of .gmo is historical (it was needed to avoid overwriting the
53dnl GNU format catalogs when building on a platform with an X/Open gettext),
54dnl but we keep it in order not to force irrelevant filename changes on the
55dnl maintainers.
56dnl
57AC_DEFUN([AM_GNU_GETTEXT],
58[
59  dnl Argument checking.
60  ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
61    [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
62])])])])])
63  ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
64    [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
65])])])])
66  define([gt_included_intl],
67    ifelse([$1], [external],
68      ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]),
69      [yes]))
70  define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], []))
71  gt_NEEDS_INIT
72  AM_GNU_GETTEXT_NEED([$2])
73
74  AC_REQUIRE([AM_PO_SUBDIRS])dnl
75  ifelse(gt_included_intl, yes, [
76    AC_REQUIRE([AM_INTL_SUBDIR])dnl
77  ])
78
79  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
80  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
81  AC_REQUIRE([AC_LIB_RPATH])
82
83  dnl Sometimes libintl requires libiconv, so first search for libiconv.
84  dnl Ideally we would do this search only after the
85  dnl      if test "$USE_NLS" = "yes"; then
86  dnl        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
87  dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
88  dnl the configure script would need to contain the same shell code
89  dnl again, outside any 'if'. There are two solutions:
90  dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
91  dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
92  dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
93  dnl documented, we avoid it.
94  ifelse(gt_included_intl, yes, , [
95    AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
96  ])
97
98  dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation.
99  gt_INTL_MACOSX
100
101  dnl Set USE_NLS.
102  AC_REQUIRE([AM_NLS])
103
104  ifelse(gt_included_intl, yes, [
105    BUILD_INCLUDED_LIBINTL=no
106    USE_INCLUDED_LIBINTL=no
107  ])
108  LIBINTL=
109  LTLIBINTL=
110  POSUB=
111
112  dnl Add a version number to the cache macros.
113  case " $gt_needs " in
114    *" need-formatstring-macros "*) gt_api_version=3 ;;
115    *" need-ngettext "*) gt_api_version=2 ;;
116    *) gt_api_version=1 ;;
117  esac
118  gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
119  gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
120
121  dnl If we use NLS figure out what method
122  if test "$USE_NLS" = "yes"; then
123    gt_use_preinstalled_gnugettext=no
124    ifelse(gt_included_intl, yes, [
125      AC_MSG_CHECKING([whether included gettext is requested])
126      AC_ARG_WITH(included-gettext,
127        [  --with-included-gettext use the GNU gettext library included here],
128        nls_cv_force_use_gnu_gettext=$withval,
129        nls_cv_force_use_gnu_gettext=no)
130      AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
131
132      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
133      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
134    ])
135        dnl User does not insist on using GNU NLS library.  Figure out what
136        dnl to use.  If GNU gettext is available we use this.  Else we have
137        dnl to fall back to GNU NLS library.
138
139        if test $gt_api_version -ge 3; then
140          gt_revision_test_code='
141#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
142#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
143#endif
144changequote(,)dnl
145typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
146changequote([,])dnl
147'
148        else
149          gt_revision_test_code=
150        fi
151        if test $gt_api_version -ge 2; then
152          gt_expression_test_code=' + * ngettext ("", "", 0)'
153        else
154          gt_expression_test_code=
155        fi
156
157        AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc],
158         [AC_TRY_LINK([#include <libintl.h>
159$gt_revision_test_code
160extern int _nl_msg_cat_cntr;
161extern int *_nl_domain_bindings;],
162            [bindtextdomain ("", "");
163return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings],
164            [eval "$gt_func_gnugettext_libc=yes"],
165            [eval "$gt_func_gnugettext_libc=no"])])
166
167        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
168          dnl Sometimes libintl requires libiconv, so first search for libiconv.
169          ifelse(gt_included_intl, yes, , [
170            AM_ICONV_LINK
171          ])
172          dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
173          dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
174          dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
175          dnl even if libiconv doesn't exist.
176          AC_LIB_LINKFLAGS_BODY([intl])
177          AC_CACHE_CHECK([for GNU gettext in libintl],
178            [$gt_func_gnugettext_libintl],
179           [gt_save_CPPFLAGS="$CPPFLAGS"
180            CPPFLAGS="$CPPFLAGS $INCINTL"
181            gt_save_LIBS="$LIBS"
182            LIBS="$LIBS $LIBINTL"
183            dnl Now see whether libintl exists and does not depend on libiconv.
184            AC_TRY_LINK([#include <libintl.h>
185$gt_revision_test_code
186extern int _nl_msg_cat_cntr;
187extern
188#ifdef __cplusplus
189"C"
190#endif
191const char *_nl_expand_alias (const char *);],
192              [bindtextdomain ("", "");
193return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")],
194              [eval "$gt_func_gnugettext_libintl=yes"],
195              [eval "$gt_func_gnugettext_libintl=no"])
196            dnl Now see whether libintl exists and depends on libiconv.
197            if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
198              LIBS="$LIBS $LIBICONV"
199              AC_TRY_LINK([#include <libintl.h>
200$gt_revision_test_code
201extern int _nl_msg_cat_cntr;
202extern
203#ifdef __cplusplus
204"C"
205#endif
206const char *_nl_expand_alias (const char *);],
207                [bindtextdomain ("", "");
208return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")],
209               [LIBINTL="$LIBINTL $LIBICONV"
210                LTLIBINTL="$LTLIBINTL $LTLIBICONV"
211                eval "$gt_func_gnugettext_libintl=yes"
212               ])
213            fi
214            CPPFLAGS="$gt_save_CPPFLAGS"
215            LIBS="$gt_save_LIBS"])
216        fi
217
218        dnl If an already present or preinstalled GNU gettext() is found,
219        dnl use it.  But if this macro is used in GNU gettext, and GNU
220        dnl gettext is already preinstalled in libintl, we update this
221        dnl libintl.  (Cf. the install rule in intl/Makefile.in.)
222        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
223           || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
224                && test "$PACKAGE" != gettext-runtime \
225                && test "$PACKAGE" != gettext-tools; }; then
226          gt_use_preinstalled_gnugettext=yes
227        else
228          dnl Reset the values set by searching for libintl.
229          LIBINTL=
230          LTLIBINTL=
231          INCINTL=
232        fi
233
234    ifelse(gt_included_intl, yes, [
235        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
236          dnl GNU gettext is not found in the C library.
237          dnl Fall back on included GNU gettext library.
238          nls_cv_use_gnu_gettext=yes
239        fi
240      fi
241
242      if test "$nls_cv_use_gnu_gettext" = "yes"; then
243        dnl Mark actions used to generate GNU NLS library.
244        BUILD_INCLUDED_LIBINTL=yes
245        USE_INCLUDED_LIBINTL=yes
246        LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD"
247        LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD"
248        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
249      fi
250
251      CATOBJEXT=
252      if test "$gt_use_preinstalled_gnugettext" = "yes" \
253         || test "$nls_cv_use_gnu_gettext" = "yes"; then
254        dnl Mark actions to use GNU gettext tools.
255        CATOBJEXT=.gmo
256      fi
257    ])
258
259    if test -n "$INTL_MACOSX_LIBS"; then
260      if test "$gt_use_preinstalled_gnugettext" = "yes" \
261         || test "$nls_cv_use_gnu_gettext" = "yes"; then
262        dnl Some extra flags are needed during linking.
263        LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
264        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
265      fi
266    fi
267
268    if test "$gt_use_preinstalled_gnugettext" = "yes" \
269       || test "$nls_cv_use_gnu_gettext" = "yes"; then
270      AC_DEFINE(ENABLE_NLS, 1,
271        [Define to 1 if translation of program messages to the user's native language
272   is requested.])
273    else
274      USE_NLS=no
275    fi
276  fi
277
278  AC_MSG_CHECKING([whether to use NLS])
279  AC_MSG_RESULT([$USE_NLS])
280  if test "$USE_NLS" = "yes"; then
281    AC_MSG_CHECKING([where the gettext function comes from])
282    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
283      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
284        gt_source="external libintl"
285      else
286        gt_source="libc"
287      fi
288    else
289      gt_source="included intl directory"
290    fi
291    AC_MSG_RESULT([$gt_source])
292  fi
293
294  if test "$USE_NLS" = "yes"; then
295
296    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
297      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
298        AC_MSG_CHECKING([how to link with libintl])
299        AC_MSG_RESULT([$LIBINTL])
300        AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
301      fi
302
303      dnl For backward compatibility. Some packages may be using this.
304      AC_DEFINE(HAVE_GETTEXT, 1,
305       [Define if the GNU gettext() function is already present or preinstalled.])
306      AC_DEFINE(HAVE_DCGETTEXT, 1,
307       [Define if the GNU dcgettext() function is already present or preinstalled.])
308    fi
309
310    dnl We need to process the po/ directory.
311    POSUB=po
312  fi
313
314  ifelse(gt_included_intl, yes, [
315    dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
316    dnl to 'yes' because some of the testsuite requires it.
317    if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
318      BUILD_INCLUDED_LIBINTL=yes
319    fi
320
321    dnl Make all variables we use known to autoconf.
322    AC_SUBST(BUILD_INCLUDED_LIBINTL)
323    AC_SUBST(USE_INCLUDED_LIBINTL)
324    AC_SUBST(CATOBJEXT)
325
326    dnl For backward compatibility. Some configure.ins may be using this.
327    nls_cv_header_intl=
328    nls_cv_header_libgt=
329
330    dnl For backward compatibility. Some Makefiles may be using this.
331    DATADIRNAME=share
332    AC_SUBST(DATADIRNAME)
333
334    dnl For backward compatibility. Some Makefiles may be using this.
335    INSTOBJEXT=.mo
336    AC_SUBST(INSTOBJEXT)
337
338    dnl For backward compatibility. Some Makefiles may be using this.
339    GENCAT=gencat
340    AC_SUBST(GENCAT)
341
342    dnl For backward compatibility. Some Makefiles may be using this.
343    INTLOBJS=
344    if test "$USE_INCLUDED_LIBINTL" = yes; then
345      INTLOBJS="\$(GETTOBJS)"
346    fi
347    AC_SUBST(INTLOBJS)
348
349    dnl Enable libtool support if the surrounding package wishes it.
350    INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
351    AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
352  ])
353
354  dnl For backward compatibility. Some Makefiles may be using this.
355  INTLLIBS="$LIBINTL"
356  AC_SUBST(INTLLIBS)
357
358  dnl Make all documented variables known to autoconf.
359  AC_SUBST(LIBINTL)
360  AC_SUBST(LTLIBINTL)
361  AC_SUBST(POSUB)
362])
363
364
365dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized.
366m4_define([gt_NEEDS_INIT],
367[
368  m4_divert_text([DEFAULTS], [gt_needs=])
369  m4_define([gt_NEEDS_INIT], [])
370])
371
372
373dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL])
374AC_DEFUN([AM_GNU_GETTEXT_NEED],
375[
376  m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"])
377])
378
379
380dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
381AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
382