Fix a small problem with msgfmt -c detection
[platform/upstream/glib.git] / m4macros / glib-gettext.m4
1 # Copyright (C) 1995-2002 Free Software Foundation, Inc.
2 # Copyright (C) 2001-2003,2004 Red Hat, Inc.
3 #
4 # This file is free software, distributed under the terms of the GNU
5 # General Public License.  As a special exception to the GNU General
6 # Public License, this file may be distributed as part of a program
7 # that contains a configuration script generated by Autoconf, under
8 # the same distribution terms as the rest of that program.
9 #
10 # This file can be copied and used freely without restrictions.  It can
11 # be used in projects which are not available under the GNU Public License
12 # but which still want to provide support for the GNU gettext functionality.
13 #
14 # Macro to add for using GNU gettext.
15 # Ulrich Drepper <drepper@cygnus.com>, 1995, 1996
16 #
17 # Modified to never use included libintl. 
18 # Owen Taylor <otaylor@redhat.com>, 12/15/1998
19 #
20 # Major rework to remove unused code
21 # Owen Taylor <otaylor@redhat.com>, 12/11/2002
22 #
23 # Added better handling of ALL_LINGUAS from GNU gettext version 
24 # written by Bruno Haible, Owen Taylor <otaylor.redhat.com> 5/30/3002
25 #
26 # Modified to require ngettext
27 # Matthias Clasen <mclasen@redhat.com> 08/06/2004
28 #
29 # We need this here as well, since someone might use autoconf-2.5x
30 # to configure GLib then an older version to configure a package
31 # using AM_GLIB_GNU_GETTEXT
32 AC_PREREQ(2.53)
33
34 dnl
35 dnl We go to great lengths to make sure that aclocal won't 
36 dnl try to pull in the installed version of these macros
37 dnl when running aclocal in the glib directory.
38 dnl
39 m4_copy([AC_DEFUN],[glib_DEFUN])
40 m4_copy([AC_REQUIRE],[glib_REQUIRE])
41 dnl
42 dnl At the end, if we're not within glib, we'll define the public
43 dnl definitions in terms of our private definitions.
44 dnl
45
46 # GLIB_LC_MESSAGES
47 #--------------------
48 glib_DEFUN([GLIB_LC_MESSAGES],
49   [AC_CHECK_HEADERS([locale.h])
50     if test $ac_cv_header_locale_h = yes; then
51     AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
52       [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
53        am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
54     if test $am_cv_val_LC_MESSAGES = yes; then
55       AC_DEFINE(HAVE_LC_MESSAGES, 1,
56         [Define if your <locale.h> file defines LC_MESSAGES.])
57     fi
58   fi])
59
60 # GLIB_PATH_PROG_WITH_TEST
61 #----------------------------
62 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 [# Extract the first word of "$2", so it can be a program name with args.
66 set dummy $2; ac_word=[$]2
67 AC_MSG_CHECKING([for $ac_word])
68 AC_CACHE_VAL(ac_cv_path_$1,
69 [case "[$]$1" in
70   /*)
71   ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
72   ;;
73   *)
74   IFS="${IFS=   }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
75   for ac_dir in ifelse([$5], , $PATH, [$5]); do
76     test -z "$ac_dir" && ac_dir=.
77     if test -f $ac_dir/$ac_word; then
78       if [$3]; then
79         ac_cv_path_$1="$ac_dir/$ac_word"
80         break
81       fi
82     fi
83   done
84   IFS="$ac_save_ifs"
85 dnl If no 4th arg is given, leave the cache variable unset,
86 dnl so AC_PATH_PROGS will keep looking.
87 ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
88 ])dnl
89   ;;
90 esac])dnl
91 $1="$ac_cv_path_$1"
92 if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
93   AC_MSG_RESULT([$]$1)
94 else
95   AC_MSG_RESULT(no)
96 fi
97 AC_SUBST($1)dnl
98 ])
99
100 # GLIB_WITH_NLS
101 #-----------------
102 glib_DEFUN([GLIB_WITH_NLS],
103   dnl NLS is obligatory
104   [AC_REQUIRE([AC_CANONICAL_HOST])dnl
105     USE_NLS=yes
106     AC_SUBST(USE_NLS)
107
108     gt_cv_have_gettext=no
109
110     CATOBJEXT=NONE
111     XGETTEXT=:
112     INTLLIBS=
113
114     AC_CHECK_HEADER(libintl.h,
115      [gt_cv_func_dgettext_libintl="no"
116       libintl_extra_libs=""
117
118       #
119       # First check in libc
120       #
121       AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc,
122         [AC_TRY_LINK([
123 #include <libintl.h>
124 ],
125          [return !ngettext ("","", 1)],
126           gt_cv_func_ngettext_libc=yes,
127           gt_cv_func_ngettext_libc=no)
128         ])
129   
130       if test "$gt_cv_func_ngettext_libc" = "yes" ; then
131               AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc,
132                 [AC_TRY_LINK([
133 #include <libintl.h>
134 ],
135                   [return !dgettext ("","")],
136                   gt_cv_func_dgettext_libc=yes,
137                   gt_cv_func_dgettext_libc=no)
138                 ])
139       fi
140   
141       if test "$gt_cv_func_ngettext_libc" = "yes" ; then
142         AC_CHECK_FUNCS(bind_textdomain_codeset)
143       fi
144
145       #
146       # If we don't have everything we want, check in libintl
147       #
148       if test "$gt_cv_func_dgettext_libc" != "yes" \
149          || test "$gt_cv_func_ngettext_libc" != "yes" \
150          || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then
151         
152         AC_CHECK_LIB(intl, bindtextdomain,
153             [AC_CHECK_LIB(intl, ngettext,
154                     [AC_CHECK_LIB(intl, dgettext,
155                                   gt_cv_func_dgettext_libintl=yes)])])
156
157         if test "$gt_cv_func_dgettext_libintl" != "yes" ; then
158           AC_MSG_CHECKING([if -liconv is needed to use gettext])
159           AC_MSG_RESULT([])
160           AC_CHECK_LIB(intl, ngettext,
161                 [AC_CHECK_LIB(intl, dcgettext,
162                        [gt_cv_func_dgettext_libintl=yes
163                         libintl_extra_libs=-liconv],
164                         :,-liconv)],
165                 :,-liconv)
166         fi
167
168         #
169         # If we found libintl, then check in it for bind_textdomain_codeset();
170         # we'll prefer libc if neither have bind_textdomain_codeset(),
171         # and both have dgettext and ngettext
172         #
173         if test "$gt_cv_func_dgettext_libintl" = "yes" ; then
174           glib_save_LIBS="$LIBS"
175           LIBS="$LIBS -lintl $libintl_extra_libs"
176           unset ac_cv_func_bind_textdomain_codeset
177           AC_CHECK_FUNCS(bind_textdomain_codeset)
178           LIBS="$glib_save_LIBS"
179
180           if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then
181             gt_cv_func_dgettext_libc=no
182           else
183             if test "$gt_cv_func_dgettext_libc" = "yes" \
184                 && test "$gt_cv_func_ngettext_libc" = "yes"; then
185               gt_cv_func_dgettext_libintl=no
186             fi
187           fi
188         fi
189       fi
190
191       if test "$gt_cv_func_dgettext_libc" = "yes" \
192         || test "$gt_cv_func_dgettext_libintl" = "yes"; then
193         gt_cv_have_gettext=yes
194       fi
195   
196       if test "$gt_cv_func_dgettext_libintl" = "yes"; then
197         INTLLIBS="-lintl $libintl_extra_libs"
198       fi
199   
200       if test "$gt_cv_have_gettext" = "yes"; then
201         AC_DEFINE(HAVE_GETTEXT,1,
202           [Define if the GNU gettext() function is already present or preinstalled.])
203         GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
204           [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
205         if test "$MSGFMT" != "no"; then
206           glib_save_LIBS="$LIBS"
207           LIBS="$LIBS $INTLLIBS"
208           AC_CHECK_FUNCS(dcgettext)
209           MSGFMT_OPTS=
210           AC_MSG_CHECKING([if msgfmt accepts -c])
211           GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[
212 msgid ""
213 msgstr ""
214 "Content-Type: text/plain; charset=UTF-8\n"
215 "Project-Id-Version: test 1.0\n"
216 "PO-Revision-Date: 2007-02-15 12:01+0100\n"
217 "Last-Translator: test <foo@bar.xx>\n"
218 "Language-Team: C <LL@li.org>\n"
219 "MIME-Version: 1.0\n"
220 "Content-Transfer-Encoding: 8bit\n"
221 ], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])
222           AC_SUBST(MSGFMT_OPTS)
223           AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
224           GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
225             [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
226           AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
227                          return _nl_msg_cat_cntr],
228             [CATOBJEXT=.gmo 
229              DATADIRNAME=share],
230             [case $host in
231             *-*-solaris*)
232             dnl On Solaris, if bind_textdomain_codeset is in libc,
233             dnl GNU format message catalog is always supported,
234             dnl since both are added to the libc all together.
235             dnl Hence, we'd like to go with DATADIRNAME=share and
236             dnl and CATOBJEXT=.gmo in this case.
237             AC_CHECK_FUNC(bind_textdomain_codeset,
238               [CATOBJEXT=.gmo 
239                DATADIRNAME=share],
240               [CATOBJEXT=.mo
241                DATADIRNAME=lib])
242             ;;
243             *)
244             CATOBJEXT=.mo
245             DATADIRNAME=lib
246             ;;
247             esac])
248           LIBS="$glib_save_LIBS"
249           INSTOBJEXT=.mo
250         else
251           gt_cv_have_gettext=no
252         fi
253       fi
254     ])
255
256     if test "$gt_cv_have_gettext" = "yes" ; then
257       AC_DEFINE(ENABLE_NLS, 1,
258         [always defined to indicate that i18n is enabled])
259     fi
260
261     dnl Test whether we really found GNU xgettext.
262     if test "$XGETTEXT" != ":"; then
263       dnl If it is not GNU xgettext we define it as : so that the
264       dnl Makefiles still can work.
265       if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
266         : ;
267       else
268         AC_MSG_RESULT(
269           [found xgettext program is not GNU xgettext; ignore it])
270         XGETTEXT=":"
271       fi
272     fi
273
274     # We need to process the po/ directory.
275     POSUB=po
276
277     AC_OUTPUT_COMMANDS(
278       [case "$CONFIG_FILES" in *po/Makefile.in*)
279         sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
280       esac])
281
282     dnl These rules are solely for the distribution goal.  While doing this
283     dnl we only have to keep exactly one list of the available catalogs
284     dnl in configure.in.
285     for lang in $ALL_LINGUAS; do
286       GMOFILES="$GMOFILES $lang.gmo"
287       POFILES="$POFILES $lang.po"
288     done
289
290     dnl Make all variables we use known to autoconf.
291     AC_SUBST(CATALOGS)
292     AC_SUBST(CATOBJEXT)
293     AC_SUBST(DATADIRNAME)
294     AC_SUBST(GMOFILES)
295     AC_SUBST(INSTOBJEXT)
296     AC_SUBST(INTLLIBS)
297     AC_SUBST(PO_IN_DATADIR_TRUE)
298     AC_SUBST(PO_IN_DATADIR_FALSE)
299     AC_SUBST(POFILES)
300     AC_SUBST(POSUB)
301   ])
302
303 # AM_GLIB_GNU_GETTEXT
304 # -------------------
305 # Do checks necessary for use of gettext. If a suitable implementation 
306 # of gettext is found in either in libintl or in the C library,
307 # it will set INTLLIBS to the libraries needed for use of gettext
308 # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable
309 # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST()
310 # on various variables needed by the Makefile.in.in installed by 
311 # glib-gettextize.
312 dnl
313 glib_DEFUN([GLIB_GNU_GETTEXT],
314   [AC_REQUIRE([AC_PROG_CC])dnl
315    AC_REQUIRE([AC_HEADER_STDC])dnl
316    
317    GLIB_LC_MESSAGES
318    GLIB_WITH_NLS
319
320    if test "$gt_cv_have_gettext" = "yes"; then
321      if test "x$ALL_LINGUAS" = "x"; then
322        LINGUAS=
323      else
324        AC_MSG_CHECKING(for catalogs to be installed)
325        NEW_LINGUAS=
326        for presentlang in $ALL_LINGUAS; do
327          useit=no
328          if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then
329            desiredlanguages="$LINGUAS"
330          else
331            desiredlanguages="$ALL_LINGUAS"
332          fi
333          for desiredlang in $desiredlanguages; do
334            # Use the presentlang catalog if desiredlang is
335            #   a. equal to presentlang, or
336            #   b. a variant of presentlang (because in this case,
337            #      presentlang can be used as a fallback for messages
338            #      which are not translated in the desiredlang catalog).
339            case "$desiredlang" in
340              "$presentlang"*) useit=yes;;
341            esac
342          done
343          if test $useit = yes; then
344            NEW_LINGUAS="$NEW_LINGUAS $presentlang"
345          fi
346        done
347        LINGUAS=$NEW_LINGUAS
348        AC_MSG_RESULT($LINGUAS)
349      fi
350
351      dnl Construct list of names of catalog files to be constructed.
352      if test -n "$LINGUAS"; then
353        for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
354      fi
355    fi
356
357    dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
358    dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
359    dnl Try to locate is.
360    MKINSTALLDIRS=
361    if test -n "$ac_aux_dir"; then
362      MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
363    fi
364    if test -z "$MKINSTALLDIRS"; then
365      MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
366    fi
367    AC_SUBST(MKINSTALLDIRS)
368
369    dnl Generate list of files to be processed by xgettext which will
370    dnl be included in po/Makefile.
371    test -d po || mkdir po
372    if test "x$srcdir" != "x."; then
373      if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
374        posrcprefix="$srcdir/"
375      else
376        posrcprefix="../$srcdir/"
377      fi
378    else
379      posrcprefix="../"
380    fi
381    rm -f po/POTFILES
382    sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
383         < $srcdir/po/POTFILES.in > po/POTFILES
384   ])
385
386 # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE)
387 # -------------------------------
388 # Define VARIABLE to the location where catalog files will
389 # be installed by po/Makefile.
390 glib_DEFUN([GLIB_DEFINE_LOCALEDIR],
391 [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl
392 glib_save_prefix="$prefix"
393 glib_save_exec_prefix="$exec_prefix"
394 glib_save_datarootdir="$datarootdir"
395 test "x$prefix" = xNONE && prefix=$ac_default_prefix
396 test "x$exec_prefix" = xNONE && exec_prefix=$prefix
397 datarootdir=`eval echo "${datarootdir}"`
398 if test "x$CATOBJEXT" = "x.mo" ; then
399   localedir=`eval echo "${libdir}/locale"`
400 else
401   localedir=`eval echo "${datadir}/locale"`
402 fi
403 prefix="$glib_save_prefix"
404 exec_prefix="$glib_save_exec_prefix"
405 datarootdir="$glib_save_datarootdir"
406 AC_DEFINE_UNQUOTED($1, "$localedir",
407   [Define the location where the catalogs will be installed])
408 ])
409
410 dnl
411 dnl Now the definitions that aclocal will find
412 dnl
413 ifdef(glib_configure_in,[],[
414 AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)])
415 AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)])
416 ])dnl
417
418 # GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL])
419
420 # Create a temporary file with TEST-FILE as its contents and pass the
421 # file name to PROGRAM.  Perform ACTION-IF-PASS if PROGRAM exits with
422 # 0 and perform ACTION-IF-FAIL for any other exit status.
423 AC_DEFUN([GLIB_RUN_PROG],
424 [cat >conftest.foo <<_ACEOF
425 $2
426 _ACEOF
427 if AC_RUN_LOG([$1 conftest.foo]); then
428   m4_ifval([$3], [$3], [:])
429 m4_ifvaln([$4], [else $4])dnl
430 echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD
431 sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD
432 fi])
433