X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=doc%2Fgnulib-tool.texi;h=17d5265f1c49cb22dc876c67d3d51fef854043cb;hb=765ede785ea58125c799662bb90440e5c990afa7;hp=8af4a054821e6955d2e4c573b2fc2f559df38e51;hpb=0e88f121165602cfc0885b41f03717e4eaf5910f;p=gnulib.git diff --git a/doc/gnulib-tool.texi b/doc/gnulib-tool.texi index 8af4a0548..17d5265f1 100644 --- a/doc/gnulib-tool.texi +++ b/doc/gnulib-tool.texi @@ -1,7 +1,7 @@ @node Invoking gnulib-tool @chapter Invoking gnulib-tool -@c Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. +@c Copyright (C) 2005-2008 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.2 or @@ -32,6 +32,8 @@ a real run without changing anything. * Modified imports:: Changing the import specification. * Simple update:: Tracking Gnulib development. * Source changes:: Impact of Gnulib on your source files. +* gettextize and autopoint:: Caveat: @code{gettextize} and @code{autopoint} users! +* Localization:: Handling Gnulib's own message translations. * VCS Issues:: Integration with Version Control Systems. @end menu @@ -310,8 +312,10 @@ The argument is the name of the library to be created. Corresponds to the @samp{--lib} command line argument. @item gl_LGPL -The presence of this macro corresponds to the @samp{--lgpl} command line -argument. It takes no arguments. +The presence of this macro without arguments corresponds to the @samp{--lgpl} +command line argument. The presence of this macro with an argument (whose +value must be 2 or 3) corresponds to the @samp{--lgpl=@var{arg}} command line +argument. @item gl_LIBTOOL The presence of this macro corresponds to the @samp{--libtool} command line @@ -368,6 +372,130 @@ used to set system dependent flags (such as @code{_GNU_SOURCE} on GNU systems), and these flags have no effect after any system header file has been included. +@node gettextize and autopoint +@section Caveat: @code{gettextize} and @code{autopoint} users + +@cindex gettextize, caveat +@cindex autopoint, caveat +The programs @code{gettextize} and @code{autopoint}, part of +GNU @code{gettext}, import or update the internationalization infrastructure. +Some of this infrastructure, namely ca.@: 20 autoconf macro files and the +@file{config.rpath} file, is also contained in Gnulib and may be imported +by @code{gnulib-tool}. The use of @code{gettextize} or @code{autopoint} +will therefore overwrite some of the files that @code{gnulib-tool} has +imported, and vice versa. + +Avoiding to use @code{gettextize} (manually, as package maintainer) or +@code{autopoint} (as part of a script like @code{autoreconf} or +@code{autogen.sh}) is not the solution: These programs also import the +infrastructure in the @file{po/} and optionally in the @file{intl/} directory. + +The copies of the conflicting files in Gnulib are more up-to-date than +the copies brought in by @code{gettextize} and @code{autopoint}. When a +new @code{gettext} release is made, the copies of the files in Gnulib will +be updated immediately. + +The solution is therefore: + +@enumerate +@item +When you run @code{gettextize}, always use the @code{gettextize} from the +matching GNU gettext release. For the most recent Gnulib checkout, this is +the newest release found on @url{http://ftp.gnu.org/gnu/gettext/}. For an +older Gnulib snapshot, it is the release that was the most recent release +at the time the Gnulib snapshot was taken. Then, after @code{gettextize}, +invoke @code{gnulib-tool}. + +@item +When a script of yours run @code{autopoint}, invoke @code{gnulib-tool} +afterwards. + +@item +If you get an error message like +@code{*** error: gettext infrastructure mismatch: +using a Makefile.in.in from gettext version ... +but the autoconf macros are from gettext version ...}, +it means that a new GNU gettext release was made, and its autoconf macros +were integrated into Gnulib and now mismatch the @file{po/} infrastructure. +In this case, fetch and install the new GNU gettext release and run +@code{gettextize} followed by @code{gnulib-tool}. +@end enumerate + + +@node Localization +@section Handling Gnulib's own message translations + +Gnulib provides some functions that emit translatable messages using GNU +@code{gettext}. The @samp{gnulib} domain at the +@url{http://translationproject.org/, Translation Project} collects +translations of these messages, which you should incorporate into your +own programs. + +There are two basic ways to achieve this. The first, and older, method +is to list all the source files you use from Gnulib in your own +@file{po/POTFILES.in} file. This will cause all the relevant +translatable strings to be included in your POT file. When you send +this POT file to the Translation Project, translators will normally fill +in the translations of the Gnulib strings from their ``translation +memory'', and send you back updated PO files. + +However, this process is error-prone: you might forget to list some +source files, or the translator might not be using a translation memory +and provide a different translation than another translator, or the +translation might not be kept in sync between Gnulib and your package. +It is also slow and causes substantial extra work, because a human +translator must be in the loop for each language and you will need to +incorporate their work on request. + +For these reasons, a new method was designed and is now recommended. If +you pass the @code{--po-base=@var{directory}} and @code{--po-domain=@var{domain}} +options to @code{gnulib-tool}, then @code{gnulib-tool} will create a +separate directory with its own @file{POTFILES.in}, and fetch current +translations directly from the Translation Project (using +@command{rsync} or @command{wget}, whichever is available). +The POT file in this directory will be called +@file{@var{domain}-gnulib.pot}, depending on the @var{domain} you gave to the +@code{--po-domain} option (typically the same as the package name). +This causes these translations to reside in a separate message domain, +so that they do not clash either with the translations for the main part +of your package nor with those of other packages on the system that use +possibly different versions of Gnulib. +When you use these options, the functions in Gnulib are built +in such a way that they will always use this domain regardless of the +default domain set by @code{textdomain}. + +In order to use this method, you must -- in each program that might use +Gnulib code -- add an extra line to the part of the program that +initializes locale-dependent behavior. Where you would normally write +something like: + +@example +@group + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); +@end group +@end example + +@noindent +you should add an additional @code{bindtextdomain} call to inform +gettext of where the MO files for the extra message domain may be found: + +@example +@group + bindtextdomain (PACKAGE "-gnulib", LOCALEDIR); +@end group +@end example + +(This example assumes that the @var{domain} that you specified +to @code{gnulib-tool} is the same as the value of the @code{PACKAGE} +preprocessor macro.) + +Since you do not change the @code{textdomain} call, the default message +domain for your program remains the same and your own use of @code{gettext} +functions will not be affected. + + @node VCS Issues @section Issues with Version Control Systems @@ -385,10 +513,11 @@ In projects which commit all source files, whether generated or not, into their VCS, the @code{gnulib-tool} generated files should all be committed. Gnulib also contains files generated by @command{make} (and removed by -@code{make clean}), using information determined by @command{configure} +@code{make clean}), using information determined by @command{configure}. They should not be checked into the VCS, but instead added to -@file{.cvsignore}. When you have a Gnulib source file of the form -@file{lib/foo_.h}, the corresponding @file{lib/foo.h} is such a file. +@file{.gitignore} or @file{.cvsignore}. +When you have a Gnulib source file of the form @file{lib/foo.in.h}, the +corresponding @file{lib/foo.h} is such a file. @item In projects which customarily omit from their VCS all files that are generated