glib-gettext.m4 13.3 KB
Newer Older
1
# Copyright (C) 1995-2002 Free Software Foundation, Inc.
2
# Copyright (C) 2001-2003,2004 Red Hat, Inc.
3 4 5 6 7 8 9 10 11 12 13
#
# This file is free software, distributed under the terms of the GNU
# General Public License.  As a special exception to the GNU General
# Public License, this file may be distributed as part of a program
# that contains a configuration script generated by Autoconf, under
# the same distribution terms as the rest of that program.
#
# This file can be copied and used freely without restrictions.  It can
# be used in projects which are not available under the GNU Public License
# but which still want to provide support for the GNU gettext functionality.
#
Owen Taylor's avatar
Owen Taylor committed
14
# Macro to add for using GNU gettext.
15
# Ulrich Drepper <drepper@cygnus.com>, 1995, 1996
Owen Taylor's avatar
Owen Taylor committed
16 17 18 19
#
# Modified to never use included libintl. 
# Owen Taylor <otaylor@redhat.com>, 12/15/1998
#
20 21
# Major rework to remove unused code
# Owen Taylor <otaylor@redhat.com>, 12/11/2002
Owen Taylor's avatar
Owen Taylor committed
22
#
23 24
# Added better handling of ALL_LINGUAS from GNU gettext version 
# written by Bruno Haible, Owen Taylor <otaylor.redhat.com> 5/30/3002
25 26 27
#
# Modified to require ngettext
# Matthias Clasen <mclasen@redhat.com> 08/06/2004
28 29 30 31 32 33
#
# We need this here as well, since someone might use autoconf-2.5x
# to configure GLib then an older version to configure a package
# using AM_GLIB_GNU_GETTEXT
AC_PREREQ(2.53)

34 35 36 37 38 39 40 41 42 43 44 45 46 47
dnl
dnl We go to great lengths to make sure that aclocal won't 
dnl try to pull in the installed version of these macros
dnl when running aclocal in the glib directory.
dnl
m4_copy([AC_DEFUN],[glib_DEFUN])
m4_copy([AC_REQUIRE],[glib_REQUIRE])
dnl
dnl At the end, if we're not within glib, we'll define the public
dnl definitions in terms of our private definitions.
dnl

