13.5.1 AM_GNU_GETTEXT in gettext.m4

The AM_GNU_GETTEXT macro tests for the presence of the GNU gettext function family in either the C library or a separate libintl library (shared or static libraries are both supported). It also invokes AM_PO_SUBDIRS, thus preparing the po/ directories of the package for building.

AM_GNU_GETTEXT accepts up to three optional arguments. The general syntax is

AM_GNU_GETTEXT([intlsymbol], [needsymbol])

intlsymbol should always be ‘external’.

If needsymbol is specified and is ‘need-ngettext’, then GNU gettext implementations (in libc or libintl) without the ngettext() function will be ignored. If needsymbol is specified and is ‘need-formatstring-macros’, then GNU gettext implementations that don’t support the ISO C 99 <inttypes.h> formatstring macros will be ignored. Only one needsymbol can be specified. These requirements can also be specified by using the macro AM_GNU_GETTEXT_NEED elsewhere. To specify more than one requirement, just specify the strongest one among them, or invoke the AM_GNU_GETTEXT_NEED macro several times. The hierarchy among the various alternatives is as follows: ‘need-formatstring-macros’ implies ‘need-ngettext’.

The AM_GNU_GETTEXT macro determines whether GNU gettext is available and should be used. If so, it sets the USE_NLS variable to ‘yes’; it defines ENABLE_NLS to 1 in the autoconf generated configuration file (usually called config.h); it sets the variables LIBINTL and LTLIBINTL to the linker options for use in a Makefile (LIBINTL for use without libtool, LTLIBINTL for use with libtool); it adds an ‘-I’ option to CPPFLAGS if necessary. In the negative case, it sets USE_NLS to ‘no’; it sets LIBINTL and LTLIBINTL to empty and doesn’t change CPPFLAGS.

The complexities that AM_GNU_GETTEXT deals with are the following:

  • Some operating systems have gettext in the C library, for example glibc. Some have it in a separate library libintl. GNU libintl might have been installed as part of the GNU gettext package.
  • GNU libintl, if installed, is not necessarily already in the search path (CPPFLAGS for the include file search path, LDFLAGS for the library search path).
  • Except for glibc, the operating system’s native gettext cannot exploit the GNU mo files, doesn’t have the necessary locale dependency features, and cannot convert messages from the catalog’s text encoding to the user’s locale encoding.
  • GNU libintl, if installed, is not necessarily already in the run time library search path. To avoid the need for setting an environment variable like LD_LIBRARY_PATH, the macro adds the appropriate run time search path options to the LIBINTL and LTLIBINTL variables. This works on most systems, but not on some operating systems with limited shared library support, like SCO.
  • GNU libintl relies on POSIX/XSI iconv. The macro checks for linker options needed to use iconv and appends them to the LIBINTL and LTLIBINTL variables.