# GLIB_LC_MESSAGES
#--------------------
48
glib_DEFUN([GLIB_LC_MESSAGES],
49 50
  [AC_CHECK_HEADERS([locale.h])
    if test $ac_cv_header_locale_h = yes; then
51 52 53 54 55 56 57 58 59
    AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
      [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
       am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
    if test $am_cv_val_LC_MESSAGES = yes; then
      AC_DEFINE(HAVE_LC_MESSAGES, 1,
        [Define if your <locale.h> file defines LC_MESSAGES.])
    fi
  fi])

60 61 62
# GLIB_PATH_PROG_WITH_TEST
#----------------------------
dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
63
dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
64
glib_DEFUN([GLIB_PATH_PROG_WITH_TEST],
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
[# Extract the first word of "$2", so it can be a program name with args.
set dummy $2; ac_word=[$]2
AC_MSG_CHECKING([for $ac_word])
AC_CACHE_VAL(ac_cv_path_$1,
[case "[$]$1" in
  /*)
  ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
  for ac_dir in ifelse([$5], , $PATH, [$5]); do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      if [$3]; then
	ac_cv_path_$1="$ac_dir/$ac_word"
	break
      fi
    fi
  done
  IFS="$ac_save_ifs"
dnl If no 4th arg is given, leave the cache variable unset,
dnl so AC_PATH_PROGS will keep looking.
ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
])dnl
  ;;
esac])dnl
$1="$ac_cv_path_$1"
if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
  AC_MSG_RESULT([$]$1)
else
  AC_MSG_RESULT(no)
fi
AC_SUBST($1)dnl
])

100 101 102
# GLIB_WITH_NLS
#-----------------
glib_DEFUN([GLIB_WITH_NLS],
103
  dnl NLS is obligatory
104
  [USE_NLS=yes
Owen Taylor's avatar
Owen Taylor committed
105 106
    AC_SUBST(USE_NLS)

107
    gt_cv_have_gettext=no
108

109 110
    CATOBJEXT=NONE
    XGETTEXT=:
111
    INTLLIBS=
112

113 114 115
    AC_CHECK_HEADER(libintl.h,
     [gt_cv_func_dgettext_libintl="no"
      libintl_extra_libs=""
116

117 118 119
      #
      # First check in libc
      #
120
      AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc,
121 122 123
        [AC_TRY_LINK([
#include <libintl.h>
],
124
         [return !ngettext ("","", 1)],
125 126
	  gt_cv_func_ngettext_libc=yes,
          gt_cv_func_ngettext_libc=no)
127 128
        ])
  
129 130 131 132 133
      if test "$gt_cv_func_ngettext_libc" = "yes" ; then
	      AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc,
        	[AC_TRY_LINK([
#include <libintl.h>
],
134
	          [return !dgettext ("","")],
135 136 137 138 139 140
		  gt_cv_func_dgettext_libc=yes,
	          gt_cv_func_dgettext_libc=no)
        	])
      fi
  
      if test "$gt_cv_func_ngettext_libc" = "yes" ; then
141 142
        AC_CHECK_FUNCS(bind_textdomain_codeset)
      fi
143

144 145 146 147
      #
      # If we don't have everything we want, check in libintl
      #
      if test "$gt_cv_func_dgettext_libc" != "yes" \
148
	 || test "$gt_cv_func_ngettext_libc" != "yes" \
149 150 151
         || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then
        
        AC_CHECK_LIB(intl, bindtextdomain,
152 153 154
	    [AC_CHECK_LIB(intl, ngettext,
		    [AC_CHECK_LIB(intl, dgettext,
			          gt_cv_func_dgettext_libintl=yes)])])
155

156 157 158
	if test "$gt_cv_func_dgettext_libintl" != "yes" ; then
	  AC_MSG_CHECKING([if -liconv is needed to use gettext])
	  AC_MSG_RESULT([])
159 160
  	  AC_CHECK_LIB(intl, ngettext,
          	[AC_CHECK_LIB(intl, dcgettext,
161 162
		       [gt_cv_func_dgettext_libintl=yes
			libintl_extra_libs=-liconv],
163 164
			:,-liconv)],
		:,-liconv)
165
        fi
166

167 168 169
        #
        # If we found libintl, then check in it for bind_textdomain_codeset();
        # we'll prefer libc if neither have bind_textdomain_codeset(),
170
        # and both have dgettext and ngettext
171 172 173 174
        #
        if test "$gt_cv_func_dgettext_libintl" = "yes" ; then
          glib_save_LIBS="$LIBS"
          LIBS="$LIBS -lintl $libintl_extra_libs"
175
          unset ac_cv_func_bind_textdomain_codeset
176 177
          AC_CHECK_FUNCS(bind_textdomain_codeset)
          LIBS="$glib_save_LIBS"
178

179 180 181
          if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then
            gt_cv_func_dgettext_libc=no
          else
182 183
            if test "$gt_cv_func_dgettext_libc" = "yes" \
		&& test "$gt_cv_func_ngettext_libc" = "yes"; then
184 185 186 187 188
              gt_cv_func_dgettext_libintl=no
            fi
          fi
        fi
      fi
189

190 191 192
      if test "$gt_cv_func_dgettext_libc" = "yes" \
	|| test "$gt_cv_func_dgettext_libintl" = "yes"; then
        gt_cv_have_gettext=yes
Owen Taylor's avatar
Owen Taylor committed
193
      fi
194
  
195 196 197 198
      if test "$gt_cv_func_dgettext_libintl" = "yes"; then
        INTLLIBS="-lintl $libintl_extra_libs"
      fi
  
199 200 201 202 203 204
      if test "$gt_cv_have_gettext" = "yes"; then
	AC_DEFINE(HAVE_GETTEXT,1,
	  [Define if the GNU gettext() function is already present or preinstalled.])
	GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
	  [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
	if test "$MSGFMT" != "no"; then
205
          glib_save_LIBS="$LIBS"
206
          LIBS="$LIBS $INTLLIBS"
207
	  AC_CHECK_FUNCS(dcgettext)
208 209
	  MSGFMT_OPTS=
	  AC_MSG_CHECKING([if msgfmt accepts -c])
210
	  GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[
211 212 213 214 215 216 217 218 219 220 221
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: test 1.0\n"
"PO-Revision-Date: 2007-02-15 12:01+0100\n"
"Last-Translator: test <foo@bar.xx>\n"
"Language-Team: C <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])
	  AC_SUBST(MSGFMT_OPTS)
222 223 224 225 226 227 228
	  AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
	  GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
	    [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
	  AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
			 return _nl_msg_cat_cntr],
	    [CATOBJEXT=.gmo 
             DATADIRNAME=share],
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
	    [case $host in
	    *-*-solaris*)
	    dnl On Solaris, if bind_textdomain_codeset is in libc,
	    dnl GNU format message catalog is always supported,
            dnl since both are added to the libc all together.
	    dnl Hence, we'd like to go with DATADIRNAME=share and
	    dnl and CATOBJEXT=.gmo in this case.
            AC_CHECK_FUNC(bind_textdomain_codeset,
	      [CATOBJEXT=.gmo 
               DATADIRNAME=share],
	      [CATOBJEXT=.mo
               DATADIRNAME=lib])
	    ;;
	    *)
	    CATOBJEXT=.mo
            DATADIRNAME=lib
	    ;;
	    esac])
247
          LIBS="$glib_save_LIBS"
248
	  INSTOBJEXT=.mo
249 250
	else
	  gt_cv_have_gettext=no
251 252 253
	fi
      fi
    ])
Owen Taylor's avatar
Owen Taylor committed
254

255
    if test "$gt_cv_have_gettext" = "yes" ; then
256 257
      AC_DEFINE(ENABLE_NLS, 1,
        [always defined to indicate that i18n is enabled])
258 259 260 261
    fi

    dnl Test whether we really found GNU xgettext.
    if test "$XGETTEXT" != ":"; then
262
      dnl If it is not GNU xgettext we define it as : so that the
263 264 265
      dnl Makefiles still can work.
      if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
        : ;
Owen Taylor's avatar
Owen Taylor committed
266
      else
267 268 269
        AC_MSG_RESULT(
	  [found xgettext program is not GNU xgettext; ignore it])
        XGETTEXT=":"
Owen Taylor's avatar
Owen Taylor committed
270
      fi
271
    fi
Owen Taylor's avatar
Owen Taylor committed
272

273 274
    # We need to process the po/ directory.
    POSUB=po
Owen Taylor's avatar
Owen Taylor committed
275 276

    AC_OUTPUT_COMMANDS(
277
      [case "$CONFIG_FILES" in *po/Makefile.in*)
Owen Taylor's avatar
Owen Taylor committed
278 279 280 281 282
        sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
      esac])

    dnl These rules are solely for the distribution goal.  While doing this
    dnl we only have to keep exactly one list of the available catalogs
283
    dnl in configure.ac.
Owen Taylor's avatar
Owen Taylor committed
284 285 286 287 288 289 290 291
    for lang in $ALL_LINGUAS; do
      GMOFILES="$GMOFILES $lang.gmo"
      POFILES="$POFILES $lang.po"
    done

    dnl Make all variables we use known to autoconf.
    AC_SUBST(CATALOGS)
    AC_SUBST(CATOBJEXT)
292
    AC_SUBST(DATADIRNAME)
Owen Taylor's avatar
Owen Taylor committed
293 294 295
    AC_SUBST(GMOFILES)
    AC_SUBST(INSTOBJEXT)
    AC_SUBST(INTLLIBS)
296 297
    AC_SUBST(PO_IN_DATADIR_TRUE)
    AC_SUBST(PO_IN_DATADIR_FALSE)
Owen Taylor's avatar
Owen Taylor committed
298 299 300 301
    AC_SUBST(POFILES)
    AC_SUBST(POSUB)
  ])

302 303 304 305 306 307 308 309 310 311
# AM_GLIB_GNU_GETTEXT
# -------------------
# Do checks necessary for use of gettext. If a suitable implementation 
# of gettext is found in either in libintl or in the C library,
# it will set INTLLIBS to the libraries needed for use of gettext
# and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable
# gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST()
# on various variables needed by the Makefile.in.in installed by 
# glib-gettextize.
dnl
312
glib_DEFUN([GLIB_GNU_GETTEXT],
313
  [AC_REQUIRE([AC_PROG_CC])dnl
Owen Taylor's avatar
Owen Taylor committed
314
   AC_REQUIRE([AC_HEADER_STDC])dnl
315 316 317
   
   GLIB_LC_MESSAGES
   GLIB_WITH_NLS
Owen Taylor's avatar
Owen Taylor committed
318

319
   if test "$gt_cv_have_gettext" = "yes"; then
Owen Taylor's avatar
Owen Taylor committed
320 321 322 323 324
     if test "x$ALL_LINGUAS" = "x"; then
       LINGUAS=
     else
       AC_MSG_CHECKING(for catalogs to be installed)
       NEW_LINGUAS=
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
       for presentlang in $ALL_LINGUAS; do
         useit=no
         if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then
           desiredlanguages="$LINGUAS"
         else
           desiredlanguages="$ALL_LINGUAS"
         fi
         for desiredlang in $desiredlanguages; do
 	   # 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).
           case "$desiredlang" in
             "$presentlang"*) useit=yes;;
           esac
         done
         if test $useit = yes; then
           NEW_LINGUAS="$NEW_LINGUAS $presentlang"
         fi
Owen Taylor's avatar
Owen Taylor committed
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
       done
       LINGUAS=$NEW_LINGUAS
       AC_MSG_RESULT($LINGUAS)
     fi

     dnl Construct list of names of catalog files to be constructed.
     if test -n "$LINGUAS"; then
       for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
     fi
   fi

   dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
   dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
   dnl Try to locate is.
   MKINSTALLDIRS=
   if test -n "$ac_aux_dir"; then
     MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
   fi
   if test -z "$MKINSTALLDIRS"; then
     MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
   fi
   AC_SUBST(MKINSTALLDIRS)

   dnl Generate list of files to be processed by xgettext which will
   dnl be included in po/Makefile.
   test -d po || mkdir po
   if test "x$srcdir" != "x."; then
     if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
       posrcprefix="$srcdir/"
     else
       posrcprefix="../$srcdir/"
     fi
   else
     posrcprefix="../"
   fi
   rm -f po/POTFILES
   sed -e "/^#/d" -e "/^\$/d" -e "s,.*,	$posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
	< $srcdir/po/POTFILES.in > po/POTFILES
  ])

385 386 387 388
# AM_GLIB_DEFINE_LOCALEDIR(VARIABLE)
# -------------------------------
# Define VARIABLE to the location where catalog files will
# be installed by po/Makefile.
389
glib_DEFUN([GLIB_DEFINE_LOCALEDIR],
390 391
[glib_REQUIRE([GLIB_GNU_GETTEXT])dnl
glib_save_prefix="$prefix"
392
glib_save_exec_prefix="$exec_prefix"
Matthias Clasen's avatar
Matthias Clasen committed
393
glib_save_datarootdir="$datarootdir"
394
test "x$prefix" = xNONE && prefix=$ac_default_prefix
395
test "x$exec_prefix" = xNONE && exec_prefix=$prefix
Matthias Clasen's avatar
Matthias Clasen committed
396
datarootdir=`eval echo "${datarootdir}"`
397 398 399 400 401 402
if test "x$CATOBJEXT" = "x.mo" ; then
  localedir=`eval echo "${libdir}/locale"`
else
  localedir=`eval echo "${datadir}/locale"`
fi
prefix="$glib_save_prefix"
403
exec_prefix="$glib_save_exec_prefix"
Matthias Clasen's avatar
Matthias Clasen committed
404
datarootdir="$glib_save_datarootdir"
405 406 407 408 409 410 411
AC_DEFINE_UNQUOTED($1, "$localedir",
  [Define the location where the catalogs will be installed])
])

dnl
dnl Now the definitions that aclocal will find
dnl
412
ifdef(glib_configure_ac,[],[
413 414
AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)])
AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)])
415
])dnl
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432

# GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL])
# 
# Create a temporary file with TEST-FILE as its contents and pass the
# file name to PROGRAM.  Perform ACTION-IF-PASS if PROGRAM exits with
# 0 and perform ACTION-IF-FAIL for any other exit status.
AC_DEFUN([GLIB_RUN_PROG],
[cat >conftest.foo <<_ACEOF
$2
_ACEOF
if AC_RUN_LOG([$1 conftest.foo]); then
  m4_ifval([$3], [$3], [:])
m4_ifvaln([$4], [else $4])dnl
echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD
sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD
fi])