summaryrefslogtreecommitdiff
path: root/gtk+-mingw/share/info
diff options
context:
space:
mode:
authorLeo Tenenbaum <pommicket@gmail.com>2018-08-20 20:34:57 -0400
committerLeo Tenenbaum <pommicket@gmail.com>2018-08-20 20:34:57 -0400
commita4460f6d9453bbd7e584937686449cef3e19f052 (patch)
tree037c208f1e20302ed048c0952ef8e3418add9c86 /gtk+-mingw/share/info
Initial commit0.0.0
Diffstat (limited to 'gtk+-mingw/share/info')
-rw-r--r--gtk+-mingw/share/info/autosprintf.info134
-rw-r--r--gtk+-mingw/share/info/dir23
-rw-r--r--gtk+-mingw/share/info/gettext.info18374
-rw-r--r--gtk+-mingw/share/info/libffi.info617
-rw-r--r--gtk+-mingw/share/info/libtool.info140
-rw-r--r--gtk+-mingw/share/info/libtool.info-16698
-rw-r--r--gtk+-mingw/share/info/libtool.info-21227
7 files changed, 27213 insertions, 0 deletions
diff --git a/gtk+-mingw/share/info/autosprintf.info b/gtk+-mingw/share/info/autosprintf.info
new file mode 100644
index 0000000..37af0bd
--- /dev/null
+++ b/gtk+-mingw/share/info/autosprintf.info
@@ -0,0 +1,134 @@
+This is autosprintf.info, produced by makeinfo version 4.13 from
+autosprintf.texi.
+
+INFO-DIR-SECTION C++ libraries
+START-INFO-DIR-ENTRY
+* autosprintf: (autosprintf). Support for printf format strings in C++.
+END-INFO-DIR-ENTRY
+
+ This file provides documentation for GNU `autosprintf' library.
+
+ Copyright (C) 2002-2003, 2006-2007 Free Software Foundation, Inc.
+
+ This manual is free documentation. It is dually licensed under the
+GNU FDL and the GNU GPL. This means that you can redistribute this
+manual under either of these two licenses, at your choice.
+
+ This manual is covered by the GNU FDL. Permission is granted to
+copy, distribute and/or modify this document under the terms of the GNU
+Free Documentation License (FDL), either version 1.2 of the License, or
+(at your option) any later version published by the Free Software
+Foundation (FSF); with no Invariant Sections, with no Front-Cover Text,
+and with no Back-Cover Texts. A copy of the license is at
+`http://www.gnu.org/licenses/fdl.html'.
+
+ This manual is covered by the GNU GPL. You can redistribute it
+and/or modify it under the terms of the GNU General Public License
+(GPL), either version 2 of the License, or (at your option) any later
+version published by the Free Software Foundation (FSF). A copy of the
+license is at `http://www.gnu.org/licenses/gpl.html'.
+
+
+File: autosprintf.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir)
+
+GNU autosprintf
+***************
+
+This manual documents the GNU autosprintf class, version 1.0.
+
+* Menu:
+
+* Introduction:: Introduction
+* Class autosprintf:: The `autosprintf' class
+* Using autosprintf:: Using `autosprintf' in own programs
+
+
+File: autosprintf.info, Node: Introduction, Next: Class autosprintf, Prev: Top, Up: Top
+
+1 Introduction
+**************
+
+This package makes the C formatted output routines (`fprintf' et al.)
+usable in C++ programs, for use with the `<string>' strings and the
+`<iostream>' streams.
+
+ It allows to write code like
+
+ cerr << autosprintf ("syntax error in %s:%d: %s", filename, line, errstring);
+
+instead of
+
+ cerr << "syntax error in " << filename << ":" << line << ": " << errstring;
+
+ The benefits of the autosprintf syntax are:
+
+ * It reuses the standard POSIX printf facility. Easy migration from
+ C to C++.
+
+ * English sentences are kept together.
+
+ * It makes internationalization possible. Internationalization
+ requires format strings, because in some cases the translator
+ needs to change the order of a sentence, and more generally it is
+ easier for the translator to work with a single string for a
+ sentence than with multiple string pieces.
+
+ * It reduces the risk of programming errors due to forgotten state
+ in the output stream (e.g. `cout << hex;' not followed by `cout <<
+ dec;').
+
+
+File: autosprintf.info, Node: Class autosprintf, Next: Using autosprintf, Prev: Introduction, Up: Top
+
+2 The `autosprintf' class
+*************************
+
+An instance of class `autosprintf' just contains a string with the
+formatted output result. Such an instance is usually allocated as an
+automatic storage variable, i.e. on the stack, not with `new' on the
+heap.
+
+ The constructor `autosprintf (const char *format, ...)' takes a
+format string and additional arguments, like the C function `printf'.
+
+ Conversions to `char *' and `std::string' are defined that return
+the encapsulated string. The conversion to `char *' returns a freshly
+allocated copy of the encapsulated string; it needs to be freed using
+`delete[]'. The conversion to `std::string' returns a copy of the
+encapsulated string, with automatic memory management.
+
+ The destructor `~autosprintf ()' destroys the encapsulated string.
+
+ An `operator <<' is provided that outputs the encapsulated string to
+the given `ostream'.
+
+
+File: autosprintf.info, Node: Using autosprintf, Prev: Class autosprintf, Up: Top
+
+3 Using `autosprintf' in own programs
+*************************************
+
+To use the `autosprintf' class in your programs, you need to add
+
+ #include "autosprintf.h"
+ using gnu::autosprintf;
+
+to your source code. The include file defines the class `autosprintf',
+in a namespace called `gnu'. The `using' statement makes it possible to
+use the class without the (otherwise natural) `gnu::' prefix.
+
+ When linking your program, you need to link with `libasprintf',
+because that's where the class is defined. In projects using GNU
+`autoconf', this means adding `AC_LIB_LINKFLAGS([asprintf])' to
+`configure.in' or `configure.ac', and using the @LIBASPRINTF@ Makefile
+variable that it provides.
+
+
+
+Tag Table:
+Node: Top1348
+Node: Introduction1708
+Node: Class autosprintf2859
+Node: Using autosprintf3869
+
+End Tag Table
diff --git a/gtk+-mingw/share/info/dir b/gtk+-mingw/share/info/dir
new file mode 100644
index 0000000..e240bf0
--- /dev/null
+++ b/gtk+-mingw/share/info/dir
@@ -0,0 +1,23 @@
+This is the file .../info/dir, which contains the
+topmost node of the Info hierarchy, called (dir)Top.
+The first time you invoke Info you start off looking at this node.
+
+File: dir, Node: Top This is the top of the INFO tree
+
+ This (the Directory node) gives a menu of major topics.
+ Typing "q" exits, "?" lists all Info commands, "d" returns here,
+ "h" gives a primer for first-timers,
+ "mEmacs<Return>" visits the Emacs manual, etc.
+
+ In Emacs, you can click mouse button 2 on a menu item or cross reference
+ to select it.
+
+* Menu:
+
+GNU programming tools
+* Libtool: (libtool). Generic shared library support script.
+
+Individual utilities
+* libtool-invocation: (libtool)Invoking libtool.
+ Running the `libtool' script.
+* libtoolize: (libtool)Invoking libtoolize. Adding libtool support.
diff --git a/gtk+-mingw/share/info/gettext.info b/gtk+-mingw/share/info/gettext.info
new file mode 100644
index 0000000..abd1869
--- /dev/null
+++ b/gtk+-mingw/share/info/gettext.info
@@ -0,0 +1,18374 @@
+This is gettext.info, produced by makeinfo version 4.13 from
+gettext.texi.
+
+INFO-DIR-SECTION GNU Gettext Utilities
+START-INFO-DIR-ENTRY
+* gettext: (gettext). GNU gettext utilities.
+* autopoint: (gettext)autopoint Invocation. Copy gettext infrastructure.
+* envsubst: (gettext)envsubst Invocation. Expand environment variables.
+* gettextize: (gettext)gettextize Invocation. Prepare a package for gettext.
+* msgattrib: (gettext)msgattrib Invocation. Select part of a PO file.
+* msgcat: (gettext)msgcat Invocation. Combine several PO files.
+* msgcmp: (gettext)msgcmp Invocation. Compare a PO file and template.
+* msgcomm: (gettext)msgcomm Invocation. Match two PO files.
+* msgconv: (gettext)msgconv Invocation. Convert PO file to encoding.
+* msgen: (gettext)msgen Invocation. Create an English PO file.
+* msgexec: (gettext)msgexec Invocation. Process a PO file.
+* msgfilter: (gettext)msgfilter Invocation. Pipe a PO file through a filter.
+* msgfmt: (gettext)msgfmt Invocation. Make MO files out of PO files.
+* msggrep: (gettext)msggrep Invocation. Select part of a PO file.
+* msginit: (gettext)msginit Invocation. Create a fresh PO file.
+* msgmerge: (gettext)msgmerge Invocation. Update a PO file from template.
+* msgunfmt: (gettext)msgunfmt Invocation. Uncompile MO file into PO file.
+* msguniq: (gettext)msguniq Invocation. Unify duplicates for PO file.
+* ngettext: (gettext)ngettext Invocation. Translate a message with plural.
+* xgettext: (gettext)xgettext Invocation. Extract strings into a PO file.
+* ISO639: (gettext)Language Codes. ISO 639 language codes.
+* ISO3166: (gettext)Country Codes. ISO 3166 country codes.
+END-INFO-DIR-ENTRY
+
+ This file provides documentation for GNU `gettext' utilities. It
+also serves as a reference for the free Translation Project.
+
+ Copyright (C) 1995-1998, 2001-2007 Free Software Foundation, Inc.
+
+ This manual is free documentation. It is dually licensed under the
+GNU FDL and the GNU GPL. This means that you can redistribute this
+manual under either of these two licenses, at your choice.
+
+ This manual is covered by the GNU FDL. Permission is granted to
+copy, distribute and/or modify this document under the terms of the GNU
+Free Documentation License (FDL), either version 1.2 of the License, or
+(at your option) any later version published by the Free Software
+Foundation (FSF); with no Invariant Sections, with no Front-Cover Text,
+and with no Back-Cover Texts. A copy of the license is included in
+*note GNU FDL::.
+
+ This manual is covered by the GNU GPL. You can redistribute it
+and/or modify it under the terms of the GNU General Public License
+(GPL), either version 2 of the License, or (at your option) any later
+version published by the Free Software Foundation (FSF). A copy of the
+license is included in *note GNU GPL::.
+
+
+File: gettext.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir)
+
+GNU `gettext' utilities
+***********************
+
+ This manual documents the GNU gettext tools and the GNU libintl
+library, version 0.18.1.
+
+* Menu:
+
+* Introduction:: Introduction
+* Users:: The User's View
+* PO Files:: The Format of PO Files
+* Sources:: Preparing Program Sources
+* Template:: Making the PO Template File
+* Creating:: Creating a New PO File
+* Updating:: Updating Existing PO Files
+* Editing:: Editing PO Files
+* Manipulating:: Manipulating PO Files
+* Binaries:: Producing Binary MO Files
+* Programmers:: The Programmer's View
+* Translators:: The Translator's View
+* Maintainers:: The Maintainer's View
+* Installers:: The Installer's and Distributor's View
+* Programming Languages:: Other Programming Languages
+* Conclusion:: Concluding Remarks
+
+* Language Codes:: ISO 639 language codes
+* Country Codes:: ISO 3166 country codes
+* Licenses:: Licenses
+
+* Program Index:: Index of Programs
+* Option Index:: Index of Command-Line Options
+* Variable Index:: Index of Environment Variables
+* PO Mode Index:: Index of Emacs PO Mode Commands
+* Autoconf Macro Index:: Index of Autoconf Macros
+* Index:: General Index
+
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* Why:: The Purpose of GNU `gettext'
+* Concepts:: I18n, L10n, and Such
+* Aspects:: Aspects in Native Language Support
+* Files:: Files Conveying Translations
+* Overview:: Overview of GNU `gettext'
+
+The User's View
+
+* System Installation:: Questions During Operating System Installation
+* Setting the GUI Locale:: How to Specify the Locale Used by GUI Programs
+* Setting the POSIX Locale:: How to Specify the Locale According to POSIX
+* Installing Localizations:: How to Install Additional Translations
+
+Setting the POSIX Locale
+
+* Locale Names:: How a Locale Specification Looks Like
+* Locale Environment Variables:: Which Environment Variable Specfies What
+* The LANGUAGE variable:: How to Specify a Priority List of Languages
+
+Preparing Program Sources
+
+* Importing:: Importing the `gettext' declaration
+* Triggering:: Triggering `gettext' Operations
+* Preparing Strings:: Preparing Translatable Strings
+* Mark Keywords:: How Marks Appear in Sources
+* Marking:: Marking Translatable Strings
+* c-format Flag:: Telling something about the following string
+* Special cases:: Special Cases of Translatable Strings
+* Bug Report Address:: Letting Users Report Translation Bugs
+* Names:: Marking Proper Names for Translation
+* Libraries:: Preparing Library Sources
+
+Making the PO Template File
+
+* xgettext Invocation:: Invoking the `xgettext' Program
+
+Creating a New PO File
+
+* msginit Invocation:: Invoking the `msginit' Program
+* Header Entry:: Filling in the Header Entry
+
+Updating Existing PO Files
+
+* msgmerge Invocation:: Invoking the `msgmerge' Program
+
+Editing PO Files
+
+* KBabel:: KDE's PO File Editor
+* Gtranslator:: GNOME's PO File Editor
+* PO Mode:: Emacs's PO File Editor
+* Compendium:: Using Translation Compendia
+
+Emacs's PO File Editor
+
+* Installation:: Completing GNU `gettext' Installation
+* Main PO Commands:: Main Commands
+* Entry Positioning:: Entry Positioning
+* Normalizing:: Normalizing Strings in Entries
+* Translated Entries:: Translated Entries
+* Fuzzy Entries:: Fuzzy Entries
+* Untranslated Entries:: Untranslated Entries
+* Obsolete Entries:: Obsolete Entries
+* Modifying Translations:: Modifying Translations
+* Modifying Comments:: Modifying Comments
+* Subedit:: Mode for Editing Translations
+* C Sources Context:: C Sources Context
+* Auxiliary:: Consulting Auxiliary PO Files
+
+Using Translation Compendia
+
+* Creating Compendia:: Merging translations for later use
+* Using Compendia:: Using older translations if they fit
+
+Manipulating PO Files
+
+* msgcat Invocation:: Invoking the `msgcat' Program
+* msgconv Invocation:: Invoking the `msgconv' Program
+* msggrep Invocation:: Invoking the `msggrep' Program
+* msgfilter Invocation:: Invoking the `msgfilter' Program
+* msguniq Invocation:: Invoking the `msguniq' Program
+* msgcomm Invocation:: Invoking the `msgcomm' Program
+* msgcmp Invocation:: Invoking the `msgcmp' Program
+* msgattrib Invocation:: Invoking the `msgattrib' Program
+* msgen Invocation:: Invoking the `msgen' Program
+* msgexec Invocation:: Invoking the `msgexec' Program
+* Colorizing:: Highlighting parts of PO files
+* libgettextpo:: Writing your own programs that process PO files
+
+Highlighting parts of PO files
+
+* The --color option:: Triggering colorized output
+* The TERM variable:: The environment variable `TERM'
+* The --style option:: The `--style' option
+* Style rules:: Style rules for PO files
+* Customizing less:: Customizing `less' for viewing PO files
+
+Producing Binary MO Files
+
+* msgfmt Invocation:: Invoking the `msgfmt' Program
+* msgunfmt Invocation:: Invoking the `msgunfmt' Program
+* MO Files:: The Format of GNU MO Files
+
+The Programmer's View
+
+* catgets:: About `catgets'
+* gettext:: About `gettext'
+* Comparison:: Comparing the two interfaces
+* Using libintl.a:: Using libintl.a in own programs
+* gettext grok:: Being a `gettext' grok
+* Temp Programmers:: Temporary Notes for the Programmers Chapter
+
+About `catgets'
+
+* Interface to catgets:: The interface
+* Problems with catgets:: Problems with the `catgets' interface?!
+
+About `gettext'
+
+* Interface to gettext:: The interface
+* Ambiguities:: Solving ambiguities
+* Locating Catalogs:: Locating message catalog files
+* Charset conversion:: How to request conversion to Unicode
+* Contexts:: Solving ambiguities in GUI programs
+* Plural forms:: Additional functions for handling plurals
+* Optimized gettext:: Optimization of the *gettext functions
+
+Temporary Notes for the Programmers Chapter
+
+* Temp Implementations:: Temporary - Two Possible Implementations
+* Temp catgets:: Temporary - About `catgets'
+* Temp WSI:: Temporary - Why a single implementation
+* Temp Notes:: Temporary - Notes
+
+The Translator's View
+
+* Trans Intro 0:: Introduction 0
+* Trans Intro 1:: Introduction 1
+* Discussions:: Discussions
+* Organization:: Organization
+* Information Flow:: Information Flow
+* Translating plural forms:: How to fill in `msgstr[0]', `msgstr[1]'
+* Prioritizing messages:: How to find which messages to translate first
+
+Organization
+
+* Central Coordination:: Central Coordination
+* National Teams:: National Teams
+* Mailing Lists:: Mailing Lists
+
+National Teams
+
+* Sub-Cultures:: Sub-Cultures
+* Organizational Ideas:: Organizational Ideas
+
+The Maintainer's View
+
+* Flat and Non-Flat:: Flat or Non-Flat Directory Structures
+* Prerequisites:: Prerequisite Works
+* gettextize Invocation:: Invoking the `gettextize' Program
+* Adjusting Files:: Files You Must Create or Alter
+* autoconf macros:: Autoconf macros for use in `configure.ac'
+* CVS Issues:: Integrating with CVS
+* Release Management:: Creating a Distribution Tarball
+
+Files You Must Create or Alter
+
+* po/POTFILES.in:: `POTFILES.in' in `po/'
+* po/LINGUAS:: `LINGUAS' in `po/'
+* po/Makevars:: `Makevars' in `po/'
+* po/Rules-*:: Extending `Makefile' in `po/'
+* configure.ac:: `configure.ac' at top level
+* config.guess:: `config.guess', `config.sub' at top level
+* mkinstalldirs:: `mkinstalldirs' at top level
+* aclocal:: `aclocal.m4' at top level
+* acconfig:: `acconfig.h' at top level
+* config.h.in:: `config.h.in' at top level
+* Makefile:: `Makefile.in' at top level
+* src/Makefile:: `Makefile.in' in `src/'
+* lib/gettext.h:: `gettext.h' in `lib/'
+
+Autoconf macros for use in `configure.ac'
+
+* AM_GNU_GETTEXT:: AM_GNU_GETTEXT in `gettext.m4'
+* AM_GNU_GETTEXT_VERSION:: AM_GNU_GETTEXT_VERSION in `gettext.m4'
+* AM_GNU_GETTEXT_NEED:: AM_GNU_GETTEXT_NEED in `gettext.m4'
+* AM_GNU_GETTEXT_INTL_SUBDIR:: AM_GNU_GETTEXT_INTL_SUBDIR in `intldir.m4'
+* AM_PO_SUBDIRS:: AM_PO_SUBDIRS in `po.m4'
+* AM_ICONV:: AM_ICONV in `iconv.m4'
+
+Integrating with CVS
+
+* Distributed CVS:: Avoiding version mismatch in distributed development
+* Files under CVS:: Files to put under CVS version control
+* autopoint Invocation:: Invoking the `autopoint' Program
+
+Other Programming Languages
+
+* Language Implementors:: The Language Implementor's View
+* Programmers for other Languages:: The Programmer's View
+* Translators for other Languages:: The Translator's View
+* Maintainers for other Languages:: The Maintainer's View
+* List of Programming Languages:: Individual Programming Languages
+* List of Data Formats:: Internationalizable Data
+
+The Translator's View
+
+* c-format:: C Format Strings
+* objc-format:: Objective C Format Strings
+* sh-format:: Shell Format Strings
+* python-format:: Python Format Strings
+* lisp-format:: Lisp Format Strings
+* elisp-format:: Emacs Lisp Format Strings
+* librep-format:: librep Format Strings
+* scheme-format:: Scheme Format Strings
+* smalltalk-format:: Smalltalk Format Strings
+* java-format:: Java Format Strings
+* csharp-format:: C# Format Strings
+* awk-format:: awk Format Strings
+* object-pascal-format:: Object Pascal Format Strings
+* ycp-format:: YCP Format Strings
+* tcl-format:: Tcl Format Strings
+* perl-format:: Perl Format Strings
+* php-format:: PHP Format Strings
+* gcc-internal-format:: GCC internal Format Strings
+* gfc-internal-format:: GFC internal Format Strings
+* qt-format:: Qt Format Strings
+* qt-plural-format:: Qt Plural Format Strings
+* kde-format:: KDE Format Strings
+* boost-format:: Boost Format Strings
+
+Individual Programming Languages
+
+* C:: C, C++, Objective C
+* sh:: sh - Shell Script
+* bash:: bash - Bourne-Again Shell Script
+* Python:: Python
+* Common Lisp:: GNU clisp - Common Lisp
+* clisp C:: GNU clisp C sources
+* Emacs Lisp:: Emacs Lisp
+* librep:: librep
+* Scheme:: GNU guile - Scheme
+* Smalltalk:: GNU Smalltalk
+* Java:: Java
+* C#:: C#
+* gawk:: GNU awk
+* Pascal:: Pascal - Free Pascal Compiler
+* wxWidgets:: wxWidgets library
+* YCP:: YCP - YaST2 scripting language
+* Tcl:: Tcl - Tk's scripting language
+* Perl:: Perl
+* PHP:: PHP Hypertext Preprocessor
+* Pike:: Pike
+* GCC-source:: GNU Compiler Collection sources
+
+sh - Shell Script
+
+* Preparing Shell Scripts:: Preparing Shell Scripts for Internationalization
+* gettext.sh:: Contents of `gettext.sh'
+* gettext Invocation:: Invoking the `gettext' program
+* ngettext Invocation:: Invoking the `ngettext' program
+* envsubst Invocation:: Invoking the `envsubst' program
+* eval_gettext Invocation:: Invoking the `eval_gettext' function
+* eval_ngettext Invocation:: Invoking the `eval_ngettext' function
+
+Perl
+
+* General Problems:: General Problems Parsing Perl Code
+* Default Keywords:: Which Keywords Will xgettext Look For?
+* Special Keywords:: How to Extract Hash Keys
+* Quote-like Expressions:: What are Strings And Quote-like Expressions?
+* Interpolation I:: Invalid String Interpolation
+* Interpolation II:: Valid String Interpolation
+* Parentheses:: When To Use Parentheses
+* Long Lines:: How To Grok with Long Lines
+* Perl Pitfalls:: Bugs, Pitfalls, and Things That Do Not Work
+
+Internationalizable Data
+
+* POT:: POT - Portable Object Template
+* RST:: Resource String Table
+* Glade:: Glade - GNOME user interface description
+
+Concluding Remarks
+
+* History:: History of GNU `gettext'
+* References:: Related Readings
+
+Language Codes
+
+* Usual Language Codes:: Two-letter ISO 639 language codes
+* Rare Language Codes:: Three-letter ISO 639 language codes
+
+Licenses
+
+* GNU GPL:: GNU General Public License
+* GNU LGPL:: GNU Lesser General Public License
+* GNU FDL:: GNU Free Documentation License
+
+
+File: gettext.info, Node: Introduction, Next: Users, Prev: Top, Up: Top
+
+1 Introduction
+**************
+
+ This chapter explains the goals sought in the creation of GNU
+`gettext' and the free Translation Project. Then, it explains a few
+broad concepts around Native Language Support, and positions message
+translation with regard to other aspects of national and cultural
+variance, as they apply to programs. It also surveys those files used
+to convey the translations. It explains how the various tools interact
+in the initial generation of these files, and later, how the maintenance
+cycle should usually operate.
+
+ In this manual, we use _he_ when speaking of the programmer or
+maintainer, _she_ when speaking of the translator, and _they_ when
+speaking of the installers or end users of the translated program.
+This is only a convenience for clarifying the documentation. It is
+_absolutely_ not meant to imply that some roles are more appropriate to
+males or females. Besides, as you might guess, GNU `gettext' is meant
+to be useful for people using computers, whatever their sex, race,
+religion or nationality!
+
+ Please send suggestions and corrections to:
+
+ Internet address:
+ bug-gnu-gettext@gnu.org
+
+Please include the manual's edition number and update date in your
+messages.
+
+* Menu:
+
+* Why:: The Purpose of GNU `gettext'
+* Concepts:: I18n, L10n, and Such
+* Aspects:: Aspects in Native Language Support
+* Files:: Files Conveying Translations
+* Overview:: Overview of GNU `gettext'
+
+
+File: gettext.info, Node: Why, Next: Concepts, Prev: Introduction, Up: Introduction
+
+1.1 The Purpose of GNU `gettext'
+================================
+
+ Usually, programs are written and documented in English, and use
+English at execution time to interact with users. This is true not
+only of GNU software, but also of a great deal of proprietary and free
+software. Using a common language is quite handy for communication
+between developers, maintainers and users from all countries. On the
+other hand, most people are less comfortable with English than with
+their own native language, and would prefer to use their mother tongue
+for day to day's work, as far as possible. Many would simply _love_ to
+see their computer screen showing a lot less of English, and far more
+of their own language.
+
+ However, to many people, this dream might appear so far fetched that
+they may believe it is not even worth spending time thinking about it.
+They have no confidence at all that the dream might ever become true.
+Yet some have not lost hope, and have organized themselves. The
+Translation Project is a formalization of this hope into a workable
+structure, which has a good chance to get all of us nearer the
+achievement of a truly multi-lingual set of programs.
+
+ GNU `gettext' is an important step for the Translation Project, as
+it is an asset on which we may build many other steps. This package
+offers to programmers, translators and even users, a well integrated
+set of tools and documentation. Specifically, the GNU `gettext'
+utilities are a set of tools that provides a framework within which
+other free packages may produce multi-lingual messages. These tools
+include
+
+ * A set of conventions about how programs should be written to
+ support message catalogs.
+
+ * A directory and file naming organization for the message catalogs
+ themselves.
+
+ * A runtime library supporting the retrieval of translated messages.
+
+ * A few stand-alone programs to massage in various ways the sets of
+ translatable strings, or already translated strings.
+
+ * A library supporting the parsing and creation of files containing
+ translated messages.
+
+ * A special mode for Emacs(1) which helps preparing these sets and
+ bringing them up to date.
+
+ GNU `gettext' is designed to minimize the impact of
+internationalization on program sources, keeping this impact as small
+and hardly noticeable as possible. Internationalization has better
+chances of succeeding if it is very light weighted, or at least, appear
+to be so, when looking at program sources.
+
+ The Translation Project also uses the GNU `gettext' distribution as
+a vehicle for documenting its structure and methods. This goes beyond
+the strict technicalities of documenting the GNU `gettext' proper. By
+so doing, translators will find in a single place, as far as possible,
+all they need to know for properly doing their translating work. Also,
+this supplemental documentation might also help programmers, and even
+curious users, in understanding how GNU `gettext' is related to the
+remainder of the Translation Project, and consequently, have a glimpse
+at the _big picture_.
+
+ ---------- Footnotes ----------
+
+ (1) In this manual, all mentions of Emacs refers to either GNU Emacs
+or to XEmacs, which people sometimes call FSF Emacs and Lucid Emacs,
+respectively.
+
+
+File: gettext.info, Node: Concepts, Next: Aspects, Prev: Why, Up: Introduction
+
+1.2 I18n, L10n, and Such
+========================
+
+ Two long words appear all the time when we discuss support of native
+language in programs, and these words have a precise meaning, worth
+being explained here, once and for all in this document. The words are
+_internationalization_ and _localization_. Many people, tired of
+writing these long words over and over again, took the habit of writing
+"i18n" and "l10n" instead, quoting the first and last letter of each
+word, and replacing the run of intermediate letters by a number merely
+telling how many such letters there are. But in this manual, in the
+sake of clarity, we will patiently write the names in full, each time...
+
+ By "internationalization", one refers to the operation by which a
+program, or a set of programs turned into a package, is made aware of
+and able to support multiple languages. This is a generalization
+process, by which the programs are untied from calling only English
+strings or other English specific habits, and connected to generic ways
+of doing the same, instead. Program developers may use various
+techniques to internationalize their programs. Some of these have been
+standardized. GNU `gettext' offers one of these standards. *Note
+Programmers::.
+
+ By "localization", one means the operation by which, in a set of
+programs already internationalized, one gives the program all needed
+information so that it can adapt itself to handle its input and output
+in a fashion which is correct for some native language and cultural
+habits. This is a particularisation process, by which generic methods
+already implemented in an internationalized program are used in
+specific ways. The programming environment puts several functions to
+the programmers disposal which allow this runtime configuration. The
+formal description of specific set of cultural habits for some country,
+together with all associated translations targeted to the same native
+language, is called the "locale" for this language or country. Users
+achieve localization of programs by setting proper values to special
+environment variables, prior to executing those programs, identifying
+which locale should be used.
+
+ In fact, locale message support is only one component of the cultural
+data that makes up a particular locale. There are a whole host of
+routines and functions provided to aid programmers in developing
+internationalized software and which allow them to access the data
+stored in a particular locale. When someone presently refers to a
+particular locale, they are obviously referring to the data stored
+within that particular locale. Similarly, if a programmer is referring
+to "accessing the locale routines", they are referring to the complete
+suite of routines that access all of the locale's information.
+
+ One uses the expression "Native Language Support", or merely NLS,
+for speaking of the overall activity or feature encompassing both
+internationalization and localization, allowing for multi-lingual
+interactions in a program. In a nutshell, one could say that
+internationalization is the operation by which further localizations
+are made possible.
+
+ Also, very roughly said, when it comes to multi-lingual messages,
+internationalization is usually taken care of by programmers, and
+localization is usually taken care of by translators.
+
+
+File: gettext.info, Node: Aspects, Next: Files, Prev: Concepts, Up: Introduction
+
+1.3 Aspects in Native Language Support
+======================================
+
+ For a totally multi-lingual distribution, there are many things to
+translate beyond output messages.
+
+ * As of today, GNU `gettext' offers a complete toolset for
+ translating messages output by C programs. Perl scripts and shell
+ scripts will also need to be translated. Even if there are today
+ some hooks by which this can be done, these hooks are not
+ integrated as well as they should be.
+
+ * Some programs, like `autoconf' or `bison', are able to produce
+ other programs (or scripts). Even if the generating programs
+ themselves are internationalized, the generated programs they
+ produce may need internationalization on their own, and this
+ indirect internationalization could be automated right from the
+ generating program. In fact, quite usually, generating and
+ generated programs could be internationalized independently, as
+ the effort needed is fairly orthogonal.
+
+ * A few programs include textual tables which might need translation
+ themselves, independently of the strings contained in the program
+ itself. For example, RFC 1345 gives an English description for
+ each character which the `recode' program is able to reconstruct
+ at execution. Since these descriptions are extracted from the RFC
+ by mechanical means, translating them properly would require a
+ prior translation of the RFC itself.
+
+ * Almost all programs accept options, which are often worded out so
+ to be descriptive for the English readers; one might want to
+ consider offering translated versions for program options as well.
+
+ * Many programs read, interpret, compile, or are somewhat driven by
+ input files which are texts containing keywords, identifiers, or
+ replies which are inherently translatable. For example, one may
+ want `gcc' to allow diacriticized characters in identifiers or use
+ translated keywords; `rm -i' might accept something else than `y'
+ or `n' for replies, etc. Even if the program will eventually make
+ most of its output in the foreign languages, one has to decide
+ whether the input syntax, option values, etc., are to be localized
+ or not.
+
+ * The manual accompanying a package, as well as all documentation
+ files in the distribution, could surely be translated, too.
+ Translating a manual, with the intent of later keeping up with
+ updates, is a major undertaking in itself, generally.
+
+
+ As we already stressed, translation is only one aspect of locales.
+Other internationalization aspects are system services and are handled
+in GNU `libc'. There are many attributes that are needed to define a
+country's cultural conventions. These attributes include beside the
+country's native language, the formatting of the date and time, the
+representation of numbers, the symbols for currency, etc. These local
+"rules" are termed the country's locale. The locale represents the
+knowledge needed to support the country's native attributes.
+
+ There are a few major areas which may vary between countries and
+hence, define what a locale must describe. The following list helps
+putting multi-lingual messages into the proper context of other tasks
+related to locales. See the GNU `libc' manual for details.
+
+_Characters and Codesets_
+ The codeset most commonly used through out the USA and most English
+ speaking parts of the world is the ASCII codeset. However, there
+ are many characters needed by various locales that are not found
+ within this codeset. The 8-bit ISO 8859-1 code set has most of
+ the special characters needed to handle the major European
+ languages. However, in many cases, choosing ISO 8859-1 is
+ nevertheless not adequate: it doesn't even handle the major
+ European currency. Hence each locale will need to specify which
+ codeset they need to use and will need to have the appropriate
+ character handling routines to cope with the codeset.
+
+_Currency_
+ The symbols used vary from country to country as does the position
+ used by the symbol. Software needs to be able to transparently
+ display currency figures in the native mode for each locale.
+
+_Dates_
+ The format of date varies between locales. For example, Christmas
+ day in 1994 is written as 12/25/94 in the USA and as 25/12/94 in
+ Australia. Other countries might use ISO 8601 dates, etc.
+
+ Time of the day may be noted as HH:MM, HH.MM, or otherwise. Some
+ locales require time to be specified in 24-hour mode rather than
+ as AM or PM. Further, the nature and yearly extent of the
+ Daylight Saving correction vary widely between countries.
+
+_Numbers_
+ Numbers can be represented differently in different locales. For
+ example, the following numbers are all written correctly for their
+ respective locales:
+
+ 12,345.67 English
+ 12.345,67 German
+ 12345,67 French
+ 1,2345.67 Asia
+
+ Some programs could go further and use different unit systems, like
+ English units or Metric units, or even take into account variants
+ about how numbers are spelled in full.
+
+_Messages_
+ The most obvious area is the language support within a locale.
+ This is where GNU `gettext' provides the means for developers and
+ users to easily change the language that the software uses to
+ communicate to the user.
+
+
+ These areas of cultural conventions are called _locale categories_.
+It is an unfortunate term; _locale aspects_ or _locale feature
+categories_ would be a better term, because each "locale category"
+describes an area or task that requires localization. The concrete data
+that describes the cultural conventions for such an area and for a
+particular culture is also called a _locale category_. In this sense,
+a locale is composed of several locale categories: the locale category
+describing the codeset, the locale category describing the formatting
+of numbers, the locale category containing the translated messages, and
+so on.
+
+ Components of locale outside of message handling are standardized in
+the ISO C standard and the POSIX:2001 standard (also known as the SUSV3
+specification). GNU `libc' fully implements this, and most other
+modern systems provide a more or less reasonable support for at least
+some of the missing components.
+
+
+File: gettext.info, Node: Files, Next: Overview, Prev: Aspects, Up: Introduction
+
+1.4 Files Conveying Translations
+================================
+
+ The letters PO in `.po' files means Portable Object, to distinguish
+it from `.mo' files, where MO stands for Machine Object. This
+paradigm, as well as the PO file format, is inspired by the NLS
+standard developed by Uniforum, and first implemented by Sun in their
+Solaris system.
+
+ PO files are meant to be read and edited by humans, and associate
+each original, translatable string of a given package with its
+translation in a particular target language. A single PO file is
+dedicated to a single target language. If a package supports many
+languages, there is one such PO file per language supported, and each
+package has its own set of PO files. These PO files are best created by
+the `xgettext' program, and later updated or refreshed through the
+`msgmerge' program. Program `xgettext' extracts all marked messages
+from a set of C files and initializes a PO file with empty
+translations. Program `msgmerge' takes care of adjusting PO files
+between releases of the corresponding sources, commenting obsolete
+entries, initializing new ones, and updating all source line
+references. Files ending with `.pot' are kind of base translation
+files found in distributions, in PO file format.
+
+ MO files are meant to be read by programs, and are binary in nature.
+A few systems already offer tools for creating and handling MO files as
+part of the Native Language Support coming with the system, but the
+format of these MO files is often different from system to system, and
+non-portable. The tools already provided with these systems don't
+support all the features of GNU `gettext'. Therefore GNU `gettext'
+uses its own format for MO files. Files ending with `.gmo' are really
+MO files, when it is known that these files use the GNU format.
+
+
+File: gettext.info, Node: Overview, Prev: Files, Up: Introduction
+
+1.5 Overview of GNU `gettext'
+=============================
+
+ The following diagram summarizes the relation between the files
+handled by GNU `gettext' and the tools acting on these files. It is
+followed by somewhat detailed explanations, which you should read while
+keeping an eye on the diagram. Having a clear understanding of these
+interrelations will surely help programmers, translators and
+maintainers.
+
+ Original C Sources ---> Preparation ---> Marked C Sources ---.
+ |
+ .---------<--- GNU gettext Library |
+ .--- make <---+ |
+ | `---------<--------------------+---------------'
+ | |
+ | .-----<--- PACKAGE.pot <--- xgettext <---' .---<--- PO Compendium
+ | | | ^
+ | | `---. |
+ | `---. +---> PO editor ---.
+ | +----> msgmerge ------> LANG.po ---->--------' |
+ | .---' |
+ | | |
+ | `-------------<---------------. |
+ | +--- New LANG.po <--------------------'
+ | .--- LANG.gmo <--- msgfmt <---'
+ | |
+ | `---> install ---> /.../LANG/PACKAGE.mo ---.
+ | +---> "Hello world!"
+ `-------> install ---> /.../bin/PROGRAM -------'
+
+ As a programmer, the first step to bringing GNU `gettext' into your
+package is identifying, right in the C sources, those strings which are
+meant to be translatable, and those which are untranslatable. This
+tedious job can be done a little more comfortably using emacs PO mode,
+but you can use any means familiar to you for modifying your C sources.
+Beside this some other simple, standard changes are needed to properly
+initialize the translation library. *Note Sources::, for more
+information about all this.
+
+ For newly written software the strings of course can and should be
+marked while writing it. The `gettext' approach makes this very easy.
+Simply put the following lines at the beginning of each file or in a
+central header file:
+
+ #define _(String) (String)
+ #define N_(String) String
+ #define textdomain(Domain)
+ #define bindtextdomain(Package, Directory)
+
+Doing this allows you to prepare the sources for internationalization.
+Later when you feel ready for the step to use the `gettext' library
+simply replace these definitions by the following:
+
+ #include <libintl.h>
+ #define _(String) gettext (String)
+ #define gettext_noop(String) String
+ #define N_(String) gettext_noop (String)
+
+and link against `libintl.a' or `libintl.so'. Note that on GNU
+systems, you don't need to link with `libintl' because the `gettext'
+library functions are already contained in GNU libc. That is all you
+have to change.
+
+ Once the C sources have been modified, the `xgettext' program is
+used to find and extract all translatable strings, and create a PO
+template file out of all these. This `PACKAGE.pot' file contains all
+original program strings. It has sets of pointers to exactly where in
+C sources each string is used. All translations are set to empty. The
+letter `t' in `.pot' marks this as a Template PO file, not yet oriented
+towards any particular language. *Note xgettext Invocation::, for more
+details about how one calls the `xgettext' program. If you are
+_really_ lazy, you might be interested at working a lot more right
+away, and preparing the whole distribution setup (*note Maintainers::).
+By doing so, you spare yourself typing the `xgettext' command, as `make'
+should now generate the proper things automatically for you!
+
+ The first time through, there is no `LANG.po' yet, so the `msgmerge'
+step may be skipped and replaced by a mere copy of `PACKAGE.pot' to
+`LANG.po', where LANG represents the target language. See *note
+Creating:: for details.
+
+ Then comes the initial translation of messages. Translation in
+itself is a whole matter, still exclusively meant for humans, and whose
+complexity far overwhelms the level of this manual. Nevertheless, a
+few hints are given in some other chapter of this manual (*note
+Translators::). You will also find there indications about how to
+contact translating teams, or becoming part of them, for sharing your
+translating concerns with others who target the same native language.
+
+ While adding the translated messages into the `LANG.po' PO file, if
+you are not using one of the dedicated PO file editors (*note
+Editing::), you are on your own for ensuring that your efforts fully
+respect the PO file format, and quoting conventions (*note PO Files::).
+This is surely not an impossible task, as this is the way many people
+have handled PO files around 1995. On the other hand, by using a PO
+file editor, most details of PO file format are taken care of for you,
+but you have to acquire some familiarity with PO file editor itself.
+
+ If some common translations have already been saved into a compendium
+PO file, translators may use PO mode for initializing untranslated
+entries from the compendium, and also save selected translations into
+the compendium, updating it (*note Compendium::). Compendium files are
+meant to be exchanged between members of a given translation team.
+
+ Programs, or packages of programs, are dynamic in nature: users write
+bug reports and suggestion for improvements, maintainers react by
+modifying programs in various ways. The fact that a package has
+already been internationalized should not make maintainers shy of
+adding new strings, or modifying strings already translated. They just
+do their job the best they can. For the Translation Project to work
+smoothly, it is important that maintainers do not carry translation
+concerns on their already loaded shoulders, and that translators be
+kept as free as possible of programming concerns.
+
+ The only concern maintainers should have is carefully marking new
+strings as translatable, when they should be, and do not otherwise
+worry about them being translated, as this will come in proper time.
+Consequently, when programs and their strings are adjusted in various
+ways by maintainers, and for matters usually unrelated to translation,
+`xgettext' would construct `PACKAGE.pot' files which are evolving over
+time, so the translations carried by `LANG.po' are slowly fading out of
+date.
+
+ It is important for translators (and even maintainers) to understand
+that package translation is a continuous process in the lifetime of a
+package, and not something which is done once and for all at the start.
+After an initial burst of translation activity for a given package,
+interventions are needed once in a while, because here and there,
+translated entries become obsolete, and new untranslated entries
+appear, needing translation.
+
+ The `msgmerge' program has the purpose of refreshing an already
+existing `LANG.po' file, by comparing it with a newer `PACKAGE.pot'
+template file, extracted by `xgettext' out of recent C sources. The
+refreshing operation adjusts all references to C source locations for
+strings, since these strings move as programs are modified. Also,
+`msgmerge' comments out as obsolete, in `LANG.po', those already
+translated entries which are no longer used in the program sources
+(*note Obsolete Entries::). It finally discovers new strings and
+inserts them in the resulting PO file as untranslated entries (*note
+Untranslated Entries::). *Note msgmerge Invocation::, for more
+information about what `msgmerge' really does.
+
+ Whatever route or means taken, the goal is to obtain an updated
+`LANG.po' file offering translations for all strings.
+
+ The temporal mobility, or fluidity of PO files, is an integral part
+of the translation game, and should be well understood, and accepted.
+People resisting it will have a hard time participating in the
+Translation Project, or will give a hard time to other participants! In
+particular, maintainers should relax and include all available official
+PO files in their distributions, even if these have not recently been
+updated, without exerting pressure on the translator teams to get the
+job done. The pressure should rather come from the community of users
+speaking a particular language, and maintainers should consider
+themselves fairly relieved of any concern about the adequacy of
+translation files. On the other hand, translators should reasonably
+try updating the PO files they are responsible for, while the package
+is undergoing pretest, prior to an official distribution.
+
+ Once the PO file is complete and dependable, the `msgfmt' program is
+used for turning the PO file into a machine-oriented format, which may
+yield efficient retrieval of translations by the programs of the
+package, whenever needed at runtime (*note MO Files::). *Note msgfmt
+Invocation::, for more information about all modes of execution for the
+`msgfmt' program.
+
+ Finally, the modified and marked C sources are compiled and linked
+with the GNU `gettext' library, usually through the operation of
+`make', given a suitable `Makefile' exists for the project, and the
+resulting executable is installed somewhere users will find it. The MO
+files themselves should also be properly installed. Given the
+appropriate environment variables are set (*note Setting the POSIX
+Locale::), the program should localize itself automatically, whenever
+it executes.
+
+ The remainder of this manual has the purpose of explaining in depth
+the various steps outlined above.
+
+
+File: gettext.info, Node: Users, Next: PO Files, Prev: Introduction, Up: Top
+
+2 The User's View
+*****************
+
+ Nowadays, when users log into a computer, they usually find that all
+their programs show messages in their native language - at least for
+users of languages with an active free software community, like French
+or German; to a lesser extent for languages with a smaller
+participation in free software and the GNU project, like Hindi and
+Filipino.
+
+ How does this work? How can the user influence the language that is
+used by the programs? This chapter will answer it.
+
+* Menu:
+
+* System Installation:: Questions During Operating System Installation
+* Setting the GUI Locale:: How to Specify the Locale Used by GUI Programs
+* Setting the POSIX Locale:: How to Specify the Locale According to POSIX
+* Installing Localizations:: How to Install Additional Translations
+
+
+File: gettext.info, Node: System Installation, Next: Setting the GUI Locale, Prev: Users, Up: Users
+
+2.1 Operating System Installation
+=================================
+
+ The default language is often already specified during operating
+system installation. When the operating system is installed, the
+installer typically asks for the language used for the installation
+process and, separately, for the language to use in the installed
+system. Some OS installers only ask for the language once.
+
+ This determines the system-wide default language for all users. But
+the installers often give the possibility to install extra
+localizations for additional languages. For example, the localizations
+of KDE (the K Desktop Environment) and OpenOffice.org are often bundled
+separately, as one installable package per language.
+
+ At this point it is good to consider the intended use of the
+machine: If it is a machine designated for personal use, additional
+localizations are probably not necessary. If, however, the machine is
+in use in an organization or company that has international
+relationships, one can consider the needs of guest users. If you have
+a guest from abroad, for a week, what could be his preferred locales?
+It may be worth installing these additional localizations ahead of
+time, since they cost only a bit of disk space at this point.
+
+ The system-wide default language is the locale configuration that is
+used when a new user account is created. But the user can have his own
+locale configuration that is different from the one of the other users
+of the same machine. He can specify it, typically after the first
+login, as described in the next section.
+
+
+File: gettext.info, Node: Setting the GUI Locale, Next: Setting the POSIX Locale, Prev: System Installation, Up: Users
+
+2.2 Setting the Locale Used by GUI Programs
+===========================================
+
+ The immediately available programs in a user's desktop come from a
+group of programs called a "desktop environment"; it usually includes
+the window manager, a web browser, a text editor, and more. The most
+common free desktop environments are KDE, GNOME, and Xfce.
+
+ The locale used by GUI programs of the desktop environment can be
+specified in a configuration screen called "control center", "language
+settings" or "country settings".
+
+ Individual GUI programs that are not part of the desktop environment
+can have their locale specified either in a settings panel, or through
+environment variables.
+
+ For some programs, it is possible to specify the locale through
+environment variables, possibly even to a different locale than the
+desktop's locale. This means, instead of starting a program through a
+menu or from the file system, you can start it from the command-line,
+after having set some environment variables. The environment variables
+can be those specified in the next section (*note Setting the POSIX
+Locale::); for some versions of KDE, however, the locale is specified
+through a variable `KDE_LANG', rather than `LANG' or `LC_ALL'.
+
+
+File: gettext.info, Node: Setting the POSIX Locale, Next: Installing Localizations, Prev: Setting the GUI Locale, Up: Users
+
+2.3 Setting the Locale through Environment Variables
+====================================================
+
+ As a user, if your language has been installed for this package, in
+the simplest case, you only have to set the `LANG' environment variable
+to the appropriate `LL_CC' combination. For example, let's suppose
+that you speak German and live in Germany. At the shell prompt, merely
+execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in
+`sh') or `export LANG=de_DE' (in `bash'). This can be done from your
+`.login' or `.profile' file, once and for all.
+
+* Menu:
+
+* Locale Names:: How a Locale Specification Looks Like
+* Locale Environment Variables:: Which Environment Variable Specfies What
+* The LANGUAGE variable:: How to Specify a Priority List of Languages
+
+
+File: gettext.info, Node: Locale Names, Next: Locale Environment Variables, Prev: Setting the POSIX Locale, Up: Setting the POSIX Locale
+
+2.3.1 Locale Names
+------------------
+
+ A locale name usually has the form `LL_CC'. Here `LL' is an ISO 639
+two-letter language code, and `CC' is an ISO 3166 two-letter country
+code. For example, for German in Germany, LL is `de', and CC is `DE'.
+You find a list of the language codes in appendix *note Language
+Codes:: and a list of the country codes in appendix *note Country
+Codes::.
+
+ You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries. For
+example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The
+country code serves to distinguish the dialects.
+
+ Many locale names have an extended syntax `LL_CC.ENCODING' that also
+specifies the character encoding. These are in use because between
+2000 and 2005, most users have switched to locales in UTF-8 encoding.
+For example, the German locale on glibc systems is nowadays
+`de_DE.UTF-8'. The older name `de_DE' still refers to the German
+locale as of 2000 that stores characters in ISO-8859-1 encoding - a
+text encoding that cannot even accomodate the Euro currency sign.
+
+ Some locale names use `LL_CC.@VARIANT' instead of `LL_CC'. The
+`@VARIANT' can denote any kind of characteristics that is not already
+implied by the language LL and the country CC. It can denote a
+particular monetary unit. For example, on glibc systems, `de_DE@euro'
+denotes the locale that uses the Euro currency, in contrast to the
+older locale `de_DE' which implies the use of the currency before 2002.
+It can also denote a dialect of the language, or the script used to
+write text (for example, `sr_RS@latin' uses the Latin script, whereas
+`sr_RS' uses the Cyrillic script to write Serbian), or the orthography
+rules, or similar.
+
+ On other systems, some variations of this scheme are used, such as
+`LL'. You can get the list of locales supported by your system for
+your language by running the command `locale -a | grep '^LL''.
+
+ There is also a special locale, called `C'. When it is used, it
+disables all localization: in this locale, all programs standardized by
+POSIX use English messages and an unspecified character encoding (often
+US-ASCII, but sometimes also ISO-8859-1 or UTF-8, depending on the
+operating system).
+
+
+File: gettext.info, Node: Locale Environment Variables, Next: The LANGUAGE variable, Prev: Locale Names, Up: Setting the POSIX Locale
+
+2.3.2 Locale Environment Variables
+----------------------------------
+
+ A locale is composed of several _locale categories_, see *note
+Aspects::. When a program looks up locale dependent values, it does
+this according to the following environment variables, in priority
+order:
+
+ 1. `LANGUAGE'
+
+ 2. `LC_ALL'
+
+ 3. `LC_xxx', according to selected locale category: `LC_CTYPE',
+ `LC_NUMERIC', `LC_TIME', `LC_COLLATE', `LC_MONETARY',
+ `LC_MESSAGES', ...
+
+ 4. `LANG'
+
+ Variables whose value is set but is empty are ignored in this lookup.
+
+ `LANG' is the normal environment variable for specifying a locale.
+As a user, you normally set this variable (unless some of the other
+variables have already been set by the system, in `/etc/profile' or
+similar initialization files).
+
+ `LC_CTYPE', `LC_NUMERIC', `LC_TIME', `LC_COLLATE', `LC_MONETARY',
+`LC_MESSAGES', and so on, are the environment variables meant to
+override `LANG' and affecting a single locale category only. For
+example, assume you are a Swedish user in Spain, and you want your
+programs to handle numbers and dates according to Spanish conventions,
+and only the messages should be in Swedish. Then you could create a
+locale named `sv_ES' or `sv_ES.UTF-8' by use of the `localedef'
+program. But it is simpler, and achieves the same effect, to set the
+`LANG' variable to `es_ES.UTF-8' and the `LC_MESSAGES' variable to
+`sv_SE.UTF-8'; these two locales come already preinstalled with the
+operating system.
+
+ `LC_ALL' is an environment variable that overrides all of these. It
+is typically used in scripts that run particular programs. For example,
+`configure' scripts generated by GNU autoconf use `LC_ALL' to make sure
+that the configuration tests don't operate in locale dependent ways.
+
+ Some systems, unfortunately, set `LC_ALL' in `/etc/profile' or in
+similar initialization files. As a user, you therefore have to unset
+this variable if you want to set `LANG' and optionally some of the other
+`LC_xxx' variables.
+
+ The `LANGUAGE' variable is described in the next subsection.
+
+
+File: gettext.info, Node: The LANGUAGE variable, Prev: Locale Environment Variables, Up: Setting the POSIX Locale
+
+2.3.3 Specifying a Priority List of Languages
+---------------------------------------------
+
+ Not all programs have translations for all languages. By default, an
+English message is shown in place of a nonexistent translation. If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LC_ALL'
+and `LANG' for the purpose of message handling, but you still need to
+have `LANG' (or `LC_ALL') set to the primary language; this is required
+by other parts of the system libraries. For example, some Swedish
+users who would rather read translations in German than English for
+when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving
+`LANG' to `sv_SE'.
+
+ Special advice for Norwegian users: The language code for Norwegian
+bokma*l changed from `no' to `nb' recently (in 2003). During the
+transition period, while some message catalogs for this language are
+installed under `nb' and some older ones under `no', it is recommended
+for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and
+older translations are used.
+
+ In the `LANGUAGE' environment variable, but not in the other
+environment variables, `LL_CC' combinations can be abbreviated as `LL'
+to denote the language's main dialect. For example, `de' is equivalent
+to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+(Portuguese as spoken in Portugal) in this context.
+
+ Note: The variable `LANGUAGE' is ignored if the locale is set to
+`C'. In other words, you have to first enable localization, by setting
+`LANG' (or `LC_ALL') to a value other than `C', before you can use a
+language priority list through the `LANGUAGE' variable.
+
+
+File: gettext.info, Node: Installing Localizations, Prev: Setting the POSIX Locale, Up: Users
+
+2.4 Installing Translations for Particular Programs
+===================================================
+
+ Languages are not equally well supported in all packages using GNU
+`gettext', and more translations are added over time. Usually, you use
+the translations that are shipped with the operating system or with
+particular packages that you install afterwards. But you can also
+install newer localizations directly. For doing this, you will need an
+understanding where each localization file is stored on the file system.
+
+ For programs that participate in the Translation Project, you can
+start looking for translations here:
+`http://translationproject.org/team/index.html'. A snapshot of this
+information is also found in the `ABOUT-NLS' file that is shipped with
+GNU gettext.
+
+ For programs that are part of the KDE project, the starting point is:
+`http://i18n.kde.org/'.
+
+ For programs that are part of the GNOME project, the starting point
+is: `http://www.gnome.org/i18n/'.
+
+ For other programs, you may check whether the program's source code
+package contains some `LL.po' files; often they are kept together in a
+directory called `po/'. Each `LL.po' file contains the message
+translations for the language whose abbreviation of LL.
+
+
+File: gettext.info, Node: PO Files, Next: Sources, Prev: Users, Up: Top
+
+3 The Format of PO Files
+************************
+
+ The GNU `gettext' toolset helps programmers and translators at
+producing, updating and using translation files, mainly those PO files
+which are textual, editable files. This chapter explains the format of
+PO files.
+
+ A PO file is made up of many entries, each entry holding the relation
+between an original untranslated string and its corresponding
+translation. All entries in a given PO file usually pertain to a
+single project, and all translations are expressed in a single target
+language. One PO file "entry" has the following schematic structure:
+
+ WHITE-SPACE
+ # TRANSLATOR-COMMENTS
+ #. EXTRACTED-COMMENTS
+ #: REFERENCE...
+ #, FLAG...
+ #| msgid PREVIOUS-UNTRANSLATED-STRING
+ msgid UNTRANSLATED-STRING
+ msgstr TRANSLATED-STRING
+
+ The general structure of a PO file should be well understood by the
+translator. When using PO mode, very little has to be known about the
+format details, as PO mode takes care of them for her.
+
+ A simple entry can look like this:
+
+ #: lib/error.c:116
+ msgid "Unknown system error"
+ msgstr "Error desconegut del sistema"
+
+ Entries begin with some optional white space. Usually, when
+generated through GNU `gettext' tools, there is exactly one blank line
+between entries. Then comments follow, on lines all starting with the
+character `#'. There are two kinds of comments: those which have some
+white space immediately following the `#' - the TRANSLATOR COMMENTS -,
+which comments are created and maintained exclusively by the
+translator, and those which have some non-white character just after the
+`#' - the AUTOMATIC COMMENTS -, which comments are created and
+maintained automatically by GNU `gettext' tools. Comment lines
+starting with `#.' contain comments given by the programmer, directed
+at the translator; these comments are called EXTRACTED COMMENTS because
+the `xgettext' program extracts them from the program's source code.
+Comment lines starting with `#:' contain references to the program's
+source code. Comment lines starting with `#,' contain flags; more
+about these below. Comment lines starting with `#|' contain the
+previous untranslated string for which the translator gave a
+translation.
+
+ All comments, of either kind, are optional.
+
+ After white space and comments, entries show two strings, namely
+first the untranslated string as it appears in the original program
+sources, and then, the translation of this string. The original string
+is introduced by the keyword `msgid', and the translation, by `msgstr'.
+The two strings, untranslated and translated, are quoted in various
+ways in the PO file, using `"' delimiters and `\' escapes, but the
+translator does not really have to pay attention to the precise quoting
+format, as PO mode fully takes care of quoting for her.
+
+ The `msgid' strings, as well as automatic comments, are produced and
+managed by other GNU `gettext' tools, and PO mode does not provide
+means for the translator to alter these. The most she can do is merely
+deleting them, and only by deleting the whole entry. On the other
+hand, the `msgstr' string, as well as translator comments, are really
+meant for the translator, and PO mode gives her the full control she
+needs.
+
+ The comment lines beginning with `#,' are special because they are
+not completely ignored by the programs as comments generally are. The
+comma separated list of FLAGs is used by the `msgfmt' program to give
+the user some better diagnostic messages. Currently there are two
+forms of flags defined:
+
+`fuzzy'
+ This flag can be generated by the `msgmerge' program or it can be
+ inserted by the translator herself. It shows that the `msgstr'
+ string might not be a correct translation (anymore). Only the
+ translator can judge if the translation requires further
+ modification, or is acceptable as is. Once satisfied with the
+ translation, she then removes this `fuzzy' attribute. The
+ `msgmerge' program inserts this when it combined the `msgid' and
+ `msgstr' entries after fuzzy search only. *Note Fuzzy Entries::.
+
+`c-format'
+`no-c-format'
+ These flags should not be added by a human. Instead only the
+ `xgettext' program adds them. In an automated PO file processing
+ system as proposed here, the user's changes would be thrown away
+ again as soon as the `xgettext' program generates a new template
+ file.
+
+ The `c-format' flag indicates that the untranslated string and the
+ translation are supposed to be C format strings. The `no-c-format'
+ flag indicates that they are not C format strings, even though the
+ untranslated string happens to look like a C format string (with
+ `%' directives).
+
+ When the `c-format' flag is given for a string the `msgfmt'
+ program does some more tests to check the validity of the
+ translation. *Note msgfmt Invocation::, *note c-format Flag:: and
+ *note c-format::.
+
+`objc-format'
+`no-objc-format'
+ Likewise for Objective C, see *note objc-format::.
+
+`sh-format'
+`no-sh-format'
+ Likewise for Shell, see *note sh-format::.
+
+`python-format'
+`no-python-format'
+ Likewise for Python, see *note python-format::.
+
+`lisp-format'
+`no-lisp-format'
+ Likewise for Lisp, see *note lisp-format::.
+
+`elisp-format'
+`no-elisp-format'
+ Likewise for Emacs Lisp, see *note elisp-format::.
+
+`librep-format'
+`no-librep-format'
+ Likewise for librep, see *note librep-format::.
+
+`scheme-format'
+`no-scheme-format'
+ Likewise for Scheme, see *note scheme-format::.
+
+`smalltalk-format'
+`no-smalltalk-format'
+ Likewise for Smalltalk, see *note smalltalk-format::.
+
+`java-format'
+`no-java-format'
+ Likewise for Java, see *note java-format::.
+
+`csharp-format'
+`no-csharp-format'
+ Likewise for C#, see *note csharp-format::.
+
+`awk-format'
+`no-awk-format'
+ Likewise for awk, see *note awk-format::.
+
+`object-pascal-format'
+`no-object-pascal-format'
+ Likewise for Object Pascal, see *note object-pascal-format::.
+
+`ycp-format'
+`no-ycp-format'
+ Likewise for YCP, see *note ycp-format::.
+
+`tcl-format'
+`no-tcl-format'
+ Likewise for Tcl, see *note tcl-format::.
+
+`perl-format'
+`no-perl-format'
+ Likewise for Perl, see *note perl-format::.
+
+`perl-brace-format'
+`no-perl-brace-format'
+ Likewise for Perl brace, see *note perl-format::.
+
+`php-format'
+`no-php-format'
+ Likewise for PHP, see *note php-format::.
+
+`gcc-internal-format'
+`no-gcc-internal-format'
+ Likewise for the GCC sources, see *note gcc-internal-format::.
+
+`gfc-internal-format'
+`no-gfc-internal-format'
+ Likewise for the GNU Fortran Compiler sources, see *note
+ gfc-internal-format::.
+
+`qt-format'
+`no-qt-format'
+ Likewise for Qt, see *note qt-format::.
+
+`qt-plural-format'
+`no-qt-plural-format'
+ Likewise for Qt plural forms, see *note qt-plural-format::.
+
+`kde-format'
+`no-kde-format'
+ Likewise for KDE, see *note kde-format::.
+
+`boost-format'
+`no-boost-format'
+ Likewise for Boost, see *note boost-format::.
+
+
+ It is also possible to have entries with a context specifier. They
+look like this:
+
+ WHITE-SPACE
+ # TRANSLATOR-COMMENTS
+ #. EXTRACTED-COMMENTS
+ #: REFERENCE...
+ #, FLAG...
+ #| msgctxt PREVIOUS-CONTEXT
+ #| msgid PREVIOUS-UNTRANSLATED-STRING
+ msgctxt CONTEXT
+ msgid UNTRANSLATED-STRING
+ msgstr TRANSLATED-STRING
+
+ The context serves to disambiguate messages with the same
+UNTRANSLATED-STRING. It is possible to have several entries with the
+same UNTRANSLATED-STRING in a PO file, provided that they each have a
+different CONTEXT. Note that an empty CONTEXT string and an absent
+`msgctxt' line do not mean the same thing.
+
+ A different kind of entries is used for translations which involve
+plural forms.
+
+ WHITE-SPACE
+ # TRANSLATOR-COMMENTS
+ #. EXTRACTED-COMMENTS
+ #: REFERENCE...
+ #, FLAG...
+ #| msgid PREVIOUS-UNTRANSLATED-STRING-SINGULAR
+ #| msgid_plural PREVIOUS-UNTRANSLATED-STRING-PLURAL
+ msgid UNTRANSLATED-STRING-SINGULAR
+ msgid_plural UNTRANSLATED-STRING-PLURAL
+ msgstr[0] TRANSLATED-STRING-CASE-0
+ ...
+ msgstr[N] TRANSLATED-STRING-CASE-N
+
+ Such an entry can look like this:
+
+ #: src/msgcmp.c:338 src/po-lex.c:699
+ #, c-format
+ msgid "found %d fatal error"
+ msgid_plural "found %d fatal errors"
+ msgstr[0] "s'ha trobat %d error fatal"
+ msgstr[1] "s'han trobat %d errors fatals"
+
+ Here also, a `msgctxt' context can be specified before `msgid', like
+above.
+
+ Here, additional kinds of flags can be used:
+
+`range:'
+ This flag is followed by a range of non-negative numbers, using
+ the syntax `range: MINIMUM-VALUE..MAXIMUM-VALUE'. It designates
+ the possible values that the numeric parameter of the message can
+ take. In some languages, translators may produce slightly better
+ translations if they know that the value can only take on values
+ between 0 and 10, for example.
+
+ The PREVIOUS-UNTRANSLATED-STRING is optionally inserted by the
+`msgmerge' program, at the same time when it marks a message fuzzy. It
+helps the translator to see which changes were done by the developers
+on the UNTRANSLATED-STRING.
+
+ It happens that some lines, usually whitespace or comments, follow
+the very last entry of a PO file. Such lines are not part of any entry,
+and will be dropped when the PO file is processed by the tools, or may
+disturb some PO file editors.
+
+ The remainder of this section may be safely skipped by those using a
+PO file editor, yet it may be interesting for everybody to have a better
+idea of the precise format of a PO file. On the other hand, those
+wishing to modify PO files by hand should carefully continue reading on.
+
+ Each of UNTRANSLATED-STRING and TRANSLATED-STRING respects the C
+syntax for a character string, including the surrounding quotes and
+embedded backslashed escape sequences. When the time comes to write
+multi-line strings, one should not use escaped newlines. Instead, a
+closing quote should follow the last character on the line to be
+continued, and an opening quote should resume the string at the
+beginning of the following PO file line. For example:
+
+ msgid ""
+ "Here is an example of how one might continue a very long string\n"
+ "for the common case the string represents multi-line output.\n"
+
+In this example, the empty string is used on the first line, to allow
+better alignment of the `H' from the word `Here' over the `f' from the
+word `for'. In this example, the `msgid' keyword is followed by three
+strings, which are meant to be concatenated. Concatenating the empty
+string does not change the resulting overall string, but it is a way
+for us to comply with the necessity of `msgid' to be followed by a
+string on the same line, while keeping the multi-line presentation
+left-justified, as we find this to be a cleaner disposition. The empty
+string could have been omitted, but only if the string starting with
+`Here' was promoted on the first line, right after `msgid'.(1) It was
+not really necessary either to switch between the two last quoted
+strings immediately after the newline `\n', the switch could have
+occurred after _any_ other character, we just did it this way because
+it is neater.
+
+ One should carefully distinguish between end of lines marked as `\n'
+_inside_ quotes, which are part of the represented string, and end of
+lines in the PO file itself, outside string quotes, which have no
+incidence on the represented string.
+
+ Outside strings, white lines and comments may be used freely.
+Comments start at the beginning of a line with `#' and extend until the
+end of the PO file line. Comments written by translators should have
+the initial `#' immediately followed by some white space. If the `#'
+is not immediately followed by white space, this comment is most likely
+generated and managed by specialized GNU tools, and might disappear or
+be replaced unexpectedly when the PO file is given to `msgmerge'.
+
+ ---------- Footnotes ----------
+
+ (1) This limitation is not imposed by GNU `gettext', but is for
+compatibility with the `msgfmt' implementation on Solaris.
+
+
+File: gettext.info, Node: Sources, Next: Template, Prev: PO Files, Up: Top
+
+4 Preparing Program Sources
+***************************
+
+ For the programmer, changes to the C source code fall into three
+categories. First, you have to make the localization functions known
+to all modules needing message translation. Second, you should
+properly trigger the operation of GNU `gettext' when the program
+initializes, usually from the `main' function. Last, you should
+identify, adjust and mark all constant strings in your program needing
+translation.
+
+* Menu:
+
+* Importing:: Importing the `gettext' declaration
+* Triggering:: Triggering `gettext' Operations
+* Preparing Strings:: Preparing Translatable Strings
+* Mark Keywords:: How Marks Appear in Sources
+* Marking:: Marking Translatable Strings
+* c-format Flag:: Telling something about the following string
+* Special cases:: Special Cases of Translatable Strings
+* Bug Report Address:: Letting Users Report Translation Bugs
+* Names:: Marking Proper Names for Translation
+* Libraries:: Preparing Library Sources
+
+
+File: gettext.info, Node: Importing, Next: Triggering, Prev: Sources, Up: Sources
+
+4.1 Importing the `gettext' declaration
+=======================================
+
+ Presuming that your set of programs, or package, has been adjusted
+so all needed GNU `gettext' files are available, and your `Makefile'
+files are adjusted (*note Maintainers::), each C module having
+translated C strings should contain the line:
+
+ #include <libintl.h>
+
+ Similarly, each C module containing `printf()'/`fprintf()'/...
+calls with a format string that could be a translated C string (even if
+the C string comes from a different C module) should contain the line:
+
+ #include <libintl.h>
+
+
+File: gettext.info, Node: Triggering, Next: Preparing Strings, Prev: Importing, Up: Sources
+
+4.2 Triggering `gettext' Operations
+===================================
+
+ The initialization of locale data should be done with more or less
+the same code in every program, as demonstrated below:
+
+ int
+ main (int argc, char *argv[])
+ {
+ ...
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+ ...
+ }
+
+ PACKAGE and LOCALEDIR should be provided either by `config.h' or by
+the Makefile. For now consult the `gettext' or `hello' sources for
+more information.
+
+ The use of `LC_ALL' might not be appropriate for you. `LC_ALL'
+includes all locale categories and especially `LC_CTYPE'. This latter
+category is responsible for determining character classes with the
+`isalnum' etc. functions from `ctype.h' which could especially for
+programs, which process some kind of input language, be wrong. For
+example this would mean that a source code using the ç (c-cedilla
+character) is runnable in France but not in the U.S.
+
+ Some systems also have problems with parsing numbers using the
+`scanf' functions if an other but the `LC_ALL' locale category is used.
+The standards say that additional formats but the one known in the
+`"C"' locale might be recognized. But some systems seem to reject
+numbers in the `"C"' locale format. In some situation, it might also
+be a problem with the notation itself which makes it impossible to
+recognize whether the number is in the `"C"' locale or the local
+format. This can happen if thousands separator characters are used.
+Some locales define this character according to the national
+conventions to `'.'' which is the same character used in the `"C"'
+locale to denote the decimal point.
+
+ So it is sometimes necessary to replace the `LC_ALL' line in the
+code above by a sequence of `setlocale' lines
+
+ {
+ ...
+ setlocale (LC_CTYPE, "");
+ setlocale (LC_MESSAGES, "");
+ ...
+ }
+
+On all POSIX conformant systems the locale categories `LC_CTYPE',
+`LC_MESSAGES', `LC_COLLATE', `LC_MONETARY', `LC_NUMERIC', and `LC_TIME'
+are available. On some systems which are only ISO C compliant,
+`LC_MESSAGES' is missing, but a substitute for it is defined in GNU
+gettext's `<libintl.h>' and in GNU gnulib's `<locale.h>'.
+
+ Note that changing the `LC_CTYPE' also affects the functions
+declared in the `<ctype.h>' standard header and some functions declared
+in the `<string.h>' and `<stdlib.h>' standard headers. If this is not
+desirable in your application (for example in a compiler's parser), you
+can use a set of substitute functions which hardwire the C locale, such
+as found in the modules `c-ctype', `c-strcase', `c-strcasestr',
+`c-strtod', `c-strtold' in the GNU gnulib source distribution.
+
+ It is also possible to switch the locale forth and back between the
+environment dependent locale and the C locale, but this approach is
+normally avoided because a `setlocale' call is expensive, because it is
+tedious to determine the places where a locale switch is needed in a
+large program's source, and because switching a locale is not
+multithread-safe.
+
+
+File: gettext.info, Node: Preparing Strings, Next: Mark Keywords, Prev: Triggering, Up: Sources
+
+4.3 Preparing Translatable Strings
+==================================
+
+ Before strings can be marked for translations, they sometimes need to
+be adjusted. Usually preparing a string for translation is done right
+before marking it, during the marking phase which is described in the
+next sections. What you have to keep in mind while doing that is the
+following.
+
+ * Decent English style.
+
+ * Entire sentences.
+
+ * Split at paragraphs.
+
+ * Use format strings instead of string concatenation.
+
+ * Avoid unusual markup and unusual control characters.
+
+Let's look at some examples of these guidelines.
+
+ Translatable strings should be in good English style. If slang
+language with abbreviations and shortcuts is used, often translators
+will not understand the message and will produce very inappropriate
+translations.
+
+ "%s: is parameter\n"
+
+This is nearly untranslatable: Is the displayed item _a_ parameter or
+_the_ parameter?
+
+ "No match"
+
+The ambiguity in this message makes it unintelligible: Is the program
+attempting to set something on fire? Does it mean "The given object does
+not match the template"? Does it mean "The template does not fit for any
+of the objects"?
+
+ In both cases, adding more words to the message will help both the
+translator and the English speaking user.
+
+ Translatable strings should be entire sentences. It is often not
+possible to translate single verbs or adjectives in a substitutable way.
+
+ printf ("File %s is %s protected", filename, rw ? "write" : "read");
+
+Most translators will not look at the source and will thus only see the
+string `"File %s is %s protected"', which is unintelligible. Change
+this to
+
+ printf (rw ? "File %s is write protected" : "File %s is read protected",
+ filename);
+
+This way the translator will not only understand the message, she will
+also be able to find the appropriate grammatical construction. A French
+translator for example translates "write protected" like "protected
+against writing".
+
+ Entire sentences are also important because in many languages, the
+declination of some word in a sentence depends on the gender or the
+number (singular/plural) of another part of the sentence. There are
+usually more interdependencies between words than in English. The
+consequence is that asking a translator to translate two half-sentences
+and then combining these two half-sentences through dumb string
+concatenation will not work, for many languages, even though it would
+work for English. That's why translators need to handle entire
+sentences.
+
+ Often sentences don't fit into a single line. If a sentence is
+output using two subsequent `printf' statements, like this
+
+ printf ("Locale charset \"%s\" is different from\n", lcharset);
+ printf ("input file charset \"%s\".\n", fcharset);
+
+the translator would have to translate two half sentences, but nothing
+in the POT file would tell her that the two half sentences belong
+together. It is necessary to merge the two `printf' statements so that
+the translator can handle the entire sentence at once and decide at
+which place to insert a line break in the translation (if at all):
+
+ printf ("Locale charset \"%s\" is different from\n\
+ input file charset \"%s\".\n", lcharset, fcharset);
+
+ You may now ask: how about two or more adjacent sentences? Like in
+this case:
+
+ puts ("Apollo 13 scenario: Stack overflow handling failed.");
+ puts ("On the next stack overflow we will crash!!!");
+
+Should these two statements merged into a single one? I would recommend
+to merge them if the two sentences are related to each other, because
+then it makes it easier for the translator to understand and translate
+both. On the other hand, if one of the two messages is a stereotypic
+one, occurring in other places as well, you will do a favour to the
+translator by not merging the two. (Identical messages occurring in
+several places are combined by xgettext, so the translator has to
+handle them once only.)
+
+ Translatable strings should be limited to one paragraph; don't let a
+single message be longer than ten lines. The reason is that when the
+translatable string changes, the translator is faced with the task of
+updating the entire translated string. Maybe only a single word will
+have changed in the English string, but the translator doesn't see that
+(with the current translation tools), therefore she has to proofread
+the entire message.
+
+ Many GNU programs have a `--help' output that extends over several
+screen pages. It is a courtesy towards the translators to split such a
+message into several ones of five to ten lines each. While doing that,
+you can also attempt to split the documented options into groups, such
+as the input options, the output options, and the informative output
+options. This will help every user to find the option he is looking
+for.
+
+ Hardcoded string concatenation is sometimes used to construct English
+strings:
+
+ strcpy (s, "Replace ");
+ strcat (s, object1);
+ strcat (s, " with ");
+ strcat (s, object2);
+ strcat (s, "?");
+
+In order to present to the translator only entire sentences, and also
+because in some languages the translator might want to swap the order
+of `object1' and `object2', it is necessary to change this to use a
+format string:
+
+ sprintf (s, "Replace %s with %s?", object1, object2);
+
+ A similar case is compile time concatenation of strings. The ISO C
+99 include file `<inttypes.h>' contains a macro `PRId64' that can be
+used as a formatting directive for outputting an `int64_t' integer
+through `printf'. It expands to a constant string, usually "d" or "ld"
+or "lld" or something like this, depending on the platform. Assume you
+have code like
+
+ printf ("The amount is %0" PRId64 "\n", number);
+
+The `gettext' tools and library have special support for these
+`<inttypes.h>' macros. You can therefore simply write
+
+ printf (gettext ("The amount is %0" PRId64 "\n"), number);
+
+The PO file will contain the string "The amount is %0<PRId64>\n". The
+translators will provide a translation containing "%0<PRId64>" as well,
+and at runtime the `gettext' function's result will contain the
+appropriate constant string, "d" or "ld" or "lld".
+
+ This works only for the predefined `<inttypes.h>' macros. If you
+have defined your own similar macros, let's say `MYPRId64', that are
+not known to `xgettext', the solution for this problem is to change the
+code like this:
+
+ char buf1[100];
+ sprintf (buf1, "%0" MYPRId64, number);
+ printf (gettext ("The amount is %s\n"), buf1);
+
+ This means, you put the platform dependent code in one statement,
+and the internationalization code in a different statement. Note that
+a buffer length of 100 is safe, because all available hardware integer
+types are limited to 128 bits, and to print a 128 bit integer one needs
+at most 54 characters, regardless whether in decimal, octal or
+hexadecimal.
+
+ All this applies to other programming languages as well. For
+example, in Java and C#, string concatenation is very frequently used,
+because it is a compiler built-in operator. Like in C, in Java, you
+would change
+
+ System.out.println("Replace "+object1+" with "+object2+"?");
+
+into a statement involving a format string:
+
+ System.out.println(
+ MessageFormat.format("Replace {0} with {1}?",
+ new Object[] { object1, object2 }));
+
+Similarly, in C#, you would change
+
+ Console.WriteLine("Replace "+object1+" with "+object2+"?");
+
+into a statement involving a format string:
+
+ Console.WriteLine(
+ String.Format("Replace {0} with {1}?", object1, object2));
+
+ Unusual markup or control characters should not be used in
+translatable strings. Translators will likely not understand the
+particular meaning of the markup or control characters.
+
+ For example, if you have a convention that `|' delimits the
+left-hand and right-hand part of some GUI elements, translators will
+often not understand it without specific comments. It might be better
+to have the translator translate the left-hand and right-hand part
+separately.
+
+ Another example is the `argp' convention to use a single `\v'
+(vertical tab) control character to delimit two sections inside a
+string. This is flawed. Some translators may convert it to a simple
+newline, some to blank lines. With some PO file editors it may not be
+easy to even enter a vertical tab control character. So, you cannot be
+sure that the translation will contain a `\v' character, at the
+corresponding position. The solution is, again, to let the translator
+translate two separate strings and combine at run-time the two
+translated strings with the `\v' required by the convention.
+
+ HTML markup, however, is common enough that it's probably ok to use
+in translatable strings. But please bear in mind that the GNU gettext
+tools don't verify that the translations are well-formed HTML.
+
+
+File: gettext.info, Node: Mark Keywords, Next: Marking, Prev: Preparing Strings, Up: Sources
+
+4.4 How Marks Appear in Sources
+===============================
+
+ All strings requiring translation should be marked in the C sources.
+Marking is done in such a way that each translatable string appears to
+be the sole argument of some function or preprocessor macro. There are
+only a few such possible functions or macros meant for translation, and
+their names are said to be marking keywords. The marking is attached
+to strings themselves, rather than to what we do with them. This
+approach has more uses. A blatant example is an error message produced
+by formatting. The format string needs translation, as well as some
+strings inserted through some `%s' specification in the format, while
+the result from `sprintf' may have so many different instances that it
+is impractical to list them all in some `error_string_out()' routine,
+say.
+
+ This marking operation has two goals. The first goal of marking is
+for triggering the retrieval of the translation, at run time. The
+keyword is possibly resolved into a routine able to dynamically return
+the proper translation, as far as possible or wanted, for the argument
+string. Most localizable strings are found in executable positions,
+that is, attached to variables or given as parameters to functions.
+But this is not universal usage, and some translatable strings appear
+in structured initializations. *Note Special cases::.
+
+ The second goal of the marking operation is to help `xgettext' at
+properly extracting all translatable strings when it scans a set of
+program sources and produces PO file templates.
+
+ The canonical keyword for marking translatable strings is `gettext',
+it gave its name to the whole GNU `gettext' package. For packages
+making only light use of the `gettext' keyword, macro or function, it
+is easily used _as is_. However, for packages using the `gettext'
+interface more heavily, it is usually more convenient to give the main
+keyword a shorter, less obtrusive name. Indeed, the keyword might
+appear on a lot of strings all over the package, and programmers
+usually do not want nor need their program sources to remind them
+forcefully, all the time, that they are internationalized. Further, a
+long keyword has the disadvantage of using more horizontal space,
+forcing more indentation work on sources for those trying to keep them
+within 79 or 80 columns.
+
+ Many packages use `_' (a simple underline) as a keyword, and write
+`_("Translatable string")' instead of `gettext ("Translatable
+string")'. Further, the coding rule, from GNU standards, wanting that
+there is a space between the keyword and the opening parenthesis is
+relaxed, in practice, for this particular usage. So, the textual
+overhead per translatable string is reduced to only three characters:
+the underline and the two parentheses. However, even if GNU `gettext'
+uses this convention internally, it does not offer it officially. The
+real, genuine keyword is truly `gettext' indeed. It is fairly easy for
+those wanting to use `_' instead of `gettext' to declare:
+
+ #include <libintl.h>
+ #define _(String) gettext (String)
+
+instead of merely using `#include <libintl.h>'.
+
+ The marking keywords `gettext' and `_' take the translatable string
+as sole argument. It is also possible to define marking functions that
+take it at another argument position. It is even possible to make the
+marked argument position depend on the total number of arguments of the
+function call; this is useful in C++. All this is achieved using
+`xgettext''s `--keyword' option. How to pass such an option to
+`xgettext', assuming that `gettextize' is used, is described in *note
+po/Makevars:: and *note AM_XGETTEXT_OPTION::.
+
+ Note also that long strings can be split across lines, into multiple
+adjacent string tokens. Automatic string concatenation is performed at
+compile time according to ISO C and ISO C++; `xgettext' also supports
+this syntax.
+
+ Later on, the maintenance is relatively easy. If, as a programmer,
+you add or modify a string, you will have to ask yourself if the new or
+altered string requires translation, and include it within `_()' if you
+think it should be translated. For example, `"%s"' is an example of
+string _not_ requiring translation. But `"%s: %d"' _does_ require
+translation, because in French, unlike in English, it's customary to
+put a space before a colon.
+
+
+File: gettext.info, Node: Marking, Next: c-format Flag, Prev: Mark Keywords, Up: Sources
+
+4.5 Marking Translatable Strings
+================================
+
+ In PO mode, one set of features is meant more for the programmer than
+for the translator, and allows him to interactively mark which strings,
+in a set of program sources, are translatable, and which are not. Even
+if it is a fairly easy job for a programmer to find and mark such
+strings by other means, using any editor of his choice, PO mode makes
+this work more comfortable. Further, this gives translators who feel a
+little like programmers, or programmers who feel a little like
+translators, a tool letting them work at marking translatable strings
+in the program sources, while simultaneously producing a set of
+translation in some language, for the package being internationalized.
+
+ The set of program sources, targeted by the PO mode commands describe
+here, should have an Emacs tags table constructed for your project,
+prior to using these PO file commands. This is easy to do. In any
+shell window, change the directory to the root of your project, then
+execute a command resembling:
+
+ etags src/*.[hc] lib/*.[hc]
+
+presuming here you want to process all `.h' and `.c' files from the
+`src/' and `lib/' directories. This command will explore all said
+files and create a `TAGS' file in your root directory, somewhat
+summarizing the contents using a special file format Emacs can
+understand.
+
+ For packages following the GNU coding standards, there is a make
+goal `tags' or `TAGS' which constructs the tag files in all directories
+and for all files containing source code.
+
+ Once your `TAGS' file is ready, the following commands assist the
+programmer at marking translatable strings in his set of sources. But
+these commands are necessarily driven from within a PO file window, and
+it is likely that you do not even have such a PO file yet. This is not
+a problem at all, as you may safely open a new, empty PO file, mainly
+for using these commands. This empty PO file will slowly fill in while
+you mark strings as translatable in your program sources.
+
+`,'
+ Search through program sources for a string which looks like a
+ candidate for translation (`po-tags-search').
+
+`M-,'
+ Mark the last string found with `_()' (`po-mark-translatable').
+
+`M-.'
+ Mark the last string found with a keyword taken from a set of
+ possible keywords. This command with a prefix allows some
+ management of these keywords (`po-select-mark-and-mark').
+
+
+ The `,' (`po-tags-search') command searches for the next occurrence
+of a string which looks like a possible candidate for translation, and
+displays the program source in another Emacs window, positioned in such
+a way that the string is near the top of this other window. If the
+string is too big to fit whole in this window, it is positioned so only
+its end is shown. In any case, the cursor is left in the PO file
+window. If the shown string would be better presented differently in
+different native languages, you may mark it using `M-,' or `M-.'.
+Otherwise, you might rather ignore it and skip to the next string by
+merely repeating the `,' command.
+
+ A string is a good candidate for translation if it contains a
+sequence of three or more letters. A string containing at most two
+letters in a row will be considered as a candidate if it has more
+letters than non-letters. The command disregards strings containing no
+letters, or isolated letters only. It also disregards strings within
+comments, or strings already marked with some keyword PO mode knows
+(see below).
+
+ If you have never told Emacs about some `TAGS' file to use, the
+command will request that you specify one from the minibuffer, the
+first time you use the command. You may later change your `TAGS' file
+by using the regular Emacs command `M-x visit-tags-table', which will
+ask you to name the precise `TAGS' file you want to use. *Note Tag
+Tables: (emacs)Tags.
+
+ Each time you use the `,' command, the search resumes from where it
+was left by the previous search, and goes through all program sources,
+obeying the `TAGS' file, until all sources have been processed.
+However, by giving a prefix argument to the command (`C-u ,'), you may
+request that the search be restarted all over again from the first
+program source; but in this case, strings that you recently marked as
+translatable will be automatically skipped.
+
+ Using this `,' command does not prevent using of other regular Emacs
+tags commands. For example, regular `tags-search' or
+`tags-query-replace' commands may be used without disrupting the
+independent `,' search sequence. However, as implemented, the
+_initial_ `,' command (or the `,' command is used with a prefix) might
+also reinitialize the regular Emacs tags searching to the first tags
+file, this reinitialization might be considered spurious.
+
+ The `M-,' (`po-mark-translatable') command will mark the recently
+found string with the `_' keyword. The `M-.'
+(`po-select-mark-and-mark') command will request that you type one
+keyword from the minibuffer and use that keyword for marking the
+string. Both commands will automatically create a new PO file
+untranslated entry for the string being marked, and make it the current
+entry (making it easy for you to immediately proceed to its
+translation, if you feel like doing it right away). It is possible
+that the modifications made to the program source by `M-,' or `M-.'
+render some source line longer than 80 columns, forcing you to break
+and re-indent this line differently. You may use the `O' command from
+PO mode, or any other window changing command from Emacs, to break out
+into the program source window, and do any needed adjustments. You
+will have to use some regular Emacs command to return the cursor to the
+PO file window, if you want command `,' for the next string, say.
+
+ The `M-.' command has a few built-in speedups, so you do not have to
+explicitly type all keywords all the time. The first such speedup is
+that you are presented with a _preferred_ keyword, which you may accept
+by merely typing `<RET>' at the prompt. The second speedup is that you
+may type any non-ambiguous prefix of the keyword you really mean, and
+the command will complete it automatically for you. This also means
+that PO mode has to _know_ all your possible keywords, and that it will
+not accept mistyped keywords.
+
+ If you reply `?' to the keyword request, the command gives a list of
+all known keywords, from which you may choose. When the command is
+prefixed by an argument (`C-u M-.'), it inhibits updating any program
+source or PO file buffer, and does some simple keyword management
+instead. In this case, the command asks for a keyword, written in
+full, which becomes a new allowed keyword for later `M-.' commands.
+Moreover, this new keyword automatically becomes the _preferred_
+keyword for later commands. By typing an already known keyword in
+response to `C-u M-.', one merely changes the _preferred_ keyword and
+does nothing more.
+
+ All keywords known for `M-.' are recognized by the `,' command when
+scanning for strings, and strings already marked by any of those known
+keywords are automatically skipped. If many PO files are opened
+simultaneously, each one has its own independent set of known keywords.
+There is no provision in PO mode, currently, for deleting a known
+keyword, you have to quit the file (maybe using `q') and reopen it
+afresh. When a PO file is newly brought up in an Emacs window, only
+`gettext' and `_' are known as keywords, and `gettext' is preferred for
+the `M-.' command. In fact, this is not useful to prefer `_', as this
+one is already built in the `M-,' command.
+
+
+File: gettext.info, Node: c-format Flag, Next: Special cases, Prev: Marking, Up: Sources
+
+4.6 Special Comments preceding Keywords
+=======================================
+
+ In C programs strings are often used within calls of functions from
+the `printf' family. The special thing about these format strings is
+that they can contain format specifiers introduced with `%'. Assume we
+have the code
+
+ printf (gettext ("String `%s' has %d characters\n"), s, strlen (s));
+
+A possible German translation for the above string might be:
+
+ "%d Zeichen lang ist die Zeichenkette `%s'"
+
+ A C programmer, even if he cannot speak German, will recognize that
+there is something wrong here. The order of the two format specifiers
+is changed but of course the arguments in the `printf' don't have.
+This will most probably lead to problems because now the length of the
+string is regarded as the address.
+
+ To prevent errors at runtime caused by translations the `msgfmt'
+tool can check statically whether the arguments in the original and the
+translation string match in type and number. If this is not the case
+and the `-c' option has been passed to `msgfmt', `msgfmt' will give an
+error and refuse to produce a MO file. Thus consequent use of `msgfmt
+-c' will catch the error, so that it cannot cause cause problems at
+runtime.
+
+If the word order in the above German translation would be correct one
+would have to write
+
+ "%2$d Zeichen lang ist die Zeichenkette `%1$s'"
+
+The routines in `msgfmt' know about this special notation.
+
+ Because not all strings in a program must be format strings it is not
+useful for `msgfmt' to test all the strings in the `.po' file. This
+might cause problems because the string might contain what looks like a
+format specifier, but the string is not used in `printf'.
+
+ Therefore the `xgettext' adds a special tag to those messages it
+thinks might be a format string. There is no absolute rule for this,
+only a heuristic. In the `.po' file the entry is marked using the
+`c-format' flag in the `#,' comment line (*note PO Files::).
+
+ The careful reader now might say that this again can cause problems.
+The heuristic might guess it wrong. This is true and therefore
+`xgettext' knows about a special kind of comment which lets the
+programmer take over the decision. If in the same line as or the
+immediately preceding line to the `gettext' keyword the `xgettext'
+program finds a comment containing the words `xgettext:c-format', it
+will mark the string in any case with the `c-format' flag. This kind
+of comment should be used when `xgettext' does not recognize the string
+as a format string but it really is one and it should be tested.
+Please note that when the comment is in the same line as the `gettext'
+keyword, it must be before the string to be translated.
+
+ This situation happens quite often. The `printf' function is often
+called with strings which do not contain a format specifier. Of course
+one would normally use `fputs' but it does happen. In this case
+`xgettext' does not recognize this as a format string but what happens
+if the translation introduces a valid format specifier? The `printf'
+function will try to access one of the parameters but none exists
+because the original code does not pass any parameters.
+
+ `xgettext' of course could make a wrong decision the other way
+round, i.e. a string marked as a format string actually is not a format
+string. In this case the `msgfmt' might give too many warnings and
+would prevent translating the `.po' file. The method to prevent this
+wrong decision is similar to the one used above, only the comment to
+use must contain the string `xgettext:no-c-format'.
+
+ If a string is marked with `c-format' and this is not correct the
+user can find out who is responsible for the decision. See *note
+xgettext Invocation:: to see how the `--debug' option can be used for
+solving this problem.
+
+
+File: gettext.info, Node: Special cases, Next: Bug Report Address, Prev: c-format Flag, Up: Sources
+
+4.7 Special Cases of Translatable Strings
+=========================================
+
+ The attentive reader might now point out that it is not always
+possible to mark translatable string with `gettext' or something like
+this. Consider the following case:
+
+ {
+ static const char *messages[] = {
+ "some very meaningful message",
+ "and another one"
+ };
+ const char *string;
+ ...
+ string
+ = index > 1 ? "a default message" : messages[index];
+
+ fputs (string);
+ ...
+ }
+
+ While it is no problem to mark the string `"a default message"' it
+is not possible to mark the string initializers for `messages'. What
+is to be done? We have to fulfill two tasks. First we have to mark the
+strings so that the `xgettext' program (*note xgettext Invocation::)
+can find them, and second we have to translate the string at runtime
+before printing them.
+
+ The first task can be fulfilled by creating a new keyword, which
+names a no-op. For the second we have to mark all access points to a
+string from the array. So one solution can look like this:
+
+ #define gettext_noop(String) String
+
+ {
+ static const char *messages[] = {
+ gettext_noop ("some very meaningful message"),
+ gettext_noop ("and another one")
+ };
+ const char *string;
+ ...
+ string
+ = index > 1 ? gettext ("a default message") : gettext (messages[index]);
+
+ fputs (string);
+ ...
+ }
+
+ Please convince yourself that the string which is written by `fputs'
+is translated in any case. How to get `xgettext' know the additional
+keyword `gettext_noop' is explained in *note xgettext Invocation::.
+
+ The above is of course not the only solution. You could also come
+along with the following one:
+
+ #define gettext_noop(String) String
+
+ {
+ static const char *messages[] = {
+ gettext_noop ("some very meaningful message",
+ gettext_noop ("and another one")
+ };
+ const char *string;
+ ...
+ string
+ = index > 1 ? gettext_noop ("a default message") : messages[index];
+
+ fputs (gettext (string));
+ ...
+ }
+
+ But this has a drawback. The programmer has to take care that he
+uses `gettext_noop' for the string `"a default message"'. A use of
+`gettext' could have in rare cases unpredictable results.
+
+ One advantage is that you need not make control flow analysis to make
+sure the output is really translated in any case. But this analysis is
+generally not very difficult. If it should be in any situation you can
+use this second method in this situation.
+
+
+File: gettext.info, Node: Bug Report Address, Next: Names, Prev: Special cases, Up: Sources
+
+4.8 Letting Users Report Translation Bugs
+=========================================
+
+ Code sometimes has bugs, but translations sometimes have bugs too.
+The users need to be able to report them. Reporting translation bugs
+to the programmer or maintainer of a package is not very useful, since
+the maintainer must never change a translation, except on behalf of the
+translator. Hence the translation bugs must be reported to the
+translators.
+
+ Here is a way to organize this so that the maintainer does not need
+to forward translation bug reports, nor even keep a list of the
+addresses of the translators or their translation teams.
+
+ Every program has a place where is shows the bug report address. For
+GNU programs, it is the code which handles the "-help" option,
+typically in a function called "usage". In this place, instruct the
+translator to add her own bug reporting address. For example, if that
+code has a statement
+
+ printf (_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+
+ you can add some translator instructions like this:
+
+ /* TRANSLATORS: The placeholder indicates the bug-reporting address
+ for this package. Please add _another line_ saying
+ "Report translation bugs to <...>\n" with the address for translation
+ bugs (typically your translation team's web or email address). */
+ printf (_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+
+ These will be extracted by `xgettext', leading to a .pot file that
+contains this:
+
+ #. TRANSLATORS: The placeholder indicates the bug-reporting address
+ #. for this package. Please add _another line_ saying
+ #. "Report translation bugs to <...>\n" with the address for translation
+ #. bugs (typically your translation team's web or email address).
+ #: src/hello.c:178
+ #, c-format
+ msgid "Report bugs to <%s>.\n"
+ msgstr ""
+
+
+File: gettext.info, Node: Names, Next: Libraries, Prev: Bug Report Address, Up: Sources
+
+4.9 Marking Proper Names for Translation
+========================================
+
+ Should names of persons, cities, locations etc. be marked for
+translation or not? People who only know languages that can be written
+with Latin letters (English, Spanish, French, German, etc.) are tempted
+to say "no", because names usually do not change when transported
+between these languages. However, in general when translating from one
+script to another, names are translated too, usually phonetically or by
+transliteration. For example, Russian or Greek names are converted to
+the Latin alphabet when being translated to English, and English or
+French names are converted to the Katakana script when being translated
+to Japanese. This is necessary because the speakers of the target
+language in general cannot read the script the name is originally
+written in.
+
+ As a programmer, you should therefore make sure that names are marked
+for translation, with a special comment telling the translators that it
+is a proper name and how to pronounce it. In its simple form, it looks
+like this:
+
+ printf (_("Written by %s.\n"),
+ /* TRANSLATORS: This is a proper name. See the gettext
+ manual, section Names. Note this is actually a non-ASCII
+ name: The first name is (with Unicode escapes)
+ "Fran\u00e7ois" or (with HTML entities) "Fran&ccedil;ois".
+ Pronunciation is like "fraa-swa pee-nar". */
+ _("Francois Pinard"));
+
+The GNU gnulib library offers a module `propername'
+(`http://www.gnu.org/software/gnulib/MODULES.html#module=propername')
+which takes care to automatically append the original name, in
+parentheses, to the translated name. For names that cannot be written
+in ASCII, it also frees the translator from the task of entering the
+appropriate non-ASCII characters if no script change is needed. In
+this more comfortable form, it looks like this:
+
+ printf (_("Written by %s and %s.\n"),
+ proper_name ("Ulrich Drepper"),
+ /* TRANSLATORS: This is a proper name. See the gettext
+ manual, section Names. Note this is actually a non-ASCII
+ name: The first name is (with Unicode escapes)
+ "Fran\u00e7ois" or (with HTML entities) "Fran&ccedil;ois".
+ Pronunciation is like "fraa-swa pee-nar". */
+ proper_name_utf8 ("Francois Pinard", "Fran\303\247ois Pinard"));
+
+You can also write the original name directly in Unicode (rather than
+with Unicode escapes or HTML entities) and denote the pronunciation
+using the International Phonetic Alphabet (see
+`http://www.wikipedia.org/wiki/International_Phonetic_Alphabet').
+
+ As a translator, you should use some care when translating names,
+because it is frustrating if people see their names mutilated or
+distorted.
+
+ If your language uses the Latin script, all you need to do is to
+reproduce the name as perfectly as you can within the usual character
+set of your language. In this particular case, this means to provide a
+translation containing the c-cedilla character. If your language uses
+a different script and the people speaking it don't usually read Latin
+words, it means transliteration. If the programmer used the simple
+case, you should still give, in parentheses, the original writing of
+the name - for the sake of the people that do read the Latin script.
+If the programmer used the `propername' module mentioned above, you
+don't need to give the original writing of the name in parentheses,
+because the program will already do so. Here is an example, using
+Greek as the target script:
+
+ #. This is a proper name. See the gettext
+ #. manual, section Names. Note this is actually a non-ASCII
+ #. name: The first name is (with Unicode escapes)
+ #. "Fran\u00e7ois" or (with HTML entities) "Fran&ccedil;ois".
+ #. Pronunciation is like "fraa-swa pee-nar".
+ msgid "Francois Pinard"
+ msgstr "\phi\rho\alpha\sigma\omicron\alpha \pi\iota\nu\alpha\rho"
+ " (Francois Pinard)"
+
+ Because translation of names is such a sensitive domain, it is a good
+idea to test your translation before submitting it.
+
+
+File: gettext.info, Node: Libraries, Prev: Names, Up: Sources
+
+4.10 Preparing Library Sources
+==============================
+
+ When you are preparing a library, not a program, for the use of
+`gettext', only a few details are different. Here we assume that the
+library has a translation domain and a POT file of its own. (If it
+uses the translation domain and POT file of the main program, then the
+previous sections apply without changes.)
+
+ 1. The library code doesn't call `setlocale (LC_ALL, "")'. It's the
+ responsibility of the main program to set the locale. The
+ library's documentation should mention this fact, so that
+ developers of programs using the library are aware of it.
+
+ 2. The library code doesn't call `textdomain (PACKAGE)', because it
+ would interfere with the text domain set by the main program.
+
+ 3. The initialization code for a program was
+
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+ For a library it is reduced to
+
+ bindtextdomain (PACKAGE, LOCALEDIR);
+
+ If your library's API doesn't already have an initialization
+ function, you need to create one, containing at least the
+ `bindtextdomain' invocation. However, you usually don't need to
+ export and document this initialization function: It is sufficient
+ that all entry points of the library call the initialization
+ function if it hasn't been called before. The typical idiom used
+ to achieve this is a static boolean variable that indicates
+ whether the initialization function has been called. Like this:
+
+ static bool libfoo_initialized;
+
+ static void
+ libfoo_initialize (void)
+ {
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ libfoo_initialized = true;
+ }
+
+ /* This function is part of the exported API. */
+ struct foo *
+ create_foo (...)
+ {
+ /* Must ensure the initialization is performed. */
+ if (!libfoo_initialized)
+ libfoo_initialize ();
+ ...
+ }
+
+ /* This function is part of the exported API. The argument must be
+ non-NULL and have been created through create_foo(). */
+ int
+ foo_refcount (struct foo *argument)
+ {
+ /* No need to invoke the initialization function here, because
+ create_foo() must already have been called before. */
+ ...
+ }
+
+ 4. The usual declaration of the `_' macro in each source file was
+
+ #include <libintl.h>
+ #define _(String) gettext (String)
+
+ for a program. For a library, which has its own translation
+ domain, it reads like this:
+
+ #include <libintl.h>
+ #define _(String) dgettext (PACKAGE, String)
+
+ In other words, `dgettext' is used instead of `gettext'.
+ Similarly, the `dngettext' function should be used in place of the
+ `ngettext' function.
+
+
+File: gettext.info, Node: Template, Next: Creating, Prev: Sources, Up: Top
+
+5 Making the PO Template File
+*****************************
+
+ After preparing the sources, the programmer creates a PO template
+file. This section explains how to use `xgettext' for this purpose.
+
+ `xgettext' creates a file named `DOMAINNAME.po'. You should then
+rename it to `DOMAINNAME.pot'. (Why doesn't `xgettext' create it under
+the name `DOMAINNAME.pot' right away? The answer is: for historical
+reasons. When `xgettext' was specified, the distinction between a PO
+file and PO file template was fuzzy, and the suffix `.pot' wasn't in
+use at that time.)
+
+* Menu:
+
+* xgettext Invocation:: Invoking the `xgettext' Program
+
+
+File: gettext.info, Node: xgettext Invocation, Prev: Template, Up: Template
+
+5.1 Invoking the `xgettext' Program
+===================================
+
+ xgettext [OPTION] [INPUTFILE] ...
+
+ The `xgettext' program extracts translatable strings from given
+input files.
+
+5.1.1 Input file location
+-------------------------
+
+`INPUTFILE ...'
+ Input files.
+
+`-f FILE'
+`--files-from=FILE'
+ Read the names of the input files from FILE instead of getting
+ them from the command line.
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories. The resulting `.po'
+ file will be written relative to the current directory, though.
+
+
+ If INPUTFILE is `-', standard input is read.
+
+5.1.2 Output file location
+--------------------------
+
+`-d NAME'
+`--default-domain=NAME'
+ Use `NAME.po' for output (instead of `messages.po').
+
+`-o FILE'
+`--output=FILE'
+ Write output to specified file (instead of `NAME.po' or
+ `messages.po').
+
+`-p DIR'
+`--output-dir=DIR'
+ Output files will be placed in directory DIR.
+
+
+ If the output FILE is `-' or `/dev/stdout', the output is written to
+standard output.
+
+5.1.3 Choice of input file language
+-----------------------------------
+
+`-L NAME'
+`--language=NAME'
+ Specifies the language of the input files. The supported languages
+ are `C', `C++', `ObjectiveC', `PO', `Python', `Lisp', `EmacsLisp',
+ `librep', `Scheme', `Smalltalk', `Java', `JavaProperties', `C#',
+ `awk', `YCP', `Tcl', `Perl', `PHP', `GCC-source', `NXStringTable',
+ `RST', `Glade'.
+
+`-C'
+`--c++'
+ This is a shorthand for `--language=C++'.
+
+
+ By default the language is guessed depending on the input file name
+extension.
+
+5.1.4 Input file interpretation
+-------------------------------
+
+`--from-code=NAME'
+ Specifies the encoding of the input files. This option is needed
+ only if some untranslated message strings or their corresponding
+ comments contain non-ASCII characters. Note that Tcl and Glade
+ input files are always assumed to be in UTF-8, regardless of this
+ option.
+
+
+ By default the input files are assumed to be in ASCII.
+
+5.1.5 Operation mode
+--------------------
+
+`-j'
+`--join-existing'
+ Join messages with existing file.
+
+`-x FILE'
+`--exclude-file=FILE'
+ Entries from FILE are not extracted. FILE should be a PO or POT
+ file.
+
+`-c[TAG]'
+`--add-comments[=TAG]'
+ Place comment blocks starting with TAG and preceding keyword lines
+ in the output file. Without a TAG, the option means to put _all_
+ comment blocks preceding keyword lines in the output file.
+
+
+5.1.6 Language specific options
+-------------------------------
+
+`-a'
+`--extract-all'
+ Extract all strings.
+
+ This option has an effect with most languages, namely C, C++,
+ ObjectiveC, Shell, Python, Lisp, EmacsLisp, librep, Java, C#, awk,
+ Tcl, Perl, PHP, GCC-source, Glade.
+
+`-k[KEYWORDSPEC]'
+`--keyword[=KEYWORDSPEC]'
+ Specify KEYWORDSPEC as an additional keyword to be looked for.
+ Without a KEYWORDSPEC, the option means to not use default
+ keywords.
+
+ If KEYWORDSPEC is a C identifier ID, `xgettext' looks for strings
+ in the first argument of each call to the function or macro ID.
+ If KEYWORDSPEC is of the form `ID:ARGNUM', `xgettext' looks for
+ strings in the ARGNUMth argument of the call. If KEYWORDSPEC is
+ of the form `ID:ARGNUM1,ARGNUM2', `xgettext' looks for strings in
+ the ARGNUM1st argument and in the ARGNUM2nd argument of the call,
+ and treats them as singular/plural variants for a message with
+ plural handling. Also, if KEYWORDSPEC is of the form
+ `ID:CONTEXTARGNUMc,ARGNUM' or `ID:ARGNUM,CONTEXTARGNUMc',
+ `xgettext' treats strings in the CONTEXTARGNUMth argument as a
+ context specifier. And, as a special-purpose support for GNOME,
+ if KEYWORDSPEC is of the form `ID:ARGNUMg', `xgettext' recognizes
+ the ARGNUMth argument as a string with context, using the GNOME
+ `glib' syntax `"msgctxt|msgid"'.
+ Furthermore, if KEYWORDSPEC is of the form `ID:...,TOTALNUMARGSt',
+ `xgettext' recognizes this argument specification only if the
+ number of actual arguments is equal to TOTALNUMARGS. This is
+ useful for disambiguating overloaded function calls in C++.
+ Finally, if KEYWORDSPEC is of the form `ID:ARGNUM...,"XCOMMENT"',
+ `xgettext', when extracting a message from the specified argument
+ strings, adds an extracted comment XCOMMENT to the message. Note
+ that when used through a normal shell command line, the
+ double-quotes around the XCOMMENT need to be escaped.
+
+ This option has an effect with most languages, namely C, C++,
+ ObjectiveC, Shell, Python, Lisp, EmacsLisp, librep, Java, C#, awk,
+ Tcl, Perl, PHP, GCC-source, Glade.
+
+ The default keyword specifications, which are always looked for if
+ not explicitly disabled, are language dependent. They are:
+
+ * For C, C++, and GCC-source: `gettext', `dgettext:2',
+ `dcgettext:2', `ngettext:1,2', `dngettext:2,3',
+ `dcngettext:2,3', `gettext_noop', and `pgettext:1c,2',
+ `dpgettext:2c,3', `dcpgettext:2c,3', `npgettext:1c,2,3',
+ `dnpgettext:2c,3,4', `dcnpgettext:2c,3,4'.
+
+ * For Objective C: Like for C, and also `NSLocalizedString',
+ `_', `NSLocalizedStaticString', `__'.
+
+ * For Shell scripts: `gettext', `ngettext:1,2', `eval_gettext',
+ `eval_ngettext:1,2'.
+
+ * For Python: `gettext', `ugettext', `dgettext:2',
+ `ngettext:1,2', `ungettext:1,2', `dngettext:2,3', `_'.
+
+ * For Lisp: `gettext', `ngettext:1,2', `gettext-noop'.
+
+ * For EmacsLisp: `_'.
+
+ * For librep: `_'.
+
+ * For Scheme: `gettext', `ngettext:1,2', `gettext-noop'.
+
+ * For Java: `GettextResource.gettext:2',
+ `GettextResource.ngettext:2,3',
+ `GettextResource.pgettext:2c,3',
+ `GettextResource.npgettext:2c,3,4', `gettext', `ngettext:1,2',
+ `pgettext:1c,2', `npgettext:1c,2,3', `getString'.
+
+ * For C#: `GetString', `GetPluralString:1,2',
+ `GetParticularString:1c,2',
+ `GetParticularPluralString:1c,2,3'.
+
+ * For awk: `dcgettext', `dcngettext:1,2'.
+
+ * For Tcl: `::msgcat::mc'.
+
+ * For Perl: `gettext', `%gettext', `$gettext', `dgettext:2',
+ `dcgettext:2', `ngettext:1,2', `dngettext:2,3',
+ `dcngettext:2,3', `gettext_noop'.
+
+ * For PHP: `_', `gettext', `dgettext:2', `dcgettext:2',
+ `ngettext:1,2', `dngettext:2,3', `dcngettext:2,3'.
+
+ * For Glade 1: `label', `title', `text', `format', `copyright',
+ `comments', `preview_text', `tooltip'.
+
+ To disable the default keyword specifications, the option `-k' or
+ `--keyword' or `--keyword=', without a KEYWORDSPEC, can be used.
+
+`--flag=WORD:ARG:FLAG'
+ Specifies additional flags for strings occurring as part of the
+ ARGth argument of the function WORD. The possible flags are the
+ possible format string indicators, such as `c-format', and their
+ negations, such as `no-c-format', possibly prefixed with `pass-'.
+ The meaning of `--flag=FUNCTION:ARG:LANG-format' is that in
+ language LANG, the specified FUNCTION expects as ARGth argument a
+ format string. (For those of you familiar with GCC function
+ attributes, `--flag=FUNCTION:ARG:c-format' is roughly equivalent
+ to the declaration `__attribute__ ((__format__ (__printf__, ARG,
+ ...)))' attached to FUNCTION in a C source file.) For example, if
+ you use the `error' function from GNU libc, you can specify its
+ behaviour through `--flag=error:3:c-format'. The effect of this
+ specification is that `xgettext' will mark as format strings all
+ `gettext' invocations that occur as ARGth argument of FUNCTION.
+ This is useful when such strings contain no format string
+ directives: together with the checks done by `msgfmt -c' it will
+ ensure that translators cannot accidentally use format string
+ directives that would lead to a crash at runtime.
+ The meaning of `--flag=FUNCTION:ARG:pass-LANG-format' is that in
+ language LANG, if the FUNCTION call occurs in a position that must
+ yield a format string, then its ARGth argument must yield a format
+ string of the same type as well. (If you know GCC function
+ attributes, the `--flag=FUNCTION:ARG:pass-c-format' option is
+ roughly equivalent to the declaration `__attribute__
+ ((__format_arg__ (ARG)))' attached to FUNCTION in a C source file.)
+ For example, if you use the `_' shortcut for the `gettext'
+ function, you should use `--flag=_:1:pass-c-format'. The effect
+ of this specification is that `xgettext' will propagate a format
+ string requirement for a `_("string")' call to its first argument,
+ the literal `"string"', and thus mark it as a format string. This
+ is useful when such strings contain no format string directives:
+ together with the checks done by `msgfmt -c' it will ensure that
+ translators cannot accidentally use format string directives that
+ would lead to a crash at runtime.
+ This option has an effect with most languages, namely C, C++,
+ ObjectiveC, Shell, Python, Lisp, EmacsLisp, librep, Scheme, Java,
+ C#, awk, YCP, Tcl, Perl, PHP, GCC-source.
+
+`-T'
+`--trigraphs'
+ Understand ANSI C trigraphs for input.
+ This option has an effect only with the languages C, C++,
+ ObjectiveC.
+
+`--qt'
+ Recognize Qt format strings.
+ This option has an effect only with the language C++.
+
+`--kde'
+ Recognize KDE 4 format strings.
+ This option has an effect only with the language C++.
+
+`--boost'
+ Recognize Boost format strings.
+ This option has an effect only with the language C++.
+
+`--debug'
+ Use the flags `c-format' and `possible-c-format' to show who was
+ responsible for marking a message as a format string. The latter
+ form is used if the `xgettext' program decided, the format form is
+ used if the programmer prescribed it.
+
+ By default only the `c-format' form is used. The translator should
+ not have to care about these details.
+
+
+ This implementation of `xgettext' is able to process a few awkward
+cases, like strings in preprocessor macros, ANSI concatenation of
+adjacent strings, and escaped end of lines for continued strings.
+
+5.1.7 Output details
+--------------------
+
+`--color'
+`--color=WHEN'
+ Specify whether or when to use colors and other text attributes.
+ See *note The --color option:: for details.
+
+`--style=STYLE_FILE'
+ Specify the CSS style rule file to use for `--color'. See *note
+ The --style option:: for details.
+
+`--force-po'
+ Always write an output file even if no message is defined.
+
+`-i'
+`--indent'
+ Write the .po file using indented style.
+
+`--no-location'
+ Do not write `#: FILENAME:LINE' lines. Note that using this
+ option makes it harder for technically skilled translators to
+ understand each message's context.
+
+`-n'
+`--add-location'
+ Generate `#: FILENAME:LINE' lines (default).
+
+`--strict'
+ Write out a strict Uniforum conforming PO file. Note that this
+ Uniforum format should be avoided because it doesn't support the
+ GNU extensions.
+
+`--properties-output'
+ Write out a Java ResourceBundle in Java `.properties' syntax. Note
+ that this file format doesn't support plural forms and silently
+ drops obsolete messages.
+
+`--stringtable-output'
+ Write out a NeXTstep/GNUstep localized resource file in `.strings'
+ syntax. Note that this file format doesn't support plural forms.
+
+`-w NUMBER'
+`--width=NUMBER'
+ Set the output page width. Long strings in the output files will
+ be split across multiple lines in order to ensure that each line's
+ width (= number of screen columns) is less or equal to the given
+ NUMBER.
+
+`--no-wrap'
+ Do not break long message lines. Message lines whose width
+ exceeds the output page width will not be split into several
+ lines. Only file reference lines which are wider than the output
+ page width will be split.
+
+`-s'
+`--sort-output'
+ Generate sorted output. Note that using this option makes it much
+ harder for the translator to understand each message's context.
+
+`-F'
+`--sort-by-file'
+ Sort output by file location.
+
+`--omit-header'
+ Don't write header with `msgid ""' entry.
+
+ This is useful for testing purposes because it eliminates a source
+ of variance for generated `.gmo' files. With `--omit-header', two
+ invocations of `xgettext' on the same files with the same options
+ at different times are guaranteed to produce the same results.
+
+ Note that using this option will lead to an error if the resulting
+ file would not entirely be in ASCII.
+
+`--copyright-holder=STRING'
+ Set the copyright holder in the output. STRING should be the
+ copyright holder of the surrounding package. (Note that the msgstr
+ strings, extracted from the package's sources, belong to the
+ copyright holder of the package.) Translators are expected to
+ transfer or disclaim the copyright for their translations, so that
+ package maintainers can distribute them without legal risk. If
+ STRING is empty, the output files are marked as being in the
+ public domain; in this case, the translators are expected to
+ disclaim their copyright, again so that package maintainers can
+ distribute them without legal risk.
+
+ The default value for STRING is the Free Software Foundation, Inc.,
+ simply because `xgettext' was first used in the GNU project.
+
+`--foreign-user'
+ Omit FSF copyright in output. This option is equivalent to
+ `--copyright-holder='''. It can be useful for packages outside
+ the GNU project that want their translations to be in the public
+ domain.
+
+`--package-name=PACKAGE'
+ Set the package name in the header of the output.
+
+`--package-version=VERSION'
+ Set the package version in the header of the output. This option
+ has an effect only if the `--package-name' option is also used.
+
+`--msgid-bugs-address=EMAIL@ADDRESS'
+ Set the reporting address for msgid bugs. This is the email
+ address or URL to which the translators shall report bugs in the
+ untranslated strings:
+
+ - Strings which are not entire sentences, see the maintainer
+ guidelines in *note Preparing Strings::.
+
+ - Strings which use unclear terms or require additional context
+ to be understood.
+
+ - Strings which make invalid assumptions about notation of
+ date, time or money.
+
+ - Pluralisation problems.
+
+ - Incorrect English spelling.
+
+ - Incorrect formatting.
+
+ It can be your email address, or a mailing list address where
+ translators can write to without being subscribed, or the URL of a
+ web page through which the translators can contact you.
+
+ The default value is empty, which means that translators will be
+ clueless! Don't forget to specify this option.
+
+`-m[STRING]'
+`--msgstr-prefix[=STRING]'
+ Use STRING (or "" if not specified) as prefix for msgstr values.
+
+`-M[STRING]'
+`--msgstr-suffix[=STRING]'
+ Use STRING (or "" if not specified) as suffix for msgstr values.
+
+
+5.1.8 Informative output
+------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+
+File: gettext.info, Node: Creating, Next: Updating, Prev: Template, Up: Top
+
+6 Creating a New PO File
+************************
+
+ When starting a new translation, the translator creates a file called
+`LANG.po', as a copy of the `PACKAGE.pot' template file with
+modifications in the initial comments (at the beginning of the file)
+and in the header entry (the first entry, near the beginning of the
+file).
+
+ The easiest way to do so is by use of the `msginit' program. For
+example:
+
+ $ cd PACKAGE-VERSION
+ $ cd po
+ $ msginit
+
+ The alternative way is to do the copy and modifications by hand. To
+do so, the translator copies `PACKAGE.pot' to `LANG.po'. Then she
+modifies the initial comments and the header entry of this file.
+
+* Menu:
+
+* msginit Invocation:: Invoking the `msginit' Program
+* Header Entry:: Filling in the Header Entry
+
+
+File: gettext.info, Node: msginit Invocation, Next: Header Entry, Prev: Creating, Up: Creating
+
+6.1 Invoking the `msginit' Program
+==================================
+
+ msginit [OPTION]
+
+ The `msginit' program creates a new PO file, initializing the meta
+information with values from the user's environment.
+
+6.1.1 Input file location
+-------------------------
+
+`-i INPUTFILE'
+`--input=INPUTFILE'
+ Input POT file.
+
+
+ If no INPUTFILE is given, the current directory is searched for the
+POT file. If it is `-', standard input is read.
+
+6.1.2 Output file location
+--------------------------
+
+`-o FILE'
+`--output-file=FILE'
+ Write output to specified PO file.
+
+
+ If no output file is given, it depends on the `--locale' option or
+the user's locale setting. If it is `-', the results are written to
+standard output.
+
+6.1.3 Input file syntax
+-----------------------
+
+`-P'
+`--properties-input'
+ Assume the input file is a Java ResourceBundle in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input file is a NeXTstep/GNUstep localized resource
+ file in `.strings' syntax, not in PO file syntax.
+
+
+6.1.4 Output details
+--------------------
+
+`-l LL_CC'
+`--locale=LL_CC'
+ Set target locale. LL should be a language code, and CC should be
+ a country code. The command `locale -a' can be used to output a
+ list of all installed locales. The default is the user's locale
+ setting.
+
+`--no-translator'
+ Declares that the PO file will not have a human translator and is
+ instead automatically generated.
+
+`--color'
+`--color=WHEN'
+ Specify whether or when to use colors and other text attributes.
+ See *note The --color option:: for details.
+
+`--style=STYLE_FILE'
+ Specify the CSS style rule file to use for `--color'. See *note
+ The --style option:: for details.
+
+`-p'
+`--properties-output'
+ Write out a Java ResourceBundle in Java `.properties' syntax. Note
+ that this file format doesn't support plural forms and silently
+ drops obsolete messages.
+
+`--stringtable-output'
+ Write out a NeXTstep/GNUstep localized resource file in `.strings'
+ syntax. Note that this file format doesn't support plural forms.
+
+`-w NUMBER'
+`--width=NUMBER'
+ Set the output page width. Long strings in the output files will
+ be split across multiple lines in order to ensure that each line's
+ width (= number of screen columns) is less or equal to the given
+ NUMBER.
+
+`--no-wrap'
+ Do not break long message lines. Message lines whose width
+ exceeds the output page width will not be split into several
+ lines. Only file reference lines which are wider than the output
+ page width will be split.
+
+
+6.1.5 Informative output
+------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+
+File: gettext.info, Node: Header Entry, Prev: msginit Invocation, Up: Creating
+
+6.2 Filling in the Header Entry
+===============================
+
+ The initial comments "SOME DESCRIPTIVE TITLE", "YEAR" and "FIRST
+AUTHOR <EMAIL@ADDRESS>, YEAR" ought to be replaced by sensible
+information. This can be done in any text editor; if Emacs is used and
+it switched to PO mode automatically (because it has recognized the
+file's suffix), you can disable it by typing `M-x fundamental-mode'.
+
+ Modifying the header entry can already be done using PO mode: in
+Emacs, type `M-x po-mode RET' and then `RET' again to start editing the
+entry. You should fill in the following fields.
+
+Project-Id-Version
+ This is the name and version of the package. Fill it in if it has
+ not already been filled in by `xgettext'.
+
+Report-Msgid-Bugs-To
+ This has already been filled in by `xgettext'. It contains an
+ email address or URL where you can report bugs in the untranslated
+ strings:
+
+ - Strings which are not entire sentences, see the maintainer
+ guidelines in *note Preparing Strings::.
+
+ - Strings which use unclear terms or require additional context
+ to be understood.
+
+ - Strings which make invalid assumptions about notation of
+ date, time or money.
+
+ - Pluralisation problems.
+
+ - Incorrect English spelling.
+
+ - Incorrect formatting.
+
+POT-Creation-Date
+ This has already been filled in by `xgettext'.
+
+PO-Revision-Date
+ You don't need to fill this in. It will be filled by the PO file
+ editor when you save the file.
+
+Last-Translator
+ Fill in your name and email address (without double quotes).
+
+Language-Team
+ Fill in the English name of the language, and the email address or
+ homepage URL of the language team you are part of.
+
+ Before starting a translation, it is a good idea to get in touch
+ with your translation team, not only to make sure you don't do
+ duplicated work, but also to coordinate difficult linguistic
+ issues.
+
+ In the Free Translation Project, each translation team has its own
+ mailing list. The up-to-date list of teams can be found at the
+ Free Translation Project's homepage,
+ `http://translationproject.org/', in the "Teams" area.
+
+Language
+ Fill in the language code of the language. This can be in one of
+ three forms:
+
+ - `LL', an ISO 639 two-letter language code (lowercase). See
+ *note Language Codes:: for the list of codes.
+
+ - `LL_CC', where `LL' is an ISO 639 two-letter language code
+ (lowercase) and `CC' is an ISO 3166 two-letter country code
+ (uppercase). The country code specification is not redundant:
+ Some languages have dialects in different countries. For
+ example, `de_AT' is used for Austria, and `pt_BR' for Brazil.
+ The country code serves to distinguish the dialects. See
+ *note Language Codes:: and *note Country Codes:: for the
+ lists of codes.
+
+ - `LL_CC@VARIANT', where `LL' is an ISO 639 two-letter language
+ code (lowercase), `CC' is an ISO 3166 two-letter country code
+ (uppercase), and `VARIANT' is a variant designator. The
+ variant designator (lowercase) can be a script designator,
+ such as `latin' or `cyrillic'.
+
+ The naming convention `LL_CC' is also the way locales are named on
+ systems based on GNU libc. But there are three important
+ differences:
+
+ * In this PO file field, but not in locale names, `LL_CC'
+ combinations denoting a language's main dialect are
+ abbreviated as `LL'. For example, `de' is equivalent to
+ `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+ (Portuguese as spoken in Portugal) in this context.
+
+ * In this PO file field, suffixes like `.ENCODING' are not used.
+
+ * In this PO file field, variant designators that are not
+ relevant to message translation, such as `@euro', are not
+ used.
+
+ So, if your locale name is `de_DE.UTF-8', the language
+ specification in PO files is just `de'.
+
+Content-Type
+ Replace `CHARSET' with the character encoding used for your
+ language, in your locale, or UTF-8. This field is needed for
+ correct operation of the `msgmerge' and `msgfmt' programs, as well
+ as for users whose locale's character encoding differs from yours
+ (see *note Charset conversion::).
+
+ You get the character encoding of your locale by running the shell
+ command `locale charmap'. If the result is `C' or
+ `ANSI_X3.4-1968', which is equivalent to `ASCII' (= `US-ASCII'),
+ it means that your locale is not correctly configured. In this
+ case, ask your translation team which charset to use. `ASCII' is
+ not usable for any language except Latin.
+
+ Because the PO files must be portable to operating systems with
+ less advanced internationalization facilities, the character
+ encodings that can be used are limited to those supported by both
+ GNU `libc' and GNU `libiconv'. These are: `ASCII', `ISO-8859-1',
+ `ISO-8859-2', `ISO-8859-3', `ISO-8859-4', `ISO-8859-5',
+ `ISO-8859-6', `ISO-8859-7', `ISO-8859-8', `ISO-8859-9',
+ `ISO-8859-13', `ISO-8859-14', `ISO-8859-15', `KOI8-R', `KOI8-U',
+ `KOI8-T', `CP850', `CP866', `CP874', `CP932', `CP949', `CP950',
+ `CP1250', `CP1251', `CP1252', `CP1253', `CP1254', `CP1255',
+ `CP1256', `CP1257', `GB2312', `EUC-JP', `EUC-KR', `EUC-TW',
+ `BIG5', `BIG5-HKSCS', `GBK', `GB18030', `SHIFT_JIS', `JOHAB',
+ `TIS-620', `VISCII', `GEORGIAN-PS', `UTF-8'.
+
+ In the GNU system, the following encodings are frequently used for
+ the corresponding languages.
+
+ * `ISO-8859-1' for Afrikaans, Albanian, Basque, Breton,
+ Catalan, Cornish, Danish, Dutch, English, Estonian, Faroese,
+ Finnish, French, Galician, German, Greenlandic, Icelandic,
+ Indonesian, Irish, Italian, Malay, Manx, Norwegian, Occitan,
+ Portuguese, Spanish, Swedish, Tagalog, Uzbek, Walloon,
+
+ * `ISO-8859-2' for Bosnian, Croatian, Czech, Hungarian, Polish,
+ Romanian, Serbian, Slovak, Slovenian,
+
+ * `ISO-8859-3' for Maltese,
+
+ * `ISO-8859-5' for Macedonian, Serbian,
+
+ * `ISO-8859-6' for Arabic,
+
+ * `ISO-8859-7' for Greek,
+
+ * `ISO-8859-8' for Hebrew,
+
+ * `ISO-8859-9' for Turkish,
+
+ * `ISO-8859-13' for Latvian, Lithuanian, Maori,
+
+ * `ISO-8859-14' for Welsh,
+
+ * `ISO-8859-15' for Basque, Catalan, Dutch, English, Finnish,
+ French, Galician, German, Irish, Italian, Portuguese,
+ Spanish, Swedish, Walloon,
+
+ * `KOI8-R' for Russian,
+
+ * `KOI8-U' for Ukrainian,
+
+ * `KOI8-T' for Tajik,
+
+ * `CP1251' for Bulgarian, Belarusian,
+
+ * `GB2312', `GBK', `GB18030' for simplified writing of Chinese,
+
+ * `BIG5', `BIG5-HKSCS' for traditional writing of Chinese,
+
+ * `EUC-JP' for Japanese,
+
+ * `EUC-KR' for Korean,
+
+ * `TIS-620' for Thai,
+
+ * `GEORGIAN-PS' for Georgian,
+
+ * `UTF-8' for any language, including those listed above.
+
+ When single quote characters or double quote characters are used in
+ translations for your language, and your locale's encoding is one
+ of the ISO-8859-* charsets, it is best if you create your PO files
+ in UTF-8 encoding, instead of your locale's encoding. This is
+ because in UTF-8 the real quote characters can be represented
+ (single quote characters: U+2018, U+2019, double quote characters:
+ U+201C, U+201D), whereas none of ISO-8859-* charsets has them all.
+ Users in UTF-8 locales will see the real quote characters, whereas
+ users in ISO-8859-* locales will see the vertical apostrophe and
+ the vertical double quote instead (because that's what the
+ character set conversion will transliterate them to).
+
+ To enter such quote characters under X11, you can change your
+ keyboard mapping using the `xmodmap' program. The X11 names of
+ the quote characters are "leftsinglequotemark",
+ "rightsinglequotemark", "leftdoublequotemark",
+ "rightdoublequotemark", "singlelowquotemark", "doublelowquotemark".
+
+ Note that only recent versions of GNU Emacs support the UTF-8
+ encoding: Emacs 20 with Mule-UCS, and Emacs 21. As of January
+ 2001, XEmacs doesn't support the UTF-8 encoding.
+
+ The character encoding name can be written in either upper or
+ lower case. Usually upper case is preferred.
+
+Content-Transfer-Encoding
+ Set this to `8bit'.
+
+Plural-Forms
+ This field is optional. It is only needed if the PO file has
+ plural forms. You can find them by searching for the
+ `msgid_plural' keyword. The format of the plural forms field is
+ described in *note Plural forms:: and *note Translating plural
+ forms::.
+
+
+File: gettext.info, Node: Updating, Next: Editing, Prev: Creating, Up: Top
+
+7 Updating Existing PO Files
+****************************
+
+* Menu:
+
+* msgmerge Invocation:: Invoking the `msgmerge' Program
+
+
+File: gettext.info, Node: msgmerge Invocation, Prev: Updating, Up: Updating
+
+7.1 Invoking the `msgmerge' Program
+===================================
+
+ msgmerge [OPTION] DEF.po REF.pot
+
+ The `msgmerge' program merges two Uniforum style .po files together.
+The DEF.po file is an existing PO file with translations which will be
+taken over to the newly created file as long as they still match;
+comments will be preserved, but extracted comments and file positions
+will be discarded. The REF.pot file is the last created PO file with
+up-to-date source references but old translations, or a PO Template file
+(generally created by `xgettext'); any translations or comments in the
+file will be discarded, however dot comments and file positions will be
+preserved. Where an exact match cannot be found, fuzzy matching is
+used to produce better results.
+
+7.1.1 Input file location
+-------------------------
+
+`DEF.po'
+ Translations referring to old sources.
+
+`REF.pot'
+ References to the new sources.
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories. The resulting `.po'
+ file will be written relative to the current directory, though.
+
+`-C FILE'
+`--compendium=FILE'
+ Specify an additional library of message translations. *Note
+ Compendium::. This option may be specified more than once.
+
+
+7.1.2 Operation mode
+--------------------
+
+`-U'
+`--update'
+ Update DEF.po. Do nothing if DEF.po is already up to date.
+
+
+7.1.3 Output file location
+--------------------------
+
+`-o FILE'
+`--output-file=FILE'
+ Write output to specified file.
+
+
+ The results are written to standard output if no output file is
+specified or if it is `-'.
+
+7.1.4 Output file location in update mode
+-----------------------------------------
+
+ The result is written back to DEF.po.
+
+`--backup=CONTROL'
+ Make a backup of DEF.po
+
+`--suffix=SUFFIX'
+ Override the usual backup suffix.
+
+
+ The version control method may be selected via the `--backup' option
+or through the `VERSION_CONTROL' environment variable. Here are the
+values:
+
+`none'
+`off'
+ Never make backups (even if `--backup' is given).
+
+`numbered'
+`t'
+ Make numbered backups.
+
+`existing'
+`nil'
+ Make numbered backups if numbered backups for this file already
+ exist, otherwise make simple backups.
+
+`simple'
+`never'
+ Always make simple backups.
+
+
+ The backup suffix is `~', unless set with `--suffix' or the
+`SIMPLE_BACKUP_SUFFIX' environment variable.
+
+7.1.5 Operation modifiers
+-------------------------
+
+`-m'
+`--multi-domain'
+ Apply REF.pot to each of the domains in DEF.po.
+
+`-N'
+`--no-fuzzy-matching'
+ Do not use fuzzy matching when an exact match is not found. This
+ may speed up the operation considerably.
+
+`--previous'
+ Keep the previous msgids of translated messages, marked with `#|',
+ when adding the fuzzy marker to such messages.
+
+7.1.6 Input file syntax
+-----------------------
+
+`-P'
+`--properties-input'
+ Assume the input files are Java ResourceBundles in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input files are NeXTstep/GNUstep localized resource
+ files in `.strings' syntax, not in PO file syntax.
+
+
+7.1.7 Output details
+--------------------
+
+`--lang=CATALOGNAME'
+ Specify the `Language' field to be used in the header entry. See
+ *note Header Entry:: for the meaning of this field. Note: The
+ `Language-Team' and `Plural-Forms' fields are left unchanged. If
+ this option is not specified, the `Language' field is inferred, as
+ best as possible, from the `Language-Team' field.
+
+`--color'
+`--color=WHEN'
+ Specify whether or when to use colors and other text attributes.
+ See *note The --color option:: for details.
+
+`--style=STYLE_FILE'
+ Specify the CSS style rule file to use for `--color'. See *note
+ The --style option:: for details.
+
+`--force-po'
+ Always write an output file even if it contains no message.
+
+`-i'
+`--indent'
+ Write the .po file using indented style.
+
+`--no-location'
+ Do not write `#: FILENAME:LINE' lines.
+
+`--add-location'
+ Generate `#: FILENAME:LINE' lines (default).
+
+`--strict'
+ Write out a strict Uniforum conforming PO file. Note that this
+ Uniforum format should be avoided because it doesn't support the
+ GNU extensions.
+
+`-p'
+`--properties-output'
+ Write out a Java ResourceBundle in Java `.properties' syntax. Note
+ that this file format doesn't support plural forms and silently
+ drops obsolete messages.
+
+`--stringtable-output'
+ Write out a NeXTstep/GNUstep localized resource file in `.strings'
+ syntax. Note that this file format doesn't support plural forms.
+
+`-w NUMBER'
+`--width=NUMBER'
+ Set the output page width. Long strings in the output files will
+ be split across multiple lines in order to ensure that each line's
+ width (= number of screen columns) is less or equal to the given
+ NUMBER.
+
+`--no-wrap'
+ Do not break long message lines. Message lines whose width
+ exceeds the output page width will not be split into several
+ lines. Only file reference lines which are wider than the output
+ page width will be split.
+
+`-s'
+`--sort-output'
+ Generate sorted output. Note that using this option makes it much
+ harder for the translator to understand each message's context.
+
+`-F'
+`--sort-by-file'
+ Sort output by file location.
+
+
+7.1.8 Informative output
+------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+`-v'
+`--verbose'
+ Increase verbosity level.
+
+`-q'
+`--quiet'
+`--silent'
+ Suppress progress indicators.
+
+
+
+File: gettext.info, Node: Editing, Next: Manipulating, Prev: Updating, Up: Top
+
+8 Editing PO Files
+******************
+
+* Menu:
+
+* KBabel:: KDE's PO File Editor
+* Gtranslator:: GNOME's PO File Editor
+* PO Mode:: Emacs's PO File Editor
+* Compendium:: Using Translation Compendia
+
+
+File: gettext.info, Node: KBabel, Next: Gtranslator, Prev: Editing, Up: Editing
+
+8.1 KDE's PO File Editor
+========================
+
+
+File: gettext.info, Node: Gtranslator, Next: PO Mode, Prev: KBabel, Up: Editing
+
+8.2 GNOME's PO File Editor
+==========================
+
+
+File: gettext.info, Node: PO Mode, Next: Compendium, Prev: Gtranslator, Up: Editing
+
+8.3 Emacs's PO File Editor
+==========================
+
+ For those of you being the lucky users of Emacs, PO mode has been
+specifically created for providing a cozy environment for editing or
+modifying PO files. While editing a PO file, PO mode allows for the
+easy browsing of auxiliary and compendium PO files, as well as for
+following references into the set of C program sources from which PO
+files have been derived. It has a few special features, among which
+are the interactive marking of program strings as translatable, and the
+validation of PO files with easy repositioning to PO file lines showing
+errors.
+
+ For the beginning, besides main PO mode commands (*note Main PO
+Commands::), you should know how to move between entries (*note Entry
+Positioning::), and how to handle untranslated entries (*note
+Untranslated Entries::).
+
+* Menu:
+
+* Installation:: Completing GNU `gettext' Installation
+* Main PO Commands:: Main Commands
+* Entry Positioning:: Entry Positioning
+* Normalizing:: Normalizing Strings in Entries
+* Translated Entries:: Translated Entries
+* Fuzzy Entries:: Fuzzy Entries
+* Untranslated Entries:: Untranslated Entries
+* Obsolete Entries:: Obsolete Entries
+* Modifying Translations:: Modifying Translations
+* Modifying Comments:: Modifying Comments
+* Subedit:: Mode for Editing Translations
+* C Sources Context:: C Sources Context
+* Auxiliary:: Consulting Auxiliary PO Files
+
+
+File: gettext.info, Node: Installation, Next: Main PO Commands, Prev: PO Mode, Up: PO Mode
+
+8.3.1 Completing GNU `gettext' Installation
+-------------------------------------------
+
+ Once you have received, unpacked, configured and compiled the GNU
+`gettext' distribution, the `make install' command puts in place the
+programs `xgettext', `msgfmt', `gettext', and `msgmerge', as well as
+their available message catalogs. To top off a comfortable
+installation, you might also want to make the PO mode available to your
+Emacs users.
+
+ During the installation of the PO mode, you might want to modify your
+file `.emacs', once and for all, so it contains a few lines looking
+like:
+
+ (setq auto-mode-alist
+ (cons '("\\.po\\'\\|\\.po\\." . po-mode) auto-mode-alist))
+ (autoload 'po-mode "po-mode" "Major mode for translators to edit PO files" t)
+
+ Later, whenever you edit some `.po' file, or any file having the
+string `.po.' within its name, Emacs loads `po-mode.elc' (or
+`po-mode.el') as needed, and automatically activates PO mode commands
+for the associated buffer. The string _PO_ appears in the mode line
+for any buffer for which PO mode is active. Many PO files may be
+active at once in a single Emacs session.
+
+ If you are using Emacs version 20 or newer, and have already
+installed the appropriate international fonts on your system, you may
+also tell Emacs how to determine automatically the coding system of
+every PO file. This will often (but not always) cause the necessary
+fonts to be loaded and used for displaying the translations on your
+Emacs screen. For this to happen, add the lines:
+
+ (modify-coding-system-alist 'file "\\.po\\'\\|\\.po\\."
+ 'po-find-file-coding-system)
+ (autoload 'po-find-file-coding-system "po-mode")
+
+to your `.emacs' file. If, with this, you still see boxes instead of
+international characters, try a different font set (via Shift Mouse
+button 1).
+
+
+File: gettext.info, Node: Main PO Commands, Next: Entry Positioning, Prev: Installation, Up: PO Mode
+
+8.3.2 Main PO mode Commands
+---------------------------
+
+ After setting up Emacs with something similar to the lines in *note
+Installation::, PO mode is activated for a window when Emacs finds a PO
+file in that window. This puts the window read-only and establishes a
+po-mode-map, which is a genuine Emacs mode, in a way that is not derived
+from text mode in any way. Functions found on `po-mode-hook', if any,
+will be executed.
+
+ When PO mode is active in a window, the letters `PO' appear in the
+mode line for that window. The mode line also displays how many
+entries of each kind are held in the PO file. For example, the string
+`132t+3f+10u+2o' would tell the translator that the PO mode contains
+132 translated entries (*note Translated Entries::, 3 fuzzy entries
+(*note Fuzzy Entries::), 10 untranslated entries (*note Untranslated
+Entries::) and 2 obsolete entries (*note Obsolete Entries::).
+Zero-coefficients items are not shown. So, in this example, if the
+fuzzy entries were unfuzzied, the untranslated entries were translated
+and the obsolete entries were deleted, the mode line would merely
+display `145t' for the counters.
+
+ The main PO commands are those which do not fit into the other
+categories of subsequent sections. These allow for quitting PO mode or
+for managing windows in special ways.
+
+`_'
+ Undo last modification to the PO file (`po-undo').
+
+`Q'
+ Quit processing and save the PO file (`po-quit').
+
+`q'
+ Quit processing, possibly after confirmation
+ (`po-confirm-and-quit').
+
+`0'
+ Temporary leave the PO file window (`po-other-window').
+
+`?'
+`h'
+ Show help about PO mode (`po-help').
+
+`='
+ Give some PO file statistics (`po-statistics').
+
+`V'
+ Batch validate the format of the whole PO file (`po-validate').
+
+
+ The command `_' (`po-undo') interfaces to the Emacs _undo_ facility.
+*Note Undoing Changes: (emacs)Undo. Each time `_' is typed,
+modifications which the translator did to the PO file are undone a
+little more. For the purpose of undoing, each PO mode command is
+atomic. This is especially true for the `<RET>' command: the whole
+edition made by using a single use of this command is undone at once,
+even if the edition itself implied several actions. However, while in
+the editing window, one can undo the edition work quite parsimoniously.
+
+ The commands `Q' (`po-quit') and `q' (`po-confirm-and-quit') are
+used when the translator is done with the PO file. The former is a bit
+less verbose than the latter. If the file has been modified, it is
+saved to disk first. In both cases, and prior to all this, the
+commands check if any untranslated messages remain in the PO file and,
+if so, the translator is asked if she really wants to leave off working
+with this PO file. This is the preferred way of getting rid of an
+Emacs PO file buffer. Merely killing it through the usual command
+`C-x k' (`kill-buffer') is not the tidiest way to proceed.
+
+ The command `0' (`po-other-window') is another, softer way, to leave
+PO mode, temporarily. It just moves the cursor to some other Emacs
+window, and pops one if necessary. For example, if the translator just
+got PO mode to show some source context in some other, she might
+discover some apparent bug in the program source that needs correction.
+This command allows the translator to change sex, become a programmer,
+and have the cursor right into the window containing the program she
+(or rather _he_) wants to modify. By later getting the cursor back in
+the PO file window, or by asking Emacs to edit this file once again, PO
+mode is then recovered.
+
+ The command `h' (`po-help') displays a summary of all available PO
+mode commands. The translator should then type any character to resume
+normal PO mode operations. The command `?' has the same effect as `h'.
+
+ The command `=' (`po-statistics') computes the total number of
+entries in the PO file, the ordinal of the current entry (counted from
+1), the number of untranslated entries, the number of obsolete entries,
+and displays all these numbers.
+
+ The command `V' (`po-validate') launches `msgfmt' in checking and
+verbose mode over the current PO file. This command first offers to
+save the current PO file on disk. The `msgfmt' tool, from GNU
+`gettext', has the purpose of creating a MO file out of a PO file, and
+PO mode uses the features of this program for checking the overall
+format of a PO file, as well as all individual entries.
+
+ The program `msgfmt' runs asynchronously with Emacs, so the
+translator regains control immediately while her PO file is being
+studied. Error output is collected in the Emacs `*compilation*' buffer,
+displayed in another window. The regular Emacs command `C-x`'
+(`next-error'), as well as other usual compile commands, allow the
+translator to reposition quickly to the offending parts of the PO file.
+Once the cursor is on the line in error, the translator may decide on
+any PO mode action which would help correcting the error.
+
+
+File: gettext.info, Node: Entry Positioning, Next: Normalizing, Prev: Main PO Commands, Up: PO Mode
+
+8.3.3 Entry Positioning
+-----------------------
+
+ The cursor in a PO file window is almost always part of an entry.
+The only exceptions are the special case when the cursor is after the
+last entry in the file, or when the PO file is empty. The entry where
+the cursor is found to be is said to be the current entry. Many PO
+mode commands operate on the current entry, so moving the cursor does
+more than allowing the translator to browse the PO file, this also
+selects on which entry commands operate.
+
+ Some PO mode commands alter the position of the cursor in a
+specialized way. A few of those special purpose positioning are
+described here, the others are described in following sections (for a
+complete list try `C-h m'):
+
+`.'
+ Redisplay the current entry (`po-current-entry').
+
+`n'
+ Select the entry after the current one (`po-next-entry').
+
+`p'
+ Select the entry before the current one (`po-previous-entry').
+
+`<'
+ Select the first entry in the PO file (`po-first-entry').
+
+`>'
+ Select the last entry in the PO file (`po-last-entry').
+
+`m'
+ Record the location of the current entry for later use
+ (`po-push-location').
+
+`r'
+ Return to a previously saved entry location (`po-pop-location').
+
+`x'
+ Exchange the current entry location with the previously saved one
+ (`po-exchange-location').
+
+
+ Any Emacs command able to reposition the cursor may be used to
+select the current entry in PO mode, including commands which move by
+characters, lines, paragraphs, screens or pages, and search commands.
+However, there is a kind of standard way to display the current entry
+in PO mode, which usual Emacs commands moving the cursor do not
+especially try to enforce. The command `.' (`po-current-entry') has
+the sole purpose of redisplaying the current entry properly, after the
+current entry has been changed by means external to PO mode, or the
+Emacs screen otherwise altered.
+
+ It is yet to be decided if PO mode helps the translator, or otherwise
+irritates her, by forcing a rigid window disposition while she is doing
+her work. We originally had quite precise ideas about how windows
+should behave, but on the other hand, anyone used to Emacs is often
+happy to keep full control. Maybe a fixed window disposition might be
+offered as a PO mode option that the translator might activate or
+deactivate at will, so it could be offered on an experimental basis.
+If nobody feels a real need for using it, or a compulsion for writing
+it, we should drop this whole idea. The incentive for doing it should
+come from translators rather than programmers, as opinions from an
+experienced translator are surely more worth to me than opinions from
+programmers _thinking_ about how _others_ should do translation.
+
+ The commands `n' (`po-next-entry') and `p' (`po-previous-entry')
+move the cursor the entry following, or preceding, the current one. If
+`n' is given while the cursor is on the last entry of the PO file, or
+if `p' is given while the cursor is on the first entry, no move is done.
+
+ The commands `<' (`po-first-entry') and `>' (`po-last-entry') move
+the cursor to the first entry, or last entry, of the PO file. When the
+cursor is located past the last entry in a PO file, most PO mode
+commands will return an error saying `After last entry'. Moreover, the
+commands `<' and `>' have the special property of being able to work
+even when the cursor is not into some PO file entry, and one may use
+them for nicely correcting this situation. But even these commands
+will fail on a truly empty PO file. There are development plans for
+the PO mode for it to interactively fill an empty PO file from sources.
+*Note Marking::.
+
+ The translator may decide, before working at the translation of a
+particular entry, that she needs to browse the remainder of the PO
+file, maybe for finding the terminology or phraseology used in related
+entries. She can of course use the standard Emacs idioms for saving
+the current cursor location in some register, and use that register for
+getting back, or else, use the location ring.
+
+ PO mode offers another approach, by which cursor locations may be
+saved onto a special stack. The command `m' (`po-push-location')
+merely adds the location of current entry to the stack, pushing the
+already saved locations under the new one. The command `r'
+(`po-pop-location') consumes the top stack element and repositions the
+cursor to the entry associated with that top element. This position is
+then lost, for the next `r' will move the cursor to the previously
+saved location, and so on until no locations remain on the stack.
+
+ If the translator wants the position to be kept on the location
+stack, maybe for taking a look at the entry associated with the top
+element, then go elsewhere with the intent of getting back later, she
+ought to use `m' immediately after `r'.
+
+ The command `x' (`po-exchange-location') simultaneously repositions
+the cursor to the entry associated with the top element of the stack of
+saved locations, and replaces that top element with the location of the
+current entry before the move. Consequently, repeating the `x' command
+toggles alternatively between two entries. For achieving this, the
+translator will position the cursor on the first entry, use `m', then
+position to the second entry, and merely use `x' for making the switch.
+
+
+File: gettext.info, Node: Normalizing, Next: Translated Entries, Prev: Entry Positioning, Up: PO Mode
+
+8.3.4 Normalizing Strings in Entries
+------------------------------------
+
+ There are many different ways for encoding a particular string into a
+PO file entry, because there are so many different ways to split and
+quote multi-line strings, and even, to represent special characters by
+backslashed escaped sequences. Some features of PO mode rely on the
+ability for PO mode to scan an already existing PO file for a
+particular string encoded into the `msgid' field of some entry. Even
+if PO mode has internally all the built-in machinery for implementing
+this recognition easily, doing it fast is technically difficult. To
+facilitate a solution to this efficiency problem, we decided on a
+canonical representation for strings.
+
+ A conventional representation of strings in a PO file is currently
+under discussion, and PO mode experiments with a canonical
+representation. Having both `xgettext' and PO mode converging towards
+a uniform way of representing equivalent strings would be useful, as
+the internal normalization needed by PO mode could be automatically
+satisfied when using `xgettext' from GNU `gettext'. An explicit PO
+mode normalization should then be only necessary for PO files imported
+from elsewhere, or for when the convention itself evolves.
+
+ So, for achieving normalization of at least the strings of a given
+PO file needing a canonical representation, the following PO mode
+command is available:
+
+`M-x po-normalize'
+ Tidy the whole PO file by making entries more uniform.
+
+
+ The special command `M-x po-normalize', which has no associated
+keys, revises all entries, ensuring that strings of both original and
+translated entries use uniform internal quoting in the PO file. It
+also removes any crumb after the last entry. This command may be
+useful for PO files freshly imported from elsewhere, or if we ever
+improve on the canonical quoting format we use. This canonical format
+is not only meant for getting cleaner PO files, but also for greatly
+speeding up `msgid' string lookup for some other PO mode commands.
+
+ `M-x po-normalize' presently makes three passes over the entries.
+The first implements heuristics for converting PO files for GNU
+`gettext' 0.6 and earlier, in which `msgid' and `msgstr' fields were
+using K&R style C string syntax for multi-line strings. These
+heuristics may fail for comments not related to obsolete entries and
+ending with a backslash; they also depend on subsequent passes for
+finalizing the proper commenting of continued lines for obsolete
+entries. This first pass might disappear once all oldish PO files
+would have been adjusted. The second and third pass normalize all
+`msgid' and `msgstr' strings respectively. They also clean out those
+trailing backslashes used by XView's `msgfmt' for continued lines.
+
+ Having such an explicit normalizing command allows for importing PO
+files from other sources, but also eases the evolution of the current
+convention, evolution driven mostly by aesthetic concerns, as of now.
+It is easy to make suggested adjustments at a later time, as the
+normalizing command and eventually, other GNU `gettext' tools should
+greatly automate conformance. A description of the canonical string
+format is given below, for the particular benefit of those not having
+Emacs handy, and who would nevertheless want to handcraft their PO
+files in nice ways.
+
+ Right now, in PO mode, strings are single line or multi-line. A
+string goes multi-line if and only if it has _embedded_ newlines, that
+is, if it matches `[^\n]\n+[^\n]'. So, we would have:
+
+ msgstr "\n\nHello, world!\n\n\n"
+
+ but, replacing the space by a newline, this becomes:
+
+ msgstr ""
+ "\n"
+ "\n"
+ "Hello,\n"
+ "world!\n"
+ "\n"
+ "\n"
+
+ We are deliberately using a caricatural example, here, to make the
+point clearer. Usually, multi-lines are not that bad looking. It is
+probable that we will implement the following suggestion. We might
+lump together all initial newlines into the empty string, and also all
+newlines introducing empty lines (that is, for N > 1, the N-1'th last
+newlines would go together on a separate string), so making the
+previous example appear:
+
+ msgstr "\n\n"
+ "Hello,\n"
+ "world!\n"
+ "\n\n"
+
+ There are a few yet undecided little points about string
+normalization, to be documented in this manual, once these questions
+settle.
+
+
+File: gettext.info, Node: Translated Entries, Next: Fuzzy Entries, Prev: Normalizing, Up: PO Mode
+
+8.3.5 Translated Entries
+------------------------
+
+ Each PO file entry for which the `msgstr' field has been filled with
+a translation, and which is not marked as fuzzy (*note Fuzzy Entries::),
+is said to be a "translated" entry. Only translated entries will later
+be compiled by GNU `msgfmt' and become usable in programs. Other entry
+types will be excluded; translation will not occur for them.
+
+ Some commands are more specifically related to translated entry
+processing.
+
+`t'
+ Find the next translated entry (`po-next-translated-entry').
+
+`T'
+ Find the previous translated entry
+ (`po-previous-translated-entry').
+
+
+ The commands `t' (`po-next-translated-entry') and `T'
+(`po-previous-translated-entry') move forwards or backwards, chasing
+for an translated entry. If none is found, the search is extended and
+wraps around in the PO file buffer.
+
+ Translated entries usually result from the translator having edited
+in a translation for them, *note Modifying Translations::. However, if
+the variable `po-auto-fuzzy-on-edit' is not `nil', the entry having
+received a new translation first becomes a fuzzy entry, which ought to
+be later unfuzzied before becoming an official, genuine translated
+entry. *Note Fuzzy Entries::.
+
+
+File: gettext.info, Node: Fuzzy Entries, Next: Untranslated Entries, Prev: Translated Entries, Up: PO Mode
+
+8.3.6 Fuzzy Entries
+-------------------
+
+ Each PO file entry may have a set of "attributes", which are
+qualities given a name and explicitly associated with the translation,
+using a special system comment. One of these attributes has the name
+`fuzzy', and entries having this attribute are said to have a fuzzy
+translation. They are called fuzzy entries, for short.
+
+ Fuzzy entries, even if they account for translated entries for most
+other purposes, usually call for revision by the translator. Those may
+be produced by applying the program `msgmerge' to update an older
+translated PO files according to a new PO template file, when this tool
+hypothesises that some new `msgid' has been modified only slightly out
+of an older one, and chooses to pair what it thinks to be the old
+translation for the new modified entry. The slight alteration in the
+original string (the `msgid' string) should often be reflected in the
+translated string, and this requires the intervention of the
+translator. For this reason, `msgmerge' might mark some entries as
+being fuzzy.
+
+ Also, the translator may decide herself to mark an entry as fuzzy
+for her own convenience, when she wants to remember that the entry has
+to be later revisited. So, some commands are more specifically related
+to fuzzy entry processing.
+
+`f'
+ Find the next fuzzy entry (`po-next-fuzzy-entry').
+
+`F'
+ Find the previous fuzzy entry (`po-previous-fuzzy-entry').
+
+`<TAB>'
+ Remove the fuzzy attribute of the current entry (`po-unfuzzy').
+
+
+ The commands `f' (`po-next-fuzzy-entry') and `F'
+(`po-previous-fuzzy-entry') move forwards or backwards, chasing for a
+fuzzy entry. If none is found, the search is extended and wraps around
+in the PO file buffer.
+
+ The command `<TAB>' (`po-unfuzzy') removes the fuzzy attribute
+associated with an entry, usually leaving it translated. Further, if
+the variable `po-auto-select-on-unfuzzy' has not the `nil' value, the
+`<TAB>' command will automatically chase for another interesting entry
+to work on. The initial value of `po-auto-select-on-unfuzzy' is `nil'.
+
+ The initial value of `po-auto-fuzzy-on-edit' is `nil'. However, if
+the variable `po-auto-fuzzy-on-edit' is set to `t', any entry edited
+through the `<RET>' command is marked fuzzy, as a way to ensure some
+kind of double check, later. In this case, the usual paradigm is that
+an entry becomes fuzzy (if not already) whenever the translator
+modifies it. If she is satisfied with the translation, she then uses
+`<TAB>' to pick another entry to work on, clearing the fuzzy attribute
+on the same blow. If she is not satisfied yet, she merely uses `<SPC>'
+to chase another entry, leaving the entry fuzzy.
+
+ The translator may also use the `<DEL>' command
+(`po-fade-out-entry') over any translated entry to mark it as being
+fuzzy, when she wants to easily leave a trace she wants to later return
+working at this entry.
+
+ Also, when time comes to quit working on a PO file buffer with the
+`q' command, the translator is asked for confirmation, if fuzzy string
+still exists.
+
+
+File: gettext.info, Node: Untranslated Entries, Next: Obsolete Entries, Prev: Fuzzy Entries, Up: PO Mode
+
+8.3.7 Untranslated Entries
+--------------------------
+
+ When `xgettext' originally creates a PO file, unless told otherwise,
+it initializes the `msgid' field with the untranslated string, and
+leaves the `msgstr' string to be empty. Such entries, having an empty
+translation, are said to be "untranslated" entries. Later, when the
+programmer slightly modifies some string right in the program, this
+change is later reflected in the PO file by the appearance of a new
+untranslated entry for the modified string.
+
+ The usual commands moving from entry to entry consider untranslated
+entries on the same level as active entries. Untranslated entries are
+easily recognizable by the fact they end with `msgstr ""'.
+
+ The work of the translator might be (quite naively) seen as the
+process of seeking for an untranslated entry, editing a translation for
+it, and repeating these actions until no untranslated entries remain.
+Some commands are more specifically related to untranslated entry
+processing.
+
+`u'
+ Find the next untranslated entry (`po-next-untranslated-entry').
+
+`U'
+ Find the previous untranslated entry
+ (`po-previous-untransted-entry').
+
+`k'
+ Turn the current entry into an untranslated one (`po-kill-msgstr').
+
+
+ The commands `u' (`po-next-untranslated-entry') and `U'
+(`po-previous-untransted-entry') move forwards or backwards, chasing
+for an untranslated entry. If none is found, the search is extended
+and wraps around in the PO file buffer.
+
+ An entry can be turned back into an untranslated entry by merely
+emptying its translation, using the command `k' (`po-kill-msgstr').
+*Note Modifying Translations::.
+
+ Also, when time comes to quit working on a PO file buffer with the
+`q' command, the translator is asked for confirmation, if some
+untranslated string still exists.
+
+
+File: gettext.info, Node: Obsolete Entries, Next: Modifying Translations, Prev: Untranslated Entries, Up: PO Mode
+
+8.3.8 Obsolete Entries
+----------------------
+
+ By "obsolete" PO file entries, we mean those entries which are
+commented out, usually by `msgmerge' when it found that the translation
+is not needed anymore by the package being localized.
+
+ The usual commands moving from entry to entry consider obsolete
+entries on the same level as active entries. Obsolete entries are
+easily recognizable by the fact that all their lines start with `#',
+even those lines containing `msgid' or `msgstr'.
+
+ Commands exist for emptying the translation or reinitializing it to
+the original untranslated string. Commands interfacing with the kill
+ring may force some previously saved text into the translation. The
+user may interactively edit the translation. All these commands may
+apply to obsolete entries, carefully leaving the entry obsolete after
+the fact.
+
+ Moreover, some commands are more specifically related to obsolete
+entry processing.
+
+`o'
+ Find the next obsolete entry (`po-next-obsolete-entry').
+
+`O'
+ Find the previous obsolete entry (`po-previous-obsolete-entry').
+
+`<DEL>'
+ Make an active entry obsolete, or zap out an obsolete entry
+ (`po-fade-out-entry').
+
+
+ The commands `o' (`po-next-obsolete-entry') and `O'
+(`po-previous-obsolete-entry') move forwards or backwards, chasing for
+an obsolete entry. If none is found, the search is extended and wraps
+around in the PO file buffer.
+
+ PO mode does not provide ways for un-commenting an obsolete entry
+and making it active, because this would reintroduce an original
+untranslated string which does not correspond to any marked string in
+the program sources. This goes with the philosophy of never
+introducing useless `msgid' values.
+
+ However, it is possible to comment out an active entry, so making it
+obsolete. GNU `gettext' utilities will later react to the
+disappearance of a translation by using the untranslated string. The
+command `<DEL>' (`po-fade-out-entry') pushes the current entry a little
+further towards annihilation. If the entry is active (it is a
+translated entry), then it is first made fuzzy. If it is already fuzzy,
+then the entry is merely commented out, with confirmation. If the entry
+is already obsolete, then it is completely deleted from the PO file.
+It is easy to recycle the translation so deleted into some other PO file
+entry, usually one which is untranslated. *Note Modifying
+Translations::.
+
+ Here is a quite interesting problem to solve for later development of
+PO mode, for those nights you are not sleepy. The idea would be that
+PO mode might become bright enough, one of these days, to make good
+guesses at retrieving the most probable candidate, among all obsolete
+entries, for initializing the translation of a newly appeared string.
+I think it might be a quite hard problem to do this algorithmically, as
+we have to develop good and efficient measures of string similarity.
+Right now, PO mode completely lets the decision to the translator, when
+the time comes to find the adequate obsolete translation, it merely
+tries to provide handy tools for helping her to do so.
+
+
+File: gettext.info, Node: Modifying Translations, Next: Modifying Comments, Prev: Obsolete Entries, Up: PO Mode
+
+8.3.9 Modifying Translations
+----------------------------
+
+ PO mode prevents direct modification of the PO file, by the usual
+means Emacs gives for altering a buffer's contents. By doing so, it
+pretends helping the translator to avoid little clerical errors about
+the overall file format, or the proper quoting of strings, as those
+errors would be easily made. Other kinds of errors are still possible,
+but some may be caught and diagnosed by the batch validation process,
+which the translator may always trigger by the `V' command. For all
+other errors, the translator has to rely on her own judgment, and also
+on the linguistic reports submitted to her by the users of the
+translated package, having the same mother tongue.
+
+ When the time comes to create a translation, correct an error
+diagnosed mechanically or reported by a user, the translators have to
+resort to using the following commands for modifying the translations.
+
+`<RET>'
+ Interactively edit the translation (`po-edit-msgstr').
+
+`<LFD>'
+`C-j'
+ Reinitialize the translation with the original, untranslated string
+ (`po-msgid-to-msgstr').
+
+`k'
+ Save the translation on the kill ring, and delete it
+ (`po-kill-msgstr').
+
+`w'
+ Save the translation on the kill ring, without deleting it
+ (`po-kill-ring-save-msgstr').
+
+`y'
+ Replace the translation, taking the new from the kill ring
+ (`po-yank-msgstr').
+
+
+ The command `<RET>' (`po-edit-msgstr') opens a new Emacs window
+meant to edit in a new translation, or to modify an already existing
+translation. The new window contains a copy of the translation taken
+from the current PO file entry, all ready for edition, expunged of all
+quoting marks, fully modifiable and with the complete extent of Emacs
+modifying commands. When the translator is done with her
+modifications, she may use `C-c C-c' to close the subedit window with
+the automatically requoted results, or `C-c C-k' to abort her
+modifications. *Note Subedit::, for more information.
+
+ The command `<LFD>' (`po-msgid-to-msgstr') initializes, or
+reinitializes the translation with the original string. This command is
+normally used when the translator wants to redo a fresh translation of
+the original string, disregarding any previous work.
+
+ It is possible to arrange so, whenever editing an untranslated
+entry, the `<LFD>' command be automatically executed. If you set
+`po-auto-edit-with-msgid' to `t', the translation gets initialised with
+the original string, in case none exists already. The default value
+for `po-auto-edit-with-msgid' is `nil'.
+
+ In fact, whether it is best to start a translation with an empty
+string, or rather with a copy of the original string, is a matter of
+taste or habit. Sometimes, the source language and the target language
+are so different that is simply best to start writing on an empty page.
+At other times, the source and target languages are so close that it
+would be a waste to retype a number of words already being written in
+the original string. A translator may also like having the original
+string right under her eyes, as she will progressively overwrite the
+original text with the translation, even if this requires some extra
+editing work to get rid of the original.
+
+ The command `k' (`po-kill-msgstr') merely empties the translation
+string, so turning the entry into an untranslated one. But while doing
+so, its previous contents is put apart in a special place, known as the
+kill ring. The command `w' (`po-kill-ring-save-msgstr') has also the
+effect of taking a copy of the translation onto the kill ring, but it
+otherwise leaves the entry alone, and does _not_ remove the translation
+from the entry. Both commands use exactly the Emacs kill ring, which
+is shared between buffers, and which is well known already to Emacs
+lovers.
+
+ The translator may use `k' or `w' many times in the course of her
+work, as the kill ring may hold several saved translations. From the
+kill ring, strings may later be reinserted in various Emacs buffers.
+In particular, the kill ring may be used for moving translation strings
+between different entries of a single PO file buffer, or if the
+translator is handling many such buffers at once, even between PO files.
+
+ To facilitate exchanges with buffers which are not in PO mode, the
+translation string put on the kill ring by the `k' command is fully
+unquoted before being saved: external quotes are removed, multi-line
+strings are concatenated, and backslash escaped sequences are turned
+into their corresponding characters. In the special case of obsolete
+entries, the translation is also uncommented prior to saving.
+
+ The command `y' (`po-yank-msgstr') completely replaces the
+translation of the current entry by a string taken from the kill ring.
+Following Emacs terminology, we then say that the replacement string is
+"yanked" into the PO file buffer. *Note Yanking: (emacs)Yanking. The
+first time `y' is used, the translation receives the value of the most
+recent addition to the kill ring. If `y' is typed once again,
+immediately, without intervening keystrokes, the translation just
+inserted is taken away and replaced by the second most recent addition
+to the kill ring. By repeating `y' many times in a row, the translator
+may travel along the kill ring for saved strings, until she finds the
+string she really wanted.
+
+ When a string is yanked into a PO file entry, it is fully and
+automatically requoted for complying with the format PO files should
+have. Further, if the entry is obsolete, PO mode then appropriately
+push the inserted string inside comments. Once again, translators
+should not burden themselves with quoting considerations besides, of
+course, the necessity of the translated string itself respective to the
+program using it.
+
+ Note that `k' or `w' are not the only commands pushing strings on
+the kill ring, as almost any PO mode command replacing translation
+strings (or the translator comments) automatically saves the old string
+on the kill ring. The main exceptions to this general rule are the
+yanking commands themselves.
+
+ To better illustrate the operation of killing and yanking, let's use
+an actual example, taken from a common situation. When the programmer
+slightly modifies some string right in the program, his change is later
+reflected in the PO file by the appearance of a new untranslated entry
+for the modified string, and the fact that the entry translating the
+original or unmodified string becomes obsolete. In many cases, the
+translator might spare herself some work by retrieving the unmodified
+translation from the obsolete entry, then initializing the untranslated
+entry `msgstr' field with this retrieved translation. Once this done,
+the obsolete entry is not wanted anymore, and may be safely deleted.
+
+ When the translator finds an untranslated entry and suspects that a
+slight variant of the translation exists, she immediately uses `m' to
+mark the current entry location, then starts chasing obsolete entries
+with `o', hoping to find some translation corresponding to the
+unmodified string. Once found, she uses the `<DEL>' command for
+deleting the obsolete entry, knowing that `<DEL>' also _kills_ the
+translation, that is, pushes the translation on the kill ring. Then,
+`r' returns to the initial untranslated entry, and `y' then _yanks_ the
+saved translation right into the `msgstr' field. The translator is
+then free to use `<RET>' for fine tuning the translation contents, and
+maybe to later use `u', then `m' again, for going on with the next
+untranslated string.
+
+ When some sequence of keys has to be typed over and over again, the
+translator may find it useful to become better acquainted with the Emacs
+capability of learning these sequences and playing them back under
+request. *Note Keyboard Macros: (emacs)Keyboard Macros.
+
+
+File: gettext.info, Node: Modifying Comments, Next: Subedit, Prev: Modifying Translations, Up: PO Mode
+
+8.3.10 Modifying Comments
+-------------------------
+
+ Any translation work done seriously will raise many linguistic
+difficulties, for which decisions have to be made, and the choices
+further documented. These documents may be saved within the PO file in
+form of translator comments, which the translator is free to create,
+delete, or modify at will. These comments may be useful to herself
+when she returns to this PO file after a while.
+
+ Comments not having whitespace after the initial `#', for example,
+those beginning with `#.' or `#:', are _not_ translator comments, they
+are exclusively created by other `gettext' tools. So, the commands
+below will never alter such system added comments, they are not meant
+for the translator to modify. *Note PO Files::.
+
+ The following commands are somewhat similar to those modifying
+translations, so the general indications given for those apply here.
+*Note Modifying Translations::.
+
+`#'
+ Interactively edit the translator comments (`po-edit-comment').
+
+`K'
+ Save the translator comments on the kill ring, and delete it
+ (`po-kill-comment').
+
+`W'
+ Save the translator comments on the kill ring, without deleting it
+ (`po-kill-ring-save-comment').
+
+`Y'
+ Replace the translator comments, taking the new from the kill ring
+ (`po-yank-comment').
+
+
+ These commands parallel PO mode commands for modifying the
+translation strings, and behave much the same way as they do, except
+that they handle this part of PO file comments meant for translator
+usage, rather than the translation strings. So, if the descriptions
+given below are slightly succinct, it is because the full details have
+already been given. *Note Modifying Translations::.
+
+ The command `#' (`po-edit-comment') opens a new Emacs window
+containing a copy of the translator comments on the current PO file
+entry. If there are no such comments, PO mode understands that the
+translator wants to add a comment to the entry, and she is presented
+with an empty screen. Comment marks (`#') and the space following them
+are automatically removed before edition, and reinstated after. For
+translator comments pertaining to obsolete entries, the uncommenting
+and recommenting operations are done twice. Once in the editing
+window, the keys `C-c C-c' allow the translator to tell she is finished
+with editing the comment. *Note Subedit::, for further details.
+
+ Functions found on `po-subedit-mode-hook', if any, are executed after
+the string has been inserted in the edit buffer.
+
+ The command `K' (`po-kill-comment') gets rid of all translator
+comments, while saving those comments on the kill ring. The command
+`W' (`po-kill-ring-save-comment') takes a copy of the translator
+comments on the kill ring, but leaves them undisturbed in the current
+entry. The command `Y' (`po-yank-comment') completely replaces the
+translator comments by a string taken at the front of the kill ring.
+When this command is immediately repeated, the comments just inserted
+are withdrawn, and replaced by other strings taken along the kill ring.
+
+ On the kill ring, all strings have the same nature. There is no
+distinction between _translation_ strings and _translator comments_
+strings. So, for example, let's presume the translator has just
+finished editing a translation, and wants to create a new translator
+comment to document why the previous translation was not good, just to
+remember what was the problem. Foreseeing that she will do that in her
+documentation, the translator may want to quote the previous
+translation in her translator comments. To do so, she may initialize
+the translator comments with the previous translation, still at the
+head of the kill ring. Because editing already pushed the previous
+translation on the kill ring, she merely has to type `M-w' prior to
+`#', and the previous translation will be right there, all ready for
+being introduced by some explanatory text.
+
+ On the other hand, presume there are some translator comments already
+and that the translator wants to add to those comments, instead of
+wholly replacing them. Then, she should edit the comment right away
+with `#'. Once inside the editing window, she can use the regular
+Emacs commands `C-y' (`yank') and `M-y' (`yank-pop') to get the
+previous translation where she likes.
+
+
+File: gettext.info, Node: Subedit, Next: C Sources Context, Prev: Modifying Comments, Up: PO Mode
+
+8.3.11 Details of Sub Edition
+-----------------------------
+
+ The PO subedit minor mode has a few peculiarities worth being
+described in fuller detail. It installs a few commands over the usual
+editing set of Emacs, which are described below.
+
+`C-c C-c'
+ Complete edition (`po-subedit-exit').
+
+`C-c C-k'
+ Abort edition (`po-subedit-abort').
+
+`C-c C-a'
+ Consult auxiliary PO files (`po-subedit-cycle-auxiliary').
+
+
+ The window's contents represents a translation for a given message,
+or a translator comment. The translator may modify this window to her
+heart's content. Once this is done, the command `C-c C-c'
+(`po-subedit-exit') may be used to return the edited translation into
+the PO file, replacing the original translation, even if it moved out of
+sight or if buffers were switched.
+
+ If the translator becomes unsatisfied with her translation or
+comment, to the extent she prefers keeping what was existent prior to
+the `<RET>' or `#' command, she may use the command `C-c C-k'
+(`po-subedit-abort') to merely get rid of edition, while preserving the
+original translation or comment. Another way would be for her to exit
+normally with `C-c C-c', then type `U' once for undoing the whole
+effect of last edition.
+
+ The command `C-c C-a' (`po-subedit-cycle-auxiliary') allows for
+glancing through translations already achieved in other languages,
+directly while editing the current translation. This may be quite
+convenient when the translator is fluent at many languages, but of
+course, only makes sense when such completed auxiliary PO files are
+already available to her (*note Auxiliary::).
+
+ Functions found on `po-subedit-mode-hook', if any, are executed after
+the string has been inserted in the edit buffer.
+
+ While editing her translation, the translator should pay attention
+to not inserting unwanted `<RET>' (newline) characters at the end of
+the translated string if those are not meant to be there, or to removing
+such characters when they are required. Since these characters are not
+visible in the editing buffer, they are easily introduced by mistake.
+To help her, `<RET>' automatically puts the character `<' at the end of
+the string being edited, but this `<' is not really part of the string.
+On exiting the editing window with `C-c C-c', PO mode automatically
+removes such `<' and all whitespace added after it. If the translator
+adds characters after the terminating `<', it looses its delimiting
+property and integrally becomes part of the string. If she removes the
+delimiting `<', then the edited string is taken _as is_, with all
+trailing newlines, even if invisible. Also, if the translated string
+ought to end itself with a genuine `<', then the delimiting `<' may not
+be removed; so the string should appear, in the editing window, as
+ending with two `<' in a row.
+
+ When a translation (or a comment) is being edited, the translator
+may move the cursor back into the PO file buffer and freely move to
+other entries, browsing at will. If, with an edition pending, the
+translator wanders in the PO file buffer, she may decide to start
+modifying another entry. Each entry being edited has its own subedit
+buffer. It is possible to simultaneously edit the translation _and_
+the comment of a single entry, or to edit entries in different PO
+files, all at once. Typing `<RET>' on a field already being edited
+merely resumes that particular edit. Yet, the translator should better
+be comfortable at handling many Emacs windows!
+
+ Pending subedits may be completed or aborted in any order, regardless
+of how or when they were started. When many subedits are pending and
+the translator asks for quitting the PO file (with the `q' command),
+subedits are automatically resumed one at a time, so she may decide for
+each of them.
+
+
+File: gettext.info, Node: C Sources Context, Next: Auxiliary, Prev: Subedit, Up: PO Mode
+
+8.3.12 C Sources Context
+------------------------
+
+ PO mode is particularly powerful when used with PO files created
+through GNU `gettext' utilities, as those utilities insert special
+comments in the PO files they generate. Some of these special comments
+relate the PO file entry to exactly where the untranslated string
+appears in the program sources.
+
+ When the translator gets to an untranslated entry, she is fairly
+often faced with an original string which is not as informative as it
+normally should be, being succinct, cryptic, or otherwise ambiguous.
+Before choosing how to translate the string, she needs to understand
+better what the string really means and how tight the translation has
+to be. Most of the time, when problems arise, the only way left to make
+her judgment is looking at the true program sources from where this
+string originated, searching for surrounding comments the programmer
+might have put in there, and looking around for helping clues of _any_
+kind.
+
+ Surely, when looking at program sources, the translator will receive
+more help if she is a fluent programmer. However, even if she is not
+versed in programming and feels a little lost in C code, the translator
+should not be shy at taking a look, once in a while. It is most
+probable that she will still be able to find some of the hints she
+needs. She will learn quickly to not feel uncomfortable in program
+code, paying more attention to programmer's comments, variable and
+function names (if he dared choosing them well), and overall
+organization, than to the program code itself.
+
+ The following commands are meant to help the translator at getting
+program source context for a PO file entry.
+
+`s'
+ Resume the display of a program source context, or cycle through
+ them (`po-cycle-source-reference').
+
+`M-s'
+ Display of a program source context selected by menu
+ (`po-select-source-reference').
+
+`S'
+ Add a directory to the search path for source files
+ (`po-consider-source-path').
+
+`M-S'
+ Delete a directory from the search path for source files
+ (`po-ignore-source-path').
+
+
+ The commands `s' (`po-cycle-source-reference') and `M-s'
+(`po-select-source-reference') both open another window displaying some
+source program file, and already positioned in such a way that it shows
+an actual use of the string to be translated. By doing so, the command
+gives source program context for the string. But if the entry has no
+source context references, or if all references are unresolved along
+the search path for program sources, then the command diagnoses this as
+an error.
+
+ Even if `s' (or `M-s') opens a new window, the cursor stays in the
+PO file window. If the translator really wants to get into the program
+source window, she ought to do it explicitly, maybe by using command
+`O'.
+
+ When `s' is typed for the first time, or for a PO file entry which
+is different of the last one used for getting source context, then the
+command reacts by giving the first context available for this entry, if
+any. If some context has already been recently displayed for the
+current PO file entry, and the translator wandered off to do other
+things, typing `s' again will merely resume, in another window, the
+context last displayed. In particular, if the translator moved the
+cursor away from the context in the source file, the command will bring
+the cursor back to the context. By using `s' many times in a row, with
+no other commands intervening, PO mode will cycle to the next available
+contexts for this particular entry, getting back to the first context
+once the last has been shown.
+
+ The command `M-s' behaves differently. Instead of cycling through
+references, it lets the translator choose a particular reference among
+many, and displays that reference. It is best used with completion, if
+the translator types `<TAB>' immediately after `M-s', in response to
+the question, she will be offered a menu of all possible references, as
+a reminder of which are the acceptable answers. This command is useful
+only where there are really many contexts available for a single string
+to translate.
+
+ Program source files are usually found relative to where the PO file
+stands. As a special provision, when this fails, the file is also
+looked for, but relative to the directory immediately above it. Those
+two cases take proper care of most PO files. However, it might happen
+that a PO file has been moved, or is edited in a different place than
+its normal location. When this happens, the translator should tell PO
+mode in which directory normally sits the genuine PO file. Many such
+directories may be specified, and all together, they constitute what is
+called the "search path" for program sources. The command `S'
+(`po-consider-source-path') is used to interactively enter a new
+directory at the front of the search path, and the command `M-S'
+(`po-ignore-source-path') is used to select, with completion, one of
+the directories she does not want anymore on the search path.
+
+
+File: gettext.info, Node: Auxiliary, Prev: C Sources Context, Up: PO Mode
+
+8.3.13 Consulting Auxiliary PO Files
+------------------------------------
+
+ PO mode is able to help the knowledgeable translator, being fluent in
+many languages, at taking advantage of translations already achieved in
+other languages she just happens to know. It provides these other
+language translations as additional context for her own work. Moreover,
+it has features to ease the production of translations for many
+languages at once, for translators preferring to work in this way.
+
+ An "auxiliary" PO file is an existing PO file meant for the same
+package the translator is working on, but targeted to a different mother
+tongue language. Commands exist for declaring and handling auxiliary
+PO files, and also for showing contexts for the entry under work.
+
+ Here are the auxiliary file commands available in PO mode.
+
+`a'
+ Seek auxiliary files for another translation for the same entry
+ (`po-cycle-auxiliary').
+
+`C-c C-a'
+ Switch to a particular auxiliary file (`po-select-auxiliary').
+
+`A'
+ Declare this PO file as an auxiliary file
+ (`po-consider-as-auxiliary').
+
+`M-A'
+ Remove this PO file from the list of auxiliary files
+ (`po-ignore-as-auxiliary').
+
+
+ Command `A' (`po-consider-as-auxiliary') adds the current PO file to
+the list of auxiliary files, while command `M-A'
+(`po-ignore-as-auxiliary' just removes it.
+
+ The command `a' (`po-cycle-auxiliary') seeks all auxiliary PO files,
+round-robin, searching for a translated entry in some other language
+having an `msgid' field identical as the one for the current entry.
+The found PO file, if any, takes the place of the current PO file in
+the display (its window gets on top). Before doing so, the current PO
+file is also made into an auxiliary file, if not already. So, `a' in
+this newly displayed PO file will seek another PO file, and so on, so
+repeating `a' will eventually yield back the original PO file.
+
+ The command `C-c C-a' (`po-select-auxiliary') asks the translator
+for her choice of a particular auxiliary file, with completion, and
+then switches to that selected PO file. The command also checks if the
+selected file has an `msgid' field identical as the one for the current
+entry, and if yes, this entry becomes current. Otherwise, the cursor
+of the selected file is left undisturbed.
+
+ For all this to work fully, auxiliary PO files will have to be
+normalized, in that way that `msgid' fields should be written _exactly_
+the same way. It is possible to write `msgid' fields in various ways
+for representing the same string, different writing would break the
+proper behaviour of the auxiliary file commands of PO mode. This is not
+expected to be much a problem in practice, as most existing PO files
+have their `msgid' entries written by the same GNU `gettext' tools.
+
+ However, PO files initially created by PO mode itself, while marking
+strings in source files, are normalised differently. So are PO files
+resulting of the `M-x normalize' command. Until these discrepancies
+between PO mode and other GNU `gettext' tools get fully resolved, the
+translator should stay aware of normalisation issues.
+
+
+File: gettext.info, Node: Compendium, Prev: PO Mode, Up: Editing
+
+8.4 Using Translation Compendia
+===============================
+
+ A "compendium" is a special PO file containing a set of translations
+recurring in many different packages. The translator can use gettext
+tools to build a new compendium, to add entries to her compendium, and
+to initialize untranslated entries, or to update already translated
+entries, from translations kept in the compendium.
+
+* Menu:
+
+* Creating Compendia:: Merging translations for later use
+* Using Compendia:: Using older translations if they fit
+
+
+File: gettext.info, Node: Creating Compendia, Next: Using Compendia, Prev: Compendium, Up: Compendium
+
+8.4.1 Creating Compendia
+------------------------
+
+ Basically every PO file consisting of translated entries only can be
+declared as a valid compendium. Often the translator wants to have
+special compendia; let's consider two cases: `concatenating PO files'
+and `extracting a message subset from a PO file'.
+
+8.4.1.1 Concatenate PO Files
+............................
+
+ To concatenate several valid PO files into one compendium file you
+can use `msgcomm' or `msgcat' (the latter preferred):
+
+ msgcat -o compendium.po file1.po file2.po
+
+ By default, `msgcat' will accumulate divergent translations for the
+same string. Those occurrences will be marked as `fuzzy' and highly
+visible decorated; calling `msgcat' on `file1.po':
+
+ #: src/hello.c:200
+ #, c-format
+ msgid "Report bugs to <%s>.\n"
+ msgstr "Comunicar `bugs' a <%s>.\n"
+
+and `file2.po':
+
+ #: src/bye.c:100
+ #, c-format
+ msgid "Report bugs to <%s>.\n"
+ msgstr "Comunicar \"bugs\" a <%s>.\n"
+
+will result in:
+
+ #: src/hello.c:200 src/bye.c:100
+ #, fuzzy, c-format
+ msgid "Report bugs to <%s>.\n"
+ msgstr ""
+ "#-#-#-#-# file1.po #-#-#-#-#\n"
+ "Comunicar `bugs' a <%s>.\n"
+ "#-#-#-#-# file2.po #-#-#-#-#\n"
+ "Comunicar \"bugs\" a <%s>.\n"
+
+The translator will have to resolve this "conflict" manually; she has
+to decide whether the first or the second version is appropriate (or
+provide a new translation), to delete the "marker lines", and finally
+to remove the `fuzzy' mark.
+
+ If the translator knows in advance the first found translation of a
+message is always the best translation she can make use to the
+`--use-first' switch:
+
+ msgcat --use-first -o compendium.po file1.po file2.po
+
+ A good compendium file must not contain `fuzzy' or untranslated
+entries. If input files are "dirty" you must preprocess the input
+files or postprocess the result using `msgattrib --translated
+--no-fuzzy'.
+
+8.4.1.2 Extract a Message Subset from a PO File
+...............................................
+
+ Nobody wants to translate the same messages again and again; thus you
+may wish to have a compendium file containing `getopt.c' messages.
+
+ To extract a message subset (e.g., all `getopt.c' messages) from an
+existing PO file into one compendium file you can use `msggrep':
+
+ msggrep --location src/getopt.c -o compendium.po file.po
+
+
+File: gettext.info, Node: Using Compendia, Prev: Creating Compendia, Up: Compendium
+
+8.4.2 Using Compendia
+---------------------
+
+ You can use a compendium file to initialize a translation from
+scratch or to update an already existing translation.
+
+8.4.2.1 Initialize a New Translation File
+.........................................
+
+ Since a PO file with translations does not exist the translator can
+merely use `/dev/null' to fake the "old" translation file.
+
+ msgmerge --compendium compendium.po -o file.po /dev/null file.pot
+
+8.4.2.2 Update an Existing Translation File
+...........................................
+
+ Concatenate the compendium file(s) and the existing PO, merge the
+result with the POT file and remove the obsolete entries (optional,
+here done using `sed'):
+
+ msgcat --use-first -o update.po compendium1.po compendium2.po file.po
+ msgmerge update.po file.pot | msgattrib --no-obsolete > file.po
+
+
+File: gettext.info, Node: Manipulating, Next: Binaries, Prev: Editing, Up: Top
+
+9 Manipulating PO Files
+***********************
+
+ Sometimes it is necessary to manipulate PO files in a way that is
+better performed automatically than by hand. GNU `gettext' includes a
+complete set of tools for this purpose.
+
+ When merging two packages into a single package, the resulting POT
+file will be the concatenation of the two packages' POT files. Thus the
+maintainer must concatenate the two existing package translations into
+a single translation catalog, for each language. This is best performed
+using `msgcat'. It is then the translators' duty to deal with any
+possible conflicts that arose during the merge.
+
+ When a translator takes over the translation job from another
+translator, but she uses a different character encoding in her locale,
+she will convert the catalog to her character encoding. This is best
+done through the `msgconv' program.
+
+ When a maintainer takes a source file with tagged messages from
+another package, he should also take the existing translations for this
+source file (and not let the translators do the same job twice). One
+way to do this is through `msggrep', another is to create a POT file for
+that source file and use `msgmerge'.
+
+ When a translator wants to adjust some translation catalog for a
+special dialect or orthography -- for example, German as written in
+Switzerland versus German as written in Germany -- she needs to apply
+some text processing to every message in the catalog. The tool for
+doing this is `msgfilter'.
+
+ Another use of `msgfilter' is to produce approximately the POT file
+for which a given PO file was made. This can be done through a filter
+command like `msgfilter sed -e d | sed -e '/^# /d''. Note that the
+original POT file may have had different comments and different plural
+message counts, that's why it's better to use the original POT file if
+available.
+
+ When a translator wants to check her translations, for example
+according to orthography rules or using a non-interactive spell
+checker, she can do so using the `msgexec' program.
+
+ When third party tools create PO or POT files, sometimes duplicates
+cannot be avoided. But the GNU `gettext' tools give an error when they
+encounter duplicate msgids in the same file and in the same domain. To
+merge duplicates, the `msguniq' program can be used.
+
+ `msgcomm' is a more general tool for keeping or throwing away
+duplicates, occurring in different files.
+
+ `msgcmp' can be used to check whether a translation catalog is
+completely translated.
+
+ `msgattrib' can be used to select and extract only the fuzzy or
+untranslated messages of a translation catalog.
+
+ `msgen' is useful as a first step for preparing English translation
+catalogs. It copies each message's msgid to its msgstr.
+
+ Finally, for those applications where all these various programs are
+not sufficient, a library `libgettextpo' is provided that can be used to
+write other specialized programs that process PO files.
+
+* Menu:
+
+* msgcat Invocation:: Invoking the `msgcat' Program
+* msgconv Invocation:: Invoking the `msgconv' Program
+* msggrep Invocation:: Invoking the `msggrep' Program
+* msgfilter Invocation:: Invoking the `msgfilter' Program
+* msguniq Invocation:: Invoking the `msguniq' Program
+* msgcomm Invocation:: Invoking the `msgcomm' Program
+* msgcmp Invocation:: Invoking the `msgcmp' Program
+* msgattrib Invocation:: Invoking the `msgattrib' Program
+* msgen Invocation:: Invoking the `msgen' Program
+* msgexec Invocation:: Invoking the `msgexec' Program
+* Colorizing:: Highlighting parts of PO files
+* libgettextpo:: Writing your own programs that process PO files
+
+
+File: gettext.info, Node: msgcat Invocation, Next: msgconv Invocation, Prev: Manipulating, Up: Manipulating
+
+9.1 Invoking the `msgcat' Program
+=================================
+
+ msgcat [OPTION] [INPUTFILE]...
+
+ The `msgcat' program concatenates and merges the specified PO files.
+It finds messages which are common to two or more of the specified PO
+files. By using the `--more-than' option, greater commonality may be
+requested before messages are printed. Conversely, the `--less-than'
+option may be used to specify less commonality before messages are
+printed (i.e. `--less-than=2' will only print the unique messages).
+Translations, comments and extract comments will be cumulated, except
+that if `--use-first' is specified, they will be taken from the first
+PO file to define them. File positions from all PO files will be
+cumulated.
+
+9.1.1 Input file location
+-------------------------
+
+`INPUTFILE ...'
+ Input files.
+
+`-f FILE'
+`--files-from=FILE'
+ Read the names of the input files from FILE instead of getting
+ them from the command line.
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories. The resulting `.po'
+ file will be written relative to the current directory, though.
+
+
+ If INPUTFILE is `-', standard input is read.
+
+9.1.2 Output file location
+--------------------------
+
+`-o FILE'
+`--output-file=FILE'
+ Write output to specified file.
+
+
+ The results are written to standard output if no output file is
+specified or if it is `-'.
+
+9.1.3 Message selection
+-----------------------
+
+`-< NUMBER'
+`--less-than=NUMBER'
+ Print messages with less than NUMBER definitions, defaults to
+ infinite if not set.
+
+`-> NUMBER'
+`--more-than=NUMBER'
+ Print messages with more than NUMBER definitions, defaults to 0 if
+ not set.
+
+`-u'
+`--unique'
+ Shorthand for `--less-than=2'. Requests that only unique messages
+ be printed.
+
+
+9.1.4 Input file syntax
+-----------------------
+
+`-P'
+`--properties-input'
+ Assume the input files are Java ResourceBundles in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input files are NeXTstep/GNUstep localized resource
+ files in `.strings' syntax, not in PO file syntax.
+
+
+9.1.5 Output details
+--------------------
+
+`-t'
+`--to-code=NAME'
+ Specify encoding for output.
+
+`--use-first'
+ Use first available translation for each message. Don't merge
+ several translations into one.
+
+`--lang=CATALOGNAME'
+ Specify the `Language' field to be used in the header entry. See
+ *note Header Entry:: for the meaning of this field. Note: The
+ `Language-Team' and `Plural-Forms' fields are left unchanged.
+
+`--color'
+`--color=WHEN'
+ Specify whether or when to use colors and other text attributes.
+ See *note The --color option:: for details.
+
+`--style=STYLE_FILE'
+ Specify the CSS style rule file to use for `--color'. See *note
+ The --style option:: for details.
+
+`--force-po'
+ Always write an output file even if it contains no message.
+
+`-i'
+`--indent'
+ Write the .po file using indented style.
+
+`--no-location'
+ Do not write `#: FILENAME:LINE' lines.
+
+`-n'
+`--add-location'
+ Generate `#: FILENAME:LINE' lines (default).
+
+`--strict'
+ Write out a strict Uniforum conforming PO file. Note that this
+ Uniforum format should be avoided because it doesn't support the
+ GNU extensions.
+
+`-p'
+`--properties-output'
+ Write out a Java ResourceBundle in Java `.properties' syntax. Note
+ that this file format doesn't support plural forms and silently
+ drops obsolete messages.
+
+`--stringtable-output'
+ Write out a NeXTstep/GNUstep localized resource file in `.strings'
+ syntax. Note that this file format doesn't support plural forms.
+
+`-w NUMBER'
+`--width=NUMBER'
+ Set the output page width. Long strings in the output files will
+ be split across multiple lines in order to ensure that each line's
+ width (= number of screen columns) is less or equal to the given
+ NUMBER.
+
+`--no-wrap'
+ Do not break long message lines. Message lines whose width
+ exceeds the output page width will not be split into several
+ lines. Only file reference lines which are wider than the output
+ page width will be split.
+
+`-s'
+`--sort-output'
+ Generate sorted output. Note that using this option makes it much
+ harder for the translator to understand each message's context.
+
+`-F'
+`--sort-by-file'
+ Sort output by file location.
+
+
+9.1.6 Informative output
+------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+
+File: gettext.info, Node: msgconv Invocation, Next: msggrep Invocation, Prev: msgcat Invocation, Up: Manipulating
+
+9.2 Invoking the `msgconv' Program
+==================================
+
+ msgconv [OPTION] [INPUTFILE]
+
+ The `msgconv' program converts a translation catalog to a different
+character encoding.
+
+9.2.1 Input file location
+-------------------------
+
+`INPUTFILE'
+ Input PO file.
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories. The resulting `.po'
+ file will be written relative to the current directory, though.
+
+
+ If no INPUTFILE is given or if it is `-', standard input is read.
+
+9.2.2 Output file location
+--------------------------
+
+`-o FILE'
+`--output-file=FILE'
+ Write output to specified file.
+
+
+ The results are written to standard output if no output file is
+specified or if it is `-'.
+
+9.2.3 Conversion target
+-----------------------
+
+`-t'
+`--to-code=NAME'
+ Specify encoding for output.
+
+
+ The default encoding is the current locale's encoding.
+
+9.2.4 Input file syntax
+-----------------------
+
+`-P'
+`--properties-input'
+ Assume the input file is a Java ResourceBundle in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input file is a NeXTstep/GNUstep localized resource
+ file in `.strings' syntax, not in PO file syntax.
+
+
+9.2.5 Output details
+--------------------
+
+`--color'
+`--color=WHEN'
+ Specify whether or when to use colors and other text attributes.
+ See *note The --color option:: for details.
+
+`--style=STYLE_FILE'
+ Specify the CSS style rule file to use for `--color'. See *note
+ The --style option:: for details.
+
+`--force-po'
+ Always write an output file even if it contains no message.
+
+`-i'
+`--indent'
+ Write the .po file using indented style.
+
+`--no-location'
+ Do not write `#: FILENAME:LINE' lines.
+
+`--add-location'
+ Generate `#: FILENAME:LINE' lines (default).
+
+`--strict'
+ Write out a strict Uniforum conforming PO file. Note that this
+ Uniforum format should be avoided because it doesn't support the
+ GNU extensions.
+
+`-p'
+`--properties-output'
+ Write out a Java ResourceBundle in Java `.properties' syntax. Note
+ that this file format doesn't support plural forms and silently
+ drops obsolete messages.
+
+`--stringtable-output'
+ Write out a NeXTstep/GNUstep localized resource file in `.strings'
+ syntax. Note that this file format doesn't support plural forms.
+
+`-w NUMBER'
+`--width=NUMBER'
+ Set the output page width. Long strings in the output files will
+ be split across multiple lines in order to ensure that each line's
+ width (= number of screen columns) is less or equal to the given
+ NUMBER.
+
+`--no-wrap'
+ Do not break long message lines. Message lines whose width
+ exceeds the output page width will not be split into several
+ lines. Only file reference lines which are wider than the output
+ page width will be split.
+
+`-s'
+`--sort-output'
+ Generate sorted output. Note that using this option makes it much
+ harder for the translator to understand each message's context.
+
+`-F'
+`--sort-by-file'
+ Sort output by file location.
+
+
+9.2.6 Informative output
+------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+
+File: gettext.info, Node: msggrep Invocation, Next: msgfilter Invocation, Prev: msgconv Invocation, Up: Manipulating
+
+9.3 Invoking the `msggrep' Program
+==================================
+
+ msggrep [OPTION] [INPUTFILE]
+
+ The `msggrep' program extracts all messages of a translation catalog
+that match a given pattern or belong to some given source files.
+
+9.3.1 Input file location
+-------------------------
+
+`INPUTFILE'
+ Input PO file.
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories. The resulting `.po'
+ file will be written relative to the current directory, though.
+
+
+ If no INPUTFILE is given or if it is `-', standard input is read.
+
+9.3.2 Output file location
+--------------------------
+
+`-o FILE'
+`--output-file=FILE'
+ Write output to specified file.
+
+
+ The results are written to standard output if no output file is
+specified or if it is `-'.
+
+9.3.3 Message selection
+-----------------------
+
+ [-N SOURCEFILE]... [-M DOMAINNAME]...
+ [-J MSGCTXT-PATTERN] [-K MSGID-PATTERN] [-T MSGSTR-PATTERN]
+ [-C COMMENT-PATTERN]
+
+ A message is selected if
+ * it comes from one of the specified source files,
+
+ * or if it comes from one of the specified domains,
+
+ * or if `-J' is given and its context (msgctxt) matches
+ MSGCTXT-PATTERN,
+
+ * or if `-K' is given and its key (msgid or msgid_plural) matches
+ MSGID-PATTERN,
+
+ * or if `-T' is given and its translation (msgstr) matches
+ MSGSTR-PATTERN,
+
+ * or if `-C' is given and the translator's comment matches
+ COMMENT-PATTERN.
+
+ When more than one selection criterion is specified, the set of
+selected messages is the union of the selected messages of each
+criterion.
+
+ MSGCTXT-PATTERN or MSGID-PATTERN or MSGSTR-PATTERN syntax:
+ [-E | -F] [-e PATTERN | -f FILE]...
+ PATTERNs are basic regular expressions by default, or extended
+regular expressions if -E is given, or fixed strings if -F is given.
+
+`-N SOURCEFILE'
+`--location=SOURCEFILE'
+ Select messages extracted from SOURCEFILE. SOURCEFILE can be
+ either a literal file name or a wildcard pattern.
+
+`-M DOMAINNAME'
+`--domain=DOMAINNAME'
+ Select messages belonging to domain DOMAINNAME.
+
+`-J'
+`--msgctxt'
+ Start of patterns for the msgctxt.
+
+`-K'
+`--msgid'
+ Start of patterns for the msgid.
+
+`-T'
+`--msgstr'
+ Start of patterns for the msgstr.
+
+`-C'
+`--comment'
+ Start of patterns for the translator's comment.
+
+`-X'
+`--extracted-comment'
+ Start of patterns for the extracted comments.
+
+`-E'
+`--extended-regexp'
+ Specify that PATTERN is an extended regular expression.
+
+`-F'
+`--fixed-strings'
+ Specify that PATTERN is a set of newline-separated strings.
+
+`-e PATTERN'
+`--regexp=PATTERN'
+ Use PATTERN as a regular expression.
+
+`-f FILE'
+`--file=FILE'
+ Obtain PATTERN from FILE.
+
+`-i'
+`--ignore-case'
+ Ignore case distinctions.
+
+`-v'
+`--invert-match'
+ Output only the messages that do not match any selection
+ criterion, instead of the messages that match a selection
+ criterion.
+
+
+9.3.4 Input file syntax
+-----------------------
+
+`-P'
+`--properties-input'
+ Assume the input file is a Java ResourceBundle in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input file is a NeXTstep/GNUstep localized resource
+ file in `.strings' syntax, not in PO file syntax.
+
+
+9.3.5 Output details
+--------------------
+
+`--color'
+`--color=WHEN'
+ Specify whether or when to use colors and other text attributes.
+ See *note The --color option:: for details.
+
+`--style=STYLE_FILE'
+ Specify the CSS style rule file to use for `--color'. See *note
+ The --style option:: for details.
+
+`--force-po'
+ Always write an output file even if it contains no message.
+
+`--indent'
+ Write the .po file using indented style.
+
+`--no-location'
+ Do not write `#: FILENAME:LINE' lines.
+
+`--add-location'
+ Generate `#: FILENAME:LINE' lines (default).
+
+`--strict'
+ Write out a strict Uniforum conforming PO file. Note that this
+ Uniforum format should be avoided because it doesn't support the
+ GNU extensions.
+
+`-p'
+`--properties-output'
+ Write out a Java ResourceBundle in Java `.properties' syntax. Note
+ that this file format doesn't support plural forms and silently
+ drops obsolete messages.
+
+`--stringtable-output'
+ Write out a NeXTstep/GNUstep localized resource file in `.strings'
+ syntax. Note that this file format doesn't support plural forms.
+
+`-w NUMBER'
+`--width=NUMBER'
+ Set the output page width. Long strings in the output files will
+ be split across multiple lines in order to ensure that each line's
+ width (= number of screen columns) is less or equal to the given
+ NUMBER.
+
+`--no-wrap'
+ Do not break long message lines. Message lines whose width
+ exceeds the output page width will not be split into several
+ lines. Only file reference lines which are wider than the output
+ page width will be split.
+
+`--sort-output'
+ Generate sorted output. Note that using this option makes it much
+ harder for the translator to understand each message's context.
+
+`--sort-by-file'
+ Sort output by file location.
+
+
+9.3.6 Informative output
+------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+9.3.7 Examples
+--------------
+
+ To extract the messages that come from the source files
+`gnulib-lib/error.c' and `gnulib-lib/getopt.c':
+
+ msggrep -N gnulib-lib/error.c -N gnulib-lib/getopt.c input.po
+
+ To extract the messages that contain the string "Please specify" in
+the original string:
+
+ msggrep --msgid -F -e 'Please specify' input.po
+
+ To extract the messages that have a context specifier of either
+"Menu>File" or "Menu>Edit" or a submenu of them:
+
+ msggrep --msgctxt -E -e '^Menu>(File|Edit)' input.po
+
+ To extract the messages whose translation contains one of the
+strings in the file `wordlist.txt':
+
+ msggrep --msgstr -F -f wordlist.txt input.po
+
+
+File: gettext.info, Node: msgfilter Invocation, Next: msguniq Invocation, Prev: msggrep Invocation, Up: Manipulating
+
+9.4 Invoking the `msgfilter' Program
+====================================
+
+ msgfilter [OPTION] FILTER [FILTER-OPTION]
+
+ The `msgfilter' program applies a filter to all translations of a
+translation catalog.
+
+ During each FILTER invocation, the environment variable
+`MSGFILTER_MSGID' is bound to the message's msgid, and the environment
+variable `MSGFILTER_LOCATION' is bound to the location in the PO file
+of the message. If the message has a context, the environment variable
+`MSGFILTER_MSGCTXT' is bound to the message's msgctxt, otherwise it is
+unbound.
+
+9.4.1 Input file location
+-------------------------
+
+`-i INPUTFILE'
+`--input=INPUTFILE'
+ Input PO file.
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories. The resulting `.po'
+ file will be written relative to the current directory, though.
+
+
+ If no INPUTFILE is given or if it is `-', standard input is read.
+
+9.4.2 Output file location
+--------------------------
+
+`-o FILE'
+`--output-file=FILE'
+ Write output to specified file.
+
+
+ The results are written to standard output if no output file is
+specified or if it is `-'.
+
+9.4.3 The filter
+----------------
+
+ The FILTER can be any program that reads a translation from standard
+input and writes a modified translation to standard output. A
+frequently used filter is `sed'. A few particular built-in filters are
+also recognized.
+
+ Note: If the filter is not a built-in filter, you have to care about
+encodings: It is your responsibility to ensure that the FILTER can cope
+with input encoded in the translation catalog's encoding. If the
+FILTER wants input in a particular encoding, you can in a first step
+convert the translation catalog to that encoding using the `msgconv'
+program, before invoking `msgfilter'. If the FILTER wants input in the
+locale's encoding, but you want to avoid the locale's encoding, then
+you can first convert the translation catalog to UTF-8 using the
+`msgconv' program and then make `msgfilter' work in an UTF-8 locale, by
+using the `LC_ALL' environment variable.
+
+ Note: Most translations in a translation catalog don't end with a
+newline character. For this reason, it is important that the FILTER
+recognizes its last input line even if it ends without a newline, and
+that it doesn't add an undesired trailing newline at the end. The `sed'
+program on some platforms is known to ignore the last line of input if
+it is not terminated with a newline. You can use GNU `sed' instead; it
+does not have this limitation.
+
+9.4.4 Useful FILTER-OPTIONs when the FILTER is `sed'
+----------------------------------------------------
+
+`-e SCRIPT'
+`--expression=SCRIPT'
+ Add SCRIPT to the commands to be executed.
+
+`-f SCRIPTFILE'
+`--file=SCRIPTFILE'
+ Add the contents of SCRIPTFILE to the commands to be executed.
+
+`-n'
+`--quiet'
+`--silent'
+ Suppress automatic printing of pattern space.
+
+
+9.4.5 Built-in FILTERs
+----------------------
+
+ The filter `recode-sr-latin' is recognized as a built-in filter.
+The command `recode-sr-latin' converts Serbian text, written in the
+Cyrillic script, to the Latin script. The command `msgfilter
+recode-sr-latin' applies this conversion to the translations of a PO
+file. Thus, it can be used to convert an `sr.po' file to an
+`sr@latin.po' file.
+
+ The use of built-in filters is not sensitive to the current locale's
+encoding. Moreover, when used with a built-in filter, `msgfilter' can
+automatically convert the message catalog to the UTF-8 encoding when
+needed.
+
+9.4.6 Input file syntax
+-----------------------
+
+`-P'
+`--properties-input'
+ Assume the input file is a Java ResourceBundle in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input file is a NeXTstep/GNUstep localized resource
+ file in `.strings' syntax, not in PO file syntax.
+
+
+9.4.7 Output details
+--------------------
+
+`--color'
+`--color=WHEN'
+ Specify whether or when to use colors and other text attributes.
+ See *note The --color option:: for details.
+
+`--style=STYLE_FILE'
+ Specify the CSS style rule file to use for `--color'. See *note
+ The --style option:: for details.
+
+`--force-po'
+ Always write an output file even if it contains no message.
+
+`--indent'
+ Write the .po file using indented style.
+
+`--keep-header'
+ Keep the header entry, i.e. the message with `msgid ""',
+ unmodified, instead of filtering it. By default, the header entry
+ is subject to filtering like any other message.
+
+`--no-location'
+ Do not write `#: FILENAME:LINE' lines.
+
+`--add-location'
+ Generate `#: FILENAME:LINE' lines (default).
+
+`--strict'
+ Write out a strict Uniforum conforming PO file. Note that this
+ Uniforum format should be avoided because it doesn't support the
+ GNU extensions.
+
+`-p'
+`--properties-output'
+ Write out a Java ResourceBundle in Java `.properties' syntax. Note
+ that this file format doesn't support plural forms and silently
+ drops obsolete messages.
+
+`--stringtable-output'
+ Write out a NeXTstep/GNUstep localized resource file in `.strings'
+ syntax. Note that this file format doesn't support plural forms.
+
+`-w NUMBER'
+`--width=NUMBER'
+ Set the output page width. Long strings in the output files will
+ be split across multiple lines in order to ensure that each line's
+ width (= number of screen columns) is less or equal to the given
+ NUMBER.
+
+`--no-wrap'
+ Do not break long message lines. Message lines whose width
+ exceeds the output page width will not be split into several
+ lines. Only file reference lines which are wider than the output
+ page width will be split.
+
+`-s'
+`--sort-output'
+ Generate sorted output. Note that using this option makes it much
+ harder for the translator to understand each message's context.
+
+`-F'
+`--sort-by-file'
+ Sort output by file location.
+
+
+9.4.8 Informative output
+------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+9.4.9 Examples
+--------------
+
+ To convert German translations to Swiss orthography (in an UTF-8
+locale):
+
+ msgconv -t UTF-8 de.po | msgfilter sed -e 's/ß/ss/g'
+
+ To convert Serbian translations in Cyrillic script to Latin script:
+
+ msgfilter recode-sr-latin < sr.po
+
+
+File: gettext.info, Node: msguniq Invocation, Next: msgcomm Invocation, Prev: msgfilter Invocation, Up: Manipulating
+
+9.5 Invoking the `msguniq' Program
+==================================
+
+ msguniq [OPTION] [INPUTFILE]
+
+ The `msguniq' program unifies duplicate translations in a translation
+catalog. It finds duplicate translations of the same message ID. Such
+duplicates are invalid input for other programs like `msgfmt',
+`msgmerge' or `msgcat'. By default, duplicates are merged together.
+When using the `--repeated' option, only duplicates are output, and all
+other messages are discarded. Comments and extracted comments will be
+cumulated, except that if `--use-first' is specified, they will be
+taken from the first translation. File positions will be cumulated.
+When using the `--unique' option, duplicates are discarded.
+
+9.5.1 Input file location
+-------------------------
+
+`INPUTFILE'
+ Input PO file.
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories. The resulting `.po'
+ file will be written relative to the current directory, though.
+
+
+ If no INPUTFILE is given or if it is `-', standard input is read.
+
+9.5.2 Output file location
+--------------------------
+
+`-o FILE'
+`--output-file=FILE'
+ Write output to specified file.
+
+
+ The results are written to standard output if no output file is
+specified or if it is `-'.
+
+9.5.3 Message selection
+-----------------------
+
+`-d'
+`--repeated'
+ Print only duplicates.
+
+`-u'
+`--unique'
+ Print only unique messages, discard duplicates.
+
+
+9.5.4 Input file syntax
+-----------------------
+
+`-P'
+`--properties-input'
+ Assume the input file is a Java ResourceBundle in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input file is a NeXTstep/GNUstep localized resource
+ file in `.strings' syntax, not in PO file syntax.
+
+
+9.5.5 Output details
+--------------------
+
+`-t'
+`--to-code=NAME'
+ Specify encoding for output.
+
+`--use-first'
+ Use first available translation for each message. Don't merge
+ several translations into one.
+
+`--color'
+`--color=WHEN'
+ Specify whether or when to use colors and other text attributes.
+ See *note The --color option:: for details.
+
+`--style=STYLE_FILE'
+ Specify the CSS style rule file to use for `--color'. See *note
+ The --style option:: for details.
+
+`--force-po'
+ Always write an output file even if it contains no message.
+
+`-i'
+`--indent'
+ Write the .po file using indented style.
+
+`--no-location'
+ Do not write `#: FILENAME:LINE' lines.
+
+`-n'
+`--add-location'
+ Generate `#: FILENAME:LINE' lines (default).
+
+`--strict'
+ Write out a strict Uniforum conforming PO file. Note that this
+ Uniforum format should be avoided because it doesn't support the
+ GNU extensions.
+
+`-p'
+`--properties-output'
+ Write out a Java ResourceBundle in Java `.properties' syntax. Note
+ that this file format doesn't support plural forms and silently
+ drops obsolete messages.
+
+`--stringtable-output'
+ Write out a NeXTstep/GNUstep localized resource file in `.strings'
+ syntax. Note that this file format doesn't support plural forms.
+
+`-w NUMBER'
+`--width=NUMBER'
+ Set the output page width. Long strings in the output files will
+ be split across multiple lines in order to ensure that each line's
+ width (= number of screen columns) is less or equal to the given
+ NUMBER.
+
+`--no-wrap'
+ Do not break long message lines. Message lines whose width
+ exceeds the output page width will not be split into several
+ lines. Only file reference lines which are wider than the output
+ page width will be split.
+
+`-s'
+`--sort-output'
+ Generate sorted output. Note that using this option makes it much
+ harder for the translator to understand each message's context.
+
+`-F'
+`--sort-by-file'
+ Sort output by file location.
+
+
+9.5.6 Informative output
+------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+
+File: gettext.info, Node: msgcomm Invocation, Next: msgcmp Invocation, Prev: msguniq Invocation, Up: Manipulating
+
+9.6 Invoking the `msgcomm' Program
+==================================
+
+ msgcomm [OPTION] [INPUTFILE]...
+
+ The `msgcomm' program finds messages which are common to two or more
+of the specified PO files. By using the `--more-than' option, greater
+commonality may be requested before messages are printed. Conversely,
+the `--less-than' option may be used to specify less commonality before
+messages are printed (i.e. `--less-than=2' will only print the unique
+messages). Translations, comments and extract comments will be
+preserved, but only from the first PO file to define them. File
+positions from all PO files will be cumulated.
+
+9.6.1 Input file location
+-------------------------
+
+`INPUTFILE ...'
+ Input files.
+
+`-f FILE'
+`--files-from=FILE'
+ Read the names of the input files from FILE instead of getting
+ them from the command line.
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories. The resulting `.po'
+ file will be written relative to the current directory, though.
+
+
+ If INPUTFILE is `-', standard input is read.
+
+9.6.2 Output file location
+--------------------------
+
+`-o FILE'
+`--output-file=FILE'
+ Write output to specified file.
+
+
+ The results are written to standard output if no output file is
+specified or if it is `-'.
+
+9.6.3 Message selection
+-----------------------
+
+`-< NUMBER'
+`--less-than=NUMBER'
+ Print messages with less than NUMBER definitions, defaults to
+ infinite if not set.
+
+`-> NUMBER'
+`--more-than=NUMBER'
+ Print messages with more than NUMBER definitions, defaults to 1 if
+ not set.
+
+`-u'
+`--unique'
+ Shorthand for `--less-than=2'. Requests that only unique messages
+ be printed.
+
+
+9.6.4 Input file syntax
+-----------------------
+
+`-P'
+`--properties-input'
+ Assume the input files are Java ResourceBundles in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input files are NeXTstep/GNUstep localized resource
+ files in `.strings' syntax, not in PO file syntax.
+
+
+9.6.5 Output details
+--------------------
+
+`--color'
+`--color=WHEN'
+ Specify whether or when to use colors and other text attributes.
+ See *note The --color option:: for details.
+
+`--style=STYLE_FILE'
+ Specify the CSS style rule file to use for `--color'. See *note
+ The --style option:: for details.
+
+`--force-po'
+ Always write an output file even if it contains no message.
+
+`-i'
+`--indent'
+ Write the .po file using indented style.
+
+`--no-location'
+ Do not write `#: FILENAME:LINE' lines.
+
+`-n'
+`--add-location'
+ Generate `#: FILENAME:LINE' lines (default).
+
+`--strict'
+ Write out a strict Uniforum conforming PO file. Note that this
+ Uniforum format should be avoided because it doesn't support the
+ GNU extensions.
+
+`-p'
+`--properties-output'
+ Write out a Java ResourceBundle in Java `.properties' syntax. Note
+ that this file format doesn't support plural forms and silently
+ drops obsolete messages.
+
+`--stringtable-output'
+ Write out a NeXTstep/GNUstep localized resource file in `.strings'
+ syntax. Note that this file format doesn't support plural forms.
+
+`-w NUMBER'
+`--width=NUMBER'
+ Set the output page width. Long strings in the output files will
+ be split across multiple lines in order to ensure that each line's
+ width (= number of screen columns) is less or equal to the given
+ NUMBER.
+
+`--no-wrap'
+ Do not break long message lines. Message lines whose width
+ exceeds the output page width will not be split into several
+ lines. Only file reference lines which are wider than the output
+ page width will be split.
+
+`-s'
+`--sort-output'
+ Generate sorted output. Note that using this option makes it much
+ harder for the translator to understand each message's context.
+
+`-F'
+`--sort-by-file'
+ Sort output by file location.
+
+`--omit-header'
+ Don't write header with `msgid ""' entry.
+
+
+9.6.6 Informative output
+------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+
+File: gettext.info, Node: msgcmp Invocation, Next: msgattrib Invocation, Prev: msgcomm Invocation, Up: Manipulating
+
+9.7 Invoking the `msgcmp' Program
+=================================
+
+ msgcmp [OPTION] DEF.po REF.pot
+
+ The `msgcmp' program compares two Uniforum style .po files to check
+that both contain the same set of msgid strings. The DEF.po file is an
+existing PO file with the translations. The REF.pot file is the last
+created PO file, or a PO Template file (generally created by
+`xgettext'). This is useful for checking that you have translated each
+and every message in your program. Where an exact match cannot be
+found, fuzzy matching is used to produce better diagnostics.
+
+9.7.1 Input file location
+-------------------------
+
+`DEF.po'
+ Translations.
+
+`REF.pot'
+ References to the sources.
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories.
+
+
+9.7.2 Operation modifiers
+-------------------------
+
+`-m'
+`--multi-domain'
+ Apply REF.pot to each of the domains in DEF.po.
+
+`-N'
+`--no-fuzzy-matching'
+ Do not use fuzzy matching when an exact match is not found. This
+ may speed up the operation considerably.
+
+`--use-fuzzy'
+ Consider fuzzy messages in the DEF.po file like translated
+ messages. Note that using this option is usually wrong, because
+ fuzzy messages are exactly those which have not been validated by
+ a human translator.
+
+`--use-untranslated'
+ Consider untranslated messages in the DEF.po file like translated
+ messages. Note that using this option is usually wrong.
+
+
+9.7.3 Input file syntax
+-----------------------
+
+`-P'
+`--properties-input'
+ Assume the input files are Java ResourceBundles in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input files are NeXTstep/GNUstep localized resource
+ files in `.strings' syntax, not in PO file syntax.
+
+
+9.7.4 Informative output
+------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+
+File: gettext.info, Node: msgattrib Invocation, Next: msgen Invocation, Prev: msgcmp Invocation, Up: Manipulating
+
+9.8 Invoking the `msgattrib' Program
+====================================
+
+ msgattrib [OPTION] [INPUTFILE]
+
+ The `msgattrib' program filters the messages of a translation catalog
+according to their attributes, and manipulates the attributes.
+
+9.8.1 Input file location
+-------------------------
+
+`INPUTFILE'
+ Input PO file.
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories. The resulting `.po'
+ file will be written relative to the current directory, though.
+
+
+ If no INPUTFILE is given or if it is `-', standard input is read.
+
+9.8.2 Output file location
+--------------------------
+
+`-o FILE'
+`--output-file=FILE'
+ Write output to specified file.
+
+
+ The results are written to standard output if no output file is
+specified or if it is `-'.
+
+9.8.3 Message selection
+-----------------------
+
+`--translated'
+ Keep translated messages, remove untranslated messages.
+
+`--untranslated'
+ Keep untranslated messages, remove translated messages.
+
+`--no-fuzzy'
+ Remove `fuzzy' marked messages.
+
+`--only-fuzzy'
+ Keep `fuzzy' marked messages, remove all other messages.
+
+`--no-obsolete'
+ Remove obsolete #~ messages.
+
+`--only-obsolete'
+ Keep obsolete #~ messages, remove all other messages.
+
+
+9.8.4 Attribute manipulation
+----------------------------
+
+ Attributes are modified after the message selection/removal has been
+performed. If the `--only-file' or `--ignore-file' option is
+specified, the attribute modification is applied only to those messages
+that are listed in the ONLY-FILE and not listed in the IGNORE-FILE.
+
+`--set-fuzzy'
+ Set all messages `fuzzy'.
+
+`--clear-fuzzy'
+ Set all messages non-`fuzzy'.
+
+`--set-obsolete'
+ Set all messages obsolete.
+
+`--clear-obsolete'
+ Set all messages non-obsolete.
+
+`--clear-previous'
+ Remove the "previous msgid" (`#|') comments from all messages.
+
+`--only-file=FILE'
+ Limit the attribute changes to entries that are listed in FILE.
+ FILE should be a PO or POT file.
+
+`--ignore-file=FILE'
+ Limit the attribute changes to entries that are not listed in FILE.
+ FILE should be a PO or POT file.
+
+`--fuzzy'
+ Synonym for `--only-fuzzy --clear-fuzzy': It keeps only the fuzzy
+ messages and removes their `fuzzy' mark.
+
+`--obsolete'
+ Synonym for `--only-obsolete --clear-obsolete': It keeps only the
+ obsolete messages and makes them non-obsolete.
+
+
+9.8.5 Input file syntax
+-----------------------
+
+`-P'
+`--properties-input'
+ Assume the input file is a Java ResourceBundle in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input file is a NeXTstep/GNUstep localized resource
+ file in `.strings' syntax, not in PO file syntax.
+
+
+9.8.6 Output details
+--------------------
+
+`--color'
+`--color=WHEN'
+ Specify whether or when to use colors and other text attributes.
+ See *note The --color option:: for details.
+
+`--style=STYLE_FILE'
+ Specify the CSS style rule file to use for `--color'. See *note
+ The --style option:: for details.
+
+`--force-po'
+ Always write an output file even if it contains no message.
+
+`-i'
+`--indent'
+ Write the .po file using indented style.
+
+`--no-location'
+ Do not write `#: FILENAME:LINE' lines.
+
+`-n'
+`--add-location'
+ Generate `#: FILENAME:LINE' lines (default).
+
+`--strict'
+ Write out a strict Uniforum conforming PO file. Note that this
+ Uniforum format should be avoided because it doesn't support the
+ GNU extensions.
+
+`-p'
+`--properties-output'
+ Write out a Java ResourceBundle in Java `.properties' syntax. Note
+ that this file format doesn't support plural forms and silently
+ drops obsolete messages.
+
+`--stringtable-output'
+ Write out a NeXTstep/GNUstep localized resource file in `.strings'
+ syntax. Note that this file format doesn't support plural forms.
+
+`-w NUMBER'
+`--width=NUMBER'
+ Set the output page width. Long strings in the output files will
+ be split across multiple lines in order to ensure that each line's
+ width (= number of screen columns) is less or equal to the given
+ NUMBER.
+
+`--no-wrap'
+ Do not break long message lines. Message lines whose width
+ exceeds the output page width will not be split into several
+ lines. Only file reference lines which are wider than the output
+ page width will be split.
+
+`-s'
+`--sort-output'
+ Generate sorted output. Note that using this option makes it much
+ harder for the translator to understand each message's context.
+
+`-F'
+`--sort-by-file'
+ Sort output by file location.
+
+
+9.8.7 Informative output
+------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+
+File: gettext.info, Node: msgen Invocation, Next: msgexec Invocation, Prev: msgattrib Invocation, Up: Manipulating
+
+9.9 Invoking the `msgen' Program
+================================
+
+ msgen [OPTION] INPUTFILE
+
+ The `msgen' program creates an English translation catalog. The
+input file is the last created English PO file, or a PO Template file
+(generally created by xgettext). Untranslated entries are assigned a
+translation that is identical to the msgid.
+
+ Note: `msginit --no-translator --locale=en' performs a very similar
+task. The main difference is that `msginit' cares specially about the
+header entry, whereas `msgen' doesn't.
+
+9.9.1 Input file location
+-------------------------
+
+`INPUTFILE'
+ Input PO or POT file.
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories. The resulting `.po'
+ file will be written relative to the current directory, though.
+
+
+ If INPUTFILE is `-', standard input is read.
+
+9.9.2 Output file location
+--------------------------
+
+`-o FILE'
+`--output-file=FILE'
+ Write output to specified file.
+
+
+ The results are written to standard output if no output file is
+specified or if it is `-'.
+
+9.9.3 Input file syntax
+-----------------------
+
+`-P'
+`--properties-input'
+ Assume the input file is a Java ResourceBundle in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input file is a NeXTstep/GNUstep localized resource
+ file in `.strings' syntax, not in PO file syntax.
+
+
+9.9.4 Output details
+--------------------
+
+`--lang=CATALOGNAME'
+ Specify the `Language' field to be used in the header entry. See
+ *note Header Entry:: for the meaning of this field. Note: The
+ `Language-Team' and `Plural-Forms' fields are not set by this
+ option.
+
+`--color'
+`--color=WHEN'
+ Specify whether or when to use colors and other text attributes.
+ See *note The --color option:: for details.
+
+`--style=STYLE_FILE'
+ Specify the CSS style rule file to use for `--color'. See *note
+ The --style option:: for details.
+
+`--force-po'
+ Always write an output file even if it contains no message.
+
+`-i'
+`--indent'
+ Write the .po file using indented style.
+
+`--no-location'
+ Do not write `#: FILENAME:LINE' lines.
+
+`--add-location'
+ Generate `#: FILENAME:LINE' lines (default).
+
+`--strict'
+ Write out a strict Uniforum conforming PO file. Note that this
+ Uniforum format should be avoided because it doesn't support the
+ GNU extensions.
+
+`-p'
+`--properties-output'
+ Write out a Java ResourceBundle in Java `.properties' syntax. Note
+ that this file format doesn't support plural forms and silently
+ drops obsolete messages.
+
+`--stringtable-output'
+ Write out a NeXTstep/GNUstep localized resource file in `.strings'
+ syntax. Note that this file format doesn't support plural forms.
+
+`-w NUMBER'
+`--width=NUMBER'
+ Set the output page width. Long strings in the output files will
+ be split across multiple lines in order to ensure that each line's
+ width (= number of screen columns) is less or equal to the given
+ NUMBER.
+
+`--no-wrap'
+ Do not break long message lines. Message lines whose width
+ exceeds the output page width will not be split into several
+ lines. Only file reference lines which are wider than the output
+ page width will be split.
+
+`-s'
+`--sort-output'
+ Generate sorted output. Note that using this option makes it much
+ harder for the translator to understand each message's context.
+
+`-F'
+`--sort-by-file'
+ Sort output by file location.
+
+
+9.9.5 Informative output
+------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+
+File: gettext.info, Node: msgexec Invocation, Next: Colorizing, Prev: msgen Invocation, Up: Manipulating
+
+9.10 Invoking the `msgexec' Program
+===================================
+
+ msgexec [OPTION] COMMAND [COMMAND-OPTION]
+
+ The `msgexec' program applies a command to all translations of a
+translation catalog. The COMMAND can be any program that reads a
+translation from standard input. It is invoked once for each
+translation. Its output becomes msgexec's output. `msgexec''s return
+code is the maximum return code across all invocations.
+
+ A special builtin command called `0' outputs the translation,
+followed by a null byte. The output of `msgexec 0' is suitable as
+input for `xargs -0'.
+
+ During each COMMAND invocation, the environment variable
+`MSGEXEC_MSGID' is bound to the message's msgid, and the environment
+variable `MSGEXEC_LOCATION' is bound to the location in the PO file of
+the message. If the message has a context, the environment variable
+`MSGEXEC_MSGCTXT' is bound to the message's msgctxt, otherwise it is
+unbound.
+
+ Note: It is your responsibility to ensure that the COMMAND can cope
+with input encoded in the translation catalog's encoding. If the
+COMMAND wants input in a particular encoding, you can in a first step
+convert the translation catalog to that encoding using the `msgconv'
+program, before invoking `msgexec'. If the COMMAND wants input in the
+locale's encoding, but you want to avoid the locale's encoding, then
+you can first convert the translation catalog to UTF-8 using the
+`msgconv' program and then make `msgexec' work in an UTF-8 locale, by
+using the `LC_ALL' environment variable.
+
+9.10.1 Input file location
+--------------------------
+
+`-i INPUTFILE'
+`--input=INPUTFILE'
+ Input PO file.
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories. The resulting `.po'
+ file will be written relative to the current directory, though.
+
+
+ If no INPUTFILE is given or if it is `-', standard input is read.
+
+9.10.2 Input file syntax
+------------------------
+
+`-P'
+`--properties-input'
+ Assume the input file is a Java ResourceBundle in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input file is a NeXTstep/GNUstep localized resource
+ file in `.strings' syntax, not in PO file syntax.
+
+
+9.10.3 Informative output
+-------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+
+File: gettext.info, Node: Colorizing, Next: libgettextpo, Prev: msgexec Invocation, Up: Manipulating
+
+9.11 Highlighting parts of PO files
+===================================
+
+ Translators are usually only interested in seeing the untranslated
+and fuzzy messages of a PO file. Also, when a message is set fuzzy
+because the msgid changed, they want to see the differences between the
+previous msgid and the current one (especially if the msgid is long and
+only few words in it have changed). Finally, it's always welcome to
+highlight the different sections of a message in a PO file (comments,
+msgid, msgstr, etc.).
+
+ Such highlighting is possible through the `msgcat' options `--color'
+and `--style'.
+
+* Menu:
+
+* The --color option:: Triggering colorized output
+* The TERM variable:: The environment variable `TERM'
+* The --style option:: The `--style' option
+* Style rules:: Style rules for PO files
+* Customizing less:: Customizing `less' for viewing PO files
+
+
+File: gettext.info, Node: The --color option, Next: The TERM variable, Up: Colorizing
+
+9.11.1 The `--color' option
+---------------------------
+
+ The `--color=WHEN' option specifies under which conditions colorized
+output should be generated. The WHEN part can be one of the following:
+
+`always'
+`yes'
+ The output will be colorized.
+
+`never'
+`no'
+ The output will not be colorized.
+
+`auto'
+`tty'
+ The output will be colorized if the output device is a tty, i.e.
+ when the output goes directly to a text screen or terminal
+ emulator window.
+
+`html'
+ The output will be colorized and be in HTML format.
+
+`--color' is equivalent to `--color=yes'. The default is
+`--color=auto'.
+
+ Thus, a command like `msgcat vi.po' will produce colorized output
+when called by itself in a command window. Whereas in a pipe, such as
+`msgcat vi.po | less -R', it will not produce colorized output. To get
+colorized output in this situation nevertheless, use the command
+`msgcat --color vi.po | less -R'.
+
+ The `--color=html' option will produce output that can be viewed in
+a browser. This can be useful, for example, for Indic languages,
+because the renderic of Indic scripts in browser is usually better than
+in terminal emulators.
+
+ Note that the output produced with the `--color' option is _not_ a
+valid PO file in itself. It contains additional terminal-specific
+escape sequences or HTML tags. A PO file reader will give a syntax
+error when confronted with such content. Except for the `--color=html'
+case, you therefore normally don't need to save output produced with the
+`--color' option in a file.
+
+
+File: gettext.info, Node: The TERM variable, Next: The --style option, Prev: The --color option, Up: Colorizing
+
+9.11.2 The environment variable `TERM'
+--------------------------------------
+
+ The environment variable `TERM' contains a identifier for the text
+window's capabilities. You can get a detailed list of these
+cababilities by using the `infocmp' command, using `man 5 terminfo' as a
+reference.
+
+ When producing text with embedded color directives, `msgcat' looks
+at the `TERM' variable. Text windows today typically support at least
+8 colors. Often, however, the text window supports 16 or more colors,
+even though the `TERM' variable is set to a identifier denoting only 8
+supported colors. It can be worth setting the `TERM' variable to a
+different value in these cases:
+
+`xterm'
+ `xterm' is in most cases built with support for 16 colors. It can
+ also be built with support for 88 or 256 colors (but not both).
+ You can try to set `TERM' to either `xterm-16color',
+ `xterm-88color', or `xterm-256color'.
+
+`rxvt'
+ `rxvt' is often built with support for 16 colors. You can try to
+ set `TERM' to `rxvt-16color'.
+
+`konsole'
+ `konsole' too is often built with support for 16 colors. You can
+ try to set `TERM' to `konsole-16color' or `xterm-16color'.
+
+ After setting `TERM', you can verify it by invoking `msgcat
+--color=test' and seeing whether the output looks like a reasonable
+color map.
+
+
+File: gettext.info, Node: The --style option, Next: Style rules, Prev: The TERM variable, Up: Colorizing
+
+9.11.3 The `--style' option
+---------------------------
+
+ The `--style=STYLE_FILE' option specifies the style file to use when
+colorizing. It has an effect only when the `--color' option is
+effective.
+
+ If the `--style' option is not specified, the environment variable
+`PO_STYLE' is considered. It is meant to point to the user's preferred
+style for PO files.
+
+ The default style file is
+`$prefix/share/gettext/styles/po-default.css', where `$prefix' is the
+installation location.
+
+ A few style files are predefined:
+`po-vim.css'
+ This style imitates the look used by vim 7.
+
+`po-emacs-x.css'
+ This style imitates the look used by GNU Emacs 21 and 22 in an X11
+ window.
+
+`po-emacs-xterm.css'
+`po-emacs-xterm16.css'
+`po-emacs-xterm256.css'
+ This style imitates the look used by GNU Emacs 22 in a terminal of
+ type `xterm' (8 colors) or `xterm-16color' (16 colors) or
+ `xterm-256color' (256 colors), respectively.
+
+You can use these styles without specifying a directory. They are
+actually located in `$prefix/share/gettext/styles/', where `$prefix' is
+the installation location.
+
+ You can also design your own styles. This is described in the next
+section.
+
+
+File: gettext.info, Node: Style rules, Next: Customizing less, Prev: The --style option, Up: Colorizing
+
+9.11.4 Style rules for PO files
+-------------------------------
+
+ The same style file can be used for styling of a PO file, for
+terminal output and for HTML output. It is written in CSS (Cascading
+Style Sheet) syntax. See `http://www.w3.org/TR/css2/cover.html' for a
+formal definition of CSS. Many HTML authoring tutorials also contain
+explanations of CSS.
+
+ In the case of HTML output, the style file is embedded in the HTML
+output. In the case of text output, the style file is interpreted by
+the `msgcat' program. This means, in particular, that when `@import'
+is used with relative file names, the file names are
+
+ - relative to the resulting HTML file, in the case of HTML output,
+
+ - relative to the style sheet containing the `@import', in the case
+ of text output. (Actually, `@import's are not yet supported in
+ this case, due to a limitation in `libcroco'.)
+
+ CSS rules are built up from selectors and declarations. The
+declarations specify graphical properties; the selectors specify
+specify when they apply.
+
+ In PO files, the following simple selectors (based on "CSS classes",
+see the CSS2 spec, section 5.8.3) are supported.
+
+ * Selectors that apply to entire messages:
+
+ `.header'
+ This matches the header entry of a PO file.
+
+ `.translated'
+ This matches a translated message.
+
+ `.untranslated'
+ This matches an untranslated message (i.e. a message with
+ empty translation).
+
+ `.fuzzy'
+ This matches a fuzzy message (i.e. a message which has a
+ translation that needs review by the translator).
+
+ `.obsolete'
+ This matches an obsolete message (i.e. a message that was
+ translated but is not needed by the current POT file any
+ more).
+
+ * Selectors that apply to parts of a message in PO syntax. Recall
+ the general structure of a message in PO syntax:
+
+ WHITE-SPACE
+ # TRANSLATOR-COMMENTS
+ #. EXTRACTED-COMMENTS
+ #: REFERENCE...
+ #, FLAG...
+ #| msgid PREVIOUS-UNTRANSLATED-STRING
+ msgid UNTRANSLATED-STRING
+ msgstr TRANSLATED-STRING
+
+ `.comment'
+ This matches all comments (translator comments, extracted
+ comments, source file reference comments, flag comments,
+ previous message comments, as well as the entire obsolete
+ messages).
+
+ `.translator-comment'
+ This matches the translator comments.
+
+ `.extracted-comment'
+ This matches the extracted comments, i.e. the comments placed
+ by the programmer at the attention of the translator.
+
+ `.reference-comment'
+ This matches the source file reference comments (entire
+ lines).
+
+ `.reference'
+ This matches the individual source file references inside the
+ source file reference comment lines.
+
+ `.flag-comment'
+ This matches the flag comment lines (entire lines).
+
+ `.flag'
+ This matches the individual flags inside flag comment lines.
+
+ `.fuzzy-flag'
+ This matches the `fuzzy' flag inside flag comment lines.
+
+ `.previous-comment'
+ This matches the comments containing the previous
+ untranslated string (entire lines).
+
+ `.previous'
+ This matches the previous untranslated string including the
+ string delimiters, the associated keywords (`msgid' etc.) and
+ the spaces between them.
+
+ `.msgid'
+ This matches the untranslated string including the string
+ delimiters, the associated keywords (`msgid' etc.) and the
+ spaces between them.
+
+ `.msgstr'
+ This matches the translated string including the string
+ delimiters, the associated keywords (`msgstr' etc.) and the
+ spaces between them.
+
+ `.keyword'
+ This matches the keywords (`msgid', `msgstr', etc.).
+
+ `.string'
+ This matches strings, including the string delimiters (double
+ quotes).
+
+ * Selectors that apply to parts of strings:
+
+ `.text'
+ This matches the entire contents of a string (excluding the
+ string delimiters, i.e. the double quotes).
+
+ `.escape-sequence'
+ This matches an escape sequence (starting with a backslash).
+
+ `.format-directive'
+ This matches a format string directive (starting with a `%'
+ sign in the case of most programming languages, with a `{' in
+ the case of `java-format' and `csharp-format', with a `~' in
+ the case of `lisp-format' and `scheme-format', or with `$' in
+ the case of `sh-format').
+
+ `.invalid-format-directive'
+ This matches an invalid format string directive.
+
+ `.added'
+ In an untranslated string, this matches a part of the string
+ that was not present in the previous untranslated string.
+ (Not yet implemented in this release.)
+
+ `.changed'
+ In an untranslated string or in a previous untranslated
+ string, this matches a part of the string that is changed or
+ replaced. (Not yet implemented in this release.)
+
+ `.removed'
+ In a previous untranslated string, this matches a part of the
+ string that is not present in the current untranslated
+ string. (Not yet implemented in this release.)
+
+ These selectors can be combined to hierarchical selectors. For
+example,
+
+ .msgstr .invalid-format-directive { color: red; }
+
+will highlight the invalid format directives in the translated strings.
+
+ In text mode, pseudo-classes (CSS2 spec, section 5.11) and
+pseudo-elements (CSS2 spec, section 5.12) are not supported.
+
+ The declarations in HTML mode are not limited; any graphical
+attribute supported by the browsers can be used.
+
+ The declarations in text mode are limited to the following
+properties. Other properties will be silently ignored.
+
+`color' (CSS2 spec, section 14.1)
+`background-color' (CSS2 spec, section 14.2.1)
+ These properties is supported. Colors will be adjusted to match
+ the terminal's capabilities. Note that many terminals support
+ only 8 colors.
+
+`font-weight' (CSS2 spec, section 15.2.3)
+ This property is supported, but most terminals can only render two
+ different weights: `normal' and `bold'. Values >= 600 are
+ rendered as `bold'.
+
+`font-style' (CSS2 spec, section 15.2.3)
+ This property is supported. The values `italic' and `oblique' are
+ rendered the same way.
+
+`text-decoration' (CSS2 spec, section 16.3.1)
+ This property is supported, limited to the values `none' and
+ `underline'.
+
+
+File: gettext.info, Node: Customizing less, Prev: Style rules, Up: Colorizing
+
+9.11.5 Customizing `less' for viewing PO files
+----------------------------------------------
+
+ The `less' program is a popular text file browser for use in a text
+screen or terminal emulator. It also supports text with embedded escape
+sequences for colors and text decorations.
+
+ You can use `less' to view a PO file like this (assuming an UTF-8
+environment):
+
+ msgcat --to-code=UTF-8 --color xyz.po | less -R
+
+ You can simplify this to this simple command:
+
+ less xyz.po
+
+after these three preparations:
+
+ 1. Add the options `-R' and `-f' to the `LESS' environment variable.
+ In sh shells:
+ $ LESS="$LESS -R -f"
+ $ export LESS
+
+ 2. If your system does not already have the `lessopen.sh' and
+ `lessclose.sh' scripts, create them and set the `LESSOPEN' and
+ `LESSCLOSE' environment variables, as indicated in the manual page
+ (`man less').
+
+ 3. Add to `lessopen.sh' a piece of script that recognizes PO files
+ through their file extension and invokes `msgcat' on them,
+ producing a temporary file. Like this:
+
+ case "$1" in
+ *.po)
+ tmpfile=`mktemp "${TMPDIR-/tmp}/less.XXXXXX"`
+ msgcat --to-code=UTF-8 --color "$1" > "$tmpfile"
+ echo "$tmpfile"
+ exit 0
+ ;;
+ esac
+
+
+File: gettext.info, Node: libgettextpo, Prev: Colorizing, Up: Manipulating
+
+9.12 Writing your own programs that process PO files
+====================================================
+
+ For the tasks for which a combination of `msgattrib', `msgcat' etc.
+is not sufficient, a set of C functions is provided in a library, to
+make it possible to process PO files in your own programs. When you
+use this library, you don't need to write routines to parse the PO
+file; instead, you retrieve a pointer in memory to each of messages
+contained in the PO file. Functions for writing PO files are not
+provided at this time.
+
+ The functions are declared in the header file `<gettext-po.h>', and
+are defined in a library called `libgettextpo'.
+
+ -- Data Type: po_file_t
+ This is a pointer type that refers to the contents of a PO file,
+ after it has been read into memory.
+
+ -- Data Type: po_message_iterator_t
+ This is a pointer type that refers to an iterator that produces a
+ sequence of messages.
+
+ -- Data Type: po_message_t
+ This is a pointer type that refers to a message of a PO file,
+ including its translation.
+
+ -- Function: po_file_t po_file_read (const char *FILENAME)
+ The `po_file_read' function reads a PO file into memory. The file
+ name is given as argument. The return value is a handle to the PO
+ file's contents, valid until `po_file_free' is called on it. In
+ case of error, the return value is `NULL', and `errno' is set.
+
+ -- Function: void po_file_free (po_file_t FILE)
+ The `po_file_free' function frees a PO file's contents from memory,
+ including all messages that are only implicitly accessible through
+ iterators.
+
+ -- Function: const char * const * po_file_domains (po_file_t FILE)
+ The `po_file_domains' function returns the domains for which the
+ given PO file has messages. The return value is a `NULL'
+ terminated array which is valid as long as the FILE handle is
+ valid. For PO files which contain no `domain' directive, the
+ return value contains only one domain, namely the default domain
+ `"messages"'.
+
+ -- Function: po_message_iterator_t po_message_iterator (po_file_t
+ FILE, const char *DOMAIN)
+ The `po_message_iterator' returns an iterator that will produce the
+ messages of FILE that belong to the given DOMAIN. If DOMAIN is
+ `NULL', the default domain is used instead. To list the messages,
+ use the function `po_next_message' repeatedly.
+
+ -- Function: void po_message_iterator_free (po_message_iterator_t
+ ITERATOR)
+ The `po_message_iterator_free' function frees an iterator
+ previously allocated through the `po_message_iterator' function.
+
+ -- Function: po_message_t po_next_message (po_message_iterator_t
+ ITERATOR)
+ The `po_next_message' function returns the next message from
+ ITERATOR and advances the iterator. It returns `NULL' when the
+ iterator has reached the end of its message list.
+
+ The following functions returns details of a `po_message_t'. Recall
+that the results are valid as long as the FILE handle is valid.
+
+ -- Function: const char * po_message_msgid (po_message_t MESSAGE)
+ The `po_message_msgid' function returns the `msgid' (untranslated
+ English string) of a message. This is guaranteed to be non-`NULL'.
+
+ -- Function: const char * po_message_msgid_plural (po_message_t
+ MESSAGE)
+ The `po_message_msgid_plural' function returns the `msgid_plural'
+ (untranslated English plural string) of a message with plurals, or
+ `NULL' for a message without plural.
+
+ -- Function: const char * po_message_msgstr (po_message_t MESSAGE)
+ The `po_message_msgstr' function returns the `msgstr' (translation)
+ of a message. For an untranslated message, the return value is an
+ empty string.
+
+ -- Function: const char * po_message_msgstr_plural (po_message_t
+ MESSAGE, int INDEX)
+ The `po_message_msgstr_plural' function returns the
+ `msgstr[INDEX]' of a message with plurals, or `NULL' when the
+ INDEX is out of range or for a message without plural.
+
+ Here is an example code how these functions can be used.
+
+ const char *filename = ...;
+ po_file_t file = po_file_read (filename);
+
+ if (file == NULL)
+ error (EXIT_FAILURE, errno, "couldn't open the PO file %s", filename);
+ {
+ const char * const *domains = po_file_domains (file);
+ const char * const *domainp;
+
+ for (domainp = domains; *domainp; domainp++)
+ {
+ const char *domain = *domainp;
+ po_message_iterator_t iterator = po_message_iterator (file, domain);
+
+ for (;;)
+ {
+ po_message_t *message = po_next_message (iterator);
+
+ if (message == NULL)
+ break;
+ {
+ const char *msgid = po_message_msgid (message);
+ const char *msgstr = po_message_msgstr (message);
+
+ ...
+ }
+ }
+ po_message_iterator_free (iterator);
+ }
+ }
+ po_file_free (file);
+
+
+File: gettext.info, Node: Binaries, Next: Programmers, Prev: Manipulating, Up: Top
+
+10 Producing Binary MO Files
+****************************
+
+* Menu:
+
+* msgfmt Invocation:: Invoking the `msgfmt' Program
+* msgunfmt Invocation:: Invoking the `msgunfmt' Program
+* MO Files:: The Format of GNU MO Files
+
+
+File: gettext.info, Node: msgfmt Invocation, Next: msgunfmt Invocation, Prev: Binaries, Up: Binaries
+
+10.1 Invoking the `msgfmt' Program
+==================================
+
+ msgfmt [OPTION] FILENAME.po ...
+
+ The `msgfmt' programs generates a binary message catalog from a
+textual translation description.
+
+10.1.1 Input file location
+--------------------------
+
+`FILENAME.po ...'
+
+`-D DIRECTORY'
+`--directory=DIRECTORY'
+ Add DIRECTORY to the list of directories. Source files are
+ searched relative to this list of directories. The resulting `.po'
+ file will be written relative to the current directory, though.
+
+
+ If an input file is `-', standard input is read.
+
+10.1.2 Operation mode
+---------------------
+
+`-j'
+`--java'
+ Java mode: generate a Java `ResourceBundle' class.
+
+`--java2'
+ Like -java, and assume Java2 (JDK 1.2 or higher).
+
+`--csharp'
+ C# mode: generate a .NET .dll file containing a subclass of
+ `GettextResourceSet'.
+
+`--csharp-resources'
+ C# resources mode: generate a .NET `.resources' file.
+
+`--tcl'
+ Tcl mode: generate a tcl/msgcat `.msg' file.
+
+`--qt'
+ Qt mode: generate a Qt `.qm' file.
+
+
+10.1.3 Output file location
+---------------------------
+
+`-o FILE'
+`--output-file=FILE'
+ Write output to specified file.
+
+`--strict'
+ Direct the program to work strictly following the Uniforum/Sun
+ implementation. Currently this only affects the naming of the
+ output file. If this option is not given the name of the output
+ file is the same as the domain name. If the strict Uniforum mode
+ is enabled the suffix `.mo' is added to the file name if it is not
+ already present.
+
+ We find this behaviour of Sun's implementation rather silly and so
+ by default this mode is _not_ selected.
+
+
+ If the output FILE is `-', output is written to standard output.
+
+10.1.4 Output file location in Java mode
+----------------------------------------
+
+`-r RESOURCE'
+`--resource=RESOURCE'
+ Specify the resource name.
+
+`-l LOCALE'
+`--locale=LOCALE'
+ Specify the locale name, either a language specification of the
+ form LL or a combined language and country specification of the
+ form LL_CC.
+
+`-d DIRECTORY'
+ Specify the base directory of classes directory hierarchy.
+
+
+ The class name is determined by appending the locale name to the
+resource name, separated with an underscore. The `-d' option is
+mandatory. The class is written under the specified directory.
+
+10.1.5 Output file location in C# mode
+--------------------------------------
+
+`-r RESOURCE'
+`--resource=RESOURCE'
+ Specify the resource name.
+
+`-l LOCALE'
+`--locale=LOCALE'
+ Specify the locale name, either a language specification of the
+ form LL or a combined language and country specification of the
+ form LL_CC.
+
+`-d DIRECTORY'
+ Specify the base directory for locale dependent `.dll' files.
+
+
+ The `-l' and `-d' options are mandatory. The `.dll' file is written
+in a subdirectory of the specified directory whose name depends on the
+locale.
+
+10.1.6 Output file location in Tcl mode
+---------------------------------------
+
+`-l LOCALE'
+`--locale=LOCALE'
+ Specify the locale name, either a language specification of the
+ form LL or a combined language and country specification of the
+ form LL_CC.
+
+`-d DIRECTORY'
+ Specify the base directory of `.msg' message catalogs.
+
+
+ The `-l' and `-d' options are mandatory. The `.msg' file is written
+in the specified directory.
+
+10.1.7 Input file syntax
+------------------------
+
+`-P'
+`--properties-input'
+ Assume the input files are Java ResourceBundles in Java
+ `.properties' syntax, not in PO file syntax.
+
+`--stringtable-input'
+ Assume the input files are NeXTstep/GNUstep localized resource
+ files in `.strings' syntax, not in PO file syntax.
+
+
+10.1.8 Input file interpretation
+--------------------------------
+
+`-c'
+`--check'
+ Perform all the checks implied by `--check-format',
+ `--check-header', `--check-domain'.
+
+`--check-format'
+ Check language dependent format strings.
+
+ If the string represents a format string used in a `printf'-like
+ function both strings should have the same number of `%' format
+ specifiers, with matching types. If the flag `c-format' or
+ `possible-c-format' appears in the special comment <#,> for this
+ entry a check is performed. For example, the check will diagnose
+ using `%.*s' against `%s', or `%d' against `%s', or `%d' against
+ `%x'. It can even handle positional parameters.
+
+ Normally the `xgettext' program automatically decides whether a
+ string is a format string or not. This algorithm is not perfect,
+ though. It might regard a string as a format string though it is
+ not used in a `printf'-like function and so `msgfmt' might report
+ errors where there are none.
+
+ To solve this problem the programmer can dictate the decision to
+ the `xgettext' program (*note c-format::). The translator should
+ not consider removing the flag from the <#,> line. This "fix"
+ would be reversed again as soon as `msgmerge' is called the next
+ time.
+
+`--check-header'
+ Verify presence and contents of the header entry. *Note Header
+ Entry::, for a description of the various fields in the header
+ entry.
+
+`--check-domain'
+ Check for conflicts between domain directives and the
+ `--output-file' option
+
+`-C'
+`--check-compatibility'
+ Check that GNU msgfmt behaves like X/Open msgfmt. This will give
+ an error when attempting to use the GNU extensions.
+
+`--check-accelerators[=CHAR]'
+ Check presence of keyboard accelerators for menu items. This is
+ based on the convention used in some GUIs that a keyboard
+ accelerator in a menu item string is designated by an immediately
+ preceding `&' character. Sometimes a keyboard accelerator is also
+ called "keyboard mnemonic". This check verifies that if the
+ untranslated string has exactly one `&' character, the translated
+ string has exactly one `&' as well. If this option is given with
+ a CHAR argument, this CHAR should be a non-alphanumeric character
+ and is used as keyboard accelerator mark instead of `&'.
+
+`-f'
+`--use-fuzzy'
+ Use fuzzy entries in output. Note that using this option is
+ usually wrong, because fuzzy messages are exactly those which have
+ not been validated by a human translator.
+
+
+10.1.9 Output details
+---------------------
+
+`-a NUMBER'
+`--alignment=NUMBER'
+ Align strings to NUMBER bytes (default: 1).
+
+`--no-hash'
+ Don't include a hash table in the binary file. Lookup will be
+ more expensive at run time (binary search instead of hash table
+ lookup).
+
+
+10.1.10 Informative output
+--------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+`--statistics'
+ Print statistics about translations. When the option `--verbose'
+ is used in combination with `--statistics', the input file name is
+ printed in front of the statistics line.
+
+`-v'
+`--verbose'
+ Increase verbosity level.
+
+
+
+File: gettext.info, Node: msgunfmt Invocation, Next: MO Files, Prev: msgfmt Invocation, Up: Binaries
+
+10.2 Invoking the `msgunfmt' Program
+====================================
+
+ msgunfmt [OPTION] [FILE]...
+
+ The `msgunfmt' program converts a binary message catalog to a
+Uniforum style .po file.
+
+10.2.1 Operation mode
+---------------------
+
+`-j'
+`--java'
+ Java mode: input is a Java `ResourceBundle' class.
+
+`--csharp'
+ C# mode: input is a .NET .dll file containing a subclass of
+ `GettextResourceSet'.
+
+`--csharp-resources'
+ C# resources mode: input is a .NET `.resources' file.
+
+`--tcl'
+ Tcl mode: input is a tcl/msgcat `.msg' file.
+
+
+10.2.2 Input file location
+--------------------------
+
+`FILE ...'
+ Input .mo files.
+
+
+ If no input FILE is given or if it is `-', standard input is read.
+
+10.2.3 Input file location in Java mode
+---------------------------------------
+
+`-r RESOURCE'
+`--resource=RESOURCE'
+ Specify the resource name.
+
+`-l LOCALE'
+`--locale=LOCALE'
+ Specify the locale name, either a language specification of the
+ form LL or a combined language and country specification of the
+ form LL_CC.
+
+
+ The class name is determined by appending the locale name to the
+resource name, separated with an underscore. The class is located
+using the `CLASSPATH'.
+
+10.2.4 Input file location in C# mode
+-------------------------------------
+
+`-r RESOURCE'
+`--resource=RESOURCE'
+ Specify the resource name.
+
+`-l LOCALE'
+`--locale=LOCALE'
+ Specify the locale name, either a language specification of the
+ form LL or a combined language and country specification of the
+ form LL_CC.
+
+`-d DIRECTORY'
+ Specify the base directory for locale dependent `.dll' files.
+
+
+ The `-l' and `-d' options are mandatory. The `.msg' file is located
+in a subdirectory of the specified directory whose name depends on the
+locale.
+
+10.2.5 Input file location in Tcl mode
+--------------------------------------
+
+`-l LOCALE'
+`--locale=LOCALE'
+ Specify the locale name, either a language specification of the
+ form LL or a combined language and country specification of the
+ form LL_CC.
+
+`-d DIRECTORY'
+ Specify the base directory of `.msg' message catalogs.
+
+
+ The `-l' and `-d' options are mandatory. The `.msg' file is located
+in the specified directory.
+
+10.2.6 Output file location
+---------------------------
+
+`-o FILE'
+`--output-file=FILE'
+ Write output to specified file.
+
+
+ The results are written to standard output if no output file is
+specified or if it is `-'.
+
+10.2.7 Output details
+---------------------
+
+`--color'
+`--color=WHEN'
+ Specify whether or when to use colors and other text attributes.
+ See *note The --color option:: for details.
+
+`--style=STYLE_FILE'
+ Specify the CSS style rule file to use for `--color'. See *note
+ The --style option:: for details.
+
+`--force-po'
+ Always write an output file even if it contains no message.
+
+`-i'
+`--indent'
+ Write the .po file using indented style.
+
+`--strict'
+ Write out a strict Uniforum conforming PO file. Note that this
+ Uniforum format should be avoided because it doesn't support the
+ GNU extensions.
+
+`-p'
+`--properties-output'
+ Write out a Java ResourceBundle in Java `.properties' syntax. Note
+ that this file format doesn't support plural forms and silently
+ drops obsolete messages.
+
+`--stringtable-output'
+ Write out a NeXTstep/GNUstep localized resource file in `.strings'
+ syntax. Note that this file format doesn't support plural forms.
+
+`-w NUMBER'
+`--width=NUMBER'
+ Set the output page width. Long strings in the output files will
+ be split across multiple lines in order to ensure that each line's
+ width (= number of screen columns) is less or equal to the given
+ NUMBER.
+
+`--no-wrap'
+ Do not break long message lines. Message lines whose width
+ exceeds the output page width will not be split into several
+ lines. Only file reference lines which are wider than the output
+ page width will be split.
+
+`-s'
+`--sort-output'
+ Generate sorted output. Note that using this option makes it much
+ harder for the translator to understand each message's context.
+
+
+10.2.8 Informative output
+-------------------------
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+`-v'
+`--verbose'
+ Increase verbosity level.
+
+
+
+File: gettext.info, Node: MO Files, Prev: msgunfmt Invocation, Up: Binaries
+
+10.3 The Format of GNU MO Files
+===============================
+
+ The format of the generated MO files is best described by a picture,
+which appears below.
+
+ The first two words serve the identification of the file. The magic
+number will always signal GNU MO files. The number is stored in the
+byte order of the generating machine, so the magic number really is two
+numbers: `0x950412de' and `0xde120495'.
+
+ The second word describes the current revision of the file format,
+composed of a major and a minor revision number. The revision numbers
+ensure that the readers of MO files can distinguish new formats from
+old ones and handle their contents, as far as possible. For now the
+major revision is 0 or 1, and the minor revision is also 0 or 1. More
+revisions might be added in the future. A program seeing an unexpected
+major revision number should stop reading the MO file entirely; whereas
+an unexpected minor revision number means that the file can be read but
+will not reveal its full contents, when parsed by a program that
+supports only smaller minor revision numbers.
+
+ The version is kept separate from the magic number, instead of using
+different magic numbers for different formats, mainly because
+`/etc/magic' is not updated often.
+
+ Follow a number of pointers to later tables in the file, allowing
+for the extension of the prefix part of MO files without having to
+recompile programs reading them. This might become useful for later
+inserting a few flag bits, indication about the charset used, new
+tables, or other things.
+
+ Then, at offset O and offset T in the picture, two tables of string
+descriptors can be found. In both tables, each string descriptor uses
+two 32 bits integers, one for the string length, another for the offset
+of the string in the MO file, counting in bytes from the start of the
+file. The first table contains descriptors for the original strings,
+and is sorted so the original strings are in increasing lexicographical
+order. The second table contains descriptors for the translated
+strings, and is parallel to the first table: to find the corresponding
+translation one has to access the array slot in the second array with
+the same index.
+
+ Having the original strings sorted enables the use of simple binary
+search, for when the MO file does not contain an hashing table, or for
+when it is not practical to use the hashing table provided in the MO
+file. This also has another advantage, as the empty string in a PO
+file GNU `gettext' is usually _translated_ into some system information
+attached to that particular MO file, and the empty string necessarily
+becomes the first in both the original and translated tables, making
+the system information very easy to find.
+
+ The size S of the hash table can be zero. In this case, the hash
+table itself is not contained in the MO file. Some people might prefer
+this because a precomputed hashing table takes disk space, and does not
+win _that_ much speed. The hash table contains indices to the sorted
+array of strings in the MO file. Conflict resolution is done by double
+hashing. The precise hashing algorithm used is fairly dependent on GNU
+`gettext' code, and is not documented here.
+
+ As for the strings themselves, they follow the hash file, and each
+is terminated with a <NUL>, and this <NUL> is not counted in the length
+which appears in the string descriptor. The `msgfmt' program has an
+option selecting the alignment for MO file strings. With this option,
+each string is separately aligned so it starts at an offset which is a
+multiple of the alignment value. On some RISC machines, a correct
+alignment will speed things up.
+
+ Contexts are stored by storing the concatenation of the context, a
+<EOT> byte, and the original string, instead of the original string.
+
+ Plural forms are stored by letting the plural of the original string
+follow the singular of the original string, separated through a <NUL>
+byte. The length which appears in the string descriptor includes both.
+However, only the singular of the original string takes part in the
+hash table lookup. The plural variants of the translation are all
+stored consecutively, separated through a <NUL> byte. Here also, the
+length in the string descriptor includes all of them.
+
+ Nothing prevents a MO file from having embedded <NUL>s in strings.
+However, the program interface currently used already presumes that
+strings are <NUL> terminated, so embedded <NUL>s are somewhat useless.
+But the MO file format is general enough so other interfaces would be
+later possible, if for example, we ever want to implement wide
+characters right in MO files, where <NUL> bytes may accidentally
+appear. (No, we don't want to have wide characters in MO files. They
+would make the file unnecessarily large, and the `wchar_t' type being
+platform dependent, MO files would be platform dependent as well.)
+
+ This particular issue has been strongly debated in the GNU `gettext'
+development forum, and it is expectable that MO file format will evolve
+or change over time. It is even possible that many formats may later
+be supported concurrently. But surely, we have to start somewhere, and
+the MO file format described here is a good start. Nothing is cast in
+concrete, and the format may later evolve fairly easily, so we should
+feel comfortable with the current approach.
+
+ byte
+ +------------------------------------------+
+ 0 | magic number = 0x950412de |
+ | |
+ 4 | file format revision = 0 |
+ | |
+ 8 | number of strings | == N
+ | |
+ 12 | offset of table with original strings | == O
+ | |
+ 16 | offset of table with translation strings | == T
+ | |
+ 20 | size of hashing table | == S
+ | |
+ 24 | offset of hashing table | == H
+ | |
+ . .
+ . (possibly more entries later) .
+ . .
+ | |
+ O | length & offset 0th string ----------------.
+ O + 8 | length & offset 1st string ------------------.
+ ... ... | |
+ O + ((N-1)*8)| length & offset (N-1)th string | | |
+ | | | |
+ T | length & offset 0th translation ---------------.
+ T + 8 | length & offset 1st translation -----------------.
+ ... ... | | | |
+ T + ((N-1)*8)| length & offset (N-1)th translation | | | | |
+ | | | | | |
+ H | start hash table | | | | |
+ ... ... | | | |
+ H + S * 4 | end hash table | | | | |
+ | | | | | |
+ | NUL terminated 0th string <----------------' | | |
+ | | | | |
+ | NUL terminated 1st string <------------------' | |
+ | | | |
+ ... ... | |
+ | | | |
+ | NUL terminated 0th translation <---------------' |
+ | | |
+ | NUL terminated 1st translation <-----------------'
+ | |
+ ... ...
+ | |
+ +------------------------------------------+
+
+
+File: gettext.info, Node: Programmers, Next: Translators, Prev: Binaries, Up: Top
+
+11 The Programmer's View
+************************
+
+ One aim of the current message catalog implementation provided by
+GNU `gettext' was to use the system's message catalog handling, if the
+installer wishes to do so. So we perhaps should first take a look at
+the solutions we know about. The people in the POSIX committee did not
+manage to agree on one of the semi-official standards which we'll
+describe below. In fact they couldn't agree on anything, so they
+decided only to include an example of an interface. The major Unix
+vendors are split in the usage of the two most important
+specifications: X/Open's catgets vs. Uniforum's gettext interface.
+We'll describe them both and later explain our solution of this dilemma.
+
+* Menu:
+
+* catgets:: About `catgets'
+* gettext:: About `gettext'
+* Comparison:: Comparing the two interfaces
+* Using libintl.a:: Using libintl.a in own programs
+* gettext grok:: Being a `gettext' grok
+* Temp Programmers:: Temporary Notes for the Programmers Chapter
+
+
+File: gettext.info, Node: catgets, Next: gettext, Prev: Programmers, Up: Programmers
+
+11.1 About `catgets'
+====================
+
+ The `catgets' implementation is defined in the X/Open Portability
+Guide, Volume 3, XSI Supplementary Definitions, Chapter 5. But the
+process of creating this standard seemed to be too slow for some of the
+Unix vendors so they created their implementations on preliminary
+versions of the standard. Of course this leads again to problems while
+writing platform independent programs: even the usage of `catgets' does
+not guarantee a unique interface.
+
+ Another, personal comment on this that only a bunch of committee
+members could have made this interface. They never really tried to
+program using this interface. It is a fast, memory-saving
+implementation, an user can happily live with it. But programmers hate
+it (at least I and some others do...)
+
+ But we must not forget one point: after all the trouble with
+transferring the rights on Unix(tm) they at last came to X/Open, the
+very same who published this specification. This leads me to making
+the prediction that this interface will be in future Unix standards
+(e.g. Spec1170) and therefore part of all Unix implementation
+(implementations, which are _allowed_ to wear this name).
+
+* Menu:
+
+* Interface to catgets:: The interface
+* Problems with catgets:: Problems with the `catgets' interface?!
+
+
+File: gettext.info, Node: Interface to catgets, Next: Problems with catgets, Prev: catgets, Up: catgets
+
+11.1.1 The Interface
+--------------------
+
+ The interface to the `catgets' implementation consists of three
+functions which correspond to those used in file access: `catopen' to
+open the catalog for using, `catgets' for accessing the message tables,
+and `catclose' for closing after work is done. Prototypes for the
+functions and the needed definitions are in the `<nl_types.h>' header
+file.
+
+ `catopen' is used like in this:
+
+ nl_catd catd = catopen ("catalog_name", 0);
+
+ The function takes as the argument the name of the catalog. This
+usual refers to the name of the program or the package. The second
+parameter is not further specified in the standard. I don't even know
+whether it is implemented consistently among various systems. So the
+common advice is to use `0' as the value. The return value is a handle
+to the message catalog, equivalent to handles to file returned by
+`open'.
+
+ This handle is of course used in the `catgets' function which can be
+used like this:
+
+ char *translation = catgets (catd, set_no, msg_id, "original string");
+
+ The first parameter is this catalog descriptor. The second parameter
+specifies the set of messages in this catalog, in which the message
+described by `msg_id' is obtained. `catgets' therefore uses a
+three-stage addressing:
+
+ catalog name => set number => message ID => translation
+
+ The fourth argument is not used to address the translation. It is
+given as a default value in case when one of the addressing stages
+fail. One important thing to remember is that although the return type
+of catgets is `char *' the resulting string _must not_ be changed. It
+should better be `const char *', but the standard is published in 1988,
+one year before ANSI C.
+
+The last of these functions is used and behaves as expected:
+
+ catclose (catd);
+
+ After this no `catgets' call using the descriptor is legal anymore.
+
+
+File: gettext.info, Node: Problems with catgets, Prev: Interface to catgets, Up: catgets
+
+11.1.2 Problems with the `catgets' Interface?!
+----------------------------------------------
+
+ Now that this description seemed to be really easy -- where are the
+problems we speak of? In fact the interface could be used in a
+reasonable way, but constructing the message catalogs is a pain. The
+reason for this lies in the third argument of `catgets': the unique
+message ID. This has to be a numeric value for all messages in a single
+set. Perhaps you could imagine the problems keeping such a list while
+changing the source code. Add a new message here, remove one there. Of
+course there have been developed a lot of tools helping to organize this
+chaos but one as the other fails in one aspect or the other. We don't
+want to say that the other approach has no problems but they are far
+more easy to manage.
+
+
+File: gettext.info, Node: gettext, Next: Comparison, Prev: catgets, Up: Programmers
+
+11.2 About `gettext'
+====================
+
+ The definition of the `gettext' interface comes from a Uniforum
+proposal. It was submitted there by Sun, who had implemented the
+`gettext' function in SunOS 4, around 1990. Nowadays, the `gettext'
+interface is specified by the OpenI18N standard.
+
+ The main point about this solution is that it does not follow the
+method of normal file handling (open-use-close) and that it does not
+burden the programmer with so many tasks, especially the unique key
+handling. Of course here also a unique key is needed, but this key is
+the message itself (how long or short it is). See *note Comparison::
+for a more detailed comparison of the two methods.
+
+ The following section contains a rather detailed description of the
+interface. We make it that detailed because this is the interface we
+chose for the GNU `gettext' Library. Programmers interested in using
+this library will be interested in this description.
+
+* Menu:
+
+* Interface to gettext:: The interface
+* Ambiguities:: Solving ambiguities
+* Locating Catalogs:: Locating message catalog files
+* Charset conversion:: How to request conversion to Unicode
+* Contexts:: Solving ambiguities in GUI programs
+* Plural forms:: Additional functions for handling plurals
+* Optimized gettext:: Optimization of the *gettext functions
+
+
+File: gettext.info, Node: Interface to gettext, Next: Ambiguities, Prev: gettext, Up: gettext
+
+11.2.1 The Interface
+--------------------
+
+ The minimal functionality an interface must have is a) to select a
+domain the strings are coming from (a single domain for all programs is
+not reasonable because its construction and maintenance is difficult,
+perhaps impossible) and b) to access a string in a selected domain.
+
+ This is principally the description of the `gettext' interface. It
+has a global domain which unqualified usages reference. Of course this
+domain is selectable by the user.
+
+ char *textdomain (const char *domain_name);
+
+ This provides the possibility to change or query the current status
+of the current global domain of the `LC_MESSAGE' category. The
+argument is a null-terminated string, whose characters must be legal in
+the use in filenames. If the DOMAIN_NAME argument is `NULL', the
+function returns the current value. If no value has been set before,
+the name of the default domain is returned: _messages_. Please note
+that although the return value of `textdomain' is of type `char *' no
+changing is allowed. It is also important to know that no checks of
+the availability are made. If the name is not available you will see
+this by the fact that no translations are provided.
+
+To use a domain set by `textdomain' the function
+
+ char *gettext (const char *msgid);
+
+is to be used. This is the simplest reasonable form one can imagine.
+The translation of the string MSGID is returned if it is available in
+the current domain. If it is not available, the argument itself is
+returned. If the argument is `NULL' the result is undefined.
+
+ One thing which should come into mind is that no explicit dependency
+to the used domain is given. The current value of the domain is used.
+If this changes between two executions of the same `gettext' call in
+the program, both calls reference a different message catalog.
+
+ For the easiest case, which is normally used in internationalized
+packages, once at the beginning of execution a call to `textdomain' is
+issued, setting the domain to a unique name, normally the package name.
+In the following code all strings which have to be translated are
+filtered through the gettext function. That's all, the package speaks
+your language.
+
+
+File: gettext.info, Node: Ambiguities, Next: Locating Catalogs, Prev: Interface to gettext, Up: gettext
+
+11.2.2 Solving Ambiguities
+--------------------------
+
+ While this single name domain works well for most applications there
+might be the need to get translations from more than one domain. Of
+course one could switch between different domains with calls to
+`textdomain', but this is really not convenient nor is it fast. A
+possible situation could be one case subject to discussion during this
+writing: all error messages of functions in the set of common used
+functions should go into a separate domain `error'. By this mean we
+would only need to translate them once. Another case are messages from
+a library, as these _have_ to be independent of the current domain set
+by the application.
+
+For this reasons there are two more functions to retrieve strings:
+
+ char *dgettext (const char *domain_name, const char *msgid);
+ char *dcgettext (const char *domain_name, const char *msgid,
+ int category);
+
+ Both take an additional argument at the first place, which
+corresponds to the argument of `textdomain'. The third argument of
+`dcgettext' allows to use another locale category but `LC_MESSAGES'.
+But I really don't know where this can be useful. If the DOMAIN_NAME
+is `NULL' or CATEGORY has an value beside the known ones, the result is
+undefined. It should also be noted that this function is not part of
+the second known implementation of this function family, the one found
+in Solaris.
+
+ A second ambiguity can arise by the fact, that perhaps more than one
+domain has the same name. This can be solved by specifying where the
+needed message catalog files can be found.
+
+ char *bindtextdomain (const char *domain_name,
+ const char *dir_name);
+
+ Calling this function binds the given domain to a file in the
+specified directory (how this file is determined follows below).
+Especially a file in the systems default place is not favored against
+the specified file anymore (as it would be by solely using
+`textdomain'). A `NULL' pointer for the DIR_NAME parameter returns the
+binding associated with DOMAIN_NAME. If DOMAIN_NAME itself is `NULL'
+nothing happens and a `NULL' pointer is returned. Here again as for
+all the other functions is true that none of the return value must be
+changed!
+
+ It is important to remember that relative path names for the
+DIR_NAME parameter can be trouble. Since the path is always computed
+relative to the current directory different results will be achieved
+when the program executes a `chdir' command. Relative paths should
+always be avoided to avoid dependencies and unreliabilities.
+
+
+File: gettext.info, Node: Locating Catalogs, Next: Charset conversion, Prev: Ambiguities, Up: gettext
+
+11.2.3 Locating Message Catalog Files
+-------------------------------------
+
+ Because many different languages for many different packages have to
+be stored we need some way to add these information to file message
+catalog files. The way usually used in Unix environments is have this
+encoding in the file name. This is also done here. The directory name
+given in `bindtextdomain's second argument (or the default directory),
+followed by the name of the locale, the locale category, and the domain
+name are concatenated:
+
+ DIR_NAME/LOCALE/LC_CATEGORY/DOMAIN_NAME.mo
+
+ The default value for DIR_NAME is system specific. For the GNU
+library, and for packages adhering to its conventions, it's:
+ /usr/local/share/locale
+
+LOCALE is the name of the locale category which is designated by
+`LC_CATEGORY'. For `gettext' and `dgettext' this `LC_CATEGORY' is
+always `LC_MESSAGES'.(1) The name of the locale category is determined
+through `setlocale (LC_CATEGORY, NULL)'. (2) When using the function
+`dcgettext', you can specify the locale category through the third
+argument.
+
+ ---------- Footnotes ----------
+
+ (1) Some system, e.g. mingw, don't have `LC_MESSAGES'. Here we use
+a more or less arbitrary value for it, namely 1729, the smallest
+positive integer which can be represented in two different ways as the
+sum of two cubes.
+
+ (2) When the system does not support `setlocale' its behavior in
+setting the locale values is simulated by looking at the environment
+variables.
+
+
+File: gettext.info, Node: Charset conversion, Next: Contexts, Prev: Locating Catalogs, Up: gettext
+
+11.2.4 How to specify the output character set `gettext' uses
+-------------------------------------------------------------
+
+ `gettext' not only looks up a translation in a message catalog. It
+also converts the translation on the fly to the desired output character
+set. This is useful if the user is working in a different character set
+than the translator who created the message catalog, because it avoids
+distributing variants of message catalogs which differ only in the
+character set.
+
+ The output character set is, by default, the value of `nl_langinfo
+(CODESET)', which depends on the `LC_CTYPE' part of the current locale.
+But programs which store strings in a locale independent way (e.g.
+UTF-8) can request that `gettext' and related functions return the
+translations in that encoding, by use of the `bind_textdomain_codeset'
+function.
+
+ Note that the MSGID argument to `gettext' is not subject to
+character set conversion. Also, when `gettext' does not find a
+translation for MSGID, it returns MSGID unchanged - independently of
+the current output character set. It is therefore recommended that all
+MSGIDs be US-ASCII strings.
+
+ -- Function: char * bind_textdomain_codeset (const char *DOMAINNAME,
+ const char *CODESET)
+ The `bind_textdomain_codeset' function can be used to specify the
+ output character set for message catalogs for domain DOMAINNAME.
+ The CODESET argument must be a valid codeset name which can be used
+ for the `iconv_open' function, or a null pointer.
+
+ If the CODESET parameter is the null pointer,
+ `bind_textdomain_codeset' returns the currently selected codeset
+ for the domain with the name DOMAINNAME. It returns `NULL' if no
+ codeset has yet been selected.
+
+ The `bind_textdomain_codeset' function can be used several times.
+ If used multiple times with the same DOMAINNAME argument, the
+ later call overrides the settings made by the earlier one.
+
+ The `bind_textdomain_codeset' function returns a pointer to a
+ string containing the name of the selected codeset. The string is
+ allocated internally in the function and must not be changed by the
+ user. If the system went out of core during the execution of
+ `bind_textdomain_codeset', the return value is `NULL' and the
+ global variable ERRNO is set accordingly.
+
+
+File: gettext.info, Node: Contexts, Next: Plural forms, Prev: Charset conversion, Up: gettext
+
+11.2.5 Using contexts for solving ambiguities
+---------------------------------------------
+
+ One place where the `gettext' functions, if used normally, have big
+problems is within programs with graphical user interfaces (GUIs). The
+problem is that many of the strings which have to be translated are very
+short. They have to appear in pull-down menus which restricts the
+length. But strings which are not containing entire sentences or at
+least large fragments of a sentence may appear in more than one
+situation in the program but might have different translations. This is
+especially true for the one-word strings which are frequently used in
+GUI programs.
+
+ As a consequence many people say that the `gettext' approach is
+wrong and instead `catgets' should be used which indeed does not have
+this problem. But there is a very simple and powerful method to handle
+this kind of problems with the `gettext' functions.
+
+ Contexts can be added to strings to be translated. A context
+dependent translation lookup is when a translation for a given string
+is searched, that is limited to a given context. The translation for
+the same string in a different context can be different. The different
+translations of the same string in different contexts can be stored in
+the in the same MO file, and can be edited by the translator in the
+same PO file.
+
+ The `gettext.h' include file contains the lookup macros for strings
+with contexts. They are implemented as thin macros and inline functions
+over the functions from `<libintl.h>'.
+
+ const char *pgettext (const char *msgctxt, const char *msgid);
+
+ In a call of this macro, MSGCTXT and MSGID must be string literals.
+The macro returns the translation of MSGID, restricted to the context
+given by MSGCTXT.
+
+ The MSGCTXT string is visible in the PO file to the translator. You
+should try to make it somehow canonical and never changing. Because
+every time you change an MSGCTXT, the translator will have to review
+the translation of MSGID.
+
+ Finding a canonical MSGCTXT string that doesn't change over time can
+be hard. But you shouldn't use the file name or class name containing
+the `pgettext' call - because it is a common development task to rename
+a file or a class, and it shouldn't cause translator work. Also you
+shouldn't use a comment in the form of a complete English sentence as
+MSGCTXT - because orthography or grammar changes are often applied to
+such sentences, and again, it shouldn't force the translator to do a
+review.
+
+ The `p' in `pgettext' stands for "particular": `pgettext' fetches a
+particular translation of the MSGID.
+
+ const char *dpgettext (const char *domain_name,
+ const char *msgctxt, const char *msgid);
+ const char *dcpgettext (const char *domain_name,
+ const char *msgctxt, const char *msgid,
+ int category);
+
+ These are generalizations of `pgettext'. They behave similarly to
+`dgettext' and `dcgettext', respectively. The DOMAIN_NAME argument
+defines the translation domain. The CATEGORY argument allows to use
+another locale category than `LC_MESSAGES'.
+
+ As as example consider the following fictional situation. A GUI
+program has a menu bar with the following entries:
+
+ +------------+------------+--------------------------------------+
+ | File | Printer | |
+ +------------+------------+--------------------------------------+
+ | Open | | Select |
+ | New | | Open |
+ +----------+ | Connect |
+ +----------+
+
+ To have the strings `File', `Printer', `Open', `New', `Select', and
+`Connect' translated there has to be at some point in the code a call
+to a function of the `gettext' family. But in two places the string
+passed into the function would be `Open'. The translations might not
+be the same and therefore we are in the dilemma described above.
+
+ What distinguishes the two places is the menu path from the menu
+root to the particular menu entries:
+
+ Menu|File
+ Menu|Printer
+ Menu|File|Open
+ Menu|File|New
+ Menu|Printer|Select
+ Menu|Printer|Open
+ Menu|Printer|Connect
+
+ The context is thus the menu path without its last part. So, the
+calls look like this:
+
+ pgettext ("Menu|", "File")
+ pgettext ("Menu|", "Printer")
+ pgettext ("Menu|File|", "Open")
+ pgettext ("Menu|File|", "New")
+ pgettext ("Menu|Printer|", "Select")
+ pgettext ("Menu|Printer|", "Open")
+ pgettext ("Menu|Printer|", "Connect")
+
+ Whether or not to use the `|' character at the end of the context is
+a matter of style.
+
+ For more complex cases, where the MSGCTXT or MSGID are not string
+literals, more general macros are available:
+
+ const char *pgettext_expr (const char *msgctxt, const char *msgid);
+ const char *dpgettext_expr (const char *domain_name,
+ const char *msgctxt, const char *msgid);
+ const char *dcpgettext_expr (const char *domain_name,
+ const char *msgctxt, const char *msgid,
+ int category);
+
+ Here MSGCTXT and MSGID can be arbitrary string-valued expressions.
+These macros are more general. But in the case that both argument
+expressions are string literals, the macros without the `_expr' suffix
+are more efficient.
+
+
+File: gettext.info, Node: Plural forms, Next: Optimized gettext, Prev: Contexts, Up: gettext
+
+11.2.6 Additional functions for plural forms
+--------------------------------------------
+
+ The functions of the `gettext' family described so far (and all the
+`catgets' functions as well) have one problem in the real world which
+have been neglected completely in all existing approaches. What is
+meant here is the handling of plural forms.
+
+ Looking through Unix source code before the time anybody thought
+about internationalization (and, sadly, even afterwards) one can often
+find code similar to the following:
+
+ printf ("%d file%s deleted", n, n == 1 ? "" : "s");
+
+After the first complaints from people internationalizing the code
+people either completely avoided formulations like this or used strings
+like `"file(s)"'. Both look unnatural and should be avoided. First
+tries to solve the problem correctly looked like this:
+
+ if (n == 1)
+ printf ("%d file deleted", n);
+ else
+ printf ("%d files deleted", n);
+
+ But this does not solve the problem. It helps languages where the
+plural form of a noun is not simply constructed by adding an `s' but
+that is all. Once again people fell into the trap of believing the
+rules their language is using are universal. But the handling of plural
+forms differs widely between the language families. For example, Rafal
+Maszkowski `<rzm@mat.uni.torun.pl>' reports:
+
+ In Polish we use e.g. plik (file) this way:
+ 1 plik
+ 2,3,4 pliki
+ 5-21 pliko'w
+ 22-24 pliki
+ 25-31 pliko'w
+ and so on (o' means 8859-2 oacute which should be rather okreska,
+ similar to aogonek).
+
+ There are two things which can differ between languages (and even
+inside language families);
+
+ * The form how plural forms are built differs. This is a problem
+ with languages which have many irregularities. German, for
+ instance, is a drastic case. Though English and German are part
+ of the same language family (Germanic), the almost regular forming
+ of plural noun forms (appending an `s') is hardly found in German.
+
+ * The number of plural forms differ. This is somewhat surprising for
+ those who only have experiences with Romanic and Germanic languages
+ since here the number is the same (there are two).
+
+ But other language families have only one form or many forms. More
+ information on this in an extra section.
+
+ The consequence of this is that application writers should not try to
+solve the problem in their code. This would be localization since it is
+only usable for certain, hardcoded language environments. Instead the
+extended `gettext' interface should be used.
+
+ These extra functions are taking instead of the one key string two
+strings and a numerical argument. The idea behind this is that using
+the numerical argument and the first string as a key, the implementation
+can select using rules specified by the translator the right plural
+form. The two string arguments then will be used to provide a return
+value in case no message catalog is found (similar to the normal
+`gettext' behavior). In this case the rules for Germanic language is
+used and it is assumed that the first string argument is the singular
+form, the second the plural form.
+
+ This has the consequence that programs without language catalogs can
+display the correct strings only if the program itself is written using
+a Germanic language. This is a limitation but since the GNU C library
+(as well as the GNU `gettext' package) are written as part of the GNU
+package and the coding standards for the GNU project require program
+being written in English, this solution nevertheless fulfills its
+purpose.
+
+ -- Function: char * ngettext (const char *MSGID1, const char *MSGID2,
+ unsigned long int N)
+ The `ngettext' function is similar to the `gettext' function as it
+ finds the message catalogs in the same way. But it takes two
+ extra arguments. The MSGID1 parameter must contain the singular
+ form of the string to be converted. It is also used as the key
+ for the search in the catalog. The MSGID2 parameter is the plural
+ form. The parameter N is used to determine the plural form. If no
+ message catalog is found MSGID1 is returned if `n == 1', otherwise
+ `msgid2'.
+
+ An example for the use of this function is:
+
+ printf (ngettext ("%d file removed", "%d files removed", n), n);
+
+ Please note that the numeric value N has to be passed to the
+ `printf' function as well. It is not sufficient to pass it only to
+ `ngettext'.
+
+ In the English singular case, the number - always 1 - can be
+ replaced with "one":
+
+ printf (ngettext ("One file removed", "%d files removed", n), n);
+
+ This works because the `printf' function discards excess arguments
+ that are not consumed by the format string.
+
+ If this function is meant to yield a format string that takes two
+ or more arguments, you can not use it like this:
+
+ printf (ngettext ("%d file removed from directory %s",
+ "%d files removed from directory %s",
+ n, dir),
+ n);
+
+ because in many languages the translators want to replace the `%d'
+ with an explicit word in the singular case, just like "one" in
+ English, and C format strings cannot consume the second argument
+ but skip the first argument. Instead, you have to reorder the
+ arguments so that `n' comes last:
+
+ printf (ngettext ("%$2d file removed from directory %$1s",
+ "%$2d files removed from directory %$1s",
+ dir, n),
+ n);
+
+ See *note c-format:: for details about this argument reordering
+ syntax.
+
+ When you know that the value of `n' is within a given range, you
+ can specify it as a comment directed to the `xgettext' tool. This
+ information may help translators to use more adequate
+ translations. Like this:
+
+ if (days > 7 && days < 14)
+ /* xgettext: range: 1..6 */
+ printf (ngettext ("one week and one day", "one week and %d days",
+ days - 7),
+ days - 7);
+
+ It is also possible to use this function when the strings don't
+ contain a cardinal number:
+
+ puts (ngettext ("Delete the selected file?",
+ "Delete the selected files?",
+ n));
+
+ In this case the number N is only used to choose the plural form.
+
+ -- Function: char * dngettext (const char *DOMAIN, const char *MSGID1,
+ const char *MSGID2, unsigned long int N)
+ The `dngettext' is similar to the `dgettext' function in the way
+ the message catalog is selected. The difference is that it takes
+ two extra parameter to provide the correct plural form. These two
+ parameters are handled in the same way `ngettext' handles them.
+
+ -- Function: char * dcngettext (const char *DOMAIN, const char
+ *MSGID1, const char *MSGID2, unsigned long int N, int
+ CATEGORY)
+ The `dcngettext' is similar to the `dcgettext' function in the way
+ the message catalog is selected. The difference is that it takes
+ two extra parameter to provide the correct plural form. These two
+ parameters are handled in the same way `ngettext' handles them.
+
+ Now, how do these functions solve the problem of the plural forms?
+Without the input of linguists (which was not available) it was not
+possible to determine whether there are only a few different forms in
+which plural forms are formed or whether the number can increase with
+every new supported language.
+
+ Therefore the solution implemented is to allow the translator to
+specify the rules of how to select the plural form. Since the formula
+varies with every language this is the only viable solution except for
+hardcoding the information in the code (which still would require the
+possibility of extensions to not prevent the use of new languages).
+
+ The information about the plural form selection has to be stored in
+the header entry of the PO file (the one with the empty `msgid' string).
+The plural form information looks like this:
+
+ Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;
+
+ The `nplurals' value must be a decimal number which specifies how
+many different plural forms exist for this language. The string
+following `plural' is an expression which is using the C language
+syntax. Exceptions are that no negative numbers are allowed, numbers
+must be decimal, and the only variable allowed is `n'. Spaces are
+allowed in the expression, but backslash-newlines are not; in the
+examples below the backslash-newlines are present for formatting
+purposes only. This expression will be evaluated whenever one of the
+functions `ngettext', `dngettext', or `dcngettext' is called. The
+numeric value passed to these functions is then substituted for all uses
+of the variable `n' in the expression. The resulting value then must
+be greater or equal to zero and smaller than the value given as the
+value of `nplurals'.
+
+The following rules are known at this point. The language with families
+are listed. But this does not necessarily mean the information can be
+generalized for the whole family (as can be easily seen in the table
+below).(1)
+
+Only one form:
+ Some languages only require one single form. There is no
+ distinction between the singular and plural form. An appropriate
+ header entry would look like this:
+
+ Plural-Forms: nplurals=1; plural=0;
+
+ Languages with this property include:
+
+ Asian family
+ Japanese, Vietnamese, Korean
+
+Two forms, singular used for one only
+ This is the form used in most existing programs since it is what
+ English is using. A header entry would look like this:
+
+ Plural-Forms: nplurals=2; plural=n != 1;
+
+ (Note: this uses the feature of C expressions that boolean
+ expressions have to value zero or one.)
+
+ Languages with this property include:
+
+ Germanic family
+ English, German, Dutch, Swedish, Danish, Norwegian, Faroese
+
+ Romanic family
+ Spanish, Portuguese, Italian, Bulgarian
+
+ Latin/Greek family
+ Greek
+
+ Finno-Ugric family
+ Finnish, Estonian
+
+ Semitic family
+ Hebrew
+
+ Artificial
+ Esperanto
+
+ Other languages using the same header entry are:
+
+ Finno-Ugric family
+ Hungarian
+
+ Turkic/Altaic family
+ Turkish
+
+ Hungarian does not appear to have a plural if you look at
+ sentences involving cardinal numbers. For example, "1 apple" is
+ "1 alma", and "123 apples" is "123 alma". But when the number is
+ not explicit, the distinction between singular and plural exists:
+ "the apple" is "az alma", and "the apples" is "az almák". Since
+ `ngettext' has to support both types of sentences, it is
+ classified here, under "two forms".
+
+ The same holds for Turkish: "1 apple" is "1 elma", and "123
+ apples" is "123 elma". But when the number is omitted, the
+ distinction between singular and plural exists: "the apple" is
+ "elma", and "the apples" is "elmalar".
+
+Two forms, singular used for zero and one
+ Exceptional case in the language family. The header entry would
+ be:
+
+ Plural-Forms: nplurals=2; plural=n>1;
+
+ Languages with this property include:
+
+ Romanic family
+ Brazilian Portuguese, French
+
+Three forms, special case for zero
+ The header entry would be:
+
+ Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;
+
+ Languages with this property include:
+
+ Baltic family
+ Latvian
+
+Three forms, special cases for one and two
+ The header entry would be:
+
+ Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;
+
+ Languages with this property include:
+
+ Celtic
+ Gaeilge (Irish)
+
+Three forms, special case for numbers ending in 00 or [2-9][0-9]
+ The header entry would be:
+
+ Plural-Forms: nplurals=3; \
+ plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;
+
+ Languages with this property include:
+
+ Romanic family
+ Romanian
+
+Three forms, special case for numbers ending in 1[2-9]
+ The header entry would look like this:
+
+ Plural-Forms: nplurals=3; \
+ plural=n%10==1 && n%100!=11 ? 0 : \
+ n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2;
+
+ Languages with this property include:
+
+ Baltic family
+ Lithuanian
+
+Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
+ The header entry would look like this:
+
+ Plural-Forms: nplurals=3; \
+ plural=n%10==1 && n%100!=11 ? 0 : \
+ n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
+
+ Languages with this property include:
+
+ Slavic family
+ Russian, Ukrainian, Serbian, Croatian
+
+Three forms, special cases for 1 and 2, 3, 4
+ The header entry would look like this:
+
+ Plural-Forms: nplurals=3; \
+ plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;
+
+ Languages with this property include:
+
+ Slavic family
+ Czech, Slovak
+
+Three forms, special case for one and some numbers ending in 2, 3, or 4
+ The header entry would look like this:
+
+ Plural-Forms: nplurals=3; \
+ plural=n==1 ? 0 : \
+ n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
+
+ Languages with this property include:
+
+ Slavic family
+ Polish
+
+Four forms, special case for one and all numbers ending in 02, 03, or 04
+ The header entry would look like this:
+
+ Plural-Forms: nplurals=4; \
+ plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;
+
+ Languages with this property include:
+
+ Slavic family
+ Slovenian
+
+ You might now ask, `ngettext' handles only numbers N of type
+`unsigned long'. What about larger integer types? What about negative
+numbers? What about floating-point numbers?
+
+ About larger integer types, such as `uintmax_t' or `unsigned long
+long': they can be handled by reducing the value to a range that fits
+in an `unsigned long'. Simply casting the value to `unsigned long'
+would not do the right thing, since it would treat `ULONG_MAX + 1' like
+zero, `ULONG_MAX + 2' like singular, and the like. Here you can
+exploit the fact that all mentioned plural form formulas eventually
+become periodic, with a period that is a divisor of 100 (or 1000 or
+1000000). So, when you reduce a large value to another one in the
+range [1000000, 1999999] that ends in the same 6 decimal digits, you
+can assume that it will lead to the same plural form selection. This
+code does this:
+
+ #include <inttypes.h>
+ uintmax_t nbytes = ...;
+ printf (ngettext ("The file has %"PRIuMAX" byte.",
+ "The file has %"PRIuMAX" bytes.",
+ (nbytes > ULONG_MAX
+ ? (nbytes % 1000000) + 1000000
+ : nbytes)),
+ nbytes);
+
+ Negative and floating-point values usually represent physical
+entities for which singular and plural don't clearly apply. In such
+cases, there is no need to use `ngettext'; a simple `gettext' call with
+a form suitable for all values will do. For example:
+
+ printf (gettext ("Time elapsed: %.3f seconds"),
+ num_milliseconds * 0.001);
+
+Even if NUM_MILLISECONDS happens to be a multiple of 1000, the output
+ Time elapsed: 1.000 seconds
+ is acceptable in English, and similarly for other languages.
+
+ The translators' perspective regarding plural forms is explained in
+*note Translating plural forms::.
+
+ ---------- Footnotes ----------
+
+ (1) Additions are welcome. Send appropriate information to
+<bug-gnu-gettext@gnu.org> and <bug-glibc-manual@gnu.org>.
+
+
+File: gettext.info, Node: Optimized gettext, Prev: Plural forms, Up: gettext
+
+11.2.7 Optimization of the *gettext functions
+---------------------------------------------
+
+ At this point of the discussion we should talk about an advantage of
+the GNU `gettext' implementation. Some readers might have pointed out
+that an internationalized program might have a poor performance if some
+string has to be translated in an inner loop. While this is unavoidable
+when the string varies from one run of the loop to the other it is
+simply a waste of time when the string is always the same. Take the
+following example:
+
+ {
+ while (...)
+ {
+ puts (gettext ("Hello world"));
+ }
+ }
+
+When the locale selection does not change between two runs the resulting
+string is always the same. One way to use this is:
+
+ {
+ str = gettext ("Hello world");
+ while (...)
+ {
+ puts (str);
+ }
+ }
+
+But this solution is not usable in all situation (e.g. when the locale
+selection changes) nor does it lead to legible code.
+
+ For this reason, GNU `gettext' caches previous translation results.
+When the same translation is requested twice, with no new message
+catalogs being loaded in between, `gettext' will, the second time, find
+the result through a single cache lookup.
+
+
+File: gettext.info, Node: Comparison, Next: Using libintl.a, Prev: gettext, Up: Programmers
+
+11.3 Comparing the Two Interfaces
+=================================
+
+ The following discussion is perhaps a little bit colored. As said
+above we implemented GNU `gettext' following the Uniforum proposal and
+this surely has its reasons. But it should show how we came to this
+decision.
+
+ First we take a look at the developing process. When we write an
+application using NLS provided by `gettext' we proceed as always. Only
+when we come to a string which might be seen by the users and thus has
+to be translated we use `gettext("...")' instead of `"..."'. At the
+beginning of each source file (or in a central header file) we define
+
+ #define gettext(String) (String)
+
+ Even this definition can be avoided when the system supports the
+`gettext' function in its C library. When we compile this code the
+result is the same as if no NLS code is used. When you take a look at
+the GNU `gettext' code you will see that we use `_("...")' instead of
+`gettext("...")'. This reduces the number of additional characters per
+translatable string to _3_ (in words: three).
+
+ When now a production version of the program is needed we simply
+replace the definition
+
+ #define _(String) (String)
+
+by
+
+ #include <libintl.h>
+ #define _(String) gettext (String)
+
+Additionally we run the program `xgettext' on all source code file
+which contain translatable strings and that's it: we have a running
+program which does not depend on translations to be available, but which
+can use any that becomes available.
+
+ The same procedure can be done for the `gettext_noop' invocations
+(*note Special cases::). One usually defines `gettext_noop' as a no-op
+macro. So you should consider the following code for your project:
+
+ #define gettext_noop(String) String
+ #define N_(String) gettext_noop (String)
+
+ `N_' is a short form similar to `_'. The `Makefile' in the `po/'
+directory of GNU `gettext' knows by default both of the mentioned short
+forms so you are invited to follow this proposal for your own ease.
+
+ Now to `catgets'. The main problem is the work for the programmer.
+Every time he comes to a translatable string he has to define a number
+(or a symbolic constant) which has also be defined in the message
+catalog file. He also has to take care for duplicate entries,
+duplicate message IDs etc. If he wants to have the same quality in the
+message catalog as the GNU `gettext' program provides he also has to
+put the descriptive comments for the strings and the location in all
+source code files in the message catalog. This is nearly a Mission:
+Impossible.
+
+ But there are also some points people might call advantages speaking
+for `catgets'. If you have a single word in a string and this string
+is used in different contexts it is likely that in one or the other
+language the word has different translations. Example:
+
+ printf ("%s: %d", gettext ("number"), number_of_errors)
+
+ printf ("you should see %d %s", number_count,
+ number_count == 1 ? gettext ("number") : gettext ("numbers"))
+
+ Here we have to translate two times the string `"number"'. Even if
+you do not speak a language beside English it might be possible to
+recognize that the two words have a different meaning. In German the
+first appearance has to be translated to `"Anzahl"' and the second to
+`"Zahl"'.
+
+ Now you can say that this example is really esoteric. And you are
+right! This is exactly how we felt about this problem and decide that
+it does not weight that much. The solution for the above problem could
+be very easy:
+
+ printf ("%s %d", gettext ("number:"), number_of_errors)
+
+ printf (number_count == 1 ? gettext ("you should see %d number")
+ : gettext ("you should see %d numbers"),
+ number_count)
+
+ We believe that we can solve all conflicts with this method. If it
+is difficult one can also consider changing one of the conflicting
+string a little bit. But it is not impossible to overcome.
+
+ `catgets' allows same original entry to have different translations,
+but `gettext' has another, scalable approach for solving ambiguities of
+this kind: *Note Ambiguities::.
+
+
+File: gettext.info, Node: Using libintl.a, Next: gettext grok, Prev: Comparison, Up: Programmers
+
+11.4 Using libintl.a in own programs
+====================================
+
+ Starting with version 0.9.4 the library `libintl.h' should be
+self-contained. I.e., you can use it in your own programs without
+providing additional functions. The `Makefile' will put the header and
+the library in directories selected using the `$(prefix)'.
+
+
+File: gettext.info, Node: gettext grok, Next: Temp Programmers, Prev: Using libintl.a, Up: Programmers
+
+11.5 Being a `gettext' grok
+===========================
+
+ * NOTE: * This documentation section is outdated and needs to be
+revised.
+
+ To fully exploit the functionality of the GNU `gettext' library it
+is surely helpful to read the source code. But for those who don't want
+to spend that much time in reading the (sometimes complicated) code here
+is a list comments:
+
+ * Changing the language at runtime
+
+ For interactive programs it might be useful to offer a selection
+ of the used language at runtime. To understand how to do this one
+ need to know how the used language is determined while executing
+ the `gettext' function. The method which is presented here only
+ works correctly with the GNU implementation of the `gettext'
+ functions.
+
+ In the function `dcgettext' at every call the current setting of
+ the highest priority environment variable is determined and used.
+ Highest priority means here the following list with decreasing
+ priority:
+
+ 1. `LANGUAGE'
+
+ 2. `LC_ALL'
+
+ 3. `LC_xxx', according to selected locale category
+
+ 4. `LANG'
+
+ Afterwards the path is constructed using the found value and the
+ translation file is loaded if available.
+
+ What happens now when the value for, say, `LANGUAGE' changes?
+ According to the process explained above the new value of this
+ variable is found as soon as the `dcgettext' function is called.
+ But this also means the (perhaps) different message catalog file
+ is loaded. In other words: the used language is changed.
+
+ But there is one little hook. The code for gcc-2.7.0 and up
+ provides some optimization. This optimization normally prevents
+ the calling of the `dcgettext' function as long as no new catalog
+ is loaded. But if `dcgettext' is not called the program also
+ cannot find the `LANGUAGE' variable be changed (*note Optimized
+ gettext::). A solution for this is very easy. Include the
+ following code in the language switching function.
+
+ /* Change language. */
+ setenv ("LANGUAGE", "fr", 1);
+
+ /* Make change known. */
+ {
+ extern int _nl_msg_cat_cntr;
+ ++_nl_msg_cat_cntr;
+ }
+
+ The variable `_nl_msg_cat_cntr' is defined in `loadmsgcat.c'. You
+ don't need to know what this is for. But it can be used to detect
+ whether a `gettext' implementation is GNU gettext and not non-GNU
+ system's native gettext implementation.
+
+
+
+File: gettext.info, Node: Temp Programmers, Prev: gettext grok, Up: Programmers
+
+11.6 Temporary Notes for the Programmers Chapter
+================================================
+
+ * NOTE: * This documentation section is outdated and needs to be
+revised.
+
+* Menu:
+
+* Temp Implementations:: Temporary - Two Possible Implementations
+* Temp catgets:: Temporary - About `catgets'
+* Temp WSI:: Temporary - Why a single implementation
+* Temp Notes:: Temporary - Notes
+
+
+File: gettext.info, Node: Temp Implementations, Next: Temp catgets, Prev: Temp Programmers, Up: Temp Programmers
+
+11.6.1 Temporary - Two Possible Implementations
+-----------------------------------------------
+
+ There are two competing methods for language independent messages:
+the X/Open `catgets' method, and the Uniforum `gettext' method. The
+`catgets' method indexes messages by integers; the `gettext' method
+indexes them by their English translations. The `catgets' method has
+been around longer and is supported by more vendors. The `gettext'
+method is supported by Sun, and it has been heard that the COSE
+multi-vendor initiative is supporting it. Neither method is a POSIX
+standard; the POSIX.1 committee had a lot of disagreement in this area.
+
+ Neither one is in the POSIX standard. There was much disagreement
+in the POSIX.1 committee about using the `gettext' routines vs.
+`catgets' (XPG). In the end the committee couldn't agree on anything,
+so no messaging system was included as part of the standard. I believe
+the informative annex of the standard includes the XPG3 messaging
+interfaces, "...as an example of a messaging system that has been
+implemented..."
+
+ They were very careful not to say anywhere that you should use one
+set of interfaces over the other. For more on this topic please see
+the Programming for Internationalization FAQ.
+
+
+File: gettext.info, Node: Temp catgets, Next: Temp WSI, Prev: Temp Implementations, Up: Temp Programmers
+
+11.6.2 Temporary - About `catgets'
+----------------------------------
+
+ There have been a few discussions of late on the use of `catgets' as
+a base. I think it important to present both sides of the argument and
+hence am opting to play devil's advocate for a little bit.
+
+ I'll not deny the fact that `catgets' could have been designed a lot
+better. It currently has quite a number of limitations and these have
+already been pointed out.
+
+ However there is a great deal to be said for consistency and
+standardization. A common recurring problem when writing Unix software
+is the myriad portability problems across Unix platforms. It seems as
+if every Unix vendor had a look at the operating system and found parts
+they could improve upon. Undoubtedly, these modifications are probably
+innovative and solve real problems. However, software developers have
+a hard time keeping up with all these changes across so many platforms.
+
+ And this has prompted the Unix vendors to begin to standardize their
+systems. Hence the impetus for Spec1170. Every major Unix vendor has
+committed to supporting this standard and every Unix software developer
+waits with glee the day they can write software to this standard and
+simply recompile (without having to use autoconf) across different
+platforms.
+
+ As I understand it, Spec1170 is roughly based upon version 4 of the
+X/Open Portability Guidelines (XPG4). Because `catgets' and friends
+are defined in XPG4, I'm led to believe that `catgets' is a part of
+Spec1170 and hence will become a standardized component of all Unix
+systems.
+
+
+File: gettext.info, Node: Temp WSI, Next: Temp Notes, Prev: Temp catgets, Up: Temp Programmers
+
+11.6.3 Temporary - Why a single implementation
+----------------------------------------------
+
+ Now it seems kind of wasteful to me to have two different systems
+installed for accessing message catalogs. If we do want to remedy
+`catgets' deficiencies why don't we try to expand `catgets' (in a
+compatible manner) rather than implement an entirely new system.
+Otherwise, we'll end up with two message catalog access systems
+installed with an operating system - one set of routines for packages
+using GNU `gettext' for their internationalization, and another set of
+routines (catgets) for all other software. Bloated?
+
+ Supposing another catalog access system is implemented. Which do we
+recommend? At least for Linux, we need to attract as many software
+developers as possible. Hence we need to make it as easy for them to
+port their software as possible. Which means supporting `catgets'. We
+will be implementing the `libintl' code within our `libc', but does
+this mean we also have to incorporate another message catalog access
+scheme within our `libc' as well? And what about people who are going
+to be using the `libintl' + non-`catgets' routines. When they port
+their software to other platforms, they're now going to have to include
+the front-end (`libintl') code plus the back-end code (the non-`catgets'
+access routines) with their software instead of just including the
+`libintl' code with their software.
+
+ Message catalog support is however only the tip of the iceberg.
+What about the data for the other locale categories? They also have a
+number of deficiencies. Are we going to abandon them as well and
+develop another duplicate set of routines (should `libintl' expand
+beyond message catalog support)?
+
+ Like many parts of Unix that can be improved upon, we're stuck with
+balancing compatibility with the past with useful improvements and
+innovations for the future.
+
+
+File: gettext.info, Node: Temp Notes, Prev: Temp WSI, Up: Temp Programmers
+
+11.6.4 Temporary - Notes
+------------------------
+
+ X/Open agreed very late on the standard form so that many
+implementations differ from the final form. Both of my system (old
+Linux catgets and Ultrix-4) have a strange variation.
+
+ OK. After incorporating the last changes I have to spend some time
+on making the GNU/Linux `libc' `gettext' functions. So in future
+Solaris is not the only system having `gettext'.
+
+
+File: gettext.info, Node: Translators, Next: Maintainers, Prev: Programmers, Up: Top
+
+12 The Translator's View
+************************
+
+* Menu:
+
+* Trans Intro 0:: Introduction 0
+* Trans Intro 1:: Introduction 1
+* Discussions:: Discussions
+* Organization:: Organization
+* Information Flow:: Information Flow
+* Translating plural forms:: How to fill in `msgstr[0]', `msgstr[1]'
+* Prioritizing messages:: How to find which messages to translate first
+
+
+File: gettext.info, Node: Trans Intro 0, Next: Trans Intro 1, Prev: Translators, Up: Translators
+
+12.1 Introduction 0
+===================
+
+ * NOTE: * This documentation section is outdated and needs to be
+revised.
+
+ Free software is going international! The Translation Project is a
+way to get maintainers, translators and users all together, so free
+software will gradually become able to speak many native languages.
+
+ The GNU `gettext' tool set contains _everything_ maintainers need
+for internationalizing their packages for messages. It also contains
+quite useful tools for helping translators at localizing messages to
+their native language, once a package has already been
+internationalized.
+
+ To achieve the Translation Project, we need many interested people
+who like their own language and write it well, and who are also able to
+synergize with other translators speaking the same language. If you'd
+like to volunteer to _work_ at translating messages, please send mail
+to your translating team.
+
+ Each team has its own mailing list, courtesy of Linux International.
+You may reach your translating team at the address `LL@li.org',
+replacing LL by the two-letter ISO 639 code for your language.
+Language codes are _not_ the same as country codes given in ISO 3166.
+The following translating teams exist:
+
+ Chinese `zh', Czech `cs', Danish `da', Dutch `nl', Esperanto `eo',
+ Finnish `fi', French `fr', Irish `ga', German `de', Greek `el',
+ Italian `it', Japanese `ja', Indonesian `in', Norwegian `no',
+ Polish `pl', Portuguese `pt', Russian `ru', Spanish `es', Swedish
+ `sv' and Turkish `tr'.
+
+For example, you may reach the Chinese translating team by writing to
+`zh@li.org'. When you become a member of the translating team for your
+own language, you may subscribe to its list. For example, Swedish
+people can send a message to `sv-request@li.org', having this message
+body:
+
+ subscribe
+
+ Keep in mind that team members should be interested in _working_ at
+translations, or at solving translational difficulties, rather than
+merely lurking around. If your team does not exist yet and you want to
+start one, please write to `coordinator@translationproject.org'; you
+will then reach the coordinator for all translator teams.
+
+ A handful of GNU packages have already been adapted and provided
+with message translations for several languages. Translation teams
+have begun to organize, using these packages as a starting point. But
+there are many more packages and many languages for which we have no
+volunteer translators. If you would like to volunteer to work at
+translating messages, please send mail to
+`coordinator@translationproject.org' indicating what language(s) you
+can work on.
+
+
+File: gettext.info, Node: Trans Intro 1, Next: Discussions, Prev: Trans Intro 0, Up: Translators
+
+12.2 Introduction 1
+===================
+
+ * NOTE: * This documentation section is outdated and needs to be
+revised.
+
+ This is now official, GNU is going international! Here is the
+announcement submitted for the January 1995 GNU Bulletin:
+
+ A handful of GNU packages have already been adapted and provided
+ with message translations for several languages. Translation
+ teams have begun to organize, using these packages as a starting
+ point. But there are many more packages and many languages for
+ which we have no volunteer translators. If you'd like to
+ volunteer to work at translating messages, please send mail to
+ `coordinator@translationproject.org' indicating what language(s)
+ you can work on.
+
+ This document should answer many questions for those who are curious
+about the process or would like to contribute. Please at least skim
+over it, hoping to cut down a little of the high volume of e-mail
+generated by this collective effort towards internationalization of
+free software.
+
+ Most free programming which is widely shared is done in English, and
+currently, English is used as the main communicating language between
+national communities collaborating to free software. This very document
+is written in English. This will not change in the foreseeable future.
+
+ However, there is a strong appetite from national communities for
+having more software able to write using national language and habits,
+and there is an on-going effort to modify free software in such a way
+that it becomes able to do so. The experiments driven so far raised an
+enthusiastic response from pretesters, so we believe that
+internationalization of free software is dedicated to succeed.
+
+ For suggestion clarifications, additions or corrections to this
+document, please e-mail to `coordinator@translationproject.org'.
+
+
+File: gettext.info, Node: Discussions, Next: Organization, Prev: Trans Intro 1, Up: Translators
+
+12.3 Discussions
+================
+
+ * NOTE: * This documentation section is outdated and needs to be
+revised.
+
+ Facing this internationalization effort, a few users expressed their
+concerns. Some of these doubts are presented and discussed, here.
+
+ * Smaller groups
+
+ Some languages are not spoken by a very large number of people, so
+ people speaking them sometimes consider that there may not be all
+ that much demand such versions of free software packages.
+ Moreover, many people being _into computers_, in some countries,
+ generally seem to prefer English versions of their software.
+
+ On the other end, people might enjoy their own language a lot, and
+ be very motivated at providing to themselves the pleasure of
+ having their beloved free software speaking their mother tongue.
+ They do themselves a personal favor, and do not pay that much
+ attention to the number of people benefiting of their work.
+
+ * Misinterpretation
+
+ Other users are shy to push forward their own language, seeing in
+ this some kind of misplaced propaganda. Someone thought there
+ must be some users of the language over the networks pestering
+ other people with it.
+
+ But any spoken language is worth localization, because there are
+ people behind the language for whom the language is important and
+ dear to their hearts.
+
+ * Odd translations
+
+ The biggest problem is to find the right translations so that
+ everybody can understand the messages. Translations are usually a
+ little odd. Some people get used to English, to the extent they
+ may find translations into their own language "rather pushy,
+ obnoxious and sometimes even hilarious." As a French speaking
+ man, I have the experience of those instruction manuals for goods,
+ so poorly translated in French in Korea or Taiwan...
+
+ The fact is that we sometimes have to create a kind of national
+ computer culture, and this is not easy without the collaboration of
+ many people liking their mother tongue. This is why translations
+ are better achieved by people knowing and loving their own
+ language, and ready to work together at improving the results they
+ obtain.
+
+ * Dependencies over the GPL or LGPL
+
+ Some people wonder if using GNU `gettext' necessarily brings their
+ package under the protective wing of the GNU General Public
+ License or the GNU Library General Public License, when they do
+ not want to make their program free, or want other kinds of
+ freedom. The simplest answer is "normally not".
+
+ The `gettext-runtime' part of GNU `gettext', i.e. the contents of
+ `libintl', is covered by the GNU Library General Public License.
+ The `gettext-tools' part of GNU `gettext', i.e. the rest of the
+ GNU `gettext' package, is covered by the GNU General Public
+ License.
+
+ The mere marking of localizable strings in a package, or
+ conditional inclusion of a few lines for initialization, is not
+ really including GPL'ed or LGPL'ed code. However, since the
+ localization routines in `libintl' are under the LGPL, the LGPL
+ needs to be considered. It gives the right to distribute the
+ complete unmodified source of `libintl' even with non-free
+ programs. It also gives the right to use `libintl' as a shared
+ library, even for non-free programs. But it gives the right to
+ use `libintl' as a static library or to incorporate `libintl' into
+ another library only to free software.
+
+
+
+File: gettext.info, Node: Organization, Next: Information Flow, Prev: Discussions, Up: Translators
+
+12.4 Organization
+=================
+
+ * NOTE: * This documentation section is outdated and needs to be
+revised.
+
+ On a larger scale, the true solution would be to organize some kind
+of fairly precise set up in which volunteers could participate. I gave
+some thought to this idea lately, and realize there will be some touchy
+points. I thought of writing to Richard Stallman to launch such a
+project, but feel it might be good to shake out the ideas between
+ourselves first. Most probably that Linux International has some
+experience in the field already, or would like to orchestrate the
+volunteer work, maybe. Food for thought, in any case!
+
+ I guess we have to setup something early, somehow, that will help
+many possible contributors of the same language to interlock and avoid
+work duplication, and further be put in contact for solving together
+problems particular to their tongue (in most languages, there are many
+difficulties peculiar to translating technical English). My Swedish
+contributor acknowledged these difficulties, and I'm well aware of them
+for French.
+
+ This is surely not a technical issue, but we should manage so the
+effort of locale contributors be maximally useful, despite the national
+team layer interface between contributors and maintainers.
+
+ The Translation Project needs some setup for coordinating language
+coordinators. Localizing evolving programs will surely become a
+permanent and continuous activity in the free software community, once
+well started. The setup should be minimally completed and tested
+before GNU `gettext' becomes an official reality. The e-mail address
+`coordinator@translationproject.org' has been set up for receiving
+offers from volunteers and general e-mail on these topics. This address
+reaches the Translation Project coordinator.
+
+* Menu:
+
+* Central Coordination:: Central Coordination
+* National Teams:: National Teams
+* Mailing Lists:: Mailing Lists
+
+
+File: gettext.info, Node: Central Coordination, Next: National Teams, Prev: Organization, Up: Organization
+
+12.4.1 Central Coordination
+---------------------------
+
+ I also think GNU will need sooner than it thinks, that someone set up
+a way to organize and coordinate these groups. Some kind of group of
+groups. My opinion is that it would be good that GNU delegates this
+task to a small group of collaborating volunteers, shortly. Perhaps in
+`gnu.announce' a list of this national committee's can be published.
+
+ My role as coordinator would simply be to refer to Ulrich any German
+speaking volunteer interested to localization of free software
+packages, and maybe helping national groups to initially organize,
+while maintaining national registries for until national groups are
+ready to take over. In fact, the coordinator should ease volunteers to
+get in contact with one another for creating national teams, which
+should then select one coordinator per language, or country
+(regionalized language). If well done, the coordination should be
+useful without being an overwhelming task, the time to put delegations
+in place.
+
+
+File: gettext.info, Node: National Teams, Next: Mailing Lists, Prev: Central Coordination, Up: Organization
+
+12.4.2 National Teams
+---------------------
+
+ I suggest we look for volunteer coordinators/editors for individual
+languages. These people will scan contributions of translation files
+for various programs, for their own languages, and will ensure high and
+uniform standards of diction.
+
+ From my current experience with other people in these days, those who
+provide localizations are very enthusiastic about the process, and are
+more interested in the localization process than in the program they
+localize, and want to do many programs, not just one. This seems to
+confirm that having a coordinator/editor for each language is a good
+idea.
+
+ We need to choose someone who is good at writing clear and concise
+prose in the language in question. That is hard--we can't check it
+ourselves. So we need to ask a few people to judge each others'
+writing and select the one who is best.
+
+ I announce my prerelease to a few dozen people, and you would not
+believe all the discussions it generated already. I shudder to think
+what will happen when this will be launched, for true, officially,
+world wide. Who am I to arbitrate between two Czekolsovak users
+contradicting each other, for example?
+
+ I assume that your German is not much better than my French so that
+I would not be able to judge about these formulations. What I would
+suggest is that for each language there is a group for people who
+maintain the PO files and judge about changes. I suspect there will be
+cultural differences between how such groups of people will behave.
+Some will have relaxed ways, reach consensus easily, and have anyone of
+the group relate to the maintainers, while others will fight to death,
+organize heavy administrations up to national standards, and use strict
+channels.
+
+ The German team is putting out a good example. Right now, they are
+maybe half a dozen people revising translations of each other and
+discussing the linguistic issues. I do not even have all the names.
+Ulrich Drepper is taking care of coordinating the German team. He
+subscribed to all my pretest lists, so I do not even have to warn him
+specifically of incoming releases.
+
+ I'm sure, that is a good idea to get teams for each language working
+on translations. That will make the translations better and more
+consistent.
+
+* Menu:
+
+* Sub-Cultures:: Sub-Cultures
+* Organizational Ideas:: Organizational Ideas
+
+
+File: gettext.info, Node: Sub-Cultures, Next: Organizational Ideas, Prev: National Teams, Up: National Teams
+
+12.4.2.1 Sub-Cultures
+.....................
+
+ Taking French for example, there are a few sub-cultures around
+computers which developed diverging vocabularies. Picking volunteers
+here and there without addressing this problem in an organized way,
+soon in the project, might produce a distasteful mix of
+internationalized programs, and possibly trigger endless quarrels among
+those who really care.
+
+ Keeping some kind of unity in the way French localization of
+internationalized programs is achieved is a difficult (and delicate)
+job. Knowing the latin character of French people (:-), if we take this
+the wrong way, we could end up nowhere, or spoil a lot of energies.
+Maybe we should begin to address this problem seriously _before_ GNU
+`gettext' become officially published. And I suspect that this means
+soon!
+
+
+File: gettext.info, Node: Organizational Ideas, Prev: Sub-Cultures, Up: National Teams
+
+12.4.2.2 Organizational Ideas
+.............................
+
+ I expect the next big changes after the official release. Please
+note that I use the German translation of the short GPL message. We
+need to set a few good examples before the localization goes out for
+true in the free software community. Here are a few points to discuss:
+
+ * Each group should have one FTP server (at least one master).
+
+ * The files on the server should reflect the latest version (of
+ course!) and it should also contain a RCS directory with the
+ corresponding archives (I don't have this now).
+
+ * There should also be a ChangeLog file (this is more useful than the
+ RCS archive but can be generated automatically from the later by
+ Emacs).
+
+ * A "core group" should judge about questionable changes (for now
+ this group consists solely by me but I ask some others
+ occasionally; this also seems to work).
+
+
+
+File: gettext.info, Node: Mailing Lists, Prev: National Teams, Up: Organization
+
+12.4.3 Mailing Lists
+--------------------
+
+ If we get any inquiries about GNU `gettext', send them on to:
+
+ `coordinator@translationproject.org'
+
+ The `*-pretest' lists are quite useful to me, maybe the idea could
+be generalized to many GNU, and non-GNU packages. But each maintainer
+his/her way!
+
+ François, we have a mechanism in place here at `gnu.ai.mit.edu' to
+track teams, support mailing lists for them and log members. We have a
+slight preference that you use it. If this is OK with you, I can get
+you clued in.
+
+ Things are changing! A few years ago, when Daniel Fekete and I
+asked for a mailing list for GNU localization, nested at the FSF, we
+were politely invited to organize it anywhere else, and so did we. For
+communicating with my pretesters, I later made a handful of mailing
+lists located at iro.umontreal.ca and administrated by `majordomo'.
+These lists have been _very_ dependable so far...
+
+ I suspect that the German team will organize itself a mailing list
+located in Germany, and so forth for other countries. But before they
+organize for true, it could surely be useful to offer mailing lists
+located at the FSF to each national team. So yes, please explain me
+how I should proceed to create and handle them.
+
+ We should create temporary mailing lists, one per country, to help
+people organize. Temporary, because once regrouped and structured, it
+would be fair the volunteers from country bring back _their_ list in
+there and manage it as they want. My feeling is that, in the long run,
+each team should run its own list, from within their country. There
+also should be some central list to which all teams could subscribe as
+they see fit, as long as each team is represented in it.
+
+
+File: gettext.info, Node: Information Flow, Next: Translating plural forms, Prev: Organization, Up: Translators
+
+12.5 Information Flow
+=====================
+
+ * NOTE: * This documentation section is outdated and needs to be
+revised.
+
+ There will surely be some discussion about this messages after the
+packages are finally released. If people now send you some proposals
+for better messages, how do you proceed? Jim, please note that right
+now, as I put forward nearly a dozen of localizable programs, I receive
+both the translations and the coordination concerns about them.
+
+ If I put one of my things to pretest, Ulrich receives the
+announcement and passes it on to the German team, who make last minute
+revisions. Then he submits the translation files to me _as the
+maintainer_. For free packages I do not maintain, I would not even
+hear about it. This scheme could be made to work for the whole
+Translation Project, I think. For security reasons, maybe Ulrich
+(national coordinators, in fact) should update central registry kept at
+the Translation Project (Jim, me, or Len's recruits) once in a while.
+
+ In December/January, I was aggressively ready to internationalize
+all of GNU, giving myself the duty of one small GNU package per week or
+so, taking many weeks or months for bigger packages. But it does not
+work this way. I first did all the things I'm responsible for. I've
+nothing against some missionary work on other maintainers, but I'm also
+loosing a lot of energy over it--same debates over again.
+
+ And when the first localized packages are released we'll get a lot of
+responses about ugly translations :-). Surely, and we need to have
+beforehand a fairly good idea about how to handle the information flow
+between the national teams and the package maintainers.
+
+ Please start saving somewhere a quick history of each PO file. I
+know for sure that the file format will change, allowing for comments.
+It would be nice that each file has a kind of log, and references for
+those who want to submit comments or gripes, or otherwise contribute.
+I sent a proposal for a fast and flexible format, but it is not
+receiving acceptance yet by the GNU deciders. I'll tell you when I
+have more information about this.
+
+
+File: gettext.info, Node: Translating plural forms, Next: Prioritizing messages, Prev: Information Flow, Up: Translators
+
+12.6 Translating plural forms
+=============================
+
+ Suppose you are translating a PO file, and it contains an entry like
+this:
+
+ #, c-format
+ msgid "One file removed"
+ msgid_plural "%d files removed"
+ msgstr[0] ""
+ msgstr[1] ""
+
+What does this mean? How do you fill it in?
+
+ Such an entry denotes a message with plural forms, that is, a
+message where the text depends on a cardinal number. The general form
+of the message, in English, is the `msgid_plural' line. The `msgid'
+line is the English singular form, that is, the form for when the
+number is equal to 1. More details about plural forms are explained in
+*note Plural forms::.
+
+ The first thing you need to look at is the `Plural-Forms' line in the
+header entry of the PO file. It contains the number of plural forms
+and a formula. If the PO file does not yet have such a line, you have
+to add it. It only depends on the language into which you are
+translating. You can get this info by using the `msginit' command (see
+*note Creating::) - it contains a database of known plural formulas -
+or by asking other members of your translation team.
+
+ Suppose the line looks as follows:
+
+ "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+ It's logically one line; recall that the PO file formatting is
+allowed to break long lines so that each physical line fits in 80
+monospaced columns.
+
+ The value of `nplurals' here tells you that there are three plural
+forms. The first thing you need to do is to ensure that the entry
+contains an `msgstr' line for each of the forms:
+
+ #, c-format
+ msgid "One file removed"
+ msgid_plural "%d files removed"
+ msgstr[0] ""
+ msgstr[1] ""
+ msgstr[2] ""
+
+ Then translate the `msgid_plural' line and fill it in into each
+`msgstr' line:
+
+ #, c-format
+ msgid "One file removed"
+ msgid_plural "%d files removed"
+ msgstr[0] "%d slika uklonjenih"
+ msgstr[1] "%d slika uklonjenih"
+ msgstr[2] "%d slika uklonjenih"
+
+ Now you can refine the translation so that it matches the plural
+form. According to the formula above, `msgstr[0]' is used when the
+number ends in 1 but does not end in 11; `msgstr[1]' is used when the
+number ends in 2, 3, 4, but not in 12, 13, 14; and `msgstr[2]' is used
+in all other cases. With this knowledge, you can refine the
+translations:
+
+ #, c-format
+ msgid "One file removed"
+ msgid_plural "%d files removed"
+ msgstr[0] "%d slika je uklonjena"
+ msgstr[1] "%d datoteke uklonjenih"
+ msgstr[2] "%d slika uklonjenih"
+
+ You noticed that in the English singular form (`msgid') the number
+placeholder could be omitted and replaced by the numeral word "one".
+Can you do this in your translation as well?
+
+ msgstr[0] "jednom datotekom je uklonjen"
+
+Well, it depends on whether `msgstr[0]' applies only to the number 1,
+or to other numbers as well. If, according to the plural formula,
+`msgstr[0]' applies only to `n == 1', then you can use the specialized
+translation without the number placeholder. In our case, however,
+`msgstr[0]' also applies to the numbers 21, 31, 41, etc., and therefore
+you cannot omit the placeholder.
+
+
+File: gettext.info, Node: Prioritizing messages, Prev: Translating plural forms, Up: Translators
+
+12.7 Prioritizing messages: How to determine which messages to translate first
+==============================================================================
+
+ A translator sometimes has only a limited amount of time per week to
+spend on a package, and some packages have quite large message catalogs
+(over 1000 messages). Therefore she wishes to translate the messages
+first that are the most visible to the user, or that occur most
+frequently. This section describes how to determine these "most
+urgent" messages. It also applies to determine the "next most urgent"
+messages after the message catalog has already been partially
+translated.
+
+ In a first step, she uses the programs like a user would do. While
+she does this, the GNU `gettext' library logs into a file the not yet
+translated messages for which a translation was requested from the
+program.
+
+ In a second step, she uses the PO mode to translate precisely this
+set of messages.
+
+ Here a more details. The GNU `libintl' library (but not the
+corresponding functions in GNU `libc') supports an environment variable
+`GETTEXT_LOG_UNTRANSLATED'. The GNU `libintl' library will log into
+this file the messages for which `gettext()' and related functions
+couldn't find the translation. If the file doesn't exist, it will be
+created as needed. On systems with GNU `libc' a shared library
+`preloadable_libintl.so' is provided that can be used with the ELF
+`LD_PRELOAD' mechanism.
+
+ So, in the first step, the translator uses these commands on systems
+with GNU `libc':
+
+ $ LD_PRELOAD=/usr/local/lib/preloadable_libintl.so
+ $ export LD_PRELOAD
+ $ GETTEXT_LOG_UNTRANSLATED=$HOME/gettextlogused
+ $ export GETTEXT_LOG_UNTRANSLATED
+
+and these commands on other systems:
+
+ $ GETTEXT_LOG_UNTRANSLATED=$HOME/gettextlogused
+ $ export GETTEXT_LOG_UNTRANSLATED
+
+ Then she uses and peruses the programs. (It is a good and
+recommended practice to use the programs for which you provide
+translations: it gives you the needed context.) When done, she removes
+the environment variables:
+
+ $ unset LD_PRELOAD
+ $ unset GETTEXT_LOG_UNTRANSLATED
+
+ The second step starts with removing duplicates:
+
+ $ msguniq $HOME/gettextlogused > missing.po
+
+ The result is a PO file, but needs some preprocessing before a PO
+file editor can be used with it. First, it is a multi-domain PO file,
+containing messages from many translation domains. Second, it lacks
+all translator comments and source references. Here is how to get a
+list of the affected translation domains:
+
+ $ sed -n -e 's,^domain "\(.*\)"$,\1,p' < missing.po | sort | uniq
+
+ Then the translator can handle the domains one by one. For
+simplicity, let's use environment variables to denote the language,
+domain and source package.
+
+ $ lang=nl # your language
+ $ domain=coreutils # the name of the domain to be handled
+ $ package=/usr/src/gnu/coreutils-4.5.4 # the package where it comes from
+
+ She takes the latest copy of `$lang.po' from the Translation Project,
+or from the package (in most cases, `$package/po/$lang.po'), or creates
+a fresh one if she's the first translator (see *note Creating::). She
+then uses the following commands to mark the not urgent messages as
+"obsolete". (This doesn't mean that these messages - translated and
+untranslated ones - will go away. It simply means that the PO file
+editor will ignore them in the following editing session.)
+
+ $ msggrep --domain=$domain missing.po | grep -v '^domain' \
+ > $domain-missing.po
+ $ msgattrib --set-obsolete --ignore-file $domain-missing.po $domain.$lang.po \
+ > $domain.$lang-urgent.po
+
+ The she translates `$domain.$lang-urgent.po' by use of a PO file
+editor (*note Editing::). (FIXME: I don't know whether `KBabel' and
+`gtranslator' also preserve obsolete messages, as they should.)
+Finally she restores the not urgent messages (with their earlier
+translations, for those which were already translated) through this
+command:
+
+ $ msgmerge --no-fuzzy-matching $domain.$lang-urgent.po $package/po/$domain.pot \
+ > $domain.$lang.po
+
+ Then she can submit `$domain.$lang.po' and proceed to the next
+domain.
+
+
+File: gettext.info, Node: Maintainers, Next: Installers, Prev: Translators, Up: Top
+
+13 The Maintainer's View
+************************
+
+ The maintainer of a package has many responsibilities. One of them
+is ensuring that the package will install easily on many platforms, and
+that the magic we described earlier (*note Users::) will work for
+installers and end users.
+
+ Of course, there are many possible ways by which GNU `gettext' might
+be integrated in a distribution, and this chapter does not cover them
+in all generality. Instead, it details one possible approach which is
+especially adequate for many free software distributions following GNU
+standards, or even better, Gnits standards, because GNU `gettext' is
+purposely for helping the internationalization of the whole GNU
+project, and as many other good free packages as possible. So, the
+maintainer's view presented here presumes that the package already has
+a `configure.ac' file and uses GNU Autoconf.
+
+ Nevertheless, GNU `gettext' may surely be useful for free packages
+not following GNU standards and conventions, but the maintainers of such
+packages might have to show imagination and initiative in organizing
+their distributions so `gettext' work for them in all situations.
+There are surely many, out there.
+
+ Even if `gettext' methods are now stabilizing, slight adjustments
+might be needed between successive `gettext' versions, so you should
+ideally revise this chapter in subsequent releases, looking for changes.
+
+* Menu:
+
+* Flat and Non-Flat:: Flat or Non-Flat Directory Structures
+* Prerequisites:: Prerequisite Works
+* gettextize Invocation:: Invoking the `gettextize' Program
+* Adjusting Files:: Files You Must Create or Alter
+* autoconf macros:: Autoconf macros for use in `configure.ac'
+* CVS Issues:: Integrating with CVS
+* Release Management:: Creating a Distribution Tarball
+
+
+File: gettext.info, Node: Flat and Non-Flat, Next: Prerequisites, Prev: Maintainers, Up: Maintainers
+
+13.1 Flat or Non-Flat Directory Structures
+==========================================
+
+ Some free software packages are distributed as `tar' files which
+unpack in a single directory, these are said to be "flat" distributions.
+Other free software packages have a one level hierarchy of
+subdirectories, using for example a subdirectory named `doc/' for the
+Texinfo manual and man pages, another called `lib/' for holding
+functions meant to replace or complement C libraries, and a
+subdirectory `src/' for holding the proper sources for the package.
+These other distributions are said to be "non-flat".
+
+ We cannot say much about flat distributions. A flat directory
+structure has the disadvantage of increasing the difficulty of updating
+to a new version of GNU `gettext'. Also, if you have many PO files,
+this could somewhat pollute your single directory. Also, GNU
+`gettext''s libintl sources consist of C sources, shell scripts, `sed'
+scripts and complicated Makefile rules, which don't fit well into an
+existing flat structure. For these reasons, we recommend to use
+non-flat approach in this case as well.
+
+ Maybe because GNU `gettext' itself has a non-flat structure, we have
+more experience with this approach, and this is what will be described
+in the remaining of this chapter. Some maintainers might use this as
+an opportunity to unflatten their package structure.
+
+
+File: gettext.info, Node: Prerequisites, Next: gettextize Invocation, Prev: Flat and Non-Flat, Up: Maintainers
+
+13.2 Prerequisite Works
+=======================
+
+ There are some works which are required for using GNU `gettext' in
+one of your package. These works have some kind of generality that
+escape the point by point descriptions used in the remainder of this
+chapter. So, we describe them here.
+
+ * Before attempting to use `gettextize' you should install some
+ other packages first. Ensure that recent versions of GNU `m4',
+ GNU Autoconf and GNU `gettext' are already installed at your site,
+ and if not, proceed to do this first. If you get to install these
+ things, beware that GNU `m4' must be fully installed before GNU
+ Autoconf is even _configured_.
+
+ To further ease the task of a package maintainer the `automake'
+ package was designed and implemented. GNU `gettext' now uses this
+ tool and the `Makefile's in the `intl/' and `po/' therefore know
+ about all the goals necessary for using `automake' and `libintl'
+ in one project.
+
+ Those four packages are only needed by you, as a maintainer; the
+ installers of your own package and end users do not really need
+ any of GNU `m4', GNU Autoconf, GNU `gettext', or GNU `automake'
+ for successfully installing and running your package, with messages
+ properly translated. But this is not completely true if you
+ provide internationalized shell scripts within your own package:
+ GNU `gettext' shall then be installed at the user site if the end
+ users want to see the translation of shell script messages.
+
+ * Your package should use Autoconf and have a `configure.ac' or
+ `configure.in' file. If it does not, you have to learn how. The
+ Autoconf documentation is quite well written, it is a good idea
+ that you print it and get familiar with it.
+
+ * Your C sources should have already been modified according to
+ instructions given earlier in this manual. *Note Sources::.
+
+ * Your `po/' directory should receive all PO files submitted to you
+ by the translator teams, each having `LL.po' as a name. This is
+ not usually easy to get translation work done before your package
+ gets internationalized and available! Since the cycle has to
+ start somewhere, the easiest for the maintainer is to start with
+ absolutely no PO files, and wait until various translator teams
+ get interested in your package, and submit PO files.
+
+
+ It is worth adding here a few words about how the maintainer should
+ideally behave with PO files submissions. As a maintainer, your role is
+to authenticate the origin of the submission as being the representative
+of the appropriate translating teams of the Translation Project (forward
+the submission to `coordinator@translationproject.org' in case of
+doubt), to ensure that the PO file format is not severely broken and
+does not prevent successful installation, and for the rest, to merely
+put these PO files in `po/' for distribution.
+
+ As a maintainer, you do not have to take on your shoulders the
+responsibility of checking if the translations are adequate or
+complete, and should avoid diving into linguistic matters. Translation
+teams drive themselves and are fully responsible of their linguistic
+choices for the Translation Project. Keep in mind that translator
+teams are _not_ driven by maintainers. You can help by carefully
+redirecting all communications and reports from users about linguistic
+matters to the appropriate translation team, or explain users how to
+reach or join their team. The simplest might be to send them the
+`ABOUT-NLS' file.
+
+ Maintainers should _never ever_ apply PO file bug reports
+themselves, short-cutting translation teams. If some translator has
+difficulty to get some of her points through her team, it should not be
+an option for her to directly negotiate translations with maintainers.
+Teams ought to settle their problems themselves, if any. If you, as a
+maintainer, ever think there is a real problem with a team, please
+never try to _solve_ a team's problem on your own.
+
+
+File: gettext.info, Node: gettextize Invocation, Next: Adjusting Files, Prev: Prerequisites, Up: Maintainers
+
+13.3 Invoking the `gettextize' Program
+======================================
+
+ The `gettextize' program is an interactive tool that helps the
+maintainer of a package internationalized through GNU `gettext'. It is
+used for two purposes:
+
+ * As a wizard, when a package is modified to use GNU `gettext' for
+ the first time.
+
+ * As a migration tool, for upgrading the GNU `gettext' support in a
+ package from a previous to a newer version of GNU `gettext'.
+
+ This program performs the following tasks:
+
+ * It copies into the package some files that are consistently and
+ identically needed in every package internationalized through GNU
+ `gettext'.
+
+ * It performs as many of the tasks mentioned in the next section
+ *note Adjusting Files:: as can be performed automatically.
+
+ * It removes obsolete files and idioms used for previous GNU
+ `gettext' versions to the form recommended for the current GNU
+ `gettext' version.
+
+ * It prints a summary of the tasks that ought to be done manually
+ and could not be done automatically by `gettextize'.
+
+ It can be invoked as follows:
+
+ gettextize [ OPTION... ] [ DIRECTORY ]
+
+and accepts the following options:
+
+`-f'
+`--force'
+ Force replacement of files which already exist.
+
+`--intl'
+ Install the libintl sources in a subdirectory named `intl/'. This
+ libintl will be used to provide internationalization on systems
+ that don't have GNU libintl installed. If this option is omitted,
+ the call to `AM_GNU_GETTEXT' in `configure.ac' should read:
+ `AM_GNU_GETTEXT([external])', and internationalization will not be
+ enabled on systems lacking GNU gettext.
+
+`--po-dir=DIR'
+ Specify a directory containing PO files. Such a directory
+ contains the translations into various languages of a particular
+ POT file. This option can be specified multiple times, once for
+ each translation domain. If it is not specified, the directory
+ named `po/' is updated.
+
+`--no-changelog'
+ Don't update or create ChangeLog files. By default, `gettextize'
+ logs all changes (file additions, modifications and removals) in a
+ file called `ChangeLog' in each affected directory.
+
+`--symlink'
+ Make symbolic links instead of copying the needed files. This can
+ be useful to save a few kilobytes of disk space, but it requires
+ extra effort to create self-contained tarballs, it may disturb
+ some mechanism the maintainer applies to the sources, and it is
+ likely to introduce bugs when a newer version of `gettext' is
+ installed on the system.
+
+`-n'
+`--dry-run'
+ Print modifications but don't perform them. All actions that
+ `gettextize' would normally execute are inhibited and instead only
+ listed on standard output.
+
+`--help'
+ Display this help and exit.
+
+`--version'
+ Output version information and exit.
+
+
+ If DIRECTORY is given, this is the top level directory of a package
+to prepare for using GNU `gettext'. If not given, it is assumed that
+the current directory is the top level directory of such a package.
+
+ The program `gettextize' provides the following files. However, no
+existing file will be replaced unless the option `--force' (`-f') is
+specified.
+
+ 1. The `ABOUT-NLS' file is copied in the main directory of your
+ package, the one being at the top level. This file gives the main
+ indications about how to install and use the Native Language
+ Support features of your program. You might elect to use a more
+ recent copy of this `ABOUT-NLS' file than the one provided through
+ `gettextize', if you have one handy. You may also fetch a more
+ recent copy of file `ABOUT-NLS' from Translation Project sites,
+ and from most GNU archive sites.
+
+ 2. A `po/' directory is created for eventually holding all
+ translation files, but initially only containing the file
+ `po/Makefile.in.in' from the GNU `gettext' distribution (beware
+ the double `.in' in the file name) and a few auxiliary files. If
+ the `po/' directory already exists, it will be preserved along
+ with the files it contains, and only `Makefile.in.in' and the
+ auxiliary files will be overwritten.
+
+ If `--po-dir' has been specified, this holds for every directory
+ specified through `--po-dir', instead of `po/'.
+
+ 3. Only if `--intl' has been specified: A `intl/' directory is
+ created and filled with most of the files originally in the
+ `intl/' directory of the GNU `gettext' distribution. Also, if
+ option `--force' (`-f') is given, the `intl/' directory is emptied
+ first.
+
+ 4. The file `config.rpath' is copied into the directory containing
+ configuration support files. It is needed by the `AM_GNU_GETTEXT'
+ autoconf macro.
+
+ 5. Only if the project is using GNU `automake': A set of `autoconf'
+ macro files is copied into the package's `autoconf' macro
+ repository, usually in a directory called `m4/'.
+
+ If your site support symbolic links, `gettextize' will not actually
+copy the files into your package, but establish symbolic links instead.
+This avoids duplicating the disk space needed in all packages. Merely
+using the `-h' option while creating the `tar' archive of your
+distribution will resolve each link by an actual copy in the
+distribution archive. So, to insist, you really should use `-h' option
+with `tar' within your `dist' goal of your main `Makefile.in'.
+
+ Furthermore, `gettextize' will update all `Makefile.am' files in
+each affected directory, as well as the top level `configure.ac' or
+`configure.in' file.
+
+ It is interesting to understand that most new files for supporting
+GNU `gettext' facilities in one package go in `intl/', `po/' and `m4/'
+subdirectories. One distinction between `intl/' and the two other
+directories is that `intl/' is meant to be completely identical in all
+packages using GNU `gettext', while the other directories will mostly
+contain package dependent files.
+
+ The `gettextize' program makes backup files for all files it
+replaces or changes, and also write ChangeLog entries about these
+changes. This way, the careful maintainer can check after running
+`gettextize' whether its changes are acceptable to him, and possibly
+adjust them. An exception to this rule is the `intl/' directory, which
+is added or replaced or removed as a whole.
+
+ It is important to understand that `gettextize' can not do the
+entire job of adapting a package for using GNU `gettext'. The amount
+of remaining work depends on whether the package uses GNU `automake' or
+not. But in any case, the maintainer should still read the section
+*note Adjusting Files:: after invoking `gettextize'.
+
+ In particular, if after using `gettexize', you get an error
+`AC_COMPILE_IFELSE was called before AC_GNU_SOURCE' or `AC_RUN_IFELSE
+was called before AC_GNU_SOURCE', you can fix it by modifying
+`configure.ac', as described in *note configure.ac::.
+
+ It is also important to understand that `gettextize' is not part of
+the GNU build system, in the sense that it should not be invoked
+automatically, and not be invoked by someone who doesn't assume the
+responsibilities of a package maintainer. For the latter purpose, a
+separate tool is provided, see *note autopoint Invocation::.
+
+
+File: gettext.info, Node: Adjusting Files, Next: autoconf macros, Prev: gettextize Invocation, Up: Maintainers
+
+13.4 Files You Must Create or Alter
+===================================
+
+ Besides files which are automatically added through `gettextize',
+there are many files needing revision for properly interacting with GNU
+`gettext'. If you are closely following GNU standards for Makefile
+engineering and auto-configuration, the adaptations should be easier to
+achieve. Here is a point by point description of the changes needed in
+each.
+
+ So, here comes a list of files, each one followed by a description of
+all alterations it needs. Many examples are taken out from the GNU
+`gettext' 0.18.1 distribution itself, or from the GNU `hello'
+distribution (`http://www.franken.de/users/gnu/ke/hello' or
+`http://www.gnu.franken.de/ke/hello/') You may indeed refer to the
+source code of the GNU `gettext' and GNU `hello' packages, as they are
+intended to be good examples for using GNU gettext functionality.
+
+* Menu:
+
+* po/POTFILES.in:: `POTFILES.in' in `po/'
+* po/LINGUAS:: `LINGUAS' in `po/'
+* po/Makevars:: `Makevars' in `po/'
+* po/Rules-*:: Extending `Makefile' in `po/'
+* configure.ac:: `configure.ac' at top level
+* config.guess:: `config.guess', `config.sub' at top level
+* mkinstalldirs:: `mkinstalldirs' at top level
+* aclocal:: `aclocal.m4' at top level
+* acconfig:: `acconfig.h' at top level
+* config.h.in:: `config.h.in' at top level
+* Makefile:: `Makefile.in' at top level
+* src/Makefile:: `Makefile.in' in `src/'
+* lib/gettext.h:: `gettext.h' in `lib/'
+
+
+File: gettext.info, Node: po/POTFILES.in, Next: po/LINGUAS, Prev: Adjusting Files, Up: Adjusting Files
+
+13.4.1 `POTFILES.in' in `po/'
+-----------------------------
+
+ The `po/' directory should receive a file named `POTFILES.in'. This
+file tells which files, among all program sources, have marked strings
+needing translation. Here is an example of such a file:
+
+ # List of source files containing translatable strings.
+ # Copyright (C) 1995 Free Software Foundation, Inc.
+
+ # Common library files
+ lib/error.c
+ lib/getopt.c
+ lib/xmalloc.c
+
+ # Package source files
+ src/gettext.c
+ src/msgfmt.c
+ src/xgettext.c
+
+Hash-marked comments and white lines are ignored. All other lines list
+those source files containing strings marked for translation (*note
+Mark Keywords::), in a notation relative to the top level of your whole
+distribution, rather than the location of the `POTFILES.in' file itself.
+
+ When a C file is automatically generated by a tool, like `flex' or
+`bison', that doesn't introduce translatable strings by itself, it is
+recommended to list in `po/POTFILES.in' the real source file (ending in
+`.l' in the case of `flex', or in `.y' in the case of `bison'), not the
+generated C file.
+
+
+File: gettext.info, Node: po/LINGUAS, Next: po/Makevars, Prev: po/POTFILES.in, Up: Adjusting Files
+
+13.4.2 `LINGUAS' in `po/'
+-------------------------
+
+ The `po/' directory should also receive a file named `LINGUAS'.
+This file contains the list of available translations. It is a
+whitespace separated list. Hash-marked comments and white lines are
+ignored. Here is an example file:
+
+ # Set of available languages.
+ de fr
+
+This example means that German and French PO files are available, so
+that these languages are currently supported by your package. If you
+want to further restrict, at installation time, the set of installed
+languages, this should not be done by modifying the `LINGUAS' file, but
+rather by using the `LINGUAS' environment variable (*note Installers::).
+
+ It is recommended that you add the "languages" `en@quot' and
+`en@boldquot' to the `LINGUAS' file. `en@quot' is a variant of English
+message catalogs (`en') which uses real quotation marks instead of the
+ugly looking asymmetric ASCII substitutes ``' and `''. `en@boldquot'
+is a variant of `en@quot' that additionally outputs quoted pieces of
+text in a bold font, when used in a terminal emulator which supports
+the VT100 escape sequences (such as `xterm' or the Linux console, but
+not Emacs in `M-x shell' mode).
+
+ These extra message catalogs `en@quot' and `en@boldquot' are
+constructed automatically, not by translators; to support them, you
+need the files `Rules-quot', `quot.sed', `boldquot.sed',
+`en@quot.header', `en@boldquot.header', `insert-header.sin' in the
+`po/' directory. You can copy them from GNU gettext's `po/' directory;
+they are also installed by running `gettextize'.
+
+
+File: gettext.info, Node: po/Makevars, Next: po/Rules-*, Prev: po/LINGUAS, Up: Adjusting Files
+
+13.4.3 `Makevars' in `po/'
+--------------------------
+
+ The `po/' directory also has a file named `Makevars'. It contains
+variables that are specific to your project. `po/Makevars' gets
+inserted into the `po/Makefile' when the latter is created. The
+variables thus take effect when the POT file is created or updated, and
+when the message catalogs get installed.
+
+ The first three variables can be left unmodified if your package has
+a single message domain and, accordingly, a single `po/' directory.
+Only packages which have multiple `po/' directories at different
+locations need to adjust the three first variables defined in
+`Makevars'.
+
+ As an alternative to the `XGETTEXT_OPTIONS' variables, it is also
+possible to specify `xgettext' options through the `AM_XGETTEXT_OPTION'
+autoconf macro. See *note AM_XGETTEXT_OPTION::.
+
+
+File: gettext.info, Node: po/Rules-*, Next: configure.ac, Prev: po/Makevars, Up: Adjusting Files
+
+13.4.4 Extending `Makefile' in `po/'
+------------------------------------
+
+ All files called `Rules-*' in the `po/' directory get appended to
+the `po/Makefile' when it is created. They present an opportunity to
+add rules for special PO files to the Makefile, without needing to mess
+with `po/Makefile.in.in'.
+
+ GNU gettext comes with a `Rules-quot' file, containing rules for
+building catalogs `en@quot.po' and `en@boldquot.po'. The effect of
+`en@quot.po' is that people who set their `LANGUAGE' environment
+variable to `en@quot' will get messages with proper looking symmetric
+Unicode quotation marks instead of abusing the ASCII grave accent and
+the ASCII apostrophe for indicating quotations. To enable this
+catalog, simply add `en@quot' to the `po/LINGUAS' file. The effect of
+`en@boldquot.po' is that people who set `LANGUAGE' to `en@boldquot'
+will get not only proper quotation marks, but also the quoted text will
+be shown in a bold font on terminals and consoles. This catalog is
+useful only for command-line programs, not GUI programs. To enable it,
+similarly add `en@boldquot' to the `po/LINGUAS' file.
+
+ Similarly, you can create rules for building message catalogs for the
+`sr@latin' locale - Serbian written with the Latin alphabet - from
+those for the `sr' locale - Serbian written with Cyrillic letters. See
+*note msgfilter Invocation::.
+
+
+File: gettext.info, Node: configure.ac, Next: config.guess, Prev: po/Rules-*, Up: Adjusting Files
+
+13.4.5 `configure.ac' at top level
+----------------------------------
+
+ `configure.ac' or `configure.in' - this is the source from which
+`autoconf' generates the `configure' script.
+
+ 1. Declare the package and version.
+
+ This is done by a set of lines like these:
+
+ PACKAGE=gettext
+ VERSION=0.18.1
+ AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
+ AC_SUBST(PACKAGE)
+ AC_SUBST(VERSION)
+
+ or, if you are using GNU `automake', by a line like this:
+
+ AM_INIT_AUTOMAKE(gettext, 0.18.1)
+
+ Of course, you replace `gettext' with the name of your package,
+ and `0.18.1' by its version numbers, exactly as they should appear
+ in the packaged `tar' file name of your distribution
+ (`gettext-0.18.1.tar.gz', here).
+
+ 2. Check for internationalization support.
+
+ Here is the main `m4' macro for triggering internationalization
+ support. Just add this line to `configure.ac':
+
+ AM_GNU_GETTEXT
+
+ This call is purposely simple, even if it generates a lot of
+ configure time checking and actions.
+
+ If you have suppressed the `intl/' subdirectory by calling
+ `gettextize' without `--intl' option, this call should read
+
+ AM_GNU_GETTEXT([external])
+
+ 3. Have output files created.
+
+ The `AC_OUTPUT' directive, at the end of your `configure.ac' file,
+ needs to be modified in two ways:
+
+ AC_OUTPUT([EXISTING CONFIGURATION FILES intl/Makefile po/Makefile.in],
+ [EXISTING ADDITIONAL ACTIONS])
+
+ The modification to the first argument to `AC_OUTPUT' asks for
+ substitution in the `intl/' and `po/' directories. Note the `.in'
+ suffix used for `po/' only. This is because the distributed file
+ is really `po/Makefile.in.in'.
+
+ If you have suppressed the `intl/' subdirectory by calling
+ `gettextize' without `--intl' option, then you don't need to add
+ `intl/Makefile' to the `AC_OUTPUT' line.
+
+
+ If, after doing the recommended modifications, a command like
+`aclocal -I m4' or `autoconf' or `autoreconf' fails with a trace
+similar to this:
+
+ configure.ac:44: warning: AC_COMPILE_IFELSE was called before AC_GNU_SOURCE
+ ../../lib/autoconf/specific.m4:335: AC_GNU_SOURCE is expanded from...
+ m4/lock.m4:224: gl_LOCK is expanded from...
+ m4/gettext.m4:571: gt_INTL_SUBDIR_CORE is expanded from...
+ m4/gettext.m4:472: AM_INTL_SUBDIR is expanded from...
+ m4/gettext.m4:347: AM_GNU_GETTEXT is expanded from...
+ configure.ac:44: the top level
+ configure.ac:44: warning: AC_RUN_IFELSE was called before AC_GNU_SOURCE
+
+you need to add an explicit invocation of `AC_GNU_SOURCE' in the
+`configure.ac' file - after `AC_PROG_CC' but before `AM_GNU_GETTEXT',
+most likely very close to the `AC_PROG_CC' invocation. This is
+necessary because of ordering restrictions imposed by GNU autoconf.
+
+
+File: gettext.info, Node: config.guess, Next: mkinstalldirs, Prev: configure.ac, Up: Adjusting Files
+
+13.4.6 `config.guess', `config.sub' at top level
+------------------------------------------------
+
+ If you haven't suppressed the `intl/' subdirectory, you need to add
+the GNU `config.guess' and `config.sub' files to your distribution.
+They are needed because the `intl/' directory has platform dependent
+support for determining the locale's character encoding and therefore
+needs to identify the platform.
+
+ You can obtain the newest version of `config.guess' and `config.sub'
+from the CVS of the `config' project at `http://savannah.gnu.org/'. The
+commands to fetch them are
+ $ wget 'http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess'
+ $ wget 'http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub'
+ Less recent versions are also contained in the GNU `automake' and
+GNU `libtool' packages.
+
+ Normally, `config.guess' and `config.sub' are put at the top level
+of a distribution. But it is also possible to put them in a
+subdirectory, altogether with other configuration support files like
+`install-sh', `ltconfig', `ltmain.sh' or `missing'. All you need to
+do, other than moving the files, is to add the following line to your
+`configure.ac'.
+
+ AC_CONFIG_AUX_DIR([SUBDIR])
+
+
+File: gettext.info, Node: mkinstalldirs, Next: aclocal, Prev: config.guess, Up: Adjusting Files
+
+13.4.7 `mkinstalldirs' at top level
+-----------------------------------
+
+ With earlier versions of GNU gettext, you needed to add the GNU
+`mkinstalldirs' script to your distribution. This is not needed any
+more. You can remove it if you not also using an automake version
+older than automake 1.9.
+
+
+File: gettext.info, Node: aclocal, Next: acconfig, Prev: mkinstalldirs, Up: Adjusting Files
+
+13.4.8 `aclocal.m4' at top level
+--------------------------------
+
+ If you do not have an `aclocal.m4' file in your distribution, the
+simplest is to concatenate the files `codeset.m4', `fcntl-o.m4',
+`gettext.m4', `glibc2.m4', `glibc21.m4', `iconv.m4', `intdiv0.m4',
+`intl.m4', `intldir.m4', `intlmacosx.m4', `intmax.m4', `inttypes_h.m4',
+`inttypes-pri.m4', `lcmessage.m4', `lib-ld.m4', `lib-link.m4',
+`lib-prefix.m4', `lock.m4', `longlong.m4', `nls.m4', `po.m4',
+`printf-posix.m4', `progtest.m4', `size_max.m4', `stdint_h.m4',
+`threadlib.m4', `uintmax_t.m4', `visibility.m4', `wchar_t.m4',
+`wint_t.m4', `xsize.m4' from GNU `gettext''s `m4/' directory into a
+single file. If you have suppressed the `intl/' directory, only
+`gettext.m4', `iconv.m4', `lib-ld.m4', `lib-link.m4', `lib-prefix.m4',
+`nls.m4', `po.m4', `progtest.m4' need to be concatenated.
+
+ If you are not using GNU `automake' 1.8 or newer, you will need to
+add a file `mkdirp.m4' from a newer automake distribution to the list
+of files above.
+
+ If you already have an `aclocal.m4' file, then you will have to
+merge the said macro files into your `aclocal.m4'. Note that if you
+are upgrading from a previous release of GNU `gettext', you should most
+probably _replace_ the macros (`AM_GNU_GETTEXT', etc.), as they usually
+change a little from one release of GNU `gettext' to the next. Their
+contents may vary as we get more experience with strange systems out
+there.
+
+ If you are using GNU `automake' 1.5 or newer, it is enough to put
+these macro files into a subdirectory named `m4/' and add the line
+
+ ACLOCAL_AMFLAGS = -I m4
+
+to your top level `Makefile.am'.
+
+ These macros check for the internationalization support functions
+and related informations. Hopefully, once stabilized, these macros
+might be integrated in the standard Autoconf set, because this piece of
+`m4' code will be the same for all projects using GNU `gettext'.
+
+
+File: gettext.info, Node: acconfig, Next: config.h.in, Prev: aclocal, Up: Adjusting Files
+
+13.4.9 `acconfig.h' at top level
+--------------------------------
+
+ Earlier GNU `gettext' releases required to put definitions for
+`ENABLE_NLS', `HAVE_GETTEXT' and `HAVE_LC_MESSAGES', `HAVE_STPCPY',
+`PACKAGE' and `VERSION' into an `acconfig.h' file. This is not needed
+any more; you can remove them from your `acconfig.h' file unless your
+package uses them independently from the `intl/' directory.
+
+
+File: gettext.info, Node: config.h.in, Next: Makefile, Prev: acconfig, Up: Adjusting Files
+
+13.4.10 `config.h.in' at top level
+----------------------------------
+
+ The include file template that holds the C macros to be defined by
+`configure' is usually called `config.h.in' and may be maintained
+either manually or automatically.
+
+ If `gettextize' has created an `intl/' directory, this file must be
+called `config.h.in' and must be at the top level. If, however, you
+have suppressed the `intl/' directory by calling `gettextize' without
+`--intl' option, then you can choose the name of this file and its
+location freely.
+
+ If it is maintained automatically, by use of the `autoheader'
+program, you need to do nothing about it. This is the case in
+particular if you are using GNU `automake'.
+
+ If it is maintained manually, and if `gettextize' has created an
+`intl/' directory, you should switch to using `autoheader'. The list
+of C macros to be added for the sake of the `intl/' directory is just
+too long to be maintained manually; it also changes between different
+versions of GNU `gettext'.
+
+ If it is maintained manually, and if on the other hand you have
+suppressed the `intl/' directory by calling `gettextize' without
+`--intl' option, then you can get away by adding the following lines to
+`config.h.in':
+
+ /* Define to 1 if translation of program messages to the user's
+ native language is requested. */
+ #undef ENABLE_NLS
+
+
+File: gettext.info, Node: Makefile, Next: src/Makefile, Prev: config.h.in, Up: Adjusting Files
+
+13.4.11 `Makefile.in' at top level
+----------------------------------
+
+ Here are a few modifications you need to make to your main, top-level
+`Makefile.in' file.
+
+ 1. Add the following lines near the beginning of your `Makefile.in',
+ so the `dist:' goal will work properly (as explained further down):
+
+ PACKAGE = @PACKAGE@
+ VERSION = @VERSION@
+
+ 2. Add file `ABOUT-NLS' to the `DISTFILES' definition, so the file
+ gets distributed.
+
+ 3. Wherever you process subdirectories in your `Makefile.in', be sure
+ you also process the subdirectories `intl' and `po'. Special
+ rules in the `Makefiles' take care for the case where no
+ internationalization is wanted.
+
+ If you are using Makefiles, either generated by automake, or
+ hand-written so they carefully follow the GNU coding standards,
+ the effected goals for which the new subdirectories must be
+ handled include `installdirs', `install', `uninstall', `clean',
+ `distclean'.
+
+ Here is an example of a canonical order of processing. In this
+ example, we also define `SUBDIRS' in `Makefile.in' for it to be
+ further used in the `dist:' goal.
+
+ SUBDIRS = doc intl lib src po
+
+ Note that you must arrange for `make' to descend into the `intl'
+ directory before descending into other directories containing code
+ which make use of the `libintl.h' header file. For this reason,
+ here we mention `intl' before `lib' and `src'.
+
+ 4. A delicate point is the `dist:' goal, as both `intl/Makefile' and
+ `po/Makefile' will later assume that the proper directory has been
+ set up from the main `Makefile'. Here is an example at what the
+ `dist:' goal might look like:
+
+ distdir = $(PACKAGE)-$(VERSION)
+ dist: Makefile
+ rm -fr $(distdir)
+ mkdir $(distdir)
+ chmod 777 $(distdir)
+ for file in $(DISTFILES); do \
+ ln $$file $(distdir) 2>/dev/null || cp -p $$file $(distdir); \
+ done
+ for subdir in $(SUBDIRS); do \
+ mkdir $(distdir)/$$subdir || exit 1; \
+ chmod 777 $(distdir)/$$subdir; \
+ (cd $$subdir && $(MAKE) $@) || exit 1; \
+ done
+ tar chozf $(distdir).tar.gz $(distdir)
+ rm -fr $(distdir)
+
+
+ Note that if you are using GNU `automake', `Makefile.in' is
+automatically generated from `Makefile.am', and all needed changes to
+`Makefile.am' are already made by running `gettextize'.
+
+
+File: gettext.info, Node: src/Makefile, Next: lib/gettext.h, Prev: Makefile, Up: Adjusting Files
+
+13.4.12 `Makefile.in' in `src/'
+-------------------------------
+
+ Some of the modifications made in the main `Makefile.in' will also
+be needed in the `Makefile.in' from your package sources, which we
+assume here to be in the `src/' subdirectory. Here are all the
+modifications needed in `src/Makefile.in':
+
+ 1. In view of the `dist:' goal, you should have these lines near the
+ beginning of `src/Makefile.in':
+
+ PACKAGE = @PACKAGE@
+ VERSION = @VERSION@
+
+ 2. If not done already, you should guarantee that `top_srcdir' gets
+ defined. This will serve for `cpp' include files. Just add the
+ line:
+
+ top_srcdir = @top_srcdir@
+
+ 3. You might also want to define `subdir' as `src', later allowing
+ for almost uniform `dist:' goals in all your `Makefile.in'. At
+ list, the `dist:' goal below assume that you used:
+
+ subdir = src
+
+ 4. The `main' function of your program will normally call
+ `bindtextdomain' (see *note Triggering::), like this:
+
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+ To make LOCALEDIR known to the program, add the following lines to
+ `Makefile.in' if you are using Autoconf version 2.60 or newer:
+
+ datadir = @datadir@
+ datarootdir= @datarootdir@
+ localedir = @localedir@
+ DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
+
+ or these lines if your version of Autoconf is older than 2.60:
+
+ datadir = @datadir@
+ localedir = $(datadir)/locale
+ DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
+
+ Note that `@datadir@' defaults to `$(prefix)/share', thus
+ `$(localedir)' defaults to `$(prefix)/share/locale'.
+
+ 5. You should ensure that the final linking will use `@LIBINTL@' or
+ `@LTLIBINTL@' as a library. `@LIBINTL@' is for use without
+ `libtool', `@LTLIBINTL@' is for use with `libtool'. An easy way
+ to achieve this is to manage that it gets into `LIBS', like this:
+
+ LIBS = @LIBINTL@ @LIBS@
+
+ In most packages internationalized with GNU `gettext', one will
+ find a directory `lib/' in which a library containing some helper
+ functions will be build. (You need at least the few functions
+ which the GNU `gettext' Library itself needs.) However some of
+ the functions in the `lib/' also give messages to the user which
+ of course should be translated, too. Taking care of this, the
+ support library (say `libsupport.a') should be placed before
+ `@LIBINTL@' and `@LIBS@' in the above example. So one has to
+ write this:
+
+ LIBS = ../lib/libsupport.a @LIBINTL@ @LIBS@
+
+ 6. You should also ensure that directory `intl/' will be searched for
+ C preprocessor include files in all circumstances. So, you have to
+ manage so both `-I../intl' and `-I$(top_srcdir)/intl' will be
+ given to the C compiler.
+
+ 7. Your `dist:' goal has to conform with others. Here is a
+ reasonable definition for it:
+
+ distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+ dist: Makefile $(DISTFILES)
+ for file in $(DISTFILES); do \
+ ln $$file $(distdir) 2>/dev/null || cp -p $$file $(distdir) || exit 1; \
+ done
+
+
+ Note that if you are using GNU `automake', `Makefile.in' is
+automatically generated from `Makefile.am', and the first three changes
+and the last change are not necessary. The remaining needed
+`Makefile.am' modifications are the following:
+
+ 1. To make LOCALEDIR known to the program, add the following to
+ `Makefile.am':
+
+ <module>_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\"
+
+ for each specific module or compilation unit, or
+
+ AM_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\"
+
+ for all modules and compilation units together. Furthermore, if
+ you are using an Autoconf version older then 2.60, add this line
+ to define `localedir':
+
+ localedir = $(datadir)/locale
+
+ 2. To ensure that the final linking will use `@LIBINTL@' or
+ `@LTLIBINTL@' as a library, add the following to `Makefile.am':
+
+ <program>_LDADD = @LIBINTL@
+
+ for each specific program, or
+
+ LDADD = @LIBINTL@
+
+ for all programs together. Remember that when you use `libtool'
+ to link a program, you need to use @LTLIBINTL@ instead of @LIBINTL@
+ for that program.
+
+ 3. If you have an `intl/' directory, whose contents is created by
+ `gettextize', then to ensure that it will be searched for C
+ preprocessor include files in all circumstances, add something like
+ this to `Makefile.am':
+
+ AM_CPPFLAGS = -I../intl -I$(top_srcdir)/intl
+
+
+
+File: gettext.info, Node: lib/gettext.h, Prev: src/Makefile, Up: Adjusting Files
+
+13.4.13 `gettext.h' in `lib/'
+-----------------------------
+
+ Internationalization of packages, as provided by GNU `gettext', is
+optional. It can be turned off in two situations:
+
+ * When the installer has specified `./configure --disable-nls'. This
+ can be useful when small binaries are more important than
+ features, for example when building utilities for boot diskettes.
+ It can also be useful in order to get some specific C compiler
+ warnings about code quality with some older versions of GCC (older
+ than 3.0).
+
+ * When the package does not include the `intl/' subdirectory, and the
+ libintl.h header (with its associated libintl library, if any) is
+ not already installed on the system, it is preferable that the
+ package builds without internationalization support, rather than
+ to give a compilation error.
+
+ A C preprocessor macro can be used to detect these two cases.
+Usually, when `libintl.h' was found and not explicitly disabled, the
+`ENABLE_NLS' macro will be defined to 1 in the autoconf generated
+configuration file (usually called `config.h'). In the two negative
+situations, however, this macro will not be defined, thus it will
+evaluate to 0 in C preprocessor expressions.
+
+ `gettext.h' is a convenience header file for conditional use of
+`<libintl.h>', depending on the `ENABLE_NLS' macro. If `ENABLE_NLS' is
+set, it includes `<libintl.h>'; otherwise it defines no-op substitutes
+for the libintl.h functions. We recommend the use of `"gettext.h"'
+over direct use of `<libintl.h>', so that portability to older systems
+is guaranteed and installers can turn off internationalization if they
+want to. In the C code, you will then write
+
+ #include "gettext.h"
+
+instead of
+
+ #include <libintl.h>
+
+ The location of `gettext.h' is usually in a directory containing
+auxiliary include files. In many GNU packages, there is a directory
+`lib/' containing helper functions; `gettext.h' fits there. In other
+packages, it can go into the `src' directory.
+
+ Do not install the `gettext.h' file in public locations. Every
+package that needs it should contain a copy of it on its own.
+
+
+File: gettext.info, Node: autoconf macros, Next: CVS Issues, Prev: Adjusting Files, Up: Maintainers
+
+13.5 Autoconf macros for use in `configure.ac'
+==============================================
+
+ GNU `gettext' installs macros for use in a package's `configure.ac'
+or `configure.in'. *Note Introduction: (autoconf)Top. The primary
+macro is, of course, `AM_GNU_GETTEXT'.
+
+* Menu:
+
+* AM_GNU_GETTEXT:: AM_GNU_GETTEXT in `gettext.m4'
+* AM_GNU_GETTEXT_VERSION:: AM_GNU_GETTEXT_VERSION in `gettext.m4'
+* AM_GNU_GETTEXT_NEED:: AM_GNU_GETTEXT_NEED in `gettext.m4'
+* AM_GNU_GETTEXT_INTL_SUBDIR:: AM_GNU_GETTEXT_INTL_SUBDIR in `intldir.m4'
+* AM_PO_SUBDIRS:: AM_PO_SUBDIRS in `po.m4'
+* AM_XGETTEXT_OPTION:: AM_XGETTEXT_OPTION in `po.m4'
+* AM_ICONV:: AM_ICONV in `iconv.m4'
+
+
+File: gettext.info, Node: AM_GNU_GETTEXT, Next: AM_GNU_GETTEXT_VERSION, Prev: autoconf macros, Up: autoconf macros
+
+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) or in the package's
+`intl/' directory. 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], [INTLDIR])
+
+ INTLSYMBOL can be `external' or `no-libtool'. The default (if it is
+not specified or empty) is `no-libtool'. INTLSYMBOL should be
+`external' for packages with no `intl/' directory. For packages with
+an `intl/' directory, you can either use an INTLSYMBOL equal to
+`no-libtool', or you can use `external' and override by using the macro
+`AM_GNU_GETTEXT_INTL_SUBDIR' elsewhere. The two ways to specify the
+existence of an `intl/' directory are equivalent. At build time, a
+static library `$(top_builddir)/intl/libintl.a' will then be created.
+
+ 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'.
+
+ INTLDIR is used to find the intl libraries. If empty, the value
+`$(top_builddir)/intl/' is used.
+
+ 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.
+
+
+File: gettext.info, Node: AM_GNU_GETTEXT_VERSION, Next: AM_GNU_GETTEXT_NEED, Prev: AM_GNU_GETTEXT, Up: autoconf macros
+
+13.5.2 AM_GNU_GETTEXT_VERSION in `gettext.m4'
+---------------------------------------------
+
+ The `AM_GNU_GETTEXT_VERSION' macro declares the version number of
+the GNU gettext infrastructure that is used by the package.
+
+ The use of this macro is optional; only the `autopoint' program makes
+use of it (*note CVS Issues::).
+
+
+File: gettext.info, Node: AM_GNU_GETTEXT_NEED, Next: AM_GNU_GETTEXT_INTL_SUBDIR, Prev: AM_GNU_GETTEXT_VERSION, Up: autoconf macros
+
+13.5.3 AM_GNU_GETTEXT_NEED in `gettext.m4'
+------------------------------------------
+
+ The `AM_GNU_GETTEXT_NEED' macro declares a constraint regarding the
+GNU gettext implementation. The syntax is
+
+ AM_GNU_GETTEXT_NEED([NEEDSYMBOL])
+
+ If NEEDSYMBOL is `need-ngettext', then GNU gettext implementations
+(in libc or libintl) without the `ngettext()' function will be ignored.
+If NEEDSYMBOL is `need-formatstring-macros', then GNU gettext
+implementations that don't support the ISO C 99 `<inttypes.h>'
+formatstring macros will be ignored.
+
+ The optional second argument of `AM_GNU_GETTEXT' is also taken into
+account.
+
+ The `AM_GNU_GETTEXT_NEED' invocations can occur before or after the
+`AM_GNU_GETTEXT' invocation; the order doesn't matter.
+
+
+File: gettext.info, Node: AM_GNU_GETTEXT_INTL_SUBDIR, Next: AM_PO_SUBDIRS, Prev: AM_GNU_GETTEXT_NEED, Up: autoconf macros
+
+13.5.4 AM_GNU_GETTEXT_INTL_SUBDIR in `intldir.m4'
+-------------------------------------------------
+
+ The `AM_GNU_GETTEXT_INTL_SUBDIR' macro specifies that the
+`AM_GNU_GETTEXT' macro, although invoked with the first argument
+`external', should also prepare for building the `intl/' subdirectory.
+
+ The `AM_GNU_GETTEXT_INTL_SUBDIR' invocation can occur before or after
+the `AM_GNU_GETTEXT' invocation; the order doesn't matter.
+
+ The use of this macro requires GNU automake 1.10 or newer and GNU
+autoconf 2.61 or newer.
+
+
+File: gettext.info, Node: AM_PO_SUBDIRS, Next: AM_XGETTEXT_OPTION, Prev: AM_GNU_GETTEXT_INTL_SUBDIR, Up: autoconf macros
+
+13.5.5 AM_PO_SUBDIRS in `po.m4'
+-------------------------------
+
+ The `AM_PO_SUBDIRS' macro prepares the `po/' directories of the
+package for building. This macro should be used in internationalized
+programs written in other programming languages than C, C++, Objective
+C, for example `sh', `Python', `Lisp'. See *note Programming
+Languages:: for a list of programming languages that support
+localization through PO files.
+
+ The `AM_PO_SUBDIRS' macro determines whether internationalization
+should be used. If so, it sets the `USE_NLS' variable to `yes',
+otherwise to `no'. It also determines the right values for Makefile
+variables in each `po/' directory.
+
+
+File: gettext.info, Node: AM_XGETTEXT_OPTION, Next: AM_ICONV, Prev: AM_PO_SUBDIRS, Up: autoconf macros
+
+13.5.6 AM_XGETTEXT_OPTION in `po.m4'
+------------------------------------
+
+ The `AM_XGETTEXT_OPTION' macro registers a command-line option to be
+used in the invocations of `xgettext' in the `po/' directories of the
+package.
+
+ For example, if you have a source file that defines a function
+`error_at_line' whose fifth argument is a format string, you can use
+ AM_XGETTEXT_OPTION([--flag=error_at_line:5:c-format])
+ to instruct `xgettext' to mark all translatable strings in `gettext'
+invocations that occur as fifth argument to this function as `c-format'.
+
+ See *note xgettext Invocation:: for the list of options that
+`xgettext' accepts.
+
+ The use of this macro is an alternative to the use of the
+`XGETTEXT_OPTIONS' variable in `po/Makevars'.
+
+
+File: gettext.info, Node: AM_ICONV, Prev: AM_XGETTEXT_OPTION, Up: autoconf macros
+
+13.5.7 AM_ICONV in `iconv.m4'
+-----------------------------
+
+ The `AM_ICONV' macro tests for the presence of the POSIX/XSI `iconv'
+function family in either the C library or a separate `libiconv'
+library. If found, it sets the `am_cv_func_iconv' variable to `yes';
+it defines `HAVE_ICONV' to 1 in the autoconf generated configuration
+file (usually called `config.h'); it defines `ICONV_CONST' to `const'
+or to empty, depending on whether the second argument of `iconv()' is
+of type `const char **' or `char **'; it sets the variables `LIBICONV'
+and `LTLIBICONV' to the linker options for use in a Makefile
+(`LIBICONV' for use without libtool, `LTLIBICONV' for use with
+libtool); it adds an `-I' option to `CPPFLAGS' if necessary. If not
+found, it sets `LIBICONV' and `LTLIBICONV' to empty and doesn't change
+`CPPFLAGS'.
+
+ The complexities that `AM_ICONV' deals with are the following:
+
+ * Some operating systems have `iconv' in the C library, for example
+ glibc. Some have it in a separate library `libiconv', for example
+ OSF/1 or FreeBSD. Regardless of the operating system, GNU
+ `libiconv' might have been installed. In that case, it should be
+ used instead of the operating system's native `iconv'.
+
+ * GNU `libiconv', if installed, is not necessarily already in the
+ search path (`CPPFLAGS' for the include file search path,
+ `LDFLAGS' for the library search path).
+
+ * GNU `libiconv' is binary incompatible with some operating system's
+ native `iconv', for example on FreeBSD. Use of an `iconv.h' and
+ `libiconv.so' that don't fit together would produce program
+ crashes.
+
+ * GNU `libiconv', 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 `LIBICONV'
+ variable. This works on most systems, but not on some operating
+ systems with limited shared library support, like SCO.
+
+ `iconv.m4' is distributed with the GNU gettext package because
+`gettext.m4' relies on it.
+
+
+File: gettext.info, Node: CVS Issues, Next: Release Management, Prev: autoconf macros, Up: Maintainers
+
+13.6 Integrating with CVS
+=========================
+
+ Many projects use CVS for distributed development, version control
+and source backup. This section gives some advice how to manage the
+uses of `cvs', `gettextize', `autopoint' and `autoconf'.
+
+* Menu:
+
+* Distributed CVS:: Avoiding version mismatch in distributed development
+* Files under CVS:: Files to put under CVS version control
+* autopoint Invocation:: Invoking the `autopoint' Program
+
+
+File: gettext.info, Node: Distributed CVS, Next: Files under CVS, Prev: CVS Issues, Up: CVS Issues
+
+13.6.1 Avoiding version mismatch in distributed development
+-----------------------------------------------------------
+
+ In a project development with multiple developers, using CVS, there
+should be a single developer who occasionally - when there is desire to
+upgrade to a new `gettext' version - runs `gettextize' and performs the
+changes listed in *note Adjusting Files::, and then commits his changes
+to the CVS.
+
+ It is highly recommended that all developers on a project use the
+same version of GNU `gettext' in the package. In other words, if a
+developer runs `gettextize', he should go the whole way, make the
+necessary remaining changes and commit his changes to the CVS.
+Otherwise the following damages will likely occur:
+
+ * Apparent version mismatch between developers. Since some `gettext'
+ specific portions in `configure.ac', `configure.in' and
+ `Makefile.am', `Makefile.in' files depend on the `gettext'
+ version, the use of infrastructure files belonging to different
+ `gettext' versions can easily lead to build errors.
+
+ * Hidden version mismatch. Such version mismatch can also lead to
+ malfunctioning of the package, that may be undiscovered by the
+ developers. The worst case of hidden version mismatch is that
+ internationalization of the package doesn't work at all.
+
+ * Release risks. All developers implicitly perform constant testing
+ on a package. This is important in the days and weeks before a
+ release. If the guy who makes the release tar files uses a
+ different version of GNU `gettext' than the other developers, the
+ distribution will be less well tested than if all had been using
+ the same `gettext' version. For example, it is possible that a
+ platform specific bug goes undiscovered due to this constellation.
+
+
+File: gettext.info, Node: Files under CVS, Next: autopoint Invocation, Prev: Distributed CVS, Up: CVS Issues
+
+13.6.2 Files to put under CVS version control
+---------------------------------------------
+
+ There are basically three ways to deal with generated files in the
+context of a CVS repository, such as `configure' generated from
+`configure.ac', `PARSER.c' generated from `PARSER.y', or
+`po/Makefile.in.in' autoinstalled by `gettextize' or `autopoint'.
+
+ 1. All generated files are always committed into the repository.
+
+ 2. All generated files are committed into the repository occasionally,
+ for example each time a release is made.
+
+ 3. Generated files are never committed into the repository.
+
+ Each of these three approaches has different advantages and
+drawbacks.
+
+ 1. The advantage is that anyone can check out the CVS at any moment
+ and gets a working build. The drawbacks are: 1a. It requires
+ some frequent "cvs commit" actions by the maintainers. 1b. The
+ repository grows in size quite fast.
+
+ 2. The advantage is that anyone can check out the CVS, and the usual
+ "./configure; make" will work. The drawbacks are: 2a. The one who
+ checks out the repository needs tools like GNU `automake', GNU
+ `autoconf', GNU `m4' installed in his PATH; sometimes he even
+ needs particular versions of them. 2b. When a release is made and
+ a commit is made on the generated files, the other developers get
+ conflicts on the generated files after doing "cvs update".
+ Although these conflicts are easy to resolve, they are annoying.
+
+ 3. The advantage is less work for the maintainers. The drawback is
+ that anyone who checks out the CVS not only needs tools like GNU
+ `automake', GNU `autoconf', GNU `m4' installed in his PATH, but
+ also that he needs to perform a package specific pre-build step
+ before being able to "./configure; make".
+
+ For the first and second approach, all files modified or brought in
+by the occasional `gettextize' invocation and update should be
+committed into the CVS.
+
+ For the third approach, the maintainer can omit from the CVS
+repository all the files that `gettextize' mentions as "copy".
+Instead, he adds to the `configure.ac' or `configure.in' a line of the
+form
+
+ AM_GNU_GETTEXT_VERSION(0.18.1)
+
+and adds to the package's pre-build script an invocation of
+`autopoint'. For everyone who checks out the CVS, this `autopoint'
+invocation will copy into the right place the `gettext' infrastructure
+files that have been omitted from the CVS.
+
+ The version number used as argument to `AM_GNU_GETTEXT_VERSION' is
+the version of the `gettext' infrastructure that the package wants to
+use. It is also the minimum version number of the `autopoint' program.
+So, if you write `AM_GNU_GETTEXT_VERSION(0.11.5)' then the developers
+can have any version >= 0.11.5 installed; the package will work with
+the 0.11.5 infrastructure in all developers' builds. When the
+maintainer then runs gettextize from, say, version 0.12.1 on the
+package, the occurrence of `AM_GNU_GETTEXT_VERSION(0.11.5)' will be
+changed into `AM_GNU_GETTEXT_VERSION(0.12.1)', and all other developers
+that use the CVS will henceforth need to have GNU `gettext' 0.12.1 or
+newer installed.
+
+
+File: gettext.info, Node: autopoint Invocation, Prev: Files under CVS, Up: CVS Issues
+
+13.6.3 Invoking the `autopoint' Program
+---------------------------------------
+
+ autopoint [OPTION]...
+
+ The `autopoint' program copies standard gettext infrastructure files
+into a source package. It extracts from a macro call of the form
+`AM_GNU_GETTEXT_VERSION(VERSION)', found in the package's
+`configure.in' or `configure.ac' file, the gettext version used by the
+package, and copies the infrastructure files belonging to this version
+into the package.
+
+13.6.3.1 Options
+................
+
+`-f'
+`--force'
+ Force overwriting of files that already exist.
+
+`-n'
+`--dry-run'
+ Print modifications but don't perform them. All file copying
+ actions that `autopoint' would normally execute are inhibited and
+ instead only listed on standard output.
+
+
+13.6.3.2 Informative output
+...........................
+
+`--help'
+ Display this help and exit.
+
+`--version'
+ Output version information and exit.
+
+
+ `autopoint' supports the GNU `gettext' versions from 0.10.35 to the
+current one, 0.18.1. In order to apply `autopoint' to a package using
+a `gettext' version newer than 0.18.1, you need to install this same
+version of GNU `gettext' at least.
+
+ In packages using GNU `automake', an invocation of `autopoint'
+should be followed by invocations of `aclocal' and then `autoconf' and
+`autoheader'. The reason is that `autopoint' installs some autoconf
+macro files, which are used by `aclocal' to create `aclocal.m4', and
+the latter is used by `autoconf' to create the package's `configure'
+script and by `autoheader' to create the package's `config.h.in'
+include file template.
+
+ The name `autopoint' is an abbreviation of `auto-po-intl-m4'; the
+tool copies or updates mostly files in the `po', `intl', `m4'
+directories.
+
+
+File: gettext.info, Node: Release Management, Prev: CVS Issues, Up: Maintainers
+
+13.7 Creating a Distribution Tarball
+====================================
+
+ In projects that use GNU `automake', the usual commands for creating
+a distribution tarball, `make dist' or `make distcheck', automatically
+update the PO files as needed.
+
+ If GNU `automake' is not used, the maintainer needs to perform this
+update before making a release:
+
+ $ ./configure
+ $ (cd po; make update-po)
+ $ make distclean
+
+
+File: gettext.info, Node: Installers, Next: Programming Languages, Prev: Maintainers, Up: Top
+
+14 The Installer's and Distributor's View
+*****************************************
+
+ By default, packages fully using GNU `gettext', internally, are
+installed in such a way that they to allow translation of messages. At
+_configuration_ time, those packages should automatically detect
+whether the underlying host system already provides the GNU `gettext'
+functions. If not, the GNU `gettext' library should be automatically
+prepared and used. Installers may use special options at configuration
+time for changing this behavior. The command `./configure
+--with-included-gettext' bypasses system `gettext' to use the included
+GNU `gettext' instead, while `./configure --disable-nls' produces
+programs totally unable to translate messages.
+
+ Internationalized packages have usually many `LL.po' files. Unless
+translations are disabled, all those available are installed together
+with the package. However, the environment variable `LINGUAS' may be
+set, prior to configuration, to limit the installed set. `LINGUAS'
+should then contain a space separated list of two-letter codes, stating
+which languages are allowed.
+
+
+File: gettext.info, Node: Programming Languages, Next: Conclusion, Prev: Installers, Up: Top
+
+15 Other Programming Languages
+******************************
+
+ While the presentation of `gettext' focuses mostly on C and
+implicitly applies to C++ as well, its scope is far broader than that:
+Many programming languages, scripting languages and other textual data
+like GUI resources or package descriptions can make use of the gettext
+approach.
+
+* Menu:
+
+* Language Implementors:: The Language Implementor's View
+* Programmers for other Languages:: The Programmer's View
+* Translators for other Languages:: The Translator's View
+* Maintainers for other Languages:: The Maintainer's View
+* List of Programming Languages:: Individual Programming Languages
+* List of Data Formats:: Internationalizable Data
+
+
+File: gettext.info, Node: Language Implementors, Next: Programmers for other Languages, Prev: Programming Languages, Up: Programming Languages
+
+15.1 The Language Implementor's View
+====================================
+
+ All programming and scripting languages that have the notion of
+strings are eligible to supporting `gettext'. Supporting `gettext'
+means the following:
+
+ 1. You should add to the language a syntax for translatable strings.
+ In principle, a function call of `gettext' would do, but a
+ shorthand syntax helps keeping the legibility of internationalized
+ programs. For example, in C we use the syntax `_("string")', and
+ in GNU awk we use the shorthand `_"string"'.
+
+ 2. You should arrange that evaluation of such a translatable string at
+ runtime calls the `gettext' function, or performs equivalent
+ processing.
+
+ 3. Similarly, you should make the functions `ngettext', `dcgettext',
+ `dcngettext' available from within the language. These functions
+ are less often used, but are nevertheless necessary for particular
+ purposes: `ngettext' for correct plural handling, and `dcgettext'
+ and `dcngettext' for obeying other locale-related environment
+ variables than `LC_MESSAGES', such as `LC_TIME' or `LC_MONETARY'.
+ For these latter functions, you need to make the `LC_*' constants,
+ available in the C header `<locale.h>', referenceable from within
+ the language, usually either as enumeration values or as strings.
+
+ 4. You should allow the programmer to designate a message domain,
+ either by making the `textdomain' function available from within
+ the language, or by introducing a magic variable called
+ `TEXTDOMAIN'. Similarly, you should allow the programmer to
+ designate where to search for message catalogs, by providing
+ access to the `bindtextdomain' function.
+
+ 5. You should either perform a `setlocale (LC_ALL, "")' call during
+ the startup of your language runtime, or allow the programmer to
+ do so. Remember that gettext will act as a no-op if the
+ `LC_MESSAGES' and `LC_CTYPE' locale categories are not both set.
+
+ 6. A programmer should have a way to extract translatable strings
+ from a program into a PO file. The GNU `xgettext' program is being
+ extended to support very different programming languages. Please
+ contact the GNU `gettext' maintainers to help them doing this. If
+ the string extractor is best integrated into your language's
+ parser, GNU `xgettext' can function as a front end to your string
+ extractor.
+
+ 7. The language's library should have a string formatting facility
+ where the arguments of a format string are denoted by a positional
+ number or a name. This is needed because for some languages and
+ some messages with more than one substitutable argument, the
+ translation will need to output the substituted arguments in
+ different order. *Note c-format Flag::.
+
+ 8. If the language has more than one implementation, and not all of
+ the implementations use `gettext', but the programs should be
+ portable across implementations, you should provide a no-i18n
+ emulation, that makes the other implementations accept programs
+ written for yours, without actually translating the strings.
+
+ 9. To help the programmer in the task of marking translatable strings,
+ which is sometimes performed using the Emacs PO mode (*note
+ Marking::), you are welcome to contact the GNU `gettext'
+ maintainers, so they can add support for your language to
+ `po-mode.el'.
+
+ On the implementation side, three approaches are possible, with
+different effects on portability and copyright:
+
+ * You may integrate the GNU `gettext''s `intl/' directory in your
+ package, as described in *note Maintainers::. This allows you to
+ have internationalization on all kinds of platforms. Note that
+ when you then distribute your package, it legally falls under the
+ GNU General Public License, and the GNU project will be glad about
+ your contribution to the Free Software pool.
+
+ * You may link against GNU `gettext' functions if they are found in
+ the C library. For example, an autoconf test for `gettext()' and
+ `ngettext()' will detect this situation. For the moment, this test
+ will succeed on GNU systems and not on other platforms. No severe
+ copyright restrictions apply.
+
+ * You may emulate or reimplement the GNU `gettext' functionality.
+ This has the advantage of full portability and no copyright
+ restrictions, but also the drawback that you have to reimplement
+ the GNU `gettext' features (such as the `LANGUAGE' environment
+ variable, the locale aliases database, the automatic charset
+ conversion, and plural handling).
+
+
+File: gettext.info, Node: Programmers for other Languages, Next: Translators for other Languages, Prev: Language Implementors, Up: Programming Languages
+
+15.2 The Programmer's View
+==========================
+
+ For the programmer, the general procedure is the same as for the C
+language. The Emacs PO mode marking supports other languages, and the
+GNU `xgettext' string extractor recognizes other languages based on the
+file extension or a command-line option. In some languages,
+`setlocale' is not needed because it is already performed by the
+underlying language runtime.
+
+
+File: gettext.info, Node: Translators for other Languages, Next: Maintainers for other Languages, Prev: Programmers for other Languages, Up: Programming Languages
+
+15.3 The Translator's View
+==========================
+
+ The translator works exactly as in the C language case. The only
+difference is that when translating format strings, she has to be aware
+of the language's particular syntax for positional arguments in format
+strings.
+
+* Menu:
+
+* c-format:: C Format Strings
+* objc-format:: Objective C Format Strings
+* sh-format:: Shell Format Strings
+* python-format:: Python Format Strings
+* lisp-format:: Lisp Format Strings
+* elisp-format:: Emacs Lisp Format Strings
+* librep-format:: librep Format Strings
+* scheme-format:: Scheme Format Strings
+* smalltalk-format:: Smalltalk Format Strings
+* java-format:: Java Format Strings
+* csharp-format:: C# Format Strings
+* awk-format:: awk Format Strings
+* object-pascal-format:: Object Pascal Format Strings
+* ycp-format:: YCP Format Strings
+* tcl-format:: Tcl Format Strings
+* perl-format:: Perl Format Strings
+* php-format:: PHP Format Strings
+* gcc-internal-format:: GCC internal Format Strings
+* gfc-internal-format:: GFC internal Format Strings
+* qt-format:: Qt Format Strings
+* qt-plural-format:: Qt Plural Format Strings
+* kde-format:: KDE Format Strings
+* boost-format:: Boost Format Strings
+
+
+File: gettext.info, Node: c-format, Next: objc-format, Prev: Translators for other Languages, Up: Translators for other Languages
+
+15.3.1 C Format Strings
+-----------------------
+
+ C format strings are described in POSIX (IEEE P1003.1 2001), section
+XSH 3 fprintf(),
+`http://www.opengroup.org/onlinepubs/007904975/functions/fprintf.html'.
+See also the fprintf() manual page,
+`http://www.linuxvalley.it/encyclopedia/ldp/manpage/man3/printf.3.php',
+`http://informatik.fh-wuerzburg.de/student/i510/man/printf.html'.
+
+ Although format strings with positions that reorder arguments, such
+as
+
+ "Only %2$d bytes free on '%1$s'."
+
+which is semantically equivalent to
+
+ "'%s' has only %d bytes free."
+
+are a POSIX/XSI feature and not specified by ISO C 99, translators can
+rely on this reordering ability: On the few platforms where `printf()',
+`fprintf()' etc. don't support this feature natively, `libintl.a' or
+`libintl.so' provides replacement functions, and GNU `<libintl.h>'
+activates these replacement functions automatically.
+
+ As a special feature for Farsi (Persian) and maybe Arabic,
+translators can insert an `I' flag into numeric format directives. For
+example, the translation of `"%d"' can be `"%Id"'. The effect of this
+flag, on systems with GNU `libc', is that in the output, the ASCII
+digits are replaced with the `outdigits' defined in the `LC_CTYPE'
+locale category. On other systems, the `gettext' function removes this
+flag, so that it has no effect.
+
+ Note that the programmer should _not_ put this flag into the
+untranslated string. (Putting the `I' format directive flag into an
+MSGID string would lead to undefined behaviour on platforms without
+glibc when NLS is disabled.)
+
+
+File: gettext.info, Node: objc-format, Next: sh-format, Prev: c-format, Up: Translators for other Languages
+
+15.3.2 Objective C Format Strings
+---------------------------------
+
+ Objective C format strings are like C format strings. They support
+an additional format directive: "%@", which when executed consumes an
+argument of type `Object *'.
+
+
+File: gettext.info, Node: sh-format, Next: python-format, Prev: objc-format, Up: Translators for other Languages
+
+15.3.3 Shell Format Strings
+---------------------------
+
+ Shell format strings, as supported by GNU gettext and the `envsubst'
+program, are strings with references to shell variables in the form
+`$VARIABLE' or `${VARIABLE}'. References of the form
+`${VARIABLE-DEFAULT}', `${VARIABLE:-DEFAULT}', `${VARIABLE=DEFAULT}',
+`${VARIABLE:=DEFAULT}', `${VARIABLE+REPLACEMENT}',
+`${VARIABLE:+REPLACEMENT}', `${VARIABLE?IGNORED}',
+`${VARIABLE:?IGNORED}', that would be valid inside shell scripts, are
+not supported. The VARIABLE names must consist solely of alphanumeric
+or underscore ASCII characters, not start with a digit and be nonempty;
+otherwise such a variable reference is ignored.
+
+
+File: gettext.info, Node: python-format, Next: lisp-format, Prev: sh-format, Up: Translators for other Languages
+
+15.3.4 Python Format Strings
+----------------------------
+
+ Python format strings are described in Python Library reference /
+2. Built-in Types, Exceptions and Functions / 2.2. Built-in Types /
+2.2.6. Sequence Types / 2.2.6.2. String Formatting Operations.
+`http://www.python.org/doc/2.2.1/lib/typesseq-strings.html'.
+
+
+File: gettext.info, Node: lisp-format, Next: elisp-format, Prev: python-format, Up: Translators for other Languages
+
+15.3.5 Lisp Format Strings
+--------------------------
+
+ Lisp format strings are described in the Common Lisp HyperSpec,
+chapter 22.3 Formatted Output,
+`http://www.lisp.org/HyperSpec/Body/sec_22-3.html'.
+
+
+File: gettext.info, Node: elisp-format, Next: librep-format, Prev: lisp-format, Up: Translators for other Languages
+
+15.3.6 Emacs Lisp Format Strings
+--------------------------------
+
+ Emacs Lisp format strings are documented in the Emacs Lisp reference,
+section Formatting Strings,
+`http://www.gnu.org/manual/elisp-manual-21-2.8/html_chapter/elisp_4.html#SEC75'.
+Note that as of version 21, XEmacs supports numbered argument
+specifications in format strings while FSF Emacs doesn't.
+
+
+File: gettext.info, Node: librep-format, Next: scheme-format, Prev: elisp-format, Up: Translators for other Languages
+
+15.3.7 librep Format Strings
+----------------------------
+
+ librep format strings are documented in the librep manual, section
+Formatted Output,
+`http://librep.sourceforge.net/librep-manual.html#Formatted%20Output',
+`http://www.gwinnup.org/research/docs/librep.html#SEC122'.
+
+
+File: gettext.info, Node: scheme-format, Next: smalltalk-format, Prev: librep-format, Up: Translators for other Languages
+
+15.3.8 Scheme Format Strings
+----------------------------
+
+ Scheme format strings are documented in the SLIB manual, section
+Format Specification.
+
+
+File: gettext.info, Node: smalltalk-format, Next: java-format, Prev: scheme-format, Up: Translators for other Languages
+
+15.3.9 Smalltalk Format Strings
+-------------------------------
+
+ Smalltalk format strings are described in the GNU Smalltalk
+documentation, class `CharArray', methods `bindWith:' and
+`bindWithArguments:'.
+`http://www.gnu.org/software/smalltalk/gst-manual/gst_68.html#SEC238'.
+In summary, a directive starts with `%' and is followed by `%' or a
+nonzero digit (`1' to `9').
+
+
+File: gettext.info, Node: java-format, Next: csharp-format, Prev: smalltalk-format, Up: Translators for other Languages
+
+15.3.10 Java Format Strings
+---------------------------
+
+ Java format strings are described in the JDK documentation for class
+`java.text.MessageFormat',
+`http://java.sun.com/j2se/1.4/docs/api/java/text/MessageFormat.html'.
+See also the ICU documentation
+`http://oss.software.ibm.com/icu/apiref/classMessageFormat.html'.
+
+
+File: gettext.info, Node: csharp-format, Next: awk-format, Prev: java-format, Up: Translators for other Languages
+
+15.3.11 C# Format Strings
+-------------------------
+
+ C# format strings are described in the .NET documentation for class
+`System.String' and in
+`http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpConFormattingOverview.asp'.
+
+
+File: gettext.info, Node: awk-format, Next: object-pascal-format, Prev: csharp-format, Up: Translators for other Languages
+
+15.3.12 awk Format Strings
+--------------------------
+
+ awk format strings are described in the gawk documentation, section
+Printf, `http://www.gnu.org/manual/gawk/html_node/Printf.html#Printf'.
+
+
+File: gettext.info, Node: object-pascal-format, Next: ycp-format, Prev: awk-format, Up: Translators for other Languages
+
+15.3.13 Object Pascal Format Strings
+------------------------------------
+
+ Object Pascal format strings are described in the documentation of
+the Free Pascal runtime library, section Format,
+`http://www.freepascal.org/docs-html/rtl/sysutils/format.html'.
+
+
+File: gettext.info, Node: ycp-format, Next: tcl-format, Prev: object-pascal-format, Up: Translators for other Languages
+
+15.3.14 YCP Format Strings
+--------------------------
+
+ YCP sformat strings are described in the libycp documentation
+`file:/usr/share/doc/packages/libycp/YCP-builtins.html'. In summary, a
+directive starts with `%' and is followed by `%' or a nonzero digit
+(`1' to `9').
+
+
+File: gettext.info, Node: tcl-format, Next: perl-format, Prev: ycp-format, Up: Translators for other Languages
+
+15.3.15 Tcl Format Strings
+--------------------------
+
+ Tcl format strings are described in the `format.n' manual page,
+`http://www.scriptics.com/man/tcl8.3/TclCmd/format.htm'.
+
+
+File: gettext.info, Node: perl-format, Next: php-format, Prev: tcl-format, Up: Translators for other Languages
+
+15.3.16 Perl Format Strings
+---------------------------
+
+ There are two kinds format strings in Perl: those acceptable to the
+Perl built-in function `printf', labelled as `perl-format', and those
+acceptable to the `libintl-perl' function `__x', labelled as
+`perl-brace-format'.
+
+ Perl `printf' format strings are described in the `sprintf' section
+of `man perlfunc'.
+
+ Perl brace format strings are described in the
+`Locale::TextDomain(3pm)' manual page of the CPAN package libintl-perl.
+In brief, Perl format uses placeholders put between braces (`{' and
+`}'). The placeholder must have the syntax of simple identifiers.
+
+
+File: gettext.info, Node: php-format, Next: gcc-internal-format, Prev: perl-format, Up: Translators for other Languages
+
+15.3.17 PHP Format Strings
+--------------------------
+
+ PHP format strings are described in the documentation of the PHP
+function `sprintf', in `phpdoc/manual/function.sprintf.html' or
+`http://www.php.net/manual/en/function.sprintf.php'.
+
+
+File: gettext.info, Node: gcc-internal-format, Next: gfc-internal-format, Prev: php-format, Up: Translators for other Languages
+
+15.3.18 GCC internal Format Strings
+-----------------------------------
+
+ These format strings are used inside the GCC sources. In such a
+format string, a directive starts with `%', is optionally followed by a
+size specifier `l', an optional flag `+', another optional flag `#',
+and is finished by a specifier: `%' denotes a literal percent sign, `c'
+denotes a character, `s' denotes a string, `i' and `d' denote an
+integer, `o', `u', `x' denote an unsigned integer, `.*s' denotes a
+string preceded by a width specification, `H' denotes a `location_t *'
+pointer, `D' denotes a general declaration, `F' denotes a function
+declaration, `T' denotes a type, `A' denotes a function argument, `C'
+denotes a tree code, `E' denotes an expression, `L' denotes a
+programming language, `O' denotes a binary operator, `P' denotes a
+function parameter, `Q' denotes an assignment operator, `V' denotes a
+const/volatile qualifier.
+
+
+File: gettext.info, Node: gfc-internal-format, Next: qt-format, Prev: gcc-internal-format, Up: Translators for other Languages
+
+15.3.19 GFC internal Format Strings
+-----------------------------------
+
+ These format strings are used inside the GNU Fortran Compiler
+sources, that is, the Fortran frontend in the GCC sources. In such a
+format string, a directive starts with `%' and is finished by a
+specifier: `%' denotes a literal percent sign, `C' denotes the current
+source location, `L' denotes a source location, `c' denotes a
+character, `s' denotes a string, `i' and `d' denote an integer, `u'
+denotes an unsigned integer. `i', `d', and `u' may be preceded by a
+size specifier `l'.
+
+
+File: gettext.info, Node: qt-format, Next: qt-plural-format, Prev: gfc-internal-format, Up: Translators for other Languages
+
+15.3.20 Qt Format Strings
+-------------------------
+
+ Qt format strings are described in the documentation of the QString
+class `file:/usr/lib/qt-4.3.0/doc/html/qstring.html'. In summary, a
+directive consists of a `%' followed by a digit. The same directive
+cannot occur more than once in a format string.
+
+
+File: gettext.info, Node: qt-plural-format, Next: kde-format, Prev: qt-format, Up: Translators for other Languages
+
+15.3.21 Qt Format Strings
+-------------------------
+
+ Qt format strings are described in the documentation of the
+QObject::tr method `file:/usr/lib/qt-4.3.0/doc/html/qobject.html'. In
+summary, the only allowed directive is `%n'.
+
+
+File: gettext.info, Node: kde-format, Next: boost-format, Prev: qt-plural-format, Up: Translators for other Languages
+
+15.3.22 KDE Format Strings
+--------------------------
+
+ KDE 4 format strings are defined as follows: A directive consists of
+a `%' followed by a non-zero decimal number. If a `%n' occurs in a
+format strings, all of `%1', ..., `%(n-1)' must occur as well, except
+possibly one of them.
+
+
+File: gettext.info, Node: boost-format, Prev: kde-format, Up: Translators for other Languages
+
+15.3.23 Boost Format Strings
+----------------------------
+
+ Boost format strings are described in the documentation of the
+`boost::format' class, at
+`http://www.boost.org/libs/format/doc/format.html'. In summary, a
+directive has either the same syntax as in a C format string, such as
+`%1$+5d', or may be surrounded by vertical bars, such as `%|1$+5d|' or
+`%|1$+5|', or consists of just an argument number between percent
+signs, such as `%1%'.
+
+
+File: gettext.info, Node: Maintainers for other Languages, Next: List of Programming Languages, Prev: Translators for other Languages, Up: Programming Languages
+
+15.4 The Maintainer's View
+==========================
+
+ For the maintainer, the general procedure differs from the C language
+case in two ways.
+
+ * For those languages that don't use GNU gettext, the `intl/'
+ directory is not needed and can be omitted. This means that the
+ maintainer calls the `gettextize' program without the `--intl'
+ option, and that he invokes the `AM_GNU_GETTEXT' autoconf macro via
+ `AM_GNU_GETTEXT([external])'.
+
+ * If only a single programming language is used, the
+ `XGETTEXT_OPTIONS' variable in `po/Makevars' (*note po/Makevars::)
+ should be adjusted to match the `xgettext' options for that
+ particular programming language. If the package uses more than
+ one programming language with `gettext' support, it becomes
+ necessary to change the POT file construction rule in
+ `po/Makefile.in.in'. It is recommended to make one `xgettext'
+ invocation per programming language, each with the options
+ appropriate for that language, and to combine the resulting files
+ using `msgcat'.
+
+
+File: gettext.info, Node: List of Programming Languages, Next: List of Data Formats, Prev: Maintainers for other Languages, Up: Programming Languages
+
+15.5 Individual Programming Languages
+=====================================
+
+* Menu:
+
+* C:: C, C++, Objective C
+* sh:: sh - Shell Script
+* bash:: bash - Bourne-Again Shell Script
+* Python:: Python
+* Common Lisp:: GNU clisp - Common Lisp
+* clisp C:: GNU clisp C sources
+* Emacs Lisp:: Emacs Lisp
+* librep:: librep
+* Scheme:: GNU guile - Scheme
+* Smalltalk:: GNU Smalltalk
+* Java:: Java
+* C#:: C#
+* gawk:: GNU awk
+* Pascal:: Pascal - Free Pascal Compiler
+* wxWidgets:: wxWidgets library
+* YCP:: YCP - YaST2 scripting language
+* Tcl:: Tcl - Tk's scripting language
+* Perl:: Perl
+* PHP:: PHP Hypertext Preprocessor
+* Pike:: Pike
+* GCC-source:: GNU Compiler Collection sources
+
+
+File: gettext.info, Node: C, Next: sh, Prev: List of Programming Languages, Up: List of Programming Languages
+
+15.5.1 C, C++, Objective C
+--------------------------
+
+RPMs
+ gcc, gpp, gobjc, glibc, gettext
+
+File extension
+ For C: `c', `h'.
+ For C++: `C', `c++', `cc', `cxx', `cpp', `hpp'.
+ For Objective C: `m'.
+
+String syntax
+ `"abc"'
+
+gettext shorthand
+ `_("abc")'
+
+gettext/ngettext functions
+ `gettext', `dgettext', `dcgettext', `ngettext', `dngettext',
+ `dcngettext'
+
+textdomain
+ `textdomain' function
+
+bindtextdomain
+ `bindtextdomain' function
+
+setlocale
+ Programmer must call `setlocale (LC_ALL, "")'
+
+Prerequisite
+ `#include <libintl.h>'
+ `#include <locale.h>'
+ `#define _(string) gettext (string)'
+
+Use or emulate GNU gettext
+ Use
+
+Extractor
+ `xgettext -k_'
+
+Formatting with positions
+ `fprintf "%2$d %1$d"'
+ In C++: `autosprintf "%2$d %1$d"' (*note Introduction:
+ (autosprintf)Top.)
+
+Portability
+ autoconf (gettext.m4) and #if ENABLE_NLS
+
+po-mode marking
+ yes
+
+ The following examples are available in the `examples' directory:
+`hello-c', `hello-c-gnome', `hello-c++', `hello-c++-qt',
+`hello-c++-kde', `hello-c++-gnome', `hello-c++-wxwidgets',
+`hello-objc', `hello-objc-gnustep', `hello-objc-gnome'.
+
+
+File: gettext.info, Node: sh, Next: bash, Prev: C, Up: List of Programming Languages
+
+15.5.2 sh - Shell Script
+------------------------
+
+RPMs
+ bash, gettext
+
+File extension
+ `sh'
+
+String syntax
+ `"abc"', `'abc'', `abc'
+
+gettext shorthand
+ `"`gettext \"abc\"`"'
+
+gettext/ngettext functions
+ `gettext', `ngettext' programs
+ `eval_gettext', `eval_ngettext' shell functions
+
+textdomain
+ environment variable `TEXTDOMAIN'
+
+bindtextdomain
+ environment variable `TEXTDOMAINDIR'
+
+setlocale
+ automatic
+
+Prerequisite
+ `. gettext.sh'
+
+Use or emulate GNU gettext
+ use
+
+Extractor
+ `xgettext'
+
+Formatting with positions
+ --
+
+Portability
+ fully portable
+
+po-mode marking
+ --
+
+ An example is available in the `examples' directory: `hello-sh'.
+
+* Menu:
+
+* Preparing Shell Scripts:: Preparing Shell Scripts for Internationalization
+* gettext.sh:: Contents of `gettext.sh'
+* gettext Invocation:: Invoking the `gettext' program
+* ngettext Invocation:: Invoking the `ngettext' program
+* envsubst Invocation:: Invoking the `envsubst' program
+* eval_gettext Invocation:: Invoking the `eval_gettext' function
+* eval_ngettext Invocation:: Invoking the `eval_ngettext' function
+
+
+File: gettext.info, Node: Preparing Shell Scripts, Next: gettext.sh, Prev: sh, Up: sh
+
+15.5.2.1 Preparing Shell Scripts for Internationalization
+.........................................................
+
+ Preparing a shell script for internationalization is conceptually
+similar to the steps described in *note Sources::. The concrete steps
+for shell scripts are as follows.
+
+ 1. Insert the line
+
+ . gettext.sh
+
+ near the top of the script. `gettext.sh' is a shell function
+ library that provides the functions `eval_gettext' (see *note
+ eval_gettext Invocation::) and `eval_ngettext' (see *note
+ eval_ngettext Invocation::). You have to ensure that `gettext.sh'
+ can be found in the `PATH'.
+
+ 2. Set and export the `TEXTDOMAIN' and `TEXTDOMAINDIR' environment
+ variables. Usually `TEXTDOMAIN' is the package or program name,
+ and `TEXTDOMAINDIR' is the absolute pathname corresponding to
+ `$prefix/share/locale', where `$prefix' is the installation
+ location.
+
+ TEXTDOMAIN=@PACKAGE@
+ export TEXTDOMAIN
+ TEXTDOMAINDIR=@LOCALEDIR@
+ export TEXTDOMAINDIR
+
+ 3. Prepare the strings for translation, as described in *note
+ Preparing Strings::.
+
+ 4. Simplify translatable strings so that they don't contain command
+ substitution (`"`...`"' or `"$(...)"'), variable access with
+ defaulting (like `${VARIABLE-DEFAULT}'), access to positional
+ arguments (like `$0', `$1', ...) or highly volatile shell
+ variables (like `$?'). This can always be done through simple
+ local code restructuring. For example,
+
+ echo "Usage: $0 [OPTION] FILE..."
+
+ becomes
+
+ program_name=$0
+ echo "Usage: $program_name [OPTION] FILE..."
+
+ Similarly,
+
+ echo "Remaining files: `ls | wc -l`"
+
+ becomes
+
+ filecount="`ls | wc -l`"
+ echo "Remaining files: $filecount"
+
+ 5. For each translatable string, change the output command `echo' or
+ `$echo' to `gettext' (if the string contains no references to
+ shell variables) or to `eval_gettext' (if it refers to shell
+ variables), followed by a no-argument `echo' command (to account
+ for the terminating newline). Similarly, for cases with plural
+ handling, replace a conditional `echo' command with an invocation
+ of `ngettext' or `eval_ngettext', followed by a no-argument `echo'
+ command.
+
+ When doing this, you also need to add an extra backslash before
+ the dollar sign in references to shell variables, so that the
+ `eval_gettext' function receives the translatable string before
+ the variable values are substituted into it. For example,
+
+ echo "Remaining files: $filecount"
+
+ becomes
+
+ eval_gettext "Remaining files: \$filecount"; echo
+
+ If the output command is not `echo', you can make it use `echo'
+ nevertheless, through the use of backquotes. However, note that
+ inside backquotes, backslashes must be doubled to be effective
+ (because the backquoting eats one level of backslashes). For
+ example, assuming that `error' is a shell function that signals an
+ error,
+
+ error "file not found: $filename"
+
+ is first transformed into
+
+ error "`echo \"file not found: \$filename\"`"
+
+ which then becomes
+
+ error "`eval_gettext \"file not found: \\\$filename\"`"
+
+
+File: gettext.info, Node: gettext.sh, Next: gettext Invocation, Prev: Preparing Shell Scripts, Up: sh
+
+15.5.2.2 Contents of `gettext.sh'
+.................................
+
+ `gettext.sh', contained in the run-time package of GNU gettext,
+provides the following:
+
+ * $echo The variable `echo' is set to a command that outputs its
+ first argument and a newline, without interpreting backslashes in
+ the argument string.
+
+ * eval_gettext See *note eval_gettext Invocation::.
+
+ * eval_ngettext See *note eval_ngettext Invocation::.
+
+
+File: gettext.info, Node: gettext Invocation, Next: ngettext Invocation, Prev: gettext.sh, Up: sh
+
+15.5.2.3 Invoking the `gettext' program
+.......................................
+
+ gettext [OPTION] [[TEXTDOMAIN] MSGID]
+ gettext [OPTION] -s [MSGID]...
+
+ The `gettext' program displays the native language translation of a
+textual message.
+
+*Arguments*
+
+`-d TEXTDOMAIN'
+`--domain=TEXTDOMAIN'
+ Retrieve translated messages from TEXTDOMAIN. Usually a TEXTDOMAIN
+ corresponds to a package, a program, or a module of a program.
+
+`-e'
+ Enable expansion of some escape sequences. This option is for
+ compatibility with the `echo' program or shell built-in. The
+ escape sequences `\a', `\b', `\c', `\f', `\n', `\r', `\t', `\v',
+ `\\', and `\' followed by one to three octal digits, are
+ interpreted like the System V `echo' program did.
+
+`-E'
+ This option is only for compatibility with the `echo' program or
+ shell built-in. It has no effect.
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-n'
+ Suppress trailing newline. By default, `gettext' adds a newline to
+ the output.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+`[TEXTDOMAIN] MSGID'
+ Retrieve translated message corresponding to MSGID from TEXTDOMAIN.
+
+
+ If the TEXTDOMAIN parameter is not given, the domain is determined
+from the environment variable `TEXTDOMAIN'. If the message catalog is
+not found in the regular directory, another location can be specified
+with the environment variable `TEXTDOMAINDIR'.
+
+ When used with the `-s' option the program behaves like the `echo'
+command. But it does not simply copy its arguments to stdout. Instead
+those messages found in the selected catalog are translated.
+
+ Note: `xgettext' supports only the one-argument form of the
+`gettext' invocation, where no options are present and the TEXTDOMAIN
+is implicit, from the environment.
+
+
+File: gettext.info, Node: ngettext Invocation, Next: envsubst Invocation, Prev: gettext Invocation, Up: sh
+
+15.5.2.4 Invoking the `ngettext' program
+........................................
+
+ ngettext [OPTION] [TEXTDOMAIN] MSGID MSGID-PLURAL COUNT
+
+ The `ngettext' program displays the native language translation of a
+textual message whose grammatical form depends on a number.
+
+*Arguments*
+
+`-d TEXTDOMAIN'
+`--domain=TEXTDOMAIN'
+ Retrieve translated messages from TEXTDOMAIN. Usually a TEXTDOMAIN
+ corresponds to a package, a program, or a module of a program.
+
+`-e'
+ Enable expansion of some escape sequences. This option is for
+ compatibility with the `gettext' program. The escape sequences
+ `\a', `\b', `\c', `\f', `\n', `\r', `\t', `\v', `\\', and `\'
+ followed by one to three octal digits, are interpreted like the
+ System V `echo' program did.
+
+`-E'
+ This option is only for compatibility with the `gettext' program.
+ It has no effect.
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+`TEXTDOMAIN'
+ Retrieve translated message from TEXTDOMAIN.
+
+`MSGID MSGID-PLURAL'
+ Translate MSGID (English singular) / MSGID-PLURAL (English plural).
+
+`COUNT'
+ Choose singular/plural form based on this value.
+
+
+ If the TEXTDOMAIN parameter is not given, the domain is determined
+from the environment variable `TEXTDOMAIN'. If the message catalog is
+not found in the regular directory, another location can be specified
+with the environment variable `TEXTDOMAINDIR'.
+
+ Note: `xgettext' supports only the three-arguments form of the
+`ngettext' invocation, where no options are present and the TEXTDOMAIN
+is implicit, from the environment.
+
+
+File: gettext.info, Node: envsubst Invocation, Next: eval_gettext Invocation, Prev: ngettext Invocation, Up: sh
+
+15.5.2.5 Invoking the `envsubst' program
+........................................
+
+ envsubst [OPTION] [SHELL-FORMAT]
+
+ The `envsubst' program substitutes the values of environment
+variables.
+
+*Operation mode*
+
+`-v'
+`--variables'
+ Output the variables occurring in SHELL-FORMAT.
+
+
+*Informative output*
+
+`-h'
+`--help'
+ Display this help and exit.
+
+`-V'
+`--version'
+ Output version information and exit.
+
+
+ In normal operation mode, standard input is copied to standard
+output, with references to environment variables of the form
+`$VARIABLE' or `${VARIABLE}' being replaced with the corresponding
+values. If a SHELL-FORMAT is given, only those environment variables
+that are referenced in SHELL-FORMAT are substituted; otherwise all
+environment variables references occurring in standard input are
+substituted.
+
+ These substitutions are a subset of the substitutions that a shell
+performs on unquoted and double-quoted strings. Other kinds of
+substitutions done by a shell, such as `${VARIABLE-DEFAULT}' or
+`$(COMMAND-LIST)' or ``COMMAND-LIST`', are not performed by the
+`envsubst' program, due to security reasons.
+
+ When `--variables' is used, standard input is ignored, and the output
+consists of the environment variables that are referenced in
+SHELL-FORMAT, one per line.
+
+
+File: gettext.info, Node: eval_gettext Invocation, Next: eval_ngettext Invocation, Prev: envsubst Invocation, Up: sh
+
+15.5.2.6 Invoking the `eval_gettext' function
+.............................................
+
+ eval_gettext MSGID
+
+ This function outputs the native language translation of a textual
+message, performing dollar-substitution on the result. Note that only
+shell variables mentioned in MSGID will be dollar-substituted in the
+result.
+
+
+File: gettext.info, Node: eval_ngettext Invocation, Prev: eval_gettext Invocation, Up: sh
+
+15.5.2.7 Invoking the `eval_ngettext' function
+..............................................
+
+ eval_ngettext MSGID MSGID-PLURAL COUNT
+
+ This function outputs the native language translation of a textual
+message whose grammatical form depends on a number, performing
+dollar-substitution on the result. Note that only shell variables
+mentioned in MSGID or MSGID-PLURAL will be dollar-substituted in the
+result.
+
+
+File: gettext.info, Node: bash, Next: Python, Prev: sh, Up: List of Programming Languages
+
+15.5.3 bash - Bourne-Again Shell Script
+---------------------------------------
+
+ GNU `bash' 2.0 or newer has a special shorthand for translating a
+string and substituting variable values in it: `$"msgid"'. But the use
+of this construct is *discouraged*, due to the security holes it opens
+and due to its portability problems.
+
+ The security holes of `$"..."' come from the fact that after looking
+up the translation of the string, `bash' processes it like it processes
+any double-quoted string: dollar and backquote processing, like `eval'
+does.
+
+ 1. In a locale whose encoding is one of BIG5, BIG5-HKSCS, GBK,
+ GB18030, SHIFT_JIS, JOHAB, some double-byte characters have a
+ second byte whose value is `0x60'. For example, the byte sequence
+ `\xe0\x60' is a single character in these locales. Many versions
+ of `bash' (all versions up to bash-2.05, and newer versions on
+ platforms without `mbsrtowcs()' function) don't know about
+ character boundaries and see a backquote character where there is
+ only a particular Chinese character. Thus it can start executing
+ part of the translation as a command list. This situation can
+ occur even without the translator being aware of it: if the
+ translator provides translations in the UTF-8 encoding, it is the
+ `gettext()' function which will, during its conversion from the
+ translator's encoding to the user's locale's encoding, produce the
+ dangerous `\x60' bytes.
+
+ 2. A translator could - voluntarily or inadvertently - use backquotes
+ `"`...`"' or dollar-parentheses `"$(...)"' in her translations.
+ The enclosed strings would be executed as command lists by the
+ shell.
+
+ The portability problem is that `bash' must be built with
+internationalization support; this is normally not the case on systems
+that don't have the `gettext()' function in libc.
+
+
+File: gettext.info, Node: Python, Next: Common Lisp, Prev: bash, Up: List of Programming Languages
+
+15.5.4 Python
+-------------
+
+RPMs
+ python
+
+File extension
+ `py'
+
+String syntax
+ `'abc'', `u'abc'', `r'abc'', `ur'abc'',
+ `"abc"', `u"abc"', `r"abc"', `ur"abc"',
+ `'''abc'''', `u'''abc'''', `r'''abc'''', `ur'''abc'''',
+ `"""abc"""', `u"""abc"""', `r"""abc"""', `ur"""abc"""'
+
+gettext shorthand
+ `_('abc')' etc.
+
+gettext/ngettext functions
+ `gettext.gettext', `gettext.dgettext', `gettext.ngettext',
+ `gettext.dngettext', also `ugettext', `ungettext'
+
+textdomain
+ `gettext.textdomain' function, or `gettext.install(DOMAIN)'
+ function
+
+bindtextdomain
+ `gettext.bindtextdomain' function, or
+ `gettext.install(DOMAIN,LOCALEDIR)' function
+
+setlocale
+ not used by the gettext emulation
+
+Prerequisite
+ `import gettext'
+
+Use or emulate GNU gettext
+ emulate
+
+Extractor
+ `xgettext'
+
+Formatting with positions
+ `'...%(ident)d...' % { 'ident': value }'
+
+Portability
+ fully portable
+
+po-mode marking
+ --
+
+ An example is available in the `examples' directory: `hello-python'.
+
+ A note about format strings: Python supports format strings with
+unnamed arguments, such as `'...%d...'', and format strings with named
+arguments, such as `'...%(ident)d...''. The latter are preferable for
+internationalized programs, for two reasons:
+
+ * When a format string takes more than one argument, the translator
+ can provide a translation that uses the arguments in a different
+ order, if the format string uses named arguments. For example,
+ the translator can reformulate
+ "'%(volume)s' has only %(freespace)d bytes free."
+ to
+ "Only %(freespace)d bytes free on '%(volume)s'."
+ Additionally, the identifiers also provide some context to the
+ translator.
+
+ * In the context of plural forms, the format string used for the
+ singular form does not use the numeric argument in many languages.
+ Even in English, one prefers to write `"one hour"' instead of `"1
+ hour"'. Omitting individual arguments from format strings like
+ this is only possible with the named argument syntax. (With
+ unnamed arguments, Python - unlike C - verifies that the format
+ string uses all supplied arguments.)
+
+
+File: gettext.info, Node: Common Lisp, Next: clisp C, Prev: Python, Up: List of Programming Languages
+
+15.5.5 GNU clisp - Common Lisp
+------------------------------
+
+RPMs
+ clisp 2.28 or newer
+
+File extension
+ `lisp'
+
+String syntax
+ `"abc"'
+
+gettext shorthand
+ `(_ "abc")', `(ENGLISH "abc")'
+
+gettext/ngettext functions
+ `i18n:gettext', `i18n:ngettext'
+
+textdomain
+ `i18n:textdomain'
+
+bindtextdomain
+ `i18n:textdomaindir'
+
+setlocale
+ automatic
+
+Prerequisite
+ --
+
+Use or emulate GNU gettext
+ use
+
+Extractor
+ `xgettext -k_ -kENGLISH'
+
+Formatting with positions
+ `format "~1@*~D ~0@*~D"'
+
+Portability
+ On platforms without gettext, no translation.
+
+po-mode marking
+ --
+
+ An example is available in the `examples' directory: `hello-clisp'.
+
+
+File: gettext.info, Node: clisp C, Next: Emacs Lisp, Prev: Common Lisp, Up: List of Programming Languages
+
+15.5.6 GNU clisp C sources
+--------------------------
+
+RPMs
+ clisp
+
+File extension
+ `d'
+
+String syntax
+ `"abc"'
+
+gettext shorthand
+ `ENGLISH ? "abc" : ""'
+ `GETTEXT("abc")'
+ `GETTEXTL("abc")'
+
+gettext/ngettext functions
+ `clgettext', `clgettextl'
+
+textdomain
+ --
+
+bindtextdomain
+ --
+
+setlocale
+ automatic
+
+Prerequisite
+ `#include "lispbibl.c"'
+
+Use or emulate GNU gettext
+ use
+
+Extractor
+ `clisp-xgettext'
+
+Formatting with positions
+ `fprintf "%2$d %1$d"'
+
+Portability
+ On platforms without gettext, no translation.
+
+po-mode marking
+ --
+
+
+File: gettext.info, Node: Emacs Lisp, Next: librep, Prev: clisp C, Up: List of Programming Languages
+
+15.5.7 Emacs Lisp
+-----------------
+
+RPMs
+ emacs, xemacs
+
+File extension
+ `el'
+
+String syntax
+ `"abc"'
+
+gettext shorthand
+ `(_"abc")'
+
+gettext/ngettext functions
+ `gettext', `dgettext' (xemacs only)
+
+textdomain
+ `domain' special form (xemacs only)
+
+bindtextdomain
+ `bind-text-domain' function (xemacs only)
+
+setlocale
+ automatic
+
+Prerequisite
+ --
+
+Use or emulate GNU gettext
+ use
+
+Extractor
+ `xgettext'
+
+Formatting with positions
+ `format "%2$d %1$d"'
+
+Portability
+ Only XEmacs. Without `I18N3' defined at build time, no
+ translation.
+
+po-mode marking
+ --
+
+
+File: gettext.info, Node: librep, Next: Scheme, Prev: Emacs Lisp, Up: List of Programming Languages
+
+15.5.8 librep
+-------------
+
+RPMs
+ librep 0.15.3 or newer
+
+File extension
+ `jl'
+
+String syntax
+ `"abc"'
+
+gettext shorthand
+ `(_"abc")'
+
+gettext/ngettext functions
+ `gettext'
+
+textdomain
+ `textdomain' function
+
+bindtextdomain
+ `bindtextdomain' function
+
+setlocale
+ --
+
+Prerequisite
+ `(require 'rep.i18n.gettext)'
+
+Use or emulate GNU gettext
+ use
+
+Extractor
+ `xgettext'
+
+Formatting with positions
+ `format "%2$d %1$d"'
+
+Portability
+ On platforms without gettext, no translation.
+
+po-mode marking
+ --
+
+ An example is available in the `examples' directory: `hello-librep'.
+
+
+File: gettext.info, Node: Scheme, Next: Smalltalk, Prev: librep, Up: List of Programming Languages
+
+15.5.9 GNU guile - Scheme
+-------------------------
+
+RPMs
+ guile
+
+File extension
+ `scm'
+
+String syntax
+ `"abc"'
+
+gettext shorthand
+ `(_ "abc")'
+
+gettext/ngettext functions
+ `gettext', `ngettext'
+
+textdomain
+ `textdomain'
+
+bindtextdomain
+ `bindtextdomain'
+
+setlocale
+ `(catch #t (lambda () (setlocale LC_ALL "")) (lambda args #f))'
+
+Prerequisite
+ `(use-modules (ice-9 format))'
+
+Use or emulate GNU gettext
+ use
+
+Extractor
+ `xgettext -k_'
+
+Formatting with positions
+ --
+
+Portability
+ On platforms without gettext, no translation.
+
+po-mode marking
+ --
+
+ An example is available in the `examples' directory: `hello-guile'.
+
+
+File: gettext.info, Node: Smalltalk, Next: Java, Prev: Scheme, Up: List of Programming Languages
+
+15.5.10 GNU Smalltalk
+---------------------
+
+RPMs
+ smalltalk
+
+File extension
+ `st'
+
+String syntax
+ `'abc''
+
+gettext shorthand
+ `NLS ? 'abc''
+
+gettext/ngettext functions
+ `LcMessagesDomain>>#at:', `LcMessagesDomain>>#at:plural:with:'
+
+textdomain
+ `LcMessages>>#domain:localeDirectory:' (returns a
+ `LcMessagesDomain' object).
+ Example: `I18N Locale default messages domain: 'gettext'
+ localeDirectory: /usr/local/share/locale''
+
+bindtextdomain
+ `LcMessages>>#domain:localeDirectory:', see above.
+
+setlocale
+ Automatic if you use `I18N Locale default'.
+
+Prerequisite
+ `PackageLoader fileInPackage: 'I18N'!'
+
+Use or emulate GNU gettext
+ emulate
+
+Extractor
+ `xgettext'
+
+Formatting with positions
+ `'%1 %2' bindWith: 'Hello' with: 'world''
+
+Portability
+ fully portable
+
+po-mode marking
+ --
+
+ An example is available in the `examples' directory:
+`hello-smalltalk'.
+
+
+File: gettext.info, Node: Java, Next: C#, Prev: Smalltalk, Up: List of Programming Languages
+
+15.5.11 Java
+------------
+
+RPMs
+ java, java2
+
+File extension
+ `java'
+
+String syntax
+ "abc"
+
+gettext shorthand
+ _("abc")
+
+gettext/ngettext functions
+ `GettextResource.gettext', `GettextResource.ngettext',
+ `GettextResource.pgettext', `GettextResource.npgettext'
+
+textdomain
+ --, use `ResourceBundle.getResource' instead
+
+bindtextdomain
+ --, use CLASSPATH instead
+
+setlocale
+ automatic
+
+Prerequisite
+ --
+
+Use or emulate GNU gettext
+ --, uses a Java specific message catalog format
+
+Extractor
+ `xgettext -k_'
+
+Formatting with positions
+ `MessageFormat.format "{1,number} {0,number}"'
+
+Portability
+ fully portable
+
+po-mode marking
+ --
+
+ Before marking strings as internationalizable, uses of the string
+concatenation operator need to be converted to `MessageFormat'
+applications. For example, `"file "+filename+" not found"' becomes
+`MessageFormat.format("file {0} not found", new Object[] { filename })'.
+Only after this is done, can the strings be marked and extracted.
+
+ GNU gettext uses the native Java internationalization mechanism,
+namely `ResourceBundle's. There are two formats of `ResourceBundle's:
+`.properties' files and `.class' files. The `.properties' format is a
+text file which the translators can directly edit, like PO files, but
+which doesn't support plural forms. Whereas the `.class' format is
+compiled from `.java' source code and can support plural forms
+(provided it is accessed through an appropriate API, see below).
+
+ To convert a PO file to a `.properties' file, the `msgcat' program
+can be used with the option `--properties-output'. To convert a
+`.properties' file back to a PO file, the `msgcat' program can be used
+with the option `--properties-input'. All the tools that manipulate PO
+files can work with `.properties' files as well, if given the
+`--properties-input' and/or `--properties-output' option.
+
+ To convert a PO file to a ResourceBundle class, the `msgfmt' program
+can be used with the option `--java' or `--java2'. To convert a
+ResourceBundle back to a PO file, the `msgunfmt' program can be used
+with the option `--java'.
+
+ Two different programmatic APIs can be used to access
+ResourceBundles. Note that both APIs work with all kinds of
+ResourceBundles, whether GNU gettext generated classes, or other
+`.class' or `.properties' files.
+
+ 1. The `java.util.ResourceBundle' API.
+
+ In particular, its `getString' function returns a string
+ translation. Note that a missing translation yields a
+ `MissingResourceException'.
+
+ This has the advantage of being the standard API. And it does not
+ require any additional libraries, only the `msgcat' generated
+ `.properties' files or the `msgfmt' generated `.class' files. But
+ it cannot do plural handling, even if the resource was generated
+ by `msgfmt' from a PO file with plural handling.
+
+ 2. The `gnu.gettext.GettextResource' API.
+
+ Reference documentation in Javadoc 1.1 style format is in the
+ javadoc2 directory (javadoc2/index.html).
+
+ Its `gettext' function returns a string translation. Note that
+ when a translation is missing, the MSGID argument is returned
+ unchanged.
+
+ This has the advantage of having the `ngettext' function for plural
+ handling and the `pgettext' and `npgettext' for strings constraint
+ to a particular context.
+
+ To use this API, one needs the `libintl.jar' file which is part of
+ the GNU gettext package and distributed under the LGPL.
+
+ Four examples, using the second API, are available in the `examples'
+directory: `hello-java', `hello-java-awt', `hello-java-swing',
+`hello-java-qtjambi'.
+
+ Now, to make use of the API and define a shorthand for `getString',
+there are three idioms that you can choose from:
+
+ * (This one assumes Java 1.5 or newer.) In a unique class of your
+ project, say `Util', define a static variable holding the
+ `ResourceBundle' instance and the shorthand:
+
+ private static ResourceBundle myResources =
+ ResourceBundle.getBundle("domain-name");
+ public static String _(String s) {
+ return myResources.getString(s);
+ }
+
+ All classes containing internationalized strings then contain
+
+ import static Util._;
+
+ and the shorthand is used like this:
+
+ System.out.println(_("Operation completed."));
+
+ * In a unique class of your project, say `Util', define a static
+ variable holding the `ResourceBundle' instance:
+
+ public static ResourceBundle myResources =
+ ResourceBundle.getBundle("domain-name");
+
+ All classes containing internationalized strings then contain
+
+ private static ResourceBundle res = Util.myResources;
+ private static String _(String s) { return res.getString(s); }
+
+ and the shorthand is used like this:
+
+ System.out.println(_("Operation completed."));
+
+ * You add a class with a very short name, say `S', containing just
+ the definition of the resource bundle and of the shorthand:
+
+ public class S {
+ public static ResourceBundle myResources =
+ ResourceBundle.getBundle("domain-name");
+ public static String _(String s) {
+ return myResources.getString(s);
+ }
+ }
+
+ and the shorthand is used like this:
+
+ System.out.println(S._("Operation completed."));
+
+ Which of the three idioms you choose, will depend on whether your
+project requires portability to Java versions prior to Java 1.5 and, if
+so, whether copying two lines of codes into every class is more
+acceptable in your project than a class with a single-letter name.
+
+
+File: gettext.info, Node: C#, Next: gawk, Prev: Java, Up: List of Programming Languages
+
+15.5.12 C#
+----------
+
+RPMs
+ pnet, pnetlib 0.6.2 or newer, or mono 0.29 or newer
+
+File extension
+ `cs'
+
+String syntax
+ `"abc"', `@"abc"'
+
+gettext shorthand
+ _("abc")
+
+gettext/ngettext functions
+ `GettextResourceManager.GetString',
+ `GettextResourceManager.GetPluralString'
+ `GettextResourceManager.GetParticularString'
+ `GettextResourceManager.GetParticularPluralString'
+
+textdomain
+ `new GettextResourceManager(domain)'
+
+bindtextdomain
+ --, compiled message catalogs are located in subdirectories of the
+ directory containing the executable
+
+setlocale
+ automatic
+
+Prerequisite
+ --
+
+Use or emulate GNU gettext
+ --, uses a C# specific message catalog format
+
+Extractor
+ `xgettext -k_'
+
+Formatting with positions
+ `String.Format "{1} {0}"'
+
+Portability
+ fully portable
+
+po-mode marking
+ --
+
+ Before marking strings as internationalizable, uses of the string
+concatenation operator need to be converted to `String.Format'
+invocations. For example, `"file "+filename+" not found"' becomes
+`String.Format("file {0} not found", filename)'. Only after this is
+done, can the strings be marked and extracted.
+
+ GNU gettext uses the native C#/.NET internationalization mechanism,
+namely the classes `ResourceManager' and `ResourceSet'. Applications
+use the `ResourceManager' methods to retrieve the native language
+translation of strings. An instance of `ResourceSet' is the in-memory
+representation of a message catalog file. The `ResourceManager' loads
+and accesses `ResourceSet' instances as needed to look up the
+translations.
+
+ There are two formats of `ResourceSet's that can be directly loaded
+by the C# runtime: `.resources' files and `.dll' files.
+
+ * The `.resources' format is a binary file usually generated through
+ the `resgen' or `monoresgen' utility, but which doesn't support
+ plural forms. `.resources' files can also be embedded in .NET
+ `.exe' files. This only affects whether a file system access is
+ performed to load the message catalog; it doesn't affect the
+ contents of the message catalog.
+
+ * On the other hand, the `.dll' format is a binary file that is
+ compiled from `.cs' source code and can support plural forms
+ (provided it is accessed through the GNU gettext API, see below).
+
+ Note that these .NET `.dll' and `.exe' files are not tied to a
+particular platform; their file format and GNU gettext for C# can be
+used on any platform.
+
+ To convert a PO file to a `.resources' file, the `msgfmt' program
+can be used with the option `--csharp-resources'. To convert a
+`.resources' file back to a PO file, the `msgunfmt' program can be used
+with the option `--csharp-resources'. You can also, in some cases, use
+the `resgen' program (from the `pnet' package) or the `monoresgen'
+program (from the `mono'/`mcs' package). These programs can also
+convert a `.resources' file back to a PO file. But beware: as of this
+writing (January 2004), the `monoresgen' converter is quite buggy and
+the `resgen' converter ignores the encoding of the PO files.
+
+ To convert a PO file to a `.dll' file, the `msgfmt' program can be
+used with the option `--csharp'. The result will be a `.dll' file
+containing a subclass of `GettextResourceSet', which itself is a
+subclass of `ResourceSet'. To convert a `.dll' file containing a
+`GettextResourceSet' subclass back to a PO file, the `msgunfmt' program
+can be used with the option `--csharp'.
+
+ The advantages of the `.dll' format over the `.resources' format are:
+
+ 1. Freedom to localize: Users can add their own translations to an
+ application after it has been built and distributed. Whereas when
+ the programmer uses a `ResourceManager' constructor provided by
+ the system, the set of `.resources' files for an application must
+ be specified when the application is built and cannot be extended
+ afterwards.
+
+ 2. Plural handling: A message catalog in `.dll' format supports the
+ plural handling function `GetPluralString'. Whereas `.resources'
+ files can only contain data and only support lookups that depend
+ on a single string.
+
+ 3. Context handling: A message catalog in `.dll' format supports the
+ query-with-context functions `GetParticularString' and
+ `GetParticularPluralString'. Whereas `.resources' files can only
+ contain data and only support lookups that depend on a single
+ string.
+
+ 4. The `GettextResourceManager' that loads the message catalogs in
+ `.dll' format also provides for inheritance on a per-message basis.
+ For example, in Austrian (`de_AT') locale, translations from the
+ German (`de') message catalog will be used for messages not found
+ in the Austrian message catalog. This has the consequence that
+ the Austrian translators need only translate those few messages
+ for which the translation into Austrian differs from the German
+ one. Whereas when working with `.resources' files, each message
+ catalog must provide the translations of all messages by itself.
+
+ 5. The `GettextResourceManager' that loads the message catalogs in
+ `.dll' format also provides for a fallback: The English MSGID is
+ returned when no translation can be found. Whereas when working
+ with `.resources' files, a language-neutral `.resources' file must
+ explicitly be provided as a fallback.
+
+ On the side of the programmatic APIs, the programmer can use either
+the standard `ResourceManager' API and the GNU `GettextResourceManager'
+API. The latter is an extension of the former, because
+`GettextResourceManager' is a subclass of `ResourceManager'.
+
+ 1. The `System.Resources.ResourceManager' API.
+
+ This API works with resources in `.resources' format.
+
+ The creation of the `ResourceManager' is done through
+ new ResourceManager(domainname, Assembly.GetExecutingAssembly())
+ The `GetString' function returns a string's translation. Note
+ that this function returns null when a translation is missing
+ (i.e. not even found in the fallback resource file).
+
+ 2. The `GNU.Gettext.GettextResourceManager' API.
+
+ This API works with resources in `.dll' format.
+
+ Reference documentation is in the csharpdoc directory
+ (csharpdoc/index.html).
+
+ The creation of the `ResourceManager' is done through
+ new GettextResourceManager(domainname)
+
+ The `GetString' function returns a string's translation. Note
+ that when a translation is missing, the MSGID argument is returned
+ unchanged.
+
+ The `GetPluralString' function returns a string translation with
+ plural handling, like the `ngettext' function in C.
+
+ The `GetParticularString' function returns a string's translation,
+ specific to a particular context, like the `pgettext' function in
+ C. Note that when a translation is missing, the MSGID argument is
+ returned unchanged.
+
+ The `GetParticularPluralString' function returns a string
+ translation, specific to a particular context, with plural
+ handling, like the `npgettext' function in C.
+
+ To use this API, one needs the `GNU.Gettext.dll' file which is
+ part of the GNU gettext package and distributed under the LGPL.
+
+ You can also mix both approaches: use the
+`GNU.Gettext.GettextResourceManager' constructor, but otherwise use
+only the `ResourceManager' type and only the `GetString' method. This
+is appropriate when you want to profit from the tools for PO files, but
+don't want to change an existing source code that uses
+`ResourceManager' and don't (yet) need the `GetPluralString' method.
+
+ Two examples, using the second API, are available in the `examples'
+directory: `hello-csharp', `hello-csharp-forms'.
+
+ Now, to make use of the API and define a shorthand for `GetString',
+there are two idioms that you can choose from:
+
+ * In a unique class of your project, say `Util', define a static
+ variable holding the `ResourceManager' instance:
+
+ public static GettextResourceManager MyResourceManager =
+ new GettextResourceManager("domain-name");
+
+ All classes containing internationalized strings then contain
+
+ private static GettextResourceManager Res = Util.MyResourceManager;
+ private static String _(String s) { return Res.GetString(s); }
+
+ and the shorthand is used like this:
+
+ Console.WriteLine(_("Operation completed."));
+
+ * You add a class with a very short name, say `S', containing just
+ the definition of the resource manager and of the shorthand:
+
+ public class S {
+ public static GettextResourceManager MyResourceManager =
+ new GettextResourceManager("domain-name");
+ public static String _(String s) {
+ return MyResourceManager.GetString(s);
+ }
+ }
+
+ and the shorthand is used like this:
+
+ Console.WriteLine(S._("Operation completed."));
+
+ Which of the two idioms you choose, will depend on whether copying
+two lines of codes into every class is more acceptable in your project
+than a class with a single-letter name.
+
+
+File: gettext.info, Node: gawk, Next: Pascal, Prev: C#, Up: List of Programming Languages
+
+15.5.13 GNU awk
+---------------
+
+RPMs
+ gawk 3.1 or newer
+
+File extension
+ `awk'
+
+String syntax
+ `"abc"'
+
+gettext shorthand
+ `_"abc"'
+
+gettext/ngettext functions
+ `dcgettext', missing `dcngettext' in gawk-3.1.0
+
+textdomain
+ `TEXTDOMAIN' variable
+
+bindtextdomain
+ `bindtextdomain' function
+
+setlocale
+ automatic, but missing `setlocale (LC_MESSAGES, "")' in gawk-3.1.0
+
+Prerequisite
+ --
+
+Use or emulate GNU gettext
+ use
+
+Extractor
+ `xgettext'
+
+Formatting with positions
+ `printf "%2$d %1$d"' (GNU awk only)
+
+Portability
+ On platforms without gettext, no translation. On non-GNU awks,
+ you must define `dcgettext', `dcngettext' and `bindtextdomain'
+ yourself.
+
+po-mode marking
+ --
+
+ An example is available in the `examples' directory: `hello-gawk'.
+
+
+File: gettext.info, Node: Pascal, Next: wxWidgets, Prev: gawk, Up: List of Programming Languages
+
+15.5.14 Pascal - Free Pascal Compiler
+-------------------------------------
+
+RPMs
+ fpk
+
+File extension
+ `pp', `pas'
+
+String syntax
+ `'abc''
+
+gettext shorthand
+ automatic
+
+gettext/ngettext functions
+ --, use `ResourceString' data type instead
+
+textdomain
+ --, use `TranslateResourceStrings' function instead
+
+bindtextdomain
+ --, use `TranslateResourceStrings' function instead
+
+setlocale
+ automatic, but uses only LANG, not LC_MESSAGES or LC_ALL
+
+Prerequisite
+ `{$mode delphi}' or `{$mode objfpc}'
+ `uses gettext;'
+
+Use or emulate GNU gettext
+ emulate partially
+
+Extractor
+ `ppc386' followed by `xgettext' or `rstconv'
+
+Formatting with positions
+ `uses sysutils;'
+ `format "%1:d %0:d"'
+
+Portability
+ ?
+
+po-mode marking
+ --
+
+ The Pascal compiler has special support for the `ResourceString' data
+type. It generates a `.rst' file. This is then converted to a `.pot'
+file by use of `xgettext' or `rstconv'. At runtime, a `.mo' file
+corresponding to translations of this `.pot' file can be loaded using
+the `TranslateResourceStrings' function in the `gettext' unit.
+
+ An example is available in the `examples' directory: `hello-pascal'.
+
+
+File: gettext.info, Node: wxWidgets, Next: YCP, Prev: Pascal, Up: List of Programming Languages
+
+15.5.15 wxWidgets library
+-------------------------
+
+RPMs
+ wxGTK, gettext
+
+File extension
+ `cpp'
+
+String syntax
+ `"abc"'
+
+gettext shorthand
+ `_("abc")'
+
+gettext/ngettext functions
+ `wxLocale::GetString', `wxGetTranslation'
+
+textdomain
+ `wxLocale::AddCatalog'
+
+bindtextdomain
+ `wxLocale::AddCatalogLookupPathPrefix'
+
+setlocale
+ `wxLocale::Init', `wxSetLocale'
+
+Prerequisite
+ `#include <wx/intl.h>'
+
+Use or emulate GNU gettext
+ emulate, see `include/wx/intl.h' and `src/common/intl.cpp'
+
+Extractor
+ `xgettext'
+
+Formatting with positions
+ wxString::Format supports positions if and only if the system has
+ `wprintf()', `vswprintf()' functions and they support positions
+ according to POSIX.
+
+Portability
+ fully portable
+
+po-mode marking
+ yes
+
+
+File: gettext.info, Node: YCP, Next: Tcl, Prev: wxWidgets, Up: List of Programming Languages
+
+15.5.16 YCP - YaST2 scripting language
+--------------------------------------
+
+RPMs
+ libycp, libycp-devel, yast2-core, yast2-core-devel
+
+File extension
+ `ycp'
+
+String syntax
+ `"abc"'
+
+gettext shorthand
+ `_("abc")'
+
+gettext/ngettext functions
+ `_()' with 1 or 3 arguments
+
+textdomain
+ `textdomain' statement
+
+bindtextdomain
+ --
+
+setlocale
+ --
+
+Prerequisite
+ --
+
+Use or emulate GNU gettext
+ use
+
+Extractor
+ `xgettext'
+
+Formatting with positions
+ `sformat "%2 %1"'
+
+Portability
+ fully portable
+
+po-mode marking
+ --
+
+ An example is available in the `examples' directory: `hello-ycp'.
+
+
+File: gettext.info, Node: Tcl, Next: Perl, Prev: YCP, Up: List of Programming Languages
+
+15.5.17 Tcl - Tk's scripting language
+-------------------------------------
+
+RPMs
+ tcl
+
+File extension
+ `tcl'
+
+String syntax
+ `"abc"'
+
+gettext shorthand
+ `[_ "abc"]'
+
+gettext/ngettext functions
+ `::msgcat::mc'
+
+textdomain
+ --
+
+bindtextdomain
+ --, use `::msgcat::mcload' instead
+
+setlocale
+ automatic, uses LANG, but ignores LC_MESSAGES and LC_ALL
+
+Prerequisite
+ `package require msgcat'
+ `proc _ {s} {return [::msgcat::mc $s]}'
+
+Use or emulate GNU gettext
+ --, uses a Tcl specific message catalog format
+
+Extractor
+ `xgettext -k_'
+
+Formatting with positions
+ `format "%2\$d %1\$d"'
+
+Portability
+ fully portable
+
+po-mode marking
+ --
+
+ Two examples are available in the `examples' directory: `hello-tcl',
+`hello-tcl-tk'.
+
+ Before marking strings as internationalizable, substitutions of
+variables into the string need to be converted to `format'
+applications. For example, `"file $filename not found"' becomes
+`[format "file %s not found" $filename]'. Only after this is done, can
+the strings be marked and extracted. After marking, this example
+becomes `[format [_ "file %s not found"] $filename]' or `[msgcat::mc
+"file %s not found" $filename]'. Note that the `msgcat::mc' function
+implicitly calls `format' when more than one argument is given.
+
+
+File: gettext.info, Node: Perl, Next: PHP, Prev: Tcl, Up: List of Programming Languages
+
+15.5.18 Perl
+------------
+
+RPMs
+ perl
+
+File extension
+ `pl', `PL', `pm', `cgi'
+
+String syntax
+ * `"abc"'
+
+ * `'abc''
+
+ * `qq (abc)'
+
+ * `q (abc)'
+
+ * `qr /abc/'
+
+ * `qx (/bin/date)'
+
+ * `/pattern match/'
+
+ * `?pattern match?'
+
+ * `s/substitution/operators/'
+
+ * `$tied_hash{"message"}'
+
+ * `$tied_hash_reference->{"message"}'
+
+ * etc., issue the command `man perlsyn' for details
+
+
+gettext shorthand
+ `__' (double underscore)
+
+gettext/ngettext functions
+ `gettext', `dgettext', `dcgettext', `ngettext', `dngettext',
+ `dcngettext'
+
+textdomain
+ `textdomain' function
+
+bindtextdomain
+ `bindtextdomain' function
+
+bind_textdomain_codeset
+ `bind_textdomain_codeset' function
+
+setlocale
+ Use `setlocale (LC_ALL, "");'
+
+Prerequisite
+ `use POSIX;'
+ `use Locale::TextDomain;' (included in the package libintl-perl
+ which is available on the Comprehensive Perl Archive Network CPAN,
+ http://www.cpan.org/).
+
+Use or emulate GNU gettext
+ platform dependent: gettext_pp emulates, gettext_xs uses GNU
+ gettext
+
+Extractor
+ `xgettext -k__ -k\$__ -k%__ -k__x -k__n:1,2 -k__nx:1,2 -k__xn:1,2
+ -kN__ -k'
+
+Formatting with positions
+ Both kinds of format strings support formatting with positions.
+ `printf "%2\$d %1\$d", ...' (requires Perl 5.8.0 or newer)
+ `__expand("[new] replaces [old]", old => $oldvalue, new =>
+ $newvalue)'
+
+Portability
+ The `libintl-perl' package is platform independent but is not part
+ of the Perl core. The programmer is responsible for providing a
+ dummy implementation of the required functions if the package is
+ not installed on the target system.
+
+po-mode marking
+ --
+
+Documentation
+ Included in `libintl-perl', available on CPAN
+ (http://www.cpan.org/).
+
+
+ An example is available in the `examples' directory: `hello-perl'.
+
+ The `xgettext' parser backend for Perl differs significantly from
+the parser backends for other programming languages, just as Perl
+itself differs significantly from other programming languages. The
+Perl parser backend offers many more string marking facilities than the
+other backends but it also has some Perl specific limitations, the
+worst probably being its imperfectness.
+
+* Menu:
+
+* General Problems:: General Problems Parsing Perl Code
+* Default Keywords:: Which Keywords Will xgettext Look For?
+* Special Keywords:: How to Extract Hash Keys
+* Quote-like Expressions:: What are Strings And Quote-like Expressions?
+* Interpolation I:: Invalid String Interpolation
+* Interpolation II:: Valid String Interpolation
+* Parentheses:: When To Use Parentheses
+* Long Lines:: How To Grok with Long Lines
+* Perl Pitfalls:: Bugs, Pitfalls, and Things That Do Not Work
+
+
+File: gettext.info, Node: General Problems, Next: Default Keywords, Up: Perl
+
+15.5.18.1 General Problems Parsing Perl Code
+............................................
+
+ It is often heard that only Perl can parse Perl. This is not true.
+Perl cannot be _parsed_ at all, it can only be _executed_. Perl has
+various built-in ambiguities that can only be resolved at runtime.
+
+ The following example may illustrate one common problem:
+
+ print gettext "Hello World!";
+
+ Although this example looks like a bullet-proof case of a function
+invocation, it is not:
+
+ open gettext, ">testfile" or die;
+ print gettext "Hello world!"
+
+ In this context, the string `gettext' looks more like a file handle.
+But not necessarily:
+
+ use Locale::Messages qw (:libintl_h);
+ open gettext ">testfile" or die;
+ print gettext "Hello world!";
+
+ Now, the file is probably syntactically incorrect, provided that the
+module `Locale::Messages' found first in the Perl include path exports a
+function `gettext'. But what if the module `Locale::Messages' really
+looks like this?
+
+ use vars qw (*gettext);
+
+ 1;
+
+ In this case, the string `gettext' will be interpreted as a file
+handle again, and the above example will create a file `testfile' and
+write the string "Hello world!" into it. Even advanced control flow
+analysis will not really help:
+
+ if (0.5 < rand) {
+ eval "use Sane";
+ } else {
+ eval "use InSane";
+ }
+ print gettext "Hello world!";
+
+ If the module `Sane' exports a function `gettext' that does what we
+expect, and the module `InSane' opens a file for writing and associates
+the _handle_ `gettext' with this output stream, we are clueless again
+about what will happen at runtime. It is completely unpredictable.
+The truth is that Perl has so many ways to fill its symbol table at
+runtime that it is impossible to interpret a particular piece of code
+without executing it.
+
+ Of course, `xgettext' will not execute your Perl sources while
+scanning for translatable strings, but rather use heuristics in order
+to guess what you meant.
+
+ Another problem is the ambiguity of the slash and the question mark.
+Their interpretation depends on the context:
+
+ # A pattern match.
+ print "OK\n" if /foobar/;
+
+ # A division.
+ print 1 / 2;
+
+ # Another pattern match.
+ print "OK\n" if ?foobar?;
+
+ # Conditional.
+ print $x ? "foo" : "bar";
+
+ The slash may either act as the division operator or introduce a
+pattern match, whereas the question mark may act as the ternary
+conditional operator or as a pattern match, too. Other programming
+languages like `awk' present similar problems, but the consequences of a
+misinterpretation are particularly nasty with Perl sources. In `awk'
+for instance, a statement can never exceed one line and the parser can
+recover from a parsing error at the next newline and interpret the rest
+of the input stream correctly. Perl is different, as a pattern match
+is terminated by the next appearance of the delimiter (the slash or the
+question mark) in the input stream, regardless of the semantic context.
+If a slash is really a division sign but mis-interpreted as a pattern
+match, the rest of the input file is most probably parsed incorrectly.
+
+ There are certain cases, where the ambiguity cannot be resolved at
+all:
+
+ $x = wantarray ? 1 : 0;
+
+ The Perl built-in function `wantarray' does not accept any arguments.
+The Perl parser therefore knows that the question mark does not start a
+regular expression but is the ternary conditional operator.
+
+ sub wantarrays {}
+ $x = wantarrays ? 1 : 0;
+
+ Now the situation is different. The function `wantarrays' takes a
+variable number of arguments (like any non-prototyped Perl function).
+The question mark is now the delimiter of a pattern match, and hence
+the piece of code does not compile.
+
+ sub wantarrays() {}
+ $x = wantarrays ? 1 : 0;
+
+ Now the function is prototyped, Perl knows that it does not accept
+any arguments, and the question mark is therefore interpreted as the
+ternaray operator again. But that unfortunately outsmarts `xgettext'.
+
+ The Perl parser in `xgettext' cannot know whether a function has a
+prototype and what that prototype would look like. It therefore makes
+an educated guess. If a function is known to be a Perl built-in and
+this function does not accept any arguments, a following question mark
+or slash is treated as an operator, otherwise as the delimiter of a
+following regular expression. The Perl built-ins that do not accept
+arguments are `wantarray', `fork', `time', `times', `getlogin',
+`getppid', `getpwent', `getgrent', `gethostent', `getnetent',
+`getprotoent', `getservent', `setpwent', `setgrent', `endpwent',
+`endgrent', `endhostent', `endnetent', `endprotoent', and `endservent'.
+
+ If you find that `xgettext' fails to extract strings from portions
+of your sources, you should therefore look out for slashes and/or
+question marks preceding these sections. You may have come across a
+bug in `xgettext''s Perl parser (and of course you should report that
+bug). In the meantime you should consider to reformulate your code in
+a manner less challenging to `xgettext'.
+
+ In particular, if the parser is too dumb to see that a function does
+not accept arguments, use parentheses:
+
+ $x = somefunc() ? 1 : 0;
+ $y = (somefunc) ? 1 : 0;
+
+ In fact the Perl parser itself has similar problems and warns you
+about such constructs.
+
+
+File: gettext.info, Node: Default Keywords, Next: Special Keywords, Prev: General Problems, Up: Perl
+
+15.5.18.2 Which keywords will xgettext look for?
+................................................
+
+ Unless you instruct `xgettext' otherwise by invoking it with one of
+the options `--keyword' or `-k', it will recognize the following
+keywords in your Perl sources:
+
+ * `gettext'
+
+ * `dgettext'
+
+ * `dcgettext'
+
+ * `ngettext:1,2'
+
+ The first (singular) and the second (plural) argument will be
+ extracted.
+
+ * `dngettext:1,2'
+
+ The first (singular) and the second (plural) argument will be
+ extracted.
+
+ * `dcngettext:1,2'
+
+ The first (singular) and the second (plural) argument will be
+ extracted.
+
+ * `gettext_noop'
+
+ * `%gettext'
+
+ The keys of lookups into the hash `%gettext' will be extracted.
+
+ * `$gettext'
+
+ The keys of lookups into the hash reference `$gettext' will be
+ extracted.
+
+
+
+File: gettext.info, Node: Special Keywords, Next: Quote-like Expressions, Prev: Default Keywords, Up: Perl
+
+15.5.18.3 How to Extract Hash Keys
+..................................
+
+ Translating messages at runtime is normally performed by looking up
+the original string in the translation database and returning the
+translated version. The "natural" Perl implementation is a hash
+lookup, and, of course, `xgettext' supports such practice.
+
+ print __"Hello world!";
+ print $__{"Hello world!"};
+ print $__->{"Hello world!"};
+ print $$__{"Hello world!"};
+
+ The above four lines all do the same thing. The Perl module
+`Locale::TextDomain' exports by default a hash `%__' that is tied to
+the function `__()'. It also exports a reference `$__' to `%__'.
+
+ If an argument to the `xgettext' option `--keyword', resp. `-k'
+starts with a percent sign, the rest of the keyword is interpreted as
+the name of a hash. If it starts with a dollar sign, the rest of the
+keyword is interpreted as a reference to a hash.
+
+ Note that you can omit the quotation marks (single or double) around
+the hash key (almost) whenever Perl itself allows it:
+
+ print $gettext{Error};
+
+ The exact rule is: You can omit the surrounding quotes, when the hash
+key is a valid C (!) identifier, i.e. when it starts with an underscore
+or an ASCII letter and is followed by an arbitrary number of
+underscores, ASCII letters or digits. Other Unicode characters are
+_not_ allowed, regardless of the `use utf8' pragma.
+
+
+File: gettext.info, Node: Quote-like Expressions, Next: Interpolation I, Prev: Special Keywords, Up: Perl
+
+15.5.18.4 What are Strings And Quote-like Expressions?
+......................................................
+
+ Perl offers a plethora of different string constructs. Those that
+can be used either as arguments to functions or inside braces for hash
+lookups are generally supported by `xgettext'.
+
+ * *double-quoted strings*
+ print gettext "Hello World!";
+
+ * *single-quoted strings*
+ print gettext 'Hello World!';
+
+ * *the operator qq*
+ print gettext qq |Hello World!|;
+ print gettext qq <E-mail: <guido\@imperia.net>>;
+
+ The operator `qq' is fully supported. You can use arbitrary
+ delimiters, including the four bracketing delimiters (round, angle,
+ square, curly) that nest.
+
+ * *the operator q*
+ print gettext q |Hello World!|;
+ print gettext q <E-mail: <guido@imperia.net>>;
+
+ The operator `q' is fully supported. You can use arbitrary
+ delimiters, including the four bracketing delimiters (round, angle,
+ square, curly) that nest.
+
+ * *the operator qx*
+ print gettext qx ;LANGUAGE=C /bin/date;
+ print gettext qx [/usr/bin/ls | grep '^[A-Z]*'];
+
+ The operator `qx' is fully supported. You can use arbitrary
+ delimiters, including the four bracketing delimiters (round, angle,
+ square, curly) that nest.
+
+ The example is actually a useless use of `gettext'. It will
+ invoke the `gettext' function on the output of the command
+ specified with the `qx' operator. The feature was included in
+ order to make the interface consistent (the parser will extract
+ all strings and quote-like expressions).
+
+ * *here documents*
+ print gettext <<'EOF';
+ program not found in $PATH
+ EOF
+
+ print ngettext <<EOF, <<"EOF";
+ one file deleted
+ EOF
+ several files deleted
+ EOF
+
+ Here-documents are recognized. If the delimiter is enclosed in
+ single quotes, the string is not interpolated. If it is enclosed
+ in double quotes or has no quotes at all, the string is
+ interpolated.
+
+ Delimiters that start with a digit are not supported!
+
+
+
+File: gettext.info, Node: Interpolation I, Next: Interpolation II, Prev: Quote-like Expressions, Up: Perl
+
+15.5.18.5 Invalid Uses Of String Interpolation
+..............................................
+
+ Perl is capable of interpolating variables into strings. This offers
+some nice features in localized programs but can also lead to problems.
+
+ A common error is a construct like the following:
+
+ print gettext "This is the program $0!\n";
+
+ Perl will interpolate at runtime the value of the variable `$0' into
+the argument of the `gettext()' function. Hence, this argument is not
+a string constant but a variable argument (`$0' is a global variable
+that holds the name of the Perl script being executed). The
+interpolation is performed by Perl before the string argument is passed
+to `gettext()' and will therefore depend on the name of the script
+which can only be determined at runtime. Consequently, it is almost
+impossible that a translation can be looked up at runtime (except if,
+by accident, the interpolated string is found in the message catalog).
+
+ The `xgettext' program will therefore terminate parsing with a fatal
+error if it encounters a variable inside of an extracted string. In
+general, this will happen for all kinds of string interpolations that
+cannot be safely performed at compile time. If you absolutely know
+what you are doing, you can always circumvent this behavior:
+
+ my $know_what_i_am_doing = "This is program $0!\n";
+ print gettext $know_what_i_am_doing;
+
+ Since the parser only recognizes strings and quote-like expressions,
+but not variables or other terms, the above construct will be accepted.
+You will have to find another way, however, to let your original string
+make it into your message catalog.
+
+ If invoked with the option `--extract-all', resp. `-a', variable
+interpolation will be accepted. Rationale: You will generally use this
+option in order to prepare your sources for internationalization.
+
+ Please see the manual page `man perlop' for details of strings and
+quote-like expressions that are subject to interpolation and those that
+are not. Safe interpolations (that will not lead to a fatal error) are:
+
+ * the escape sequences `\t' (tab, HT, TAB), `\n' (newline, NL), `\r'
+ (return, CR), `\f' (form feed, FF), `\b' (backspace, BS), `\a'
+ (alarm, bell, BEL), and `\e' (escape, ESC).
+
+ * octal chars, like `\033'
+ Note that octal escapes in the range of 400-777 are translated
+ into a UTF-8 representation, regardless of the presence of the
+ `use utf8' pragma.
+
+ * hex chars, like `\x1b'
+
+ * wide hex chars, like `\x{263a}'
+ Note that this escape is translated into a UTF-8 representation,
+ regardless of the presence of the `use utf8' pragma.
+
+ * control chars, like `\c[' (CTRL-[)
+
+ * named Unicode chars, like `\N{LATIN CAPITAL LETTER C WITH CEDILLA}'
+ Note that this escape is translated into a UTF-8 representation,
+ regardless of the presence of the `use utf8' pragma.
+
+ The following escapes are considered partially safe:
+
+ * `\l' lowercase next char
+
+ * `\u' uppercase next char
+
+ * `\L' lowercase till \E
+
+ * `\U' uppercase till \E
+
+ * `\E' end case modification
+
+ * `\Q' quote non-word characters till \E
+
+
+ These escapes are only considered safe if the string consists of
+ASCII characters only. Translation of characters outside the range
+defined by ASCII is locale-dependent and can actually only be performed
+at runtime; `xgettext' doesn't do these locale-dependent translations
+at extraction time.
+
+ Except for the modifier `\Q', these translations, albeit valid, are
+generally useless and only obfuscate your sources. If a translation
+can be safely performed at compile time you can just as well write what
+you mean.
+
+
+File: gettext.info, Node: Interpolation II, Next: Parentheses, Prev: Interpolation I, Up: Perl
+
+15.5.18.6 Valid Uses Of String Interpolation
+............................................
+
+ Perl is often used to generate sources for other programming
+languages or arbitrary file formats. Web applications that output HTML
+code make a prominent example for such usage.
+
+ You will often come across situations where you want to intersperse
+code written in the target (programming) language with translatable
+messages, like in the following HTML example:
+
+ print gettext <<EOF;
+ <h1>My Homepage</h1>
+ <script language="JavaScript"><!--
+ for (i = 0; i < 100; ++i) {
+ alert ("Thank you so much for visiting my homepage!");
+ }
+ //--></script>
+ EOF
+
+ The parser will extract the entire here document, and it will appear
+entirely in the resulting PO file, including the JavaScript snippet
+embedded in the HTML code. If you exaggerate with constructs like the
+above, you will run the risk that the translators of your package will
+look out for a less challenging project. You should consider an
+alternative expression here:
+
+ print <<EOF;
+ <h1>$gettext{"My Homepage"}</h1>
+ <script language="JavaScript"><!--
+ for (i = 0; i < 100; ++i) {
+ alert ("$gettext{'Thank you so much for visiting my homepage!'}");
+ }
+ //--></script>
+ EOF
+
+ Only the translatable portions of the code will be extracted here,
+and the resulting PO file will begrudgingly improve in terms of
+readability.
+
+ You can interpolate hash lookups in all strings or quote-like
+expressions that are subject to interpolation (see the manual page `man
+perlop' for details). Double interpolation is invalid, however:
+
+ # TRANSLATORS: Replace "the earth" with the name of your planet.
+ print gettext qq{Welcome to $gettext->{"the earth"}};
+
+ The `qq'-quoted string is recognized as an argument to `xgettext' in
+the first place, and checked for invalid variable interpolation. The
+dollar sign of hash-dereferencing will therefore terminate the parser
+with an "invalid interpolation" error.
+
+ It is valid to interpolate hash lookups in regular expressions:
+
+ if ($var =~ /$gettext{"the earth"}/) {
+ print gettext "Match!\n";
+ }
+ s/$gettext{"U. S. A."}/$gettext{"U. S. A."} $gettext{"(dial +0)"}/g;
+
+
+File: gettext.info, Node: Parentheses, Next: Long Lines, Prev: Interpolation II, Up: Perl
+
+15.5.18.7 When To Use Parentheses
+.................................
+
+ In Perl, parentheses around function arguments are mostly optional.
+`xgettext' will always assume that all recognized keywords (except for
+hashes and hash references) are names of properly prototyped functions,
+and will (hopefully) only require parentheses where Perl itself
+requires them. All constructs in the following example are therefore
+ok to use:
+
+ print gettext ("Hello World!\n");
+ print gettext "Hello World!\n";
+ print dgettext ($package => "Hello World!\n");
+ print dgettext $package, "Hello World!\n";
+
+ # The "fat comma" => turns the left-hand side argument into a
+ # single-quoted string!
+ print dgettext smellovision => "Hello World!\n";
+
+ # The following assignment only works with prototyped functions.
+ # Otherwise, the functions will act as "greedy" list operators and
+ # eat up all following arguments.
+ my $anonymous_hash = {
+ planet => gettext "earth",
+ cakes => ngettext "one cake", "several cakes", $n,
+ still => $works,
+ };
+ # The same without fat comma:
+ my $other_hash = {
+ 'planet', gettext "earth",
+ 'cakes', ngettext "one cake", "several cakes", $n,
+ 'still', $works,
+ };
+
+ # Parentheses are only significant for the first argument.
+ print dngettext 'package', ("one cake", "several cakes", $n), $discarded;
+
+
+File: gettext.info, Node: Long Lines, Next: Perl Pitfalls, Prev: Parentheses, Up: Perl
+
+15.5.18.8 How To Grok with Long Lines
+.....................................
+
+ The necessity of long messages can often lead to a cumbersome or
+unreadable coding style. Perl has several options that may prevent you
+from writing unreadable code, and `xgettext' does its best to do
+likewise. This is where the dot operator (the string concatenation
+operator) may come in handy:
+
+ print gettext ("This is a very long"
+ . " message that is still"
+ . " readable, because"
+ . " it is split into"
+ . " multiple lines.\n");
+
+ Perl is smart enough to concatenate these constant string fragments
+into one long string at compile time, and so is `xgettext'. You will
+only find one long message in the resulting POT file.
+
+ Note that the future Perl 6 will probably use the underscore (`_')
+as the string concatenation operator, and the dot (`.') for
+dereferencing. This new syntax is not yet supported by `xgettext'.
+
+ If embedded newline characters are not an issue, or even desired, you
+may also insert newline characters inside quoted strings wherever you
+feel like it:
+
+ print gettext ("<em>In HTML output
+ embedded newlines are generally no
+ problem, since adjacent whitespace
+ is always rendered into a single
+ space character.</em>");
+
+ You may also consider to use here documents:
+
+ print gettext <<EOF;
+ <em>In HTML output
+ embedded newlines are generally no
+ problem, since adjacent whitespace
+ is always rendered into a single
+ space character.</em>
+ EOF
+
+ Please do not forget that the line breaks are real, i.e. they
+translate into newline characters that will consequently show up in the
+resulting POT file.
+
+
+File: gettext.info, Node: Perl Pitfalls, Prev: Long Lines, Up: Perl
+
+15.5.18.9 Bugs, Pitfalls, And Things That Do Not Work
+.....................................................
+
+ The foregoing sections should have proven that `xgettext' is quite
+smart in extracting translatable strings from Perl sources. Yet, some
+more or less exotic constructs that could be expected to work, actually
+do not work.
+
+ One of the more relevant limitations can be found in the
+implementation of variable interpolation inside quoted strings. Only
+simple hash lookups can be used there:
+
+ print <<EOF;
+ $gettext{"The dot operator"
+ . " does not work"
+ . "here!"}
+ Likewise, you cannot @{[ gettext ("interpolate function calls") ]}
+ inside quoted strings or quote-like expressions.
+ EOF
+
+ This is valid Perl code and will actually trigger invocations of the
+`gettext' function at runtime. Yet, the Perl parser in `xgettext' will
+fail to recognize the strings. A less obvious example can be found in
+the interpolation of regular expressions:
+
+ s/<!--START_OF_WEEK-->/gettext ("Sunday")/e;
+
+ The modifier `e' will cause the substitution to be interpreted as an
+evaluable statement. Consequently, at runtime the function `gettext()'
+is called, but again, the parser fails to extract the string "Sunday".
+Use a temporary variable as a simple workaround if you really happen to
+need this feature:
+
+ my $sunday = gettext "Sunday";
+ s/<!--START_OF_WEEK-->/$sunday/;
+
+ Hash slices would also be handy but are not recognized:
+
+ my @weekdays = @gettext{'Sunday', 'Monday', 'Tuesday', 'Wednesday',
+ 'Thursday', 'Friday', 'Saturday'};
+ # Or even:
+ @weekdays = @gettext{qw (Sunday Monday Tuesday Wednesday Thursday
+ Friday Saturday) };
+
+ This is perfectly valid usage of the tied hash `%gettext' but the
+strings are not recognized and therefore will not be extracted.
+
+ Another caveat of the current version is its rudimentary support for
+non-ASCII characters in identifiers. You may encounter serious
+problems if you use identifiers with characters outside the range of
+'A'-'Z', 'a'-'z', '0'-'9' and the underscore '_'.
+
+ Maybe some of these missing features will be implemented in future
+versions, but since you can always make do without them at minimal
+effort, these todos have very low priority.
+
+ A nasty problem are brace format strings that already contain braces
+as part of the normal text, for example the usage strings typically
+encountered in programs:
+
+ die "usage: $0 {OPTIONS} FILENAME...\n";
+
+ If you want to internationalize this code with Perl brace format
+strings, you will run into a problem:
+
+ die __x ("usage: {program} {OPTIONS} FILENAME...\n", program => $0);
+
+ Whereas `{program}' is a placeholder, `{OPTIONS}' is not and should
+probably be translated. Yet, there is no way to teach the Perl parser
+in `xgettext' to recognize the first one, and leave the other one alone.
+
+ There are two possible work-arounds for this problem. If you are
+sure that your program will run under Perl 5.8.0 or newer (these Perl
+versions handle positional parameters in `printf()') or if you are sure
+that the translator will not have to reorder the arguments in her
+translation - for example if you have only one brace placeholder in
+your string, or if it describes a syntax, like in this one -, you can
+mark the string as `no-perl-brace-format' and use `printf()':
+
+ # xgettext: no-perl-brace-format
+ die sprintf ("usage: %s {OPTIONS} FILENAME...\n", $0);
+
+ If you want to use the more portable Perl brace format, you will
+have to do put placeholders in place of the literal braces:
+
+ die __x ("usage: {program} {[}OPTIONS{]} FILENAME...\n",
+ program => $0, '[' => '{', ']' => '}');
+
+ Perl brace format strings know no escaping mechanism. No matter how
+this escaping mechanism looked like, it would either give the
+programmer a hard time, make translating Perl brace format strings
+heavy-going, or result in a performance penalty at runtime, when the
+format directives get executed. Most of the time you will happily get
+along with `printf()' for this special case.
+
+
+File: gettext.info, Node: PHP, Next: Pike, Prev: Perl, Up: List of Programming Languages
+
+15.5.19 PHP Hypertext Preprocessor
+----------------------------------
+
+RPMs
+ mod_php4, mod_php4-core, phpdoc
+
+File extension
+ `php', `php3', `php4'
+
+String syntax
+ `"abc"', `'abc''
+
+gettext shorthand
+ `_("abc")'
+
+gettext/ngettext functions
+ `gettext', `dgettext', `dcgettext'; starting with PHP 4.2.0 also
+ `ngettext', `dngettext', `dcngettext'
+
+textdomain
+ `textdomain' function
+
+bindtextdomain
+ `bindtextdomain' function
+
+setlocale
+ Programmer must call `setlocale (LC_ALL, "")'
+
+Prerequisite
+ --
+
+Use or emulate GNU gettext
+ use
+
+Extractor
+ `xgettext'
+
+Formatting with positions
+ `printf "%2\$d %1\$d"'
+
+Portability
+ On platforms without gettext, the functions are not available.
+
+po-mode marking
+ --
+
+ An example is available in the `examples' directory: `hello-php'.
+
+
+File: gettext.info, Node: Pike, Next: GCC-source, Prev: PHP, Up: List of Programming Languages
+
+15.5.20 Pike
+------------
+
+RPMs
+ roxen
+
+File extension
+ `pike'
+
+String syntax
+ `"abc"'
+
+gettext shorthand
+ --
+
+gettext/ngettext functions
+ `gettext', `dgettext', `dcgettext'
+
+textdomain
+ `textdomain' function
+
+bindtextdomain
+ `bindtextdomain' function
+
+setlocale
+ `setlocale' function
+
+Prerequisite
+ `import Locale.Gettext;'
+
+Use or emulate GNU gettext
+ use
+
+Extractor
+ --
+
+Formatting with positions
+ --
+
+Portability
+ On platforms without gettext, the functions are not available.
+
+po-mode marking
+ --
+
+
+File: gettext.info, Node: GCC-source, Prev: Pike, Up: List of Programming Languages
+
+15.5.21 GNU Compiler Collection sources
+---------------------------------------
+
+RPMs
+ gcc
+
+File extension
+ `c', `h'.
+
+String syntax
+ `"abc"'
+
+gettext shorthand
+ `_("abc")'
+
+gettext/ngettext functions
+ `gettext', `dgettext', `dcgettext', `ngettext', `dngettext',
+ `dcngettext'
+
+textdomain
+ `textdomain' function
+
+bindtextdomain
+ `bindtextdomain' function
+
+setlocale
+ Programmer must call `setlocale (LC_ALL, "")'
+
+Prerequisite
+ `#include "intl.h"'
+
+Use or emulate GNU gettext
+ Use
+
+Extractor
+ `xgettext -k_'
+
+Formatting with positions
+ --
+
+Portability
+ Uses autoconf macros
+
+po-mode marking
+ yes
+
+
+File: gettext.info, Node: List of Data Formats, Prev: List of Programming Languages, Up: Programming Languages
+
+15.6 Internationalizable Data
+=============================
+
+ Here is a list of other data formats which can be internationalized
+using GNU gettext.
+
+* Menu:
+
+* POT:: POT - Portable Object Template
+* RST:: Resource String Table
+* Glade:: Glade - GNOME user interface description
+
+
+File: gettext.info, Node: POT, Next: RST, Prev: List of Data Formats, Up: List of Data Formats
+
+15.6.1 POT - Portable Object Template
+-------------------------------------
+
+RPMs
+ gettext
+
+File extension
+ `pot', `po'
+
+Extractor
+ `xgettext'
+
+
+File: gettext.info, Node: RST, Next: Glade, Prev: POT, Up: List of Data Formats
+
+15.6.2 Resource String Table
+----------------------------
+
+RPMs
+ fpk
+
+File extension
+ `rst'
+
+Extractor
+ `xgettext', `rstconv'
+
+
+File: gettext.info, Node: Glade, Prev: RST, Up: List of Data Formats
+
+15.6.3 Glade - GNOME user interface description
+-----------------------------------------------
+
+RPMs
+ glade, libglade, glade2, libglade2, intltool
+
+File extension
+ `glade', `glade2'
+
+Extractor
+ `xgettext', `libglade-xgettext', `xml-i18n-extract',
+ `intltool-extract'
+
+
+File: gettext.info, Node: Conclusion, Next: Language Codes, Prev: Programming Languages, Up: Top
+
+16 Concluding Remarks
+*********************
+
+ We would like to conclude this GNU `gettext' manual by presenting an
+history of the Translation Project so far. We finally give a few
+pointers for those who want to do further research or readings about
+Native Language Support matters.
+
+* Menu:
+
+* History:: History of GNU `gettext'
+* References:: Related Readings
+
+
+File: gettext.info, Node: History, Next: References, Prev: Conclusion, Up: Conclusion
+
+16.1 History of GNU `gettext'
+=============================
+
+ Internationalization concerns and algorithms have been informally
+and casually discussed for years in GNU, sometimes around GNU `libc',
+maybe around the incoming `Hurd', or otherwise (nobody clearly
+remembers). And even then, when the work started for real, this was
+somewhat independently of these previous discussions.
+
+ This all began in July 1994, when Patrick D'Cruze had the idea and
+initiative of internationalizing version 3.9.2 of GNU `fileutils'. He
+then asked Jim Meyering, the maintainer, how to get those changes
+folded into an official release. That first draft was full of
+`#ifdef's and somewhat disconcerting, and Jim wanted to find nicer
+ways. Patrick and Jim shared some tries and experimentations in this
+area. Then, feeling that this might eventually have a deeper impact on
+GNU, Jim wanted to know what standards were, and contacted Richard
+Stallman, who very quickly and verbally described an overall design for
+what was meant to become `glocale', at that time.
+
+ Jim implemented `glocale' and got a lot of exhausting feedback from
+Patrick and Richard, of course, but also from Mitchum DSouza (who wrote
+a `catgets'-like package), Roland McGrath, maybe David MacKenzie,
+François Pinard, and Paul Eggert, all pushing and pulling in various
+directions, not always compatible, to the extent that after a couple of
+test releases, `glocale' was torn apart. In particular, Paul Eggert -
+always keeping an eye on developments in Solaris - advocated the use of
+the `gettext' API over `glocale''s `catgets'-based API.
+
+ While Jim took some distance and time and became dad for a second
+time, Roland wanted to get GNU `libc' internationalized, and got Ulrich
+Drepper involved in that project. Instead of starting from `glocale',
+Ulrich rewrote something from scratch, but more conforming to the set
+of guidelines who emerged out of the `glocale' effort. Then, Ulrich
+got people from the previous forum to involve themselves into this new
+project, and the switch from `glocale' to what was first named
+`msgutils', renamed `nlsutils', and later `gettext', became officially
+accepted by Richard in May 1995 or so.
+
+ Let's summarize by saying that Ulrich Drepper wrote GNU `gettext' in
+April 1995. The first official release of the package, including PO
+mode, occurred in July 1995, and was numbered 0.7. Other people
+contributed to the effort by providing a discussion forum around
+Ulrich, writing little pieces of code, or testing. These are quoted in
+the `THANKS' file which comes with the GNU `gettext' distribution.
+
+ While this was being done, François adapted half a dozen of GNU
+packages to `glocale' first, then later to `gettext', putting them in
+pretest, so providing along the way an effective user environment for
+fine tuning the evolving tools. He also took the responsibility of
+organizing and coordinating the Translation Project. After nearly a
+year of informal exchanges between people from many countries,
+translator teams started to exist in May 1995, through the creation and
+support by Patrick D'Cruze of twenty unmoderated mailing lists for that
+many native languages, and two moderated lists: one for reaching all
+teams at once, the other for reaching all willing maintainers of
+internationalized free software packages.
+
+ François also wrote PO mode in June 1995 with the collaboration of
+Greg McGary, as a kind of contribution to Ulrich's package. He also
+gave a hand with the GNU `gettext' Texinfo manual.
+
+ In 1997, Ulrich Drepper released the GNU libc 2.0, which included the
+`gettext', `textdomain' and `bindtextdomain' functions.
+
+ In 2000, Ulrich Drepper added plural form handling (the `ngettext'
+function) to GNU libc. Later, in 2001, he released GNU libc 2.2.x,
+which is the first free C library with full internationalization
+support.
+
+ Ulrich being quite busy in his role of General Maintainer of GNU
+libc, he handed over the GNU `gettext' maintenance to Bruno Haible in
+2000. Bruno added the plural form handling to the tools as well, added
+support for UTF-8 and CJK locales, and wrote a few new tools for
+manipulating PO files.
+
+
+File: gettext.info, Node: References, Prev: History, Up: Conclusion
+
+16.2 Related Readings
+=====================
+
+ * NOTE: * This documentation section is outdated and needs to be
+revised.
+
+ Eugene H. Dorr (`dorre@well.com') maintains an interesting
+bibliography on internationalization matters, called
+`Internationalization Reference List', which is available as:
+ ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/i18n-books.txt
+
+ Michael Gschwind (`mike@vlsivie.tuwien.ac.at') maintains a
+Frequently Asked Questions (FAQ) list, entitled `Programming for
+Internationalisation'. This FAQ discusses writing programs which can
+handle different language conventions, character sets, etc.; and is
+applicable to all character set encodings, with particular emphasis on
+ISO 8859-1. It is regularly published in Usenet groups
+`comp.unix.questions', `comp.std.internat',
+`comp.software.international', `comp.lang.c', `comp.windows.x',
+`comp.std.c', `comp.answers' and `news.answers'. The home location of
+this document is:
+ ftp://ftp.vlsivie.tuwien.ac.at/pub/8bit/ISO-programming
+
+ Patrick D'Cruze (`pdcruze@li.org') wrote a tutorial about NLS
+matters, and Jochen Hein (`Hein@student.tu-clausthal.de') took over the
+responsibility of maintaining it. It may be found as:
+ ftp://sunsite.unc.edu/pub/Linux/utils/nls/catalogs/Incoming/...
+ ...locale-tutorial-0.8.txt.gz
+ This site is mirrored in:
+ ftp://ftp.ibp.fr/pub/linux/sunsite/
+
+ A French version of the same tutorial should be findable at:
+ ftp://ftp.ibp.fr/pub/linux/french/docs/
+ together with French translations of many Linux-related documents.
+
+
+File: gettext.info, Node: Language Codes, Next: Country Codes, Prev: Conclusion, Up: Top
+
+Appendix A Language Codes
+*************************
+
+ The ISO 639 standard defines two-letter codes for many languages, and
+three-letter codes for more rarely used languages. All abbreviations
+for languages used in the Translation Project should come from this
+standard.
+
+* Menu:
+
+* Usual Language Codes:: Two-letter ISO 639 language codes
+* Rare Language Codes:: Three-letter ISO 639 language codes
+
+
+File: gettext.info, Node: Usual Language Codes, Next: Rare Language Codes, Prev: Language Codes, Up: Language Codes
+
+A.1 Usual Language Codes
+========================
+
+ For the commonly used languages, the ISO 639-1 standard defines
+two-letter codes.
+
+`aa'
+ Afar.
+
+`ab'
+ Abkhazian.
+
+`ae'
+ Avestan.
+
+`af'
+ Afrikaans.
+
+`ak'
+ Akan.
+
+`am'
+ Amharic.
+
+`an'
+ Aragonese.
+
+`ar'
+ Arabic.
+
+`as'
+ Assamese.
+
+`av'
+ Avaric.
+
+`ay'
+ Aymara.
+
+`az'
+ Azerbaijani.
+
+`ba'
+ Bashkir.
+
+`be'
+ Belarusian.
+
+`bg'
+ Bulgarian.
+
+`bh'
+ Bihari.
+
+`bi'
+ Bislama.
+
+`bm'
+ Bambara.
+
+`bn'
+ Bengali; Bangla.
+
+`bo'
+ Tibetan.
+
+`br'
+ Breton.
+
+`bs'
+ Bosnian.
+
+`ca'
+ Catalan.
+
+`ce'
+ Chechen.
+
+`ch'
+ Chamorro.
+
+`co'
+ Corsican.
+
+`cr'
+ Cree.
+
+`cs'
+ Czech.
+
+`cu'
+ Church Slavic.
+
+`cv'
+ Chuvash.
+
+`cy'
+ Welsh.
+
+`da'
+ Danish.
+
+`de'
+ German.
+
+`dv'
+ Divehi; Maldivian.
+
+`dz'
+ Dzongkha; Bhutani.
+
+`ee'
+ Éwé.
+
+`el'
+ Greek.
+
+`en'
+ English.
+
+`eo'
+ Esperanto.
+
+`es'
+ Spanish.
+
+`et'
+ Estonian.
+
+`eu'
+ Basque.
+
+`fa'
+ Persian.
+
+`ff'
+ Fulah.
+
+`fi'
+ Finnish.
+
+`fj'
+ Fijian; Fiji.
+
+`fo'
+ Faroese.
+
+`fr'
+ French.
+
+`fy'
+ Western Frisian.
+
+`ga'
+ Irish.
+
+`gd'
+ Scottish Gaelic.
+
+`gl'
+ Galician.
+
+`gn'
+ Guarani.
+
+`gu'
+ Gujarati.
+
+`gv'
+ Manx.
+
+`ha'
+ Hausa.
+
+`he'
+ Hebrew (formerly iw).
+
+`hi'
+ Hindi.
+
+`ho'
+ Hiri Motu.
+
+`hr'
+ Croatian.
+
+`ht'
+ Haitian; Haitian Creole.
+
+`hu'
+ Hungarian.
+
+`hy'
+ Armenian.
+
+`hz'
+ Herero.
+
+`ia'
+ Interlingua.
+
+`id'
+ Indonesian (formerly in).
+
+`ie'
+ Interlingue; Occidental.
+
+`ig'
+ Igbo.
+
+`ii'
+ Sichuan Yi; Nuosu.
+
+`ik'
+ Inupiak; Inupiaq.
+
+`io'
+ Ido.
+
+`is'
+ Icelandic.
+
+`it'
+ Italian.
+
+`iu'
+ Inuktitut.
+
+`ja'
+ Japanese.
+
+`jv'
+ Javanese.
+
+`ka'
+ Georgian.
+
+`kg'
+ Kongo.
+
+`ki'
+ Kikuyu; Gikuyu.
+
+`kj'
+ Kuanyama; Kwanyama.
+
+`kk'
+ Kazakh.
+
+`kl'
+ Kalaallisut; Greenlandic.
+
+`km'
+ Central Khmer; Cambodian.
+
+`kn'
+ Kannada.
+
+`ko'
+ Korean.
+
+`kr'
+ Kanuri.
+
+`ks'
+ Kashmiri.
+
+`ku'
+ Kurdish.
+
+`kv'
+ Komi.
+
+`kw'
+ Cornish.
+
+`ky'
+ Kirghiz.
+
+`la'
+ Latin.
+
+`lb'
+ Letzeburgesch; Luxembourgish.
+
+`lg'
+ Ganda.
+
+`li'
+ Limburgish; Limburger; Limburgan.
+
+`ln'
+ Lingala.
+
+`lo'
+ Lao; Laotian.
+
+`lt'
+ Lithuanian.
+
+`lu'
+ Luba-Katanga.
+
+`lv'
+ Latvian; Lettish.
+
+`mg'
+ Malagasy.
+
+`mh'
+ Marshallese.
+
+`mi'
+ Maori.
+
+`mk'
+ Macedonian.
+
+`ml'
+ Malayalam.
+
+`mn'
+ Mongolian.
+
+`mo'
+ Moldavian.
+
+`mr'
+ Marathi.
+
+`ms'
+ Malay.
+
+`mt'
+ Maltese.
+
+`my'
+ Burmese.
+
+`na'
+ Nauru.
+
+`nb'
+ Norwegian Bokmål.
+
+`nd'
+ Ndebele, North.
+
+`ne'
+ Nepali.
+
+`ng'
+ Ndonga.
+
+`nl'
+ Dutch.
+
+`nn'
+ Norwegian Nynorsk.
+
+`no'
+ Norwegian.
+
+`nr'
+ Ndebele, South.
+
+`nv'
+ Navajo; Navaho.
+
+`ny'
+ Chichewa; Nyanja.
+
+`oc'
+ Occitan; Provençal.
+
+`oj'
+ Ojibwa.
+
+`om'
+ (Afan) Oromo.
+
+`or'
+ Oriya.
+
+`os'
+ Ossetian; Ossetic.
+
+`pa'
+ Panjabi; Punjabi.
+
+`pi'
+ Pali.
+
+`pl'
+ Polish.
+
+`ps'
+ Pashto; Pushto.
+
+`pt'
+ Portuguese.
+
+`qu'
+ Quechua.
+
+`rm'
+ Romansh.
+
+`rn'
+ Rundi; Kirundi.
+
+`ro'
+ Romanian.
+
+`ru'
+ Russian.
+
+`rw'
+ Kinyarwanda.
+
+`sa'
+ Sanskrit.
+
+`sc'
+ Sardinian.
+
+`sd'
+ Sindhi.
+
+`se'
+ Northern Sami.
+
+`sg'
+ Sango; Sangro.
+
+`si'
+ Sinhala; Sinhalese.
+
+`sk'
+ Slovak.
+
+`sl'
+ Slovenian.
+
+`sm'
+ Samoan.
+
+`sn'
+ Shona.
+
+`so'
+ Somali.
+
+`sq'
+ Albanian.
+
+`sr'
+ Serbian.
+
+`ss'
+ Swati; Siswati.
+
+`st'
+ Sesotho; Sotho, Southern.
+
+`su'
+ Sundanese.
+
+`sv'
+ Swedish.
+
+`sw'
+ Swahili.
+
+`ta'
+ Tamil.
+
+`te'
+ Telugu.
+
+`tg'
+ Tajik.
+
+`th'
+ Thai.
+
+`ti'
+ Tigrinya.
+
+`tk'
+ Turkmen.
+
+`tl'
+ Tagalog.
+
+`tn'
+ Tswana; Setswana.
+
+`to'
+ Tonga.
+
+`tr'
+ Turkish.
+
+`ts'
+ Tsonga.
+
+`tt'
+ Tatar.
+
+`tw'
+ Twi.
+
+`ty'
+ Tahitian.
+
+`ug'
+ Uighur.
+
+`uk'
+ Ukrainian.
+
+`ur'
+ Urdu.
+
+`uz'
+ Uzbek.
+
+`ve'
+ Venda.
+
+`vi'
+ Vietnamese.
+
+`vo'
+ Volapük; Volapuk.
+
+`wa'
+ Walloon.
+
+`wo'
+ Wolof.
+
+`xh'
+ Xhosa.
+
+`yi'
+ Yiddish (formerly ji).
+
+`yo'
+ Yoruba.
+
+`za'
+ Zhuang.
+
+`zh'
+ Chinese.
+
+`zu'
+ Zulu.
+
+
+File: gettext.info, Node: Rare Language Codes, Prev: Usual Language Codes, Up: Language Codes
+
+A.2 Rare Language Codes
+=======================
+
+ For rarely used languages, the ISO 639-2 standard defines
+three-letter codes. Here is the current list, reduced to only living
+languages with at least one million of speakers.
+
+`ace'
+ Achinese.
+
+`awa'
+ Awadhi.
+
+`bal'
+ Baluchi.
+
+`ban'
+ Balinese.
+
+`bej'
+ Beja; Bedawiyet.
+
+`bem'
+ Bemba.
+
+`bho'
+ Bhojpuri.
+
+`bik'
+ Bikol.
+
+`bin'
+ Bini; Edo.
+
+`bug'
+ Buginese.
+
+`ceb'
+ Cebuano.
+
+`din'
+ Dinka.
+
+`doi'
+ Dogri.
+
+`fil'
+ Filipino; Pilipino.
+
+`fon'
+ Fon.
+
+`gon'
+ Gondi.
+
+`gsw'
+ Swiss German; Alemannic; Alsatian.
+
+`hil'
+ Hiligaynon.
+
+`hmn'
+ Hmong.
+
+`ilo'
+ Iloko.
+
+`kab'
+ Kabyle.
+
+`kam'
+ Kamba.
+
+`kbd'
+ Kabardian.
+
+`kmb'
+ Kimbundu.
+
+`kok'
+ Konkani.
+
+`kru'
+ Kurukh.
+
+`lua'
+ Luba-Lulua.
+
+`luo'
+ Luo (Kenya and Tanzania).
+
+`mad'
+ Madurese.
+
+`mag'
+ Magahi.
+
+`mai'
+ Maithili.
+
+`mak'
+ Makasar.
+
+`man'
+ Mandingo.
+
+`men'
+ Mende.
+
+`min'
+ Minangkabau.
+
+`mni'
+ Manipuri.
+
+`mos'
+ Mossi.
+
+`mwr'
+ Marwari.
+
+`nap'
+ Neapolitan.
+
+`nso'
+ Pedi; Sepedi; Northern Sotho.
+
+`nym'
+ Nyamwezi.
+
+`nyn'
+ Nyankole.
+
+`pag'
+ Pangasinan.
+
+`pam'
+ Pampanga; Kapampangan.
+
+`raj'
+ Rajasthani.
+
+`sas'
+ Sasak.
+
+`sat'
+ Santali.
+
+`scn'
+ Sicilian.
+
+`shn'
+ Shan.
+
+`sid'
+ Sidamo.
+
+`srr'
+ Serer.
+
+`suk'
+ Sukuma.
+
+`sus'
+ Susu.
+
+`tem'
+ Timne.
+
+`tiv'
+ Tiv.
+
+`tum'
+ Tumbuka.
+
+`umb'
+ Umbundu.
+
+`wal'
+ Walamo.
+
+`war'
+ Waray.
+
+`yao'
+ Yao.
+
+
+File: gettext.info, Node: Country Codes, Next: Licenses, Prev: Language Codes, Up: Top
+
+Appendix B Country Codes
+************************
+
+ The ISO 3166 standard defines two character codes for many countries
+and territories. All abbreviations for countries used in the
+Translation Project should come from this standard.
+
+`AD'
+ Andorra.
+
+`AE'
+ United Arab Emirates.
+
+`AF'
+ Afghanistan.
+
+`AG'
+ Antigua and Barbuda.
+
+`AI'
+ Anguilla.
+
+`AL'
+ Albania.
+
+`AM'
+ Armenia.
+
+`AN'
+ Netherlands Antilles.
+
+`AO'
+ Angola.
+
+`AQ'
+ Antarctica.
+
+`AR'
+ Argentina.
+
+`AS'
+ Samoa (American).
+
+`AT'
+ Austria.
+
+`AU'
+ Australia.
+
+`AW'
+ Aruba.
+
+`AX'
+ Aaland Islands.
+
+`AZ'
+ Azerbaijan.
+
+`BA'
+ Bosnia and Herzegovina.
+
+`BB'
+ Barbados.
+
+`BD'
+ Bangladesh.
+
+`BE'
+ Belgium.
+
+`BF'
+ Burkina Faso.
+
+`BG'
+ Bulgaria.
+
+`BH'
+ Bahrain.
+
+`BI'
+ Burundi.
+
+`BJ'
+ Benin.
+
+`BM'
+ Bermuda.
+
+`BN'
+ Brunei.
+
+`BO'
+ Bolivia.
+
+`BR'
+ Brazil.
+
+`BS'
+ Bahamas.
+
+`BT'
+ Bhutan.
+
+`BV'
+ Bouvet Island.
+
+`BW'
+ Botswana.
+
+`BY'
+ Belarus.
+
+`BZ'
+ Belize.
+
+`CA'
+ Canada.
+
+`CC'
+ Cocos (Keeling) Islands.
+
+`CD'
+ Congo (Dem. Rep.).
+
+`CF'
+ Central African Republic.
+
+`CG'
+ Congo (Rep.).
+
+`CH'
+ Switzerland.
+
+`CI'
+ Côte d'Ivoire.
+
+`CK'
+ Cook Islands.
+
+`CL'
+ Chile.
+
+`CM'
+ Cameroon.
+
+`CN'
+ China.
+
+`CO'
+ Colombia.
+
+`CR'
+ Costa Rica.
+
+`CU'
+ Cuba.
+
+`CV'
+ Cape Verde.
+
+`CX'
+ Christmas Island.
+
+`CY'
+ Cyprus.
+
+`CZ'
+ Czech Republic.
+
+`DE'
+ Germany.
+
+`DJ'
+ Djibouti.
+
+`DK'
+ Denmark.
+
+`DM'
+ Dominica.
+
+`DO'
+ Dominican Republic.
+
+`DZ'
+ Algeria.
+
+`EC'
+ Ecuador.
+
+`EE'
+ Estonia.
+
+`EG'
+ Egypt.
+
+`EH'
+ Western Sahara.
+
+`ER'
+ Eritrea.
+
+`ES'
+ Spain.
+
+`ET'
+ Ethiopia.
+
+`FI'
+ Finland.
+
+`FJ'
+ Fiji.
+
+`FK'
+ Falkland Islands.
+
+`FM'
+ Micronesia.
+
+`FO'
+ Faeroe Islands.
+
+`FR'
+ France.
+
+`GA'
+ Gabon.
+
+`GB'
+ Britain (United Kingdom).
+
+`GD'
+ Grenada.
+
+`GE'
+ Georgia.
+
+`GF'
+ French Guiana.
+
+`GG'
+ Guernsey.
+
+`GH'
+ Ghana.
+
+`GI'
+ Gibraltar.
+
+`GL'
+ Greenland.
+
+`GM'
+ Gambia.
+
+`GN'
+ Guinea.
+
+`GP'
+ Guadeloupe.
+
+`GQ'
+ Equatorial Guinea.
+
+`GR'
+ Greece.
+
+`GS'
+ South Georgia and the South Sandwich Islands.
+
+`GT'
+ Guatemala.
+
+`GU'
+ Guam.
+
+`GW'
+ Guinea-Bissau.
+
+`GY'
+ Guyana.
+
+`HK'
+ Hong Kong.
+
+`HM'
+ Heard Island and McDonald Islands.
+
+`HN'
+ Honduras.
+
+`HR'
+ Croatia.
+
+`HT'
+ Haiti.
+
+`HU'
+ Hungary.
+
+`ID'
+ Indonesia.
+
+`IE'
+ Ireland.
+
+`IL'
+ Israel.
+
+`IM'
+ Isle of Man.
+
+`IN'
+ India.
+
+`IO'
+ British Indian Ocean Territory.
+
+`IQ'
+ Iraq.
+
+`IR'
+ Iran.
+
+`IS'
+ Iceland.
+
+`IT'
+ Italy.
+
+`JE'
+ Jersey.
+
+`JM'
+ Jamaica.
+
+`JO'
+ Jordan.
+
+`JP'
+ Japan.
+
+`KE'
+ Kenya.
+
+`KG'
+ Kyrgyzstan.
+
+`KH'
+ Cambodia.
+
+`KI'
+ Kiribati.
+
+`KM'
+ Comoros.
+
+`KN'
+ St Kitts and Nevis.
+
+`KP'
+ Korea (North).
+
+`KR'
+ Korea (South).
+
+`KW'
+ Kuwait.
+
+`KY'
+ Cayman Islands.
+
+`KZ'
+ Kazakhstan.
+
+`LA'
+ Laos.
+
+`LB'
+ Lebanon.
+
+`LC'
+ St Lucia.
+
+`LI'
+ Liechtenstein.
+
+`LK'
+ Sri Lanka.
+
+`LR'
+ Liberia.
+
+`LS'
+ Lesotho.
+
+`LT'
+ Lithuania.
+
+`LU'
+ Luxembourg.
+
+`LV'
+ Latvia.
+
+`LY'
+ Libya.
+
+`MA'
+ Morocco.
+
+`MC'
+ Monaco.
+
+`MD'
+ Moldova.
+
+`ME'
+ Montenegro.
+
+`MG'
+ Madagascar.
+
+`MH'
+ Marshall Islands.
+
+`MK'
+ Macedonia.
+
+`ML'
+ Mali.
+
+`MM'
+ Myanmar (Burma).
+
+`MN'
+ Mongolia.
+
+`MO'
+ Macao.
+
+`MP'
+ Northern Mariana Islands.
+
+`MQ'
+ Martinique.
+
+`MR'
+ Mauritania.
+
+`MS'
+ Montserrat.
+
+`MT'
+ Malta.
+
+`MU'
+ Mauritius.
+
+`MV'
+ Maldives.
+
+`MW'
+ Malawi.
+
+`MX'
+ Mexico.
+
+`MY'
+ Malaysia.
+
+`MZ'
+ Mozambique.
+
+`NA'
+ Namibia.
+
+`NC'
+ New Caledonia.
+
+`NE'
+ Niger.
+
+`NF'
+ Norfolk Island.
+
+`NG'
+ Nigeria.
+
+`NI'
+ Nicaragua.
+
+`NL'
+ Netherlands.
+
+`NO'
+ Norway.
+
+`NP'
+ Nepal.
+
+`NR'
+ Nauru.
+
+`NU'
+ Niue.
+
+`NZ'
+ New Zealand.
+
+`OM'
+ Oman.
+
+`PA'
+ Panama.
+
+`PE'
+ Peru.
+
+`PF'
+ French Polynesia.
+
+`PG'
+ Papua New Guinea.
+
+`PH'
+ Philippines.
+
+`PK'
+ Pakistan.
+
+`PL'
+ Poland.
+
+`PM'
+ St Pierre and Miquelon.
+
+`PN'
+ Pitcairn.
+
+`PR'
+ Puerto Rico.
+
+`PS'
+ Palestine.
+
+`PT'
+ Portugal.
+
+`PW'
+ Palau.
+
+`PY'
+ Paraguay.
+
+`QA'
+ Qatar.
+
+`RE'
+ Reunion.
+
+`RO'
+ Romania.
+
+`RS'
+ Serbia.
+
+`RU'
+ Russia.
+
+`RW'
+ Rwanda.
+
+`SA'
+ Saudi Arabia.
+
+`SB'
+ Solomon Islands.
+
+`SC'
+ Seychelles.
+
+`SD'
+ Sudan.
+
+`SE'
+ Sweden.
+
+`SG'
+ Singapore.
+
+`SH'
+ St Helena.
+
+`SI'
+ Slovenia.
+
+`SJ'
+ Svalbard and Jan Mayen.
+
+`SK'
+ Slovakia.
+
+`SL'
+ Sierra Leone.
+
+`SM'
+ San Marino.
+
+`SN'
+ Senegal.
+
+`SO'
+ Somalia.
+
+`SR'
+ Suriname.
+
+`ST'
+ Sao Tome and Principe.
+
+`SV'
+ El Salvador.
+
+`SY'
+ Syria.
+
+`SZ'
+ Swaziland.
+
+`TC'
+ Turks and Caicos Islands.
+
+`TD'
+ Chad.
+
+`TF'
+ French Southern and Antarctic Lands.
+
+`TG'
+ Togo.
+
+`TH'
+ Thailand.
+
+`TJ'
+ Tajikistan.
+
+`TK'
+ Tokelau.
+
+`TL'
+ Timor-Leste.
+
+`TM'
+ Turkmenistan.
+
+`TN'
+ Tunisia.
+
+`TO'
+ Tonga.
+
+`TR'
+ Turkey.
+
+`TT'
+ Trinidad and Tobago.
+
+`TV'
+ Tuvalu.
+
+`TW'
+ Taiwan.
+
+`TZ'
+ Tanzania.
+
+`UA'
+ Ukraine.
+
+`UG'
+ Uganda.
+
+`UM'
+ US minor outlying islands.
+
+`US'
+ United States.
+
+`UY'
+ Uruguay.
+
+`UZ'
+ Uzbekistan.
+
+`VA'
+ Vatican City.
+
+`VC'
+ St Vincent and the Grenadines.
+
+`VE'
+ Venezuela.
+
+`VG'
+ Virgin Islands (UK).
+
+`VI'
+ Virgin Islands (US).
+
+`VN'
+ Vietnam.
+
+`VU'
+ Vanuatu.
+
+`WF'
+ Wallis and Futuna.
+
+`WS'
+ Samoa (Western).
+
+`YE'
+ Yemen.
+
+`YT'
+ Mayotte.
+
+`ZA'
+ South Africa.
+
+`ZM'
+ Zambia.
+
+`ZW'
+ Zimbabwe.
+
+
+File: gettext.info, Node: Licenses, Next: Program Index, Prev: Country Codes, Up: Top
+
+Appendix C Licenses
+*******************
+
+ The files of this package are covered by the licenses indicated in
+each particular file or directory. Here is a summary:
+
+ * The `libintl' and `libasprintf' libraries are covered by the GNU
+ Library General Public License (LGPL). A copy of the license is
+ included in *note GNU LGPL::.
+
+ * The executable programs of this package and the `libgettextpo'
+ library are covered by the GNU General Public License (GPL). A
+ copy of the license is included in *note GNU GPL::.
+
+ * This manual is free documentation. It is dually licensed under the
+ GNU FDL and the GNU GPL. This means that you can redistribute this
+ manual under either of these two licenses, at your choice.
+ This manual is covered by the GNU FDL. Permission is granted to
+ copy, distribute and/or modify this document under the terms of the
+ GNU Free Documentation License (FDL), either version 1.2 of the
+ License, or (at your option) any later version published by the
+ Free Software Foundation (FSF); with no Invariant Sections, with no
+ Front-Cover Text, and with no Back-Cover Texts. A copy of the
+ license is included in *note GNU FDL::.
+ This manual is covered by the GNU GPL. You can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ (GPL), either version 2 of the License, or (at your option) any
+ later version published by the Free Software Foundation (FSF). A
+ copy of the license is included in *note GNU GPL::.
+
+* Menu:
+
+* GNU GPL:: GNU General Public License
+* GNU LGPL:: GNU Lesser General Public License
+* GNU FDL:: GNU Free Documentation License
+
+
+File: gettext.info, Node: GNU GPL, Next: GNU LGPL, Up: Licenses
+
+C.1 GNU GENERAL PUBLIC LICENSE
+==============================
+
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+--------
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it in
+new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software,
+and (2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains a
+ notice placed by the copyright holder saying it may be distributed
+ under the terms of this General Public License. The "Program",
+ below, refers to any such program or work, and a "work based on
+ the Program" means either the Program or any derivative work under
+ copyright law: that is to say, a work containing the Program or a
+ portion of it, either verbatim or with modifications and/or
+ translated into another language. (Hereinafter, translation is
+ included without limitation in the term "modification".) Each
+ licensee is addressed as "you".
+
+ Activities other than copying, distribution and modification are
+ not covered by this License; they are outside its scope. The act
+ of running the Program is not restricted, and the output from the
+ Program is covered only if its contents constitute a work based on
+ the Program (independent of having been made by running the
+ Program). Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+ source code as you receive it, in any medium, provided that you
+ conspicuously and appropriately publish on each copy an appropriate
+ copyright notice and disclaimer of warranty; keep intact all the
+ notices that refer to this License and to the absence of any
+ warranty; and give any other recipients of the Program a copy of
+ this License along with the Program.
+
+ You may charge a fee for the physical act of transferring a copy,
+ and you may at your option offer warranty protection in exchange
+ for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+ of it, thus forming a work based on the Program, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+
+ a. You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b. You must cause any work that you distribute or publish, that
+ in whole or in part contains or is derived from the Program
+ or any part thereof, to be licensed as a whole at no charge
+ to all third parties under the terms of this License.
+
+ c. If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display
+ an announcement including an appropriate copyright notice and
+ a notice that there is no warranty (or else, saying that you
+ provide a warranty) and that users may redistribute the
+ program under these conditions, and telling the user how to
+ view a copy of this License. (Exception: if the Program
+ itself is interactive but does not normally print such an
+ announcement, your work based on the Program is not required
+ to print an announcement.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the
+ Program, and can be reasonably considered independent and separate
+ works in themselves, then this License, and its terms, do not
+ apply to those sections when you distribute them as separate
+ works. But when you distribute the same sections as part of a
+ whole which is a work based on the Program, the distribution of
+ the whole must be on the terms of this License, whose permissions
+ for other licensees extend to the entire whole, and thus to each
+ and every part regardless of who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or
+ contest your rights to work written entirely by you; rather, the
+ intent is to exercise the right to control the distribution of
+ derivative or collective works based on the Program.
+
+ In addition, mere aggregation of another work not based on the
+ Program with the Program (or with a work based on the Program) on
+ a volume of a storage or distribution medium does not bring the
+ other work under the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+ under Section 2) in object code or executable form under the terms
+ of Sections 1 and 2 above provided that you also do one of the
+ following:
+
+ a. Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of
+ Sections 1 and 2 above on a medium customarily used for
+ software interchange; or,
+
+ b. Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a
+ medium customarily used for software interchange; or,
+
+ c. Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with
+ such an offer, in accord with Subsection b above.)
+
+ The source code for a work means the preferred form of the work for
+ making modifications to it. For an executable work, complete
+ source code means all the source code for all modules it contains,
+ plus any associated interface definition files, plus the scripts
+ used to control compilation and installation of the executable.
+ However, as a special exception, the source code distributed need
+ not include anything that is normally distributed (in either
+ source or binary form) with the major components (compiler,
+ kernel, and so on) of the operating system on which the executable
+ runs, unless that component itself accompanies the executable.
+
+ If distribution of executable or object code is made by offering
+ access to copy from a designated place, then offering equivalent
+ access to copy the source code from the same place counts as
+ distribution of the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense or distribute the Program is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights,
+ from you under this License will not have their licenses
+ terminated so long as such parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify
+ or distribute the Program or its derivative works. These actions
+ are prohibited by law if you do not accept this License.
+ Therefore, by modifying or distributing the Program (or any work
+ based on the Program), you indicate your acceptance of this
+ License to do so, and all its terms and conditions for copying,
+ distributing or modifying the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+ Program), the recipient automatically receives a license from the
+ original licensor to copy, distribute or modify the Program
+ subject to these terms and conditions. You may not impose any
+ further restrictions on the recipients' exercise of the rights
+ granted herein. You are not responsible for enforcing compliance
+ by third parties to this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent
+ issues), conditions are imposed on you (whether by court order,
+ agreement or otherwise) that contradict the conditions of this
+ License, they do not excuse you from the conditions of this
+ License. If you cannot distribute so as to satisfy simultaneously
+ your obligations under this License and any other pertinent
+ obligations, then as a consequence you may not distribute the
+ Program at all. For example, if a patent license would not permit
+ royalty-free redistribution of the Program by all those who
+ receive copies directly or indirectly through you, then the only
+ way you could satisfy both it and this License would be to refrain
+ entirely from distribution of the Program.
+
+ If any portion of this section is held invalid or unenforceable
+ under any particular circumstance, the balance of the section is
+ intended to apply and the section as a whole is intended to apply
+ in other circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of
+ any such claims; this section has the sole purpose of protecting
+ the integrity of the free software distribution system, which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is
+ willing to distribute software through any other system and a
+ licensee cannot impose that choice.
+
+ This section is intended to make thoroughly clear what is believed
+ to be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces,
+ the original copyright holder who places the Program under this
+ License may add an explicit geographical distribution limitation
+ excluding those countries, so that distribution is permitted only
+ in or among countries not thus excluded. In such case, this
+ License incorporates the limitation as if written in the body of
+ this License.
+
+ 9. The Free Software Foundation may publish revised and/or new
+ versions of the General Public License from time to time. Such
+ new versions will be similar in spirit to the present version, but
+ may differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+ Program specifies a version number of this License which applies
+ to it and "any later version", you have the option of following
+ the terms and conditions either of that version or of any later
+ version published by the Free Software Foundation. If the Program
+ does not specify a version number of this License, you may choose
+ any version ever published by the Free Software Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+ programs whose distribution conditions are different, write to the
+ author to ask for permission. For software which is copyrighted
+ by the Free Software Foundation, write to the Free Software
+ Foundation; we sometimes make exceptions for this. Our decision
+ will be guided by the two goals of preserving the free status of
+ all derivatives of our free software and of promoting the sharing
+ and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+ WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+ LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
+ WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
+ NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
+ QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
+ SERVICING, REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
+ MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
+ LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+ INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+ INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
+ OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
+ OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+Appendix: How to Apply These Terms to Your New Programs
+-------------------------------------------------------
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
+ Copyright (C) YYYY NAME OF AUTHOR
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ Also add information on how to contact you by electronic and paper
+mail.
+
+ If the program is interactive, make it output a short notice like
+this when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+ The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than `show w' and `show
+c'; they could even be mouse-clicks or menu items--whatever suits your
+program.
+
+ You should also get your employer (if you work as a programmer) or
+your school, if any, to sign a "copyright disclaimer" for the program,
+if necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ SIGNATURE OF TY COON, 1 April 1989
+ Ty Coon, President of Vice
+
+ This General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use the
+GNU Library General Public License instead of this License.
+
+
+File: gettext.info, Node: GNU LGPL, Next: GNU FDL, Prev: GNU GPL, Up: Licenses
+
+C.2 GNU LESSER GENERAL PUBLIC LICENSE
+=====================================
+
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ [This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence the
+ version number 2.1.]
+
+Preamble
+--------
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software--typically libraries--of the Free
+Software Foundation and other authors who decide to use it. You can use
+it too, but we suggest you first think carefully about whether this
+license or the ordinary General Public License is the better strategy to
+use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of it
+in new free programs; and that you are informed that you can do these
+things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know that
+what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and is
+quite different from the ordinary General Public License. We use this
+license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does _Less_ to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it
+becomes a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of free
+software. For example, permission to use the GNU C Library in non-free
+programs enables many more people to use the whole GNU operating
+system, as well as its variant, the GNU/Linux operating system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run that
+program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+ program which contains a notice placed by the copyright holder or
+ other authorized party saying it may be distributed under the
+ terms of this Lesser General Public License (also called "this
+ License"). Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+ prepared so as to be conveniently linked with application programs
+ (which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+ which has been distributed under these terms. A "work based on the
+ Library" means either the Library or any derivative work under
+ copyright law: that is to say, a work containing the Library or a
+ portion of it, either verbatim or with modifications and/or
+ translated straightforwardly into another language. (Hereinafter,
+ translation is included without limitation in the term
+ "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+ making modifications to it. For a library, complete source code
+ means all the source code for all modules it contains, plus any
+ associated interface definition files, plus the scripts used to
+ control compilation and installation of the library.
+
+ Activities other than copying, distribution and modification are
+ not covered by this License; they are outside its scope. The act
+ of running a program using the Library is not restricted, and
+ output from such a program is covered only if its contents
+ constitute a work based on the Library (independent of the use of
+ the Library in a tool for writing it). Whether that is true
+ depends on what the Library does and what the program that uses
+ the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+ complete source code as you receive it, in any medium, provided
+ that you conspicuously and appropriately publish on each copy an
+ appropriate copyright notice and disclaimer of warranty; keep
+ intact all the notices that refer to this License and to the
+ absence of any warranty; and distribute a copy of this License
+ along with the Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+ and you may at your option offer warranty protection in exchange
+ for a fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+ of it, thus forming a work based on the Library, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+
+ a. The modified work must itself be a software library.
+
+ b. You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c. You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d. If a facility in the modified Library refers to a function or
+ a table of data to be supplied by an application program that
+ uses the facility, other than as an argument passed when the
+ facility is invoked, then you must make a good faith effort
+ to ensure that, in the event an application does not supply
+ such function or table, the facility still operates, and
+ performs whatever part of its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots
+ has a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function
+ must be optional: if the application does not supply it, the
+ square root function must still compute square roots.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the
+ Library, and can be reasonably considered independent and separate
+ works in themselves, then this License, and its terms, do not
+ apply to those sections when you distribute them as separate
+ works. But when you distribute the same sections as part of a
+ whole which is a work based on the Library, the distribution of
+ the whole must be on the terms of this License, whose permissions
+ for other licensees extend to the entire whole, and thus to each
+ and every part regardless of who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or
+ contest your rights to work written entirely by you; rather, the
+ intent is to exercise the right to control the distribution of
+ derivative or collective works based on the Library.
+
+ In addition, mere aggregation of another work not based on the
+ Library with the Library (or with a work based on the Library) on
+ a volume of a storage or distribution medium does not bring the
+ other work under the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+ License instead of this License to a given copy of the Library.
+ To do this, you must alter all the notices that refer to this
+ License, so that they refer to the ordinary GNU General Public
+ License, version 2, instead of to this License. (If a newer
+ version than version 2 of the ordinary GNU General Public License
+ has appeared, then you can specify that version instead if you
+ wish.) Do not make any other change in these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+ that copy, so the ordinary GNU General Public License applies to
+ all subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+ the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+ derivative of it, under Section 2) in object code or executable
+ form under the terms of Sections 1 and 2 above provided that you
+ accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software
+ interchange.
+
+ If distribution of object code is made by offering access to copy
+ from a designated place, then offering equivalent access to copy
+ the source code from the same place satisfies the requirement to
+ distribute the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+ Library, but is designed to work with the Library by being
+ compiled or linked with it, is called a "work that uses the
+ Library". Such a work, in isolation, is not a derivative work of
+ the Library, and therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+ creates an executable that is a derivative of the Library (because
+ it contains portions of the Library), rather than a "work that
+ uses the library". The executable is therefore covered by this
+ License. Section 6 states terms for distribution of such
+ executables.
+
+ When a "work that uses the Library" uses material from a header
+ file that is part of the Library, the object code for the work may
+ be a derivative work of the Library even though the source code is
+ not. Whether this is true is especially significant if the work
+ can be linked without the Library, or if the work is itself a
+ library. The threshold for this to be true is not precisely
+ defined by law.
+
+ If such an object file uses only numerical parameters, data
+ structure layouts and accessors, and small macros and small inline
+ functions (ten lines or less in length), then the use of the object
+ file is unrestricted, regardless of whether it is legally a
+ derivative work. (Executables containing this object code plus
+ portions of the Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+ distribute the object code for the work under the terms of Section
+ 6. Any executables containing that work also fall under Section 6,
+ whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+ link a "work that uses the Library" with the Library to produce a
+ work containing portions of the Library, and distribute that work
+ under terms of your choice, provided that the terms permit
+ modification of the work for the customer's own use and reverse
+ engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+ Library is used in it and that the Library and its use are covered
+ by this License. You must supply a copy of this License. If the
+ work during execution displays copyright notices, you must include
+ the copyright notice for the Library among them, as well as a
+ reference directing the user to the copy of this License. Also,
+ you must do one of these things:
+
+ a. Accompany the work with the complete corresponding
+ machine-readable source code for the Library including
+ whatever changes were used in the work (which must be
+ distributed under Sections 1 and 2 above); and, if the work
+ is an executable linked with the Library, with the complete
+ machine-readable "work that uses the Library", as object code
+ and/or source code, so that the user can modify the Library
+ and then relink to produce a modified executable containing
+ the modified Library. (It is understood that the user who
+ changes the contents of definitions files in the Library will
+ not necessarily be able to recompile the application to use
+ the modified definitions.)
+
+ b. Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run
+ time a copy of the library already present on the user's
+ computer system, rather than copying library functions into
+ the executable, and (2) will operate properly with a modified
+ version of the library, if the user installs one, as long as
+ the modified version is interface-compatible with the version
+ that the work was made with.
+
+ c. Accompany the work with a written offer, valid for at least
+ three years, to give the same user the materials specified in
+ Subsection 6a, above, for a charge no more than the cost of
+ performing this distribution.
+
+ d. If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the
+ above specified materials from the same place.
+
+ e. Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+ Library" must include any data and utility programs needed for
+ reproducing the executable from it. However, as a special
+ exception, the materials to be distributed need not include
+ anything that is normally distributed (in either source or binary
+ form) with the major components (compiler, kernel, and so on) of
+ the operating system on which the executable runs, unless that
+ component itself accompanies the executable.
+
+ It may happen that this requirement contradicts the license
+ restrictions of other proprietary libraries that do not normally
+ accompany the operating system. Such a contradiction means you
+ cannot use both them and the Library together in an executable
+ that you distribute.
+
+ 7. You may place library facilities that are a work based on the
+ Library side-by-side in a single library together with other
+ library facilities not covered by this License, and distribute
+ such a combined library, provided that the separate distribution
+ of the work based on the Library and of the other library
+ facilities is otherwise permitted, and provided that you do these
+ two things:
+
+ a. Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b. Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same
+ work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute the
+ Library except as expressly provided under this License. Any
+ attempt otherwise to copy, modify, sublicense, link with, or
+ distribute the Library is void, and will automatically terminate
+ your rights under this License. However, parties who have
+ received copies, or rights, from you under this License will not
+ have their licenses terminated so long as such parties remain in
+ full compliance.
+
+ 9. You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify
+ or distribute the Library or its derivative works. These actions
+ are prohibited by law if you do not accept this License.
+ Therefore, by modifying or distributing the Library (or any work
+ based on the Library), you indicate your acceptance of this
+ License to do so, and all its terms and conditions for copying,
+ distributing or modifying the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+ Library), the recipient automatically receives a license from the
+ original licensor to copy, distribute, link with or modify the
+ Library subject to these terms and conditions. You may not impose
+ any further restrictions on the recipients' exercise of the rights
+ granted herein. You are not responsible for enforcing compliance
+ by third parties with this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent
+ issues), conditions are imposed on you (whether by court order,
+ agreement or otherwise) that contradict the conditions of this
+ License, they do not excuse you from the conditions of this
+ License. If you cannot distribute so as to satisfy simultaneously
+ your obligations under this License and any other pertinent
+ obligations, then as a consequence you may not distribute the
+ Library at all. For example, if a patent license would not permit
+ royalty-free redistribution of the Library by all those who
+ receive copies directly or indirectly through you, then the only
+ way you could satisfy both it and this License would be to refrain
+ entirely from distribution of the Library.
+
+ If any portion of this section is held invalid or unenforceable
+ under any particular circumstance, the balance of the section is
+ intended to apply, and the section as a whole is intended to apply
+ in other circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of
+ any such claims; this section has the sole purpose of protecting
+ the integrity of the free software distribution system which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is
+ willing to distribute software through any other system and a
+ licensee cannot impose that choice.
+
+ This section is intended to make thoroughly clear what is believed
+ to be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+ certain countries either by patents or by copyrighted interfaces,
+ the original copyright holder who places the Library under this
+ License may add an explicit geographical distribution limitation
+ excluding those countries, so that distribution is permitted only
+ in or among countries not thus excluded. In such case, this
+ License incorporates the limitation as if written in the body of
+ this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+ versions of the Lesser General Public License from time to time.
+ Such new versions will be similar in spirit to the present version,
+ but may differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+ Library specifies a version number of this License which applies
+ to it and "any later version", you have the option of following
+ the terms and conditions either of that version or of any later
+ version published by the Free Software Foundation. If the Library
+ does not specify a license version number, you may choose any
+ version ever published by the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+ programs whose distribution conditions are incompatible with these,
+ write to the author to ask for permission. For software which is
+ copyrighted by the Free Software Foundation, write to the Free
+ Software Foundation; we sometimes make exceptions for this. Our
+ decision will be guided by the two goals of preserving the free
+ status of all derivatives of our free software and of promoting
+ the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+ WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE
+ LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT
+ WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
+ NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
+ QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE
+ LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
+ SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
+ MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE
+ LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+ INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+ INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
+ OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY
+ OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Libraries
+----------------------------------------------
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of
+the ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library.
+It is safest to attach them to the start of each source file to most
+effectively convey the exclusion of warranty; and each file should have
+at least the "copyright" line and a pointer to where the full notice is
+found.
+
+ ONE LINE TO GIVE THE LIBRARY'S NAME AND AN IDEA OF WHAT IT DOES.
+ Copyright (C) YEAR NAME OF AUTHOR
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version.
+
+ This library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+
+ Also add information on how to contact you by electronic and paper
+mail.
+
+ You should also get your employer (if you work as a programmer) or
+your school, if any, to sign a "copyright disclaimer" for the library,
+if necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the library
+ `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ SIGNATURE OF TY COON, 1 April 1990
+ Ty Coon, President of Vice
+
+ That's all there is to it!
+
+
+File: gettext.info, Node: GNU FDL, Prev: GNU LGPL, Up: Licenses
+
+C.3 GNU Free Documentation License
+==================================
+
+ Version 1.2, November 2002
+
+ Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document "free" in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book.
+ We recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it
+ can be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You
+ accept the license if you copy, modify or distribute the work in a
+ way requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in
+ the notice that says that the Document is released under this
+ License. If a section does not fit the above definition of
+ Secondary then it is not allowed to be designated as Invariant.
+ The Document may contain zero Invariant Sections. If the Document
+ does not identify any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images
+ composed of pixels) generic paint programs or (for drawings) some
+ widely available drawing editor, and that is suitable for input to
+ text formatters or for automatic translation to a variety of
+ formats suitable for input to text formatters. A copy made in an
+ otherwise Transparent file format whose markup, or absence of
+ markup, has been arranged to thwart or discourage subsequent
+ modification by readers is not Transparent. An image format is
+ not Transparent if used for any substantial amount of text. A
+ copy that is not "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and
+ standard-conforming simple HTML, PostScript or PDF designed for
+ human modification. Examples of transparent image formats include
+ PNG, XCF and JPG. Opaque formats include proprietary formats that
+ can be read and edited only by proprietary word processors, SGML or
+ XML for which the DTD and/or processing tools are not generally
+ available, and the machine-generated HTML, PostScript or PDF
+ produced by some word processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow
+ the conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the
+ title equally prominent and visible. You may add other material
+ on the covers in addition. Copying with changes limited to the
+ covers, as long as they preserve the title of the Document and
+ satisfy these conditions, can be treated as verbatim copying in
+ other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a
+ machine-readable Transparent copy along with each Opaque copy, or
+ state in or with each Opaque copy a computer-network location from
+ which the general network-using public has access to download
+ using public-standard network protocols a complete Transparent
+ copy of the Document, free of added material. If you use the
+ latter option, you must take reasonably prudent steps, when you
+ begin distribution of Opaque copies in quantity, to ensure that
+ this Transparent copy will remain thus accessible at the stated
+ location until at least one year after the last time you
+ distribute an Opaque copy (directly or through your agents or
+ retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of
+ copies, to give them a chance to provide you with an updated
+ version of the Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with
+ the Modified Version filling the role of the Document, thus
+ licensing distribution and modification of the Modified Version to
+ whoever possesses a copy of it. In addition, you must do these
+ things in the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of
+ previous versions (which should, if there were any, be listed
+ in the History section of the Document). You may use the
+ same title as a previous version if the original publisher of
+ that version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on
+ the Title Page. If there is no section Entitled "History" in
+ the Document, create one stating the title, year, authors,
+ and publisher of the Document as given on its Title Page,
+ then add an item describing the Modified Version as stated in
+ the previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in
+ the "History" section. You may omit a network location for a
+ work that was published at least four years before the
+ Document itself, or if the original publisher of the version
+ it refers to gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the
+ section all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section
+ titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option
+ designate some or all of these sections as invariant. To do this,
+ add their titles to the list of Invariant Sections in the Modified
+ Version's license notice. These titles must be distinct from any
+ other section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end
+ of the list of Cover Texts in the Modified Version. Only one
+ passage of Front-Cover Text and one of Back-Cover Text may be
+ added by (or through arrangements made by) any one entity. If the
+ Document already includes a cover text for the same cover,
+ previously added by you or by arrangement made by the same entity
+ you are acting on behalf of, you may not add another; but you may
+ replace the old one, on explicit permission from the previous
+ publisher that added the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination
+ all of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the
+ documents in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow
+ this License in all other respects regarding verbatim copying of
+ that document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of
+ a storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided for under this License. Any other
+ attempt to copy, modify, sublicense or distribute the Document is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights,
+ from you under this License will not have their licenses
+ terminated so long as such parties remain in full compliance.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ `http://www.gnu.org/copyleft/'.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If
+ the Document does not specify a version number of this License,
+ you may choose any version ever published (not as a draft) by the
+ Free Software Foundation.
+
+ADDENDUM: How to use this License for your documents
+----------------------------------------------------
+
+ To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with
+ the Front-Cover Texts being LIST, and with the Back-Cover Texts
+ being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+
+File: gettext.info, Node: Program Index, Next: Option Index, Prev: Licenses, Up: Top
+
+Program Index
+*************
+
+
+* Menu:
+
+* autopoint: autopoint Invocation. (line 6)
+* envsubst: envsubst Invocation. (line 6)
+* gettext <1>: gettext Invocation. (line 6)
+* gettext: sh. (line 19)
+* gettextize: gettextize Invocation.
+ (line 34)
+* msgattrib: msgattrib Invocation. (line 6)
+* msgcat: msgcat Invocation. (line 6)
+* msgcmp: msgcmp Invocation. (line 6)
+* msgcomm: msgcomm Invocation. (line 6)
+* msgconv: msgconv Invocation. (line 6)
+* msgen: msgen Invocation. (line 6)
+* msgexec: msgexec Invocation. (line 6)
+* msgfilter: msgfilter Invocation. (line 6)
+* msgfmt: msgfmt Invocation. (line 6)
+* msggrep: msggrep Invocation. (line 6)
+* msginit: msginit Invocation. (line 6)
+* msgmerge: msgmerge Invocation. (line 6)
+* msgunfmt: msgunfmt Invocation. (line 6)
+* msguniq: msguniq Invocation. (line 6)
+* ngettext <1>: ngettext Invocation. (line 6)
+* ngettext: sh. (line 19)
+* recode-sr-latin: msgfilter Invocation. (line 92)
+* xgettext: xgettext Invocation. (line 6)
+
+
+File: gettext.info, Node: Option Index, Next: Variable Index, Prev: Program Index, Up: Top
+
+Option Index
+************
+
+
+* Menu:
+
+* --add-comments, xgettext option: xgettext Invocation. (line 97)
+* --add-location, msgattrib option: msgattrib Invocation.
+ (line 136)
+* --add-location, msgcat option: msgcat Invocation. (line 119)
+* --add-location, msgcomm option: msgcomm Invocation. (line 104)
+* --add-location, msgconv option: msgconv Invocation. (line 83)
+* --add-location, msgen option: msgen Invocation. (line 85)
+* --add-location, msgfilter option: msgfilter Invocation.
+ (line 144)
+* --add-location, msggrep option: msggrep Invocation. (line 161)
+* --add-location, msgmerge option: msgmerge Invocation. (line 155)
+* --add-location, msguniq option: msguniq Invocation. (line 101)
+* --add-location, xgettext option: xgettext Invocation. (line 297)
+* --alignment, msgfmt option: msgfmt Invocation. (line 209)
+* --backup, msgmerge option: msgmerge Invocation. (line 65)
+* --boost, xgettext option: xgettext Invocation. (line 254)
+* --c++, xgettext option: xgettext Invocation. (line 64)
+* --check, msgfmt option: msgfmt Invocation. (line 146)
+* --check-accelerators, msgfmt option: msgfmt Invocation. (line 187)
+* --check-compatibility, msgfmt option: msgfmt Invocation. (line 183)
+* --check-domain, msgfmt option: msgfmt Invocation. (line 178)
+* --check-format, msgfmt option: msgfmt Invocation. (line 150)
+* --check-header, msgfmt option: msgfmt Invocation. (line 173)
+* --clear-fuzzy, msgattrib option: msgattrib Invocation.
+ (line 71)
+* --clear-obsolete, msgattrib option: msgattrib Invocation.
+ (line 77)
+* --clear-previous, msgattrib option: msgattrib Invocation.
+ (line 80)
+* --color, msgattrib option: msgattrib Invocation.
+ (line 117)
+* --color, msgcat option <1>: The --color option. (line 6)
+* --color, msgcat option: msgcat Invocation. (line 100)
+* --color, msgcomm option: msgcomm Invocation. (line 85)
+* --color, msgconv option: msgconv Invocation. (line 65)
+* --color, msgen option: msgen Invocation. (line 67)
+* --color, msgfilter option: msgfilter Invocation.
+ (line 122)
+* --color, msggrep option: msggrep Invocation. (line 144)
+* --color, msginit option: msginit Invocation. (line 63)
+* --color, msgmerge option: msgmerge Invocation. (line 137)
+* --color, msgunfmt option: msgunfmt Invocation. (line 109)
+* --color, msguniq option: msguniq Invocation. (line 82)
+* --color, xgettext option: xgettext Invocation. (line 276)
+* --comment, msggrep option: msggrep Invocation. (line 93)
+* --compendium, msgmerge option: msgmerge Invocation. (line 36)
+* --copyright-holder, xgettext option: xgettext Invocation. (line 347)
+* --csharp, msgfmt option: msgfmt Invocation. (line 36)
+* --csharp, msgunfmt option: msgunfmt Invocation. (line 19)
+* --csharp-resources, msgfmt option: msgfmt Invocation. (line 40)
+* --csharp-resources, msgunfmt option: msgunfmt Invocation. (line 23)
+* --debug, xgettext option: xgettext Invocation. (line 258)
+* --default-domain, xgettext option: xgettext Invocation. (line 36)
+* --directory, msgattrib option: msgattrib Invocation.
+ (line 19)
+* --directory, msgcat option: msgcat Invocation. (line 32)
+* --directory, msgcmp option: msgcmp Invocation. (line 27)
+* --directory, msgcomm option: msgcomm Invocation. (line 30)
+* --directory, msgconv option: msgconv Invocation. (line 19)
+* --directory, msgen option: msgen Invocation. (line 25)
+* --directory, msgexec option: msgexec Invocation. (line 44)
+* --directory, msgfilter option: msgfilter Invocation.
+ (line 27)
+* --directory, msgfmt option: msgfmt Invocation. (line 18)
+* --directory, msggrep option: msggrep Invocation. (line 19)
+* --directory, msgmerge option: msgmerge Invocation. (line 30)
+* --directory, msguniq option: msguniq Invocation. (line 26)
+* --directory, xgettext option: xgettext Invocation. (line 24)
+* --domain, gettext option: gettext Invocation. (line 16)
+* --domain, msggrep option: msggrep Invocation. (line 77)
+* --domain, ngettext option: ngettext Invocation. (line 15)
+* --dry-run, autopoint option: autopoint Invocation.
+ (line 24)
+* --dry-run, gettextize option: gettextize Invocation.
+ (line 72)
+* --exclude-file, xgettext option: xgettext Invocation. (line 92)
+* --expression, msgfilter option: msgfilter Invocation.
+ (line 77)
+* --extended-regexp, msggrep option: msggrep Invocation. (line 101)
+* --extract-all, xgettext option: xgettext Invocation. (line 107)
+* --extracted-comment, msggrep option: msggrep Invocation. (line 97)
+* --file, msgfilter option: msgfilter Invocation.
+ (line 81)
+* --file, msggrep option: msggrep Invocation. (line 113)
+* --files-from, msgcat option: msgcat Invocation. (line 27)
+* --files-from, msgcomm option: msgcomm Invocation. (line 25)
+* --files-from, xgettext option: xgettext Invocation. (line 19)
+* --fixed-strings, msggrep option: msggrep Invocation. (line 105)
+* --flag, xgettext option: xgettext Invocation. (line 201)
+* --force, autopoint option: autopoint Invocation.
+ (line 20)
+* --force, gettextize option: gettextize Invocation.
+ (line 40)
+* --force-po, msgattrib option: msgattrib Invocation.
+ (line 125)
+* --force-po, msgcat option: msgcat Invocation. (line 108)
+* --force-po, msgcomm option: msgcomm Invocation. (line 93)
+* --force-po, msgconv option: msgconv Invocation. (line 73)
+* --force-po, msgen option: msgen Invocation. (line 75)
+* --force-po, msgfilter option: msgfilter Invocation.
+ (line 130)
+* --force-po, msggrep option: msggrep Invocation. (line 152)
+* --force-po, msgmerge option: msgmerge Invocation. (line 145)
+* --force-po, msgunfmt option: msgunfmt Invocation. (line 117)
+* --force-po, msguniq option: msguniq Invocation. (line 90)
+* --force-po, xgettext option: xgettext Invocation. (line 284)
+* --foreign-user, xgettext option: xgettext Invocation. (line 362)
+* --from-code, xgettext option: xgettext Invocation. (line 74)
+* --fuzzy, msgattrib option: msgattrib Invocation.
+ (line 91)
+* --help, autopoint option: autopoint Invocation.
+ (line 33)
+* --help, envsubst option: envsubst Invocation. (line 22)
+* --help, gettext option: gettext Invocation. (line 32)
+* --help, gettextize option: gettextize Invocation.
+ (line 77)
+* --help, msgattrib option: msgattrib Invocation.
+ (line 181)
+* --help, msgcat option: msgcat Invocation. (line 164)
+* --help, msgcmp option: msgcmp Invocation. (line 72)
+* --help, msgcomm option: msgcomm Invocation. (line 152)
+* --help, msgconv option: msgconv Invocation. (line 128)
+* --help, msgen option: msgen Invocation. (line 130)
+* --help, msgexec option: msgexec Invocation. (line 69)
+* --help, msgfilter option: msgfilter Invocation.
+ (line 189)
+* --help, msgfmt option: msgfmt Invocation. (line 222)
+* --help, msggrep option: msggrep Invocation. (line 204)
+* --help, msginit option: msginit Invocation. (line 99)
+* --help, msgmerge option: msgmerge Invocation. (line 200)
+* --help, msgunfmt option: msgunfmt Invocation. (line 162)
+* --help, msguniq option: msguniq Invocation. (line 146)
+* --help, ngettext option: ngettext Invocation. (line 31)
+* --help, xgettext option: xgettext Invocation. (line 415)
+* --ignore-case, msggrep option: msggrep Invocation. (line 117)
+* --ignore-file, msgattrib option: msgattrib Invocation.
+ (line 87)
+* --indent, msgattrib option: msgattrib Invocation.
+ (line 129)
+* --indent, msgcat option: msgcat Invocation. (line 112)
+* --indent, msgcomm option: msgcomm Invocation. (line 97)
+* --indent, msgconv option: msgconv Invocation. (line 77)
+* --indent, msgen option: msgen Invocation. (line 79)
+* --indent, msgfilter option: msgfilter Invocation.
+ (line 133)
+* --indent, msggrep option: msggrep Invocation. (line 155)
+* --indent, msgmerge option: msgmerge Invocation. (line 149)
+* --indent, msgunfmt option: msgunfmt Invocation. (line 121)
+* --indent, msguniq option: msguniq Invocation. (line 94)
+* --indent, xgettext option: xgettext Invocation. (line 288)
+* --input, msgexec option: msgexec Invocation. (line 40)
+* --input, msgfilter option: msgfilter Invocation.
+ (line 23)
+* --input, msginit option: msginit Invocation. (line 16)
+* --intl, gettextize option: gettextize Invocation.
+ (line 43)
+* --invert-match, msggrep option: msggrep Invocation. (line 121)
+* --java, msgfmt option: msgfmt Invocation. (line 30)
+* --java, msgunfmt option: msgunfmt Invocation. (line 16)
+* --java2, msgfmt option: msgfmt Invocation. (line 33)
+* --join-existing, xgettext option: xgettext Invocation. (line 88)
+* --kde, xgettext option: xgettext Invocation. (line 250)
+* --keep-header, msgfilter option: msgfilter Invocation.
+ (line 136)
+* --keyword, xgettext option: xgettext Invocation. (line 115)
+* --lang, msgcat option <1>: msgen Invocation. (line 60)
+* --lang, msgcat option <2>: msgcat Invocation. (line 94)
+* --lang, msgcat option: msgmerge Invocation. (line 129)
+* --language, xgettext option: xgettext Invocation. (line 56)
+* --less-than, msgcat option: msgcat Invocation. (line 55)
+* --less-than, msgcomm option: msgcomm Invocation. (line 53)
+* --locale, msgfmt option: msgfmt Invocation. (line 79)
+* --locale, msginit option: msginit Invocation. (line 52)
+* --locale, msgunfmt option: msgunfmt Invocation. (line 47)
+* --location, msggrep option: msggrep Invocation. (line 72)
+* --more-than, msgcat option: msgcat Invocation. (line 60)
+* --more-than, msgcomm option: msgcomm Invocation. (line 58)
+* --msgctxt, msggrep option: msggrep Invocation. (line 81)
+* --msgid, msggrep option: msggrep Invocation. (line 85)
+* --msgid-bugs-address, xgettext option: xgettext Invocation. (line 375)
+* --msgstr, msggrep option: msggrep Invocation. (line 89)
+* --msgstr-prefix, xgettext option: xgettext Invocation. (line 403)
+* --msgstr-suffix, xgettext option: xgettext Invocation. (line 407)
+* --multi-domain, msgcmp option: msgcmp Invocation. (line 36)
+* --multi-domain, msgmerge option: msgmerge Invocation. (line 101)
+* --no-changelog, gettextize option: gettextize Invocation.
+ (line 58)
+* --no-fuzzy, msgattrib option: msgattrib Invocation.
+ (line 47)
+* --no-fuzzy-matching, msgcmp option: msgcmp Invocation. (line 40)
+* --no-fuzzy-matching, msgmerge option: msgmerge Invocation. (line 105)
+* --no-hash, msgfmt option: msgfmt Invocation. (line 212)
+* --no-location, msgattrib option: msgattrib Invocation.
+ (line 132)
+* --no-location, msgcat option: msgcat Invocation. (line 115)
+* --no-location, msgcomm option: msgcomm Invocation. (line 100)
+* --no-location, msgconv option: msgconv Invocation. (line 80)
+* --no-location, msgen option: msgen Invocation. (line 82)
+* --no-location, msgfilter option: msgfilter Invocation.
+ (line 141)
+* --no-location, msggrep option: msggrep Invocation. (line 158)
+* --no-location, msgmerge option: msgmerge Invocation. (line 152)
+* --no-location, msguniq option: msguniq Invocation. (line 97)
+* --no-location, xgettext option: xgettext Invocation. (line 291)
+* --no-obsolete, msgattrib option: msgattrib Invocation.
+ (line 53)
+* --no-translator, msginit option: msginit Invocation. (line 58)
+* --no-wrap, msgattrib option: msgattrib Invocation.
+ (line 161)
+* --no-wrap, msgcat option: msgcat Invocation. (line 144)
+* --no-wrap, msgcomm option: msgcomm Invocation. (line 129)
+* --no-wrap, msgconv option: msgconv Invocation. (line 108)
+* --no-wrap, msgen option: msgen Invocation. (line 110)
+* --no-wrap, msgfilter option: msgfilter Invocation.
+ (line 169)
+* --no-wrap, msggrep option: msggrep Invocation. (line 186)
+* --no-wrap, msginit option: msginit Invocation. (line 88)
+* --no-wrap, msgmerge option: msgmerge Invocation. (line 180)
+* --no-wrap, msgunfmt option: msgunfmt Invocation. (line 146)
+* --no-wrap, msguniq option: msguniq Invocation. (line 126)
+* --no-wrap, xgettext option: xgettext Invocation. (line 321)
+* --obsolete, msgattrib option: msgattrib Invocation.
+ (line 95)
+* --omit-header, msgcomm option: msgcomm Invocation. (line 144)
+* --omit-header, xgettext option: xgettext Invocation. (line 336)
+* --only-file, msgattrib option: msgattrib Invocation.
+ (line 83)
+* --only-fuzzy, msgattrib option: msgattrib Invocation.
+ (line 50)
+* --only-obsolete, msgattrib option: msgattrib Invocation.
+ (line 56)
+* --output, xgettext option: xgettext Invocation. (line 40)
+* --output-dir, xgettext option: xgettext Invocation. (line 45)
+* --output-file, msgattrib option: msgattrib Invocation.
+ (line 31)
+* --output-file, msgcat option: msgcat Invocation. (line 44)
+* --output-file, msgcomm option: msgcomm Invocation. (line 42)
+* --output-file, msgconv option: msgconv Invocation. (line 31)
+* --output-file, msgen option: msgen Invocation. (line 37)
+* --output-file, msgfilter option: msgfilter Invocation.
+ (line 39)
+* --output-file, msgfmt option: msgfmt Invocation. (line 54)
+* --output-file, msggrep option: msggrep Invocation. (line 31)
+* --output-file, msginit option: msginit Invocation. (line 27)
+* --output-file, msgmerge option: msgmerge Invocation. (line 53)
+* --output-file, msgunfmt option: msgunfmt Invocation. (line 98)
+* --output-file, msguniq option: msguniq Invocation. (line 38)
+* --package-name, xgettext option: xgettext Invocation. (line 368)
+* --package-version, xgettext option: xgettext Invocation. (line 371)
+* --po-dir, gettextize option: gettextize Invocation.
+ (line 51)
+* --previous, msgmerge option: msgmerge Invocation. (line 109)
+* --properties-input, msgattrib option: msgattrib Invocation.
+ (line 104)
+* --properties-input, msgcat option: msgcat Invocation. (line 74)
+* --properties-input, msgcmp option: msgcmp Invocation. (line 59)
+* --properties-input, msgcomm option: msgcomm Invocation. (line 72)
+* --properties-input, msgconv option: msgconv Invocation. (line 52)
+* --properties-input, msgen option: msgen Invocation. (line 48)
+* --properties-input, msgexec option: msgexec Invocation. (line 56)
+* --properties-input, msgfilter option: msgfilter Invocation.
+ (line 109)
+* --properties-input, msgfmt option: msgfmt Invocation. (line 133)
+* --properties-input, msggrep option: msggrep Invocation. (line 131)
+* --properties-input, msginit option: msginit Invocation. (line 39)
+* --properties-input, msgmerge option: msgmerge Invocation. (line 117)
+* --properties-input, msguniq option: msguniq Invocation. (line 61)
+* --properties-output, msgattrib option: msgattrib Invocation.
+ (line 145)
+* --properties-output, msgcat option: msgcat Invocation. (line 128)
+* --properties-output, msgcomm option: msgcomm Invocation. (line 113)
+* --properties-output, msgconv option: msgconv Invocation. (line 92)
+* --properties-output, msgen option: msgen Invocation. (line 94)
+* --properties-output, msgfilter option: msgfilter Invocation.
+ (line 153)
+* --properties-output, msggrep option: msggrep Invocation. (line 170)
+* --properties-output, msginit option: msginit Invocation. (line 72)
+* --properties-output, msgmerge option: msgmerge Invocation. (line 164)
+* --properties-output, msgunfmt option: msgunfmt Invocation. (line 130)
+* --properties-output, msguniq option: msguniq Invocation. (line 110)
+* --properties-output, xgettext option: xgettext Invocation. (line 305)
+* --qt, msgfmt option: msgfmt Invocation. (line 46)
+* --qt, xgettext option: xgettext Invocation. (line 246)
+* --quiet, msgfilter option: msgfilter Invocation.
+ (line 86)
+* --quiet, msgmerge option: msgmerge Invocation. (line 213)
+* --regexp=, msggrep option: msggrep Invocation. (line 109)
+* --repeated, msguniq option: msguniq Invocation. (line 49)
+* --resource, msgfmt option: msgfmt Invocation. (line 75)
+* --resource, msgunfmt option: msgunfmt Invocation. (line 43)
+* --set-fuzzy, msgattrib option: msgattrib Invocation.
+ (line 68)
+* --set-obsolete, msgattrib option: msgattrib Invocation.
+ (line 74)
+* --silent, msgfilter option: msgfilter Invocation.
+ (line 86)
+* --silent, msgmerge option: msgmerge Invocation. (line 213)
+* --sort-by-file, msgattrib option: msgattrib Invocation.
+ (line 173)
+* --sort-by-file, msgcat option: msgcat Invocation. (line 156)
+* --sort-by-file, msgcomm option: msgcomm Invocation. (line 141)
+* --sort-by-file, msgconv option: msgconv Invocation. (line 120)
+* --sort-by-file, msgen option: msgen Invocation. (line 122)
+* --sort-by-file, msgfilter option: msgfilter Invocation.
+ (line 181)
+* --sort-by-file, msggrep option: msggrep Invocation. (line 196)
+* --sort-by-file, msgmerge option: msgmerge Invocation. (line 192)
+* --sort-by-file, msguniq option: msguniq Invocation. (line 138)
+* --sort-by-file, xgettext option: xgettext Invocation. (line 333)
+* --sort-output, msgattrib option: msgattrib Invocation.
+ (line 168)
+* --sort-output, msgcat option: msgcat Invocation. (line 151)
+* --sort-output, msgcomm option: msgcomm Invocation. (line 136)
+* --sort-output, msgconv option: msgconv Invocation. (line 115)
+* --sort-output, msgen option: msgen Invocation. (line 117)
+* --sort-output, msgfilter option: msgfilter Invocation.
+ (line 176)
+* --sort-output, msggrep option: msggrep Invocation. (line 192)
+* --sort-output, msgmerge option: msgmerge Invocation. (line 187)
+* --sort-output, msgunfmt option: msgunfmt Invocation. (line 153)
+* --sort-output, msguniq option: msguniq Invocation. (line 133)
+* --sort-output, xgettext option: xgettext Invocation. (line 328)
+* --statistics, msgfmt option: msgfmt Invocation. (line 229)
+* --strict, msgattrib option: msgattrib Invocation.
+ (line 139)
+* --strict, msgcat option: msgcat Invocation. (line 122)
+* --strict, msgcomm option: msgcomm Invocation. (line 107)
+* --strict, msgconv option: msgconv Invocation. (line 86)
+* --strict, msgen option: msgen Invocation. (line 88)
+* --strict, msgfilter option: msgfilter Invocation.
+ (line 147)
+* --strict, msgfmt option: msgfmt Invocation. (line 57)
+* --strict, msggrep option: msggrep Invocation. (line 164)
+* --strict, msgmerge option: msgmerge Invocation. (line 158)
+* --strict, msgunfmt option: msgunfmt Invocation. (line 124)
+* --strict, msguniq option: msguniq Invocation. (line 104)
+* --strict, xgettext option: xgettext Invocation. (line 300)
+* --stringtable-input, msgattrib option: msgattrib Invocation.
+ (line 108)
+* --stringtable-input, msgcat option: msgcat Invocation. (line 78)
+* --stringtable-input, msgcmp option: msgcmp Invocation. (line 63)
+* --stringtable-input, msgcomm option: msgcomm Invocation. (line 76)
+* --stringtable-input, msgen option: msgen Invocation. (line 52)
+* --stringtable-input, msgexec option: msgexec Invocation. (line 60)
+* --stringtable-input, msgfilter option: msgfilter Invocation.
+ (line 113)
+* --stringtable-input, msgfmt option: msgfmt Invocation. (line 137)
+* --stringtable-input, msggrep option: msggrep Invocation. (line 135)
+* --stringtable-input, msginit option: msginit Invocation. (line 43)
+* --stringtable-input, msgmerge option: msgmerge Invocation. (line 121)
+* --stringtable-input, msgonv option: msgconv Invocation. (line 56)
+* --stringtable-input, msguniq option: msguniq Invocation. (line 65)
+* --stringtable-output, msgattrib option: msgattrib Invocation.
+ (line 150)
+* --stringtable-output, msgcat option: msgcat Invocation. (line 133)
+* --stringtable-output, msgcomm option: msgcomm Invocation. (line 118)
+* --stringtable-output, msgconv option: msgconv Invocation. (line 97)
+* --stringtable-output, msgen option: msgen Invocation. (line 99)
+* --stringtable-output, msgfilter option: msgfilter Invocation.
+ (line 158)
+* --stringtable-output, msggrep option: msggrep Invocation. (line 175)
+* --stringtable-output, msginit option: msginit Invocation. (line 77)
+* --stringtable-output, msgmerge option: msgmerge Invocation. (line 169)
+* --stringtable-output, msgunfmt option: msgunfmt Invocation. (line 135)
+* --stringtable-output, msguniq option: msguniq Invocation. (line 115)
+* --stringtable-output, xgettext option: xgettext Invocation. (line 310)
+* --style, msgattrib option: msgattrib Invocation.
+ (line 121)
+* --style, msgcat option <1>: The --style option. (line 6)
+* --style, msgcat option: msgcat Invocation. (line 104)
+* --style, msgcomm option: msgcomm Invocation. (line 89)
+* --style, msgconv option: msgconv Invocation. (line 69)
+* --style, msgen option: msgen Invocation. (line 71)
+* --style, msgfilter option: msgfilter Invocation.
+ (line 126)
+* --style, msggrep option: msggrep Invocation. (line 148)
+* --style, msginit option: msginit Invocation. (line 67)
+* --style, msgmerge option: msgmerge Invocation. (line 141)
+* --style, msgunfmt option: msgunfmt Invocation. (line 113)
+* --style, msguniq option: msguniq Invocation. (line 86)
+* --style, xgettext option: xgettext Invocation. (line 280)
+* --suffix, msgmerge option: msgmerge Invocation. (line 68)
+* --symlink, gettextize option: gettextize Invocation.
+ (line 63)
+* --tcl, msgfmt option: msgfmt Invocation. (line 43)
+* --tcl, msgunfmt option: msgunfmt Invocation. (line 26)
+* --to-code, msgcat option: msgcat Invocation. (line 87)
+* --to-code, msgconv option: msgconv Invocation. (line 42)
+* --to-code, msguniq option: msguniq Invocation. (line 74)
+* --translated, msgattrib option: msgattrib Invocation.
+ (line 41)
+* --trigraphs, xgettext option: xgettext Invocation. (line 241)
+* --unique, msgcat option: msgcat Invocation. (line 65)
+* --unique, msgcomm option: msgcomm Invocation. (line 63)
+* --unique, msguniq option: msguniq Invocation. (line 53)
+* --untranslated, msgattrib option: msgattrib Invocation.
+ (line 44)
+* --update, msgmerge option: msgmerge Invocation. (line 45)
+* --use-first, msgcat option: msgcat Invocation. (line 90)
+* --use-first, msguniq option: msguniq Invocation. (line 77)
+* --use-fuzzy, msgcmp option: msgcmp Invocation. (line 44)
+* --use-fuzzy, msgfmt option: msgfmt Invocation. (line 199)
+* --use-untranslated, msgcmp option: msgcmp Invocation. (line 50)
+* --variables, envsubst option: envsubst Invocation. (line 15)
+* --verbose, msgfmt option: msgfmt Invocation. (line 235)
+* --verbose, msgmerge option: msgmerge Invocation. (line 208)
+* --verbose, msgunfmt option: msgunfmt Invocation. (line 170)
+* --version, autopoint option: autopoint Invocation.
+ (line 36)
+* --version, envsubst option: envsubst Invocation. (line 26)
+* --version, gettext option: gettext Invocation. (line 40)
+* --version, gettextize option: gettextize Invocation.
+ (line 80)
+* --version, msgattrib option: msgattrib Invocation.
+ (line 185)
+* --version, msgcat option: msgcat Invocation. (line 168)
+* --version, msgcmp option: msgcmp Invocation. (line 76)
+* --version, msgcomm option: msgcomm Invocation. (line 156)
+* --version, msgconv option: msgconv Invocation. (line 132)
+* --version, msgen option: msgen Invocation. (line 134)
+* --version, msgexec option: msgexec Invocation. (line 73)
+* --version, msgfilter option: msgfilter Invocation.
+ (line 193)
+* --version, msgfmt option: msgfmt Invocation. (line 226)
+* --version, msggrep option: msggrep Invocation. (line 208)
+* --version, msginit option: msginit Invocation. (line 103)
+* --version, msgmerge option: msgmerge Invocation. (line 204)
+* --version, msgunfmt option: msgunfmt Invocation. (line 166)
+* --version, msguniq option: msguniq Invocation. (line 150)
+* --version, ngettext option: ngettext Invocation. (line 35)
+* --version, xgettext option: xgettext Invocation. (line 419)
+* --width, msgattrib option: msgattrib Invocation.
+ (line 155)
+* --width, msgcat option: msgcat Invocation. (line 138)
+* --width, msgcomm option: msgcomm Invocation. (line 123)
+* --width, msgconv option: msgconv Invocation. (line 102)
+* --width, msgen option: msgen Invocation. (line 104)
+* --width, msgfilter option: msgfilter Invocation.
+ (line 163)
+* --width, msggrep option: msggrep Invocation. (line 180)
+* --width, msginit option: msginit Invocation. (line 82)
+* --width, msgmerge option: msgmerge Invocation. (line 174)
+* --width, msgunfmt option: msgunfmt Invocation. (line 140)
+* --width, msguniq option: msguniq Invocation. (line 120)
+* --width, xgettext option: xgettext Invocation. (line 315)
+* -<, msgcat option: msgcat Invocation. (line 55)
+* -<, msgcomm option: msgcomm Invocation. (line 53)
+* ->, msgcat option: msgcat Invocation. (line 60)
+* ->, msgcomm option: msgcomm Invocation. (line 58)
+* -a, msgfmt option: msgfmt Invocation. (line 209)
+* -a, xgettext option: xgettext Invocation. (line 107)
+* -C, msgfmt option: msgfmt Invocation. (line 183)
+* -c, msgfmt option: msgfmt Invocation. (line 146)
+* -C, msggrep option: msggrep Invocation. (line 93)
+* -C, msgmerge option: msgmerge Invocation. (line 36)
+* -c, xgettext option: xgettext Invocation. (line 97)
+* -C, xgettext option: xgettext Invocation. (line 64)
+* -d, autopoint option: autopoint Invocation.
+ (line 24)
+* -d, gettext option: gettext Invocation. (line 16)
+* -d, gettextize option: gettextize Invocation.
+ (line 72)
+* -D, msgattrib option: msgattrib Invocation.
+ (line 19)
+* -D, msgcat option: msgcat Invocation. (line 32)
+* -D, msgcmp option: msgcmp Invocation. (line 27)
+* -D, msgcomm option: msgcomm Invocation. (line 30)
+* -D, msgconv option: msgconv Invocation. (line 19)
+* -D, msgen option: msgen Invocation. (line 25)
+* -D, msgexec option: msgexec Invocation. (line 44)
+* -D, msgfilter option: msgfilter Invocation.
+ (line 27)
+* -d, msgfmt option: msgfmt Invocation. (line 84)
+* -D, msgfmt option: msgfmt Invocation. (line 18)
+* -D, msggrep option: msggrep Invocation. (line 19)
+* -D, msgmerge option: msgmerge Invocation. (line 30)
+* -d, msgunfmt option: msgunfmt Invocation. (line 70)
+* -d, msguniq option: msguniq Invocation. (line 49)
+* -D, msguniq option: msguniq Invocation. (line 26)
+* -d, ngettext option: ngettext Invocation. (line 15)
+* -d, xgettext option: xgettext Invocation. (line 36)
+* -D, xgettext option: xgettext Invocation. (line 24)
+* -E, gettext option: gettext Invocation. (line 27)
+* -e, gettext option: gettext Invocation. (line 20)
+* -e, msgfilter option: msgfilter Invocation.
+ (line 77)
+* -e, msggrep option: msggrep Invocation. (line 109)
+* -E, msggrep option: msggrep Invocation. (line 101)
+* -E, ngettext option: ngettext Invocation. (line 26)
+* -e, ngettext option: ngettext Invocation. (line 19)
+* -f, autopoint option: autopoint Invocation.
+ (line 20)
+* -f, gettextize option: gettextize Invocation.
+ (line 40)
+* -F, msgattrib option: msgattrib Invocation.
+ (line 173)
+* -F, msgcat option: msgcat Invocation. (line 156)
+* -f, msgcat option: msgcat Invocation. (line 27)
+* -F, msgcomm option: msgcomm Invocation. (line 141)
+* -f, msgcomm option: msgcomm Invocation. (line 25)
+* -F, msgconv option: msgconv Invocation. (line 120)
+* -F, msgen option: msgen Invocation. (line 122)
+* -F, msgfilter option: msgfilter Invocation.
+ (line 181)
+* -f, msgfilter option: msgfilter Invocation.
+ (line 81)
+* -f, msgfmt option: msgfmt Invocation. (line 199)
+* -f, msggrep option: msggrep Invocation. (line 113)
+* -F, msggrep option: msggrep Invocation. (line 105)
+* -F, msgmerge option: msgmerge Invocation. (line 192)
+* -F, msguniq option: msguniq Invocation. (line 138)
+* -F, xgettext option: xgettext Invocation. (line 333)
+* -f, xgettext option: xgettext Invocation. (line 19)
+* -h, envsubst option: envsubst Invocation. (line 22)
+* -h, gettext option: gettext Invocation. (line 32)
+* -h, msgattrib option: msgattrib Invocation.
+ (line 181)
+* -h, msgcat option: msgcat Invocation. (line 164)
+* -h, msgcmp option: msgcmp Invocation. (line 72)
+* -h, msgcomm option: msgcomm Invocation. (line 152)
+* -h, msgconv option: msgconv Invocation. (line 128)
+* -h, msgen option: msgen Invocation. (line 130)
+* -h, msgexec option: msgexec Invocation. (line 69)
+* -h, msgfilter option: msgfilter Invocation.
+ (line 189)
+* -h, msgfmt option: msgfmt Invocation. (line 222)
+* -h, msggrep option: msggrep Invocation. (line 204)
+* -h, msginit option: msginit Invocation. (line 99)
+* -h, msgmerge option: msgmerge Invocation. (line 200)
+* -h, msgunfmt option: msgunfmt Invocation. (line 162)
+* -h, msguniq option: msguniq Invocation. (line 146)
+* -h, ngettext option: ngettext Invocation. (line 31)
+* -h, xgettext option: xgettext Invocation. (line 415)
+* -i, msgattrib option: msgattrib Invocation.
+ (line 129)
+* -i, msgcat option: msgcat Invocation. (line 112)
+* -i, msgcomm option: msgcomm Invocation. (line 97)
+* -i, msgconv option: msgconv Invocation. (line 77)
+* -i, msgen option: msgen Invocation. (line 79)
+* -i, msgexec option: msgexec Invocation. (line 40)
+* -i, msgfilter option: msgfilter Invocation.
+ (line 23)
+* -i, msggrep option: msggrep Invocation. (line 117)
+* -i, msginit option: msginit Invocation. (line 16)
+* -i, msgmerge option: msgmerge Invocation. (line 149)
+* -i, msgunfmt option: msgunfmt Invocation. (line 121)
+* -i, msguniq option: msguniq Invocation. (line 94)
+* -i, xgettext option: xgettext Invocation. (line 288)
+* -j, msgfmt option: msgfmt Invocation. (line 30)
+* -J, msggrep option: msggrep Invocation. (line 81)
+* -j, msgunfmt option: msgunfmt Invocation. (line 16)
+* -j, xgettext option: xgettext Invocation. (line 88)
+* -K, msggrep option: msggrep Invocation. (line 85)
+* -k, xgettext option: xgettext Invocation. (line 115)
+* -l, msgfmt option: msgfmt Invocation. (line 79)
+* -l, msginit option: msginit Invocation. (line 52)
+* -l, msgunfmt option: msgunfmt Invocation. (line 47)
+* -L, xgettext option: xgettext Invocation. (line 56)
+* -m, msgcmp option: msgcmp Invocation. (line 36)
+* -M, msggrep option: msggrep Invocation. (line 77)
+* -m, msgmerge option: msgmerge Invocation. (line 101)
+* -M, xgettext option: xgettext Invocation. (line 407)
+* -m, xgettext option: xgettext Invocation. (line 403)
+* -n, gettext option: gettext Invocation. (line 35)
+* -n, msgattrib option: msgattrib Invocation.
+ (line 136)
+* -n, msgcat option: msgcat Invocation. (line 119)
+* -N, msgcmp option: msgcmp Invocation. (line 40)
+* -n, msgcomm option: msgcomm Invocation. (line 104)
+* -n, msgfilter option: msgfilter Invocation.
+ (line 86)
+* -N, msggrep option: msggrep Invocation. (line 72)
+* -N, msgmerge option: msgmerge Invocation. (line 105)
+* -n, msguniq option: msguniq Invocation. (line 101)
+* -n, xgettext option: xgettext Invocation. (line 297)
+* -o, msgattrib option: msgattrib Invocation.
+ (line 31)
+* -o, msgcat option: msgcat Invocation. (line 44)
+* -o, msgcomm option: msgcomm Invocation. (line 42)
+* -o, msgconv option: msgconv Invocation. (line 31)
+* -o, msgen option: msgen Invocation. (line 37)
+* -o, msgfilter option: msgfilter Invocation.
+ (line 39)
+* -o, msgfmt option: msgfmt Invocation. (line 54)
+* -o, msggrep option: msggrep Invocation. (line 31)
+* -o, msginit option: msginit Invocation. (line 27)
+* -o, msgmerge option: msgmerge Invocation. (line 53)
+* -o, msgunfmt option: msgunfmt Invocation. (line 98)
+* -o, msguniq option: msguniq Invocation. (line 38)
+* -o, xgettext option: xgettext Invocation. (line 40)
+* -p, msgattrib option: msgattrib Invocation.
+ (line 145)
+* -P, msgattrib option: msgattrib Invocation.
+ (line 104)
+* -p, msgcat option: msgcat Invocation. (line 128)
+* -P, msgcat option: msgcat Invocation. (line 74)
+* -P, msgcmp option: msgcmp Invocation. (line 59)
+* -p, msgcomm option: msgcomm Invocation. (line 113)
+* -P, msgcomm option: msgcomm Invocation. (line 72)
+* -p, msgconv option: msgconv Invocation. (line 92)
+* -P, msgconv option: msgconv Invocation. (line 52)
+* -p, msgen option: msgen Invocation. (line 94)
+* -P, msgen option: msgen Invocation. (line 48)
+* -P, msgexec option: msgexec Invocation. (line 56)
+* -p, msgfilter option: msgfilter Invocation.
+ (line 153)
+* -P, msgfilter option: msgfilter Invocation.
+ (line 109)
+* -P, msgfmt option: msgfmt Invocation. (line 133)
+* -p, msggrep option: msggrep Invocation. (line 170)
+* -P, msggrep option: msggrep Invocation. (line 131)
+* -p, msginit option: msginit Invocation. (line 72)
+* -P, msginit option: msginit Invocation. (line 39)
+* -p, msgmerge option: msgmerge Invocation. (line 164)
+* -P, msgmerge option: msgmerge Invocation. (line 117)
+* -p, msgunfmt option: msgunfmt Invocation. (line 130)
+* -p, msguniq option: msguniq Invocation. (line 110)
+* -P, msguniq option: msguniq Invocation. (line 61)
+* -p, xgettext option: xgettext Invocation. (line 45)
+* -q, msgmerge option: msgmerge Invocation. (line 213)
+* -r, msgfmt option: msgfmt Invocation. (line 75)
+* -r, msgunfmt option: msgunfmt Invocation. (line 43)
+* -s, msgattrib option: msgattrib Invocation.
+ (line 168)
+* -s, msgcat option: msgcat Invocation. (line 151)
+* -s, msgcomm option: msgcomm Invocation. (line 136)
+* -s, msgconv option: msgconv Invocation. (line 115)
+* -s, msgen option: msgen Invocation. (line 117)
+* -s, msgfilter option: msgfilter Invocation.
+ (line 176)
+* -s, msgmerge option: msgmerge Invocation. (line 187)
+* -s, msgunfmt option: msgunfmt Invocation. (line 153)
+* -s, msguniq option: msguniq Invocation. (line 133)
+* -s, xgettext option: xgettext Invocation. (line 328)
+* -t, msgcat option: msgcat Invocation. (line 87)
+* -t, msgconv option: msgconv Invocation. (line 42)
+* -T, msggrep option: msggrep Invocation. (line 89)
+* -t, msguniq option: msguniq Invocation. (line 74)
+* -T, xgettext option: xgettext Invocation. (line 241)
+* -u, msgcat option: msgcat Invocation. (line 65)
+* -u, msgcomm option: msgcomm Invocation. (line 63)
+* -U, msgmerge option: msgmerge Invocation. (line 45)
+* -u, msguniq option: msguniq Invocation. (line 53)
+* -V, envsubst option: envsubst Invocation. (line 26)
+* -v, envsubst option: envsubst Invocation. (line 15)
+* -V, gettext option: gettext Invocation. (line 40)
+* -V, msgattrib option: msgattrib Invocation.
+ (line 185)
+* -V, msgcat option: msgcat Invocation. (line 168)
+* -V, msgcmp option: msgcmp Invocation. (line 76)
+* -V, msgcomm option: msgcomm Invocation. (line 156)
+* -V, msgconv option: msgconv Invocation. (line 132)
+* -V, msgen option: msgen Invocation. (line 134)
+* -V, msgexec option: msgexec Invocation. (line 73)
+* -V, msgfilter option: msgfilter Invocation.
+ (line 193)
+* -v, msgfmt option: msgfmt Invocation. (line 235)
+* -V, msgfmt option: msgfmt Invocation. (line 226)
+* -V, msggrep option: msggrep Invocation. (line 208)
+* -v, msggrep option: msggrep Invocation. (line 121)
+* -V, msginit option: msginit Invocation. (line 103)
+* -v, msgmerge option: msgmerge Invocation. (line 208)
+* -V, msgmerge option: msgmerge Invocation. (line 204)
+* -v, msgunfmt option: msgunfmt Invocation. (line 170)
+* -V, msgunfmt option: msgunfmt Invocation. (line 166)
+* -V, msguniq option: msguniq Invocation. (line 150)
+* -V, ngettext option: ngettext Invocation. (line 35)
+* -V, xgettext option: xgettext Invocation. (line 419)
+* -w, msgattrib option: msgattrib Invocation.
+ (line 155)
+* -w, msgcat option: msgcat Invocation. (line 138)
+* -w, msgcomm option: msgcomm Invocation. (line 123)
+* -w, msgconv option: msgconv Invocation. (line 102)
+* -w, msgen option: msgen Invocation. (line 104)
+* -w, msgfilter option: msgfilter Invocation.
+ (line 163)
+* -w, msggrep option: msggrep Invocation. (line 180)
+* -w, msginit option: msginit Invocation. (line 82)
+* -w, msgmerge option: msgmerge Invocation. (line 174)
+* -w, msgunfmt option: msgunfmt Invocation. (line 140)
+* -w, msguniq option: msguniq Invocation. (line 120)
+* -w, xgettext option: xgettext Invocation. (line 315)
+* -X, msggrep option: msggrep Invocation. (line 97)
+* -x, xgettext option: xgettext Invocation. (line 92)
+
+
+File: gettext.info, Node: Variable Index, Next: PO Mode Index, Prev: Option Index, Up: Top
+
+Variable Index
+**************
+
+
+* Menu:
+
+* GETTEXT_LOG_UNTRANSLATED, environment variable: Prioritizing messages.
+ (line 23)
+* LANG, environment variable <1>: gettext grok. (line 32)
+* LANG, environment variable: Locale Environment Variables.
+ (line 17)
+* LANGUAGE, environment variable <1>: po/Rules-*. (line 11)
+* LANGUAGE, environment variable <2>: gettext grok. (line 28)
+* LANGUAGE, environment variable: Locale Environment Variables.
+ (line 11)
+* LC_ALL, environment variable <1>: gettext grok. (line 28)
+* LC_ALL, environment variable: Locale Environment Variables.
+ (line 11)
+* LC_COLLATE, environment variable <1>: gettext grok. (line 30)
+* LC_COLLATE, environment variable: Locale Environment Variables.
+ (line 13)
+* LC_CTYPE, environment variable <1>: gettext grok. (line 30)
+* LC_CTYPE, environment variable: Locale Environment Variables.
+ (line 13)
+* LC_MESSAGES, environment variable <1>: gettext grok. (line 30)
+* LC_MESSAGES, environment variable: Locale Environment Variables.
+ (line 13)
+* LC_MONETARY, environment variable <1>: gettext grok. (line 30)
+* LC_MONETARY, environment variable: Locale Environment Variables.
+ (line 13)
+* LC_NUMERIC, environment variable <1>: gettext grok. (line 30)
+* LC_NUMERIC, environment variable: Locale Environment Variables.
+ (line 13)
+* LC_TIME, environment variable <1>: gettext grok. (line 30)
+* LC_TIME, environment variable: Locale Environment Variables.
+ (line 13)
+* LINGUAS, environment variable: Installers. (line 17)
+* MSGEXEC_LOCATION, environment variable: msgexec Invocation. (line 18)
+* MSGEXEC_MSGCTXT, environment variable: msgexec Invocation. (line 18)
+* MSGEXEC_MSGID, environment variable: msgexec Invocation. (line 18)
+* MSGFILTER_LOCATION, environment variable: msgfilter Invocation.
+ (line 11)
+* MSGFILTER_MSGCTXT, environment variable: msgfilter Invocation.
+ (line 11)
+* MSGFILTER_MSGID, environment variable: msgfilter Invocation. (line 11)
+* PO_STYLE, environment variable: The --style option. (line 10)
+* TERM, environment variable: The TERM variable. (line 6)
+* TEXTDOMAIN, environment variable: sh. (line 23)
+* TEXTDOMAINDIR, environment variable: sh. (line 26)
+
+
+File: gettext.info, Node: PO Mode Index, Next: Autoconf Macro Index, Prev: Variable Index, Up: Top
+
+PO Mode Index
+*************
+
+
+* Menu:
+
+* #, PO Mode command: Modifying Comments. (line 24)
+* ,, PO Mode command: Marking. (line 44)
+* ., PO Mode command: Entry Positioning. (line 20)
+* .emacs customizations: Installation. (line 13)
+* 0, PO Mode command: Main PO Commands. (line 40)
+* <, PO Mode command: Entry Positioning. (line 29)
+* =, PO Mode command: Main PO Commands. (line 47)
+* >, PO Mode command: Entry Positioning. (line 32)
+* ?, PO Mode command: Main PO Commands. (line 44)
+* _, PO Mode command: Main PO Commands. (line 30)
+* a, PO Mode command: Auxiliary. (line 40)
+* A, PO Mode command: Auxiliary. (line 28)
+* a, PO Mode command: Auxiliary. (line 21)
+* auxiliary PO file: Auxiliary. (line 13)
+* C-c C-a, PO Mode command <1>: Auxiliary. (line 25)
+* C-c C-a, PO Mode command: Subedit. (line 17)
+* C-c C-c, PO Mode command: Subedit. (line 11)
+* C-c C-k, PO Mode command: Subedit. (line 14)
+* C-j, PO Mode command: Modifying Translations.
+ (line 26)
+* commands: Main PO Commands. (line 6)
+* comment out PO file entry: Obsolete Entries. (line 47)
+* consulting program sources: C Sources Context. (line 6)
+* consulting translations to other languages: Auxiliary. (line 6)
+* current entry of a PO file: Entry Positioning. (line 6)
+* cut and paste for translated strings: Modifying Translations.
+ (line 74)
+* DEL, PO Mode command <1>: Obsolete Entries. (line 32)
+* DEL, PO Mode command: Fuzzy Entries. (line 60)
+* editing comments: Modifying Comments. (line 6)
+* editing multiple entries: Subedit. (line 62)
+* editing translations: Modifying Translations.
+ (line 6)
+* etags, using for marking strings: Marking. (line 17)
+* exiting PO subedit: Subedit. (line 20)
+* F, PO Mode command: Fuzzy Entries. (line 39)
+* f, PO Mode command: Fuzzy Entries. (line 39)
+* F, PO Mode command: Fuzzy Entries. (line 33)
+* f, PO Mode command: Fuzzy Entries. (line 30)
+* find source fragment for a PO file entry: C Sources Context.
+ (line 33)
+* h, PO Mode command: Main PO Commands. (line 44)
+* installing PO mode: Installation. (line 13)
+* K, PO Mode command: Modifying Comments. (line 27)
+* k, PO Mode command <1>: Modifying Translations.
+ (line 30)
+* k, PO Mode command: Untranslated Entries.
+ (line 32)
+* LFD, PO Mode command: Modifying Translations.
+ (line 26)
+* looking at the source to aid translation: C Sources Context.
+ (line 6)
+* m, PO Mode command: Entry Positioning. (line 35)
+* M-,, PO Mode command: Marking. (line 48)
+* M-., PO Mode command: Marking. (line 51)
+* M-A, PO Mode command: Auxiliary. (line 32)
+* M-S, PO Mode command: C Sources Context. (line 89)
+* M-s, PO Mode command: C Sources Context. (line 53)
+* M-S, PO Mode command: C Sources Context. (line 49)
+* M-s, PO Mode command: C Sources Context. (line 41)
+* marking strings for translation: Marking. (line 6)
+* moving by fuzzy entries: Fuzzy Entries. (line 24)
+* moving by obsolete entries: Obsolete Entries. (line 22)
+* moving by translated entries: Translated Entries. (line 12)
+* moving by untranslated entries: Untranslated Entries.
+ (line 18)
+* moving through a PO file: Entry Positioning. (line 14)
+* n, PO Mode command: Entry Positioning. (line 23)
+* next-error, stepping through PO file validation results: Main PO Commands.
+ (line 99)
+* normalize, PO Mode command: Auxiliary. (line 64)
+* O, PO Mode command: Obsolete Entries. (line 36)
+* o, PO Mode command: Obsolete Entries. (line 36)
+* O, PO Mode command: Obsolete Entries. (line 29)
+* o, PO Mode command: Obsolete Entries. (line 26)
+* obsolete active entry: Obsolete Entries. (line 47)
+* p, PO Mode command: Entry Positioning. (line 26)
+* pending subedits: Subedit. (line 73)
+* po-auto-edit-with-msgid, PO Mode variable: Modifying Translations.
+ (line 57)
+* po-auto-fuzzy-on-edit, PO Mode variable: Translated Entries.
+ (line 28)
+* po-auto-select-on-unfuzzy, PO Mode variable: Fuzzy Entries. (line 44)
+* po-confirm-and-quit, PO Mode command: Main PO Commands. (line 62)
+* po-consider-as-auxiliary, PO Mode command: Auxiliary. (line 36)
+* po-consider-source-path, PO Mode command: C Sources Context.
+ (line 89)
+* po-current-entry, PO Mode command: Entry Positioning. (line 46)
+* po-cycle-auxiliary, PO Mode command: Auxiliary. (line 40)
+* po-cycle-source-reference, PO Mode command: C Sources Context.
+ (line 53)
+* po-edit-comment, PO Mode command: Modifying Comments. (line 46)
+* po-edit-msgstr, PO Mode command: Modifying Translations.
+ (line 42)
+* po-exchange-location, PO Mode command: Entry Positioning. (line 106)
+* po-fade-out-entry, PO Mode command <1>: Obsolete Entries. (line 47)
+* po-fade-out-entry, PO Mode command: Fuzzy Entries. (line 60)
+* po-first-entry, PO Mode command: Entry Positioning. (line 74)
+* po-help, PO Mode command: Main PO Commands. (line 83)
+* po-ignore-as-auxiliary, PO Mode command: Auxiliary. (line 36)
+* po-ignore-source-path, PO Mode command: C Sources Context. (line 89)
+* po-kill-comment, PO Mode command: Modifying Comments. (line 60)
+* po-kill-msgstr, PO Mode command <1>: Modifying Translations.
+ (line 74)
+* po-kill-msgstr, PO Mode command: Untranslated Entries.
+ (line 40)
+* po-kill-ring-save-comment, PO Mode command: Modifying Comments.
+ (line 60)
+* po-kill-ring-save-msgstr, PO Mode command: Modifying Translations.
+ (line 74)
+* po-last-entry, PO Mode command: Entry Positioning. (line 74)
+* po-mark-translatable, PO Mode command: Marking. (line 98)
+* po-msgid-to-msgstr, PO Mode command: Modifying Translations.
+ (line 52)
+* po-next-entry, PO Mode command: Entry Positioning. (line 69)
+* po-next-fuzzy-entry, PO Mode command: Fuzzy Entries. (line 39)
+* po-next-obsolete-entry, PO Mode command: Obsolete Entries. (line 36)
+* po-next-translated-entry, PO Mode command: Translated Entries.
+ (line 23)
+* po-next-untranslated-entry, PO Mode command: Untranslated Entries.
+ (line 35)
+* po-normalize, PO Mode command: Normalizing. (line 31)
+* po-other-window, PO Mode command: Main PO Commands. (line 72)
+* po-pop-location, PO Mode command: Entry Positioning. (line 92)
+* po-previous-entry, PO Mode command: Entry Positioning. (line 69)
+* po-previous-fuzzy-entry, PO Mode command: Fuzzy Entries. (line 39)
+* po-previous-obsolete-entry, PO Mode command: Obsolete Entries.
+ (line 36)
+* po-previous-translated-entry, PO Mode command: Translated Entries.
+ (line 23)
+* po-previous-untransted-entry, PO Mode command: Untranslated Entries.
+ (line 35)
+* po-push-location, PO Mode command: Entry Positioning. (line 92)
+* po-quit, PO Mode command: Main PO Commands. (line 62)
+* po-select-auxiliary, PO Mode command: Auxiliary. (line 49)
+* po-select-mark-and-mark, PO Mode command: Marking. (line 98)
+* po-select-source-reference, PO Mode command: C Sources Context.
+ (line 53)
+* po-statistics, PO Mode command: Main PO Commands. (line 87)
+* po-subedit-abort, PO Mode command: Subedit. (line 27)
+* po-subedit-cycle-auxiliary, PO Mode command: Subedit. (line 35)
+* po-subedit-exit, PO Mode command: Subedit. (line 20)
+* po-subedit-mode-hook, PO Mode variable: Modifying Comments. (line 57)
+* po-tags-search, PO Mode command: Marking. (line 56)
+* po-undo, PO Mode command: Main PO Commands. (line 53)
+* po-unfuzzy, PO Mode command: Fuzzy Entries. (line 44)
+* po-validate, PO Mode command: Main PO Commands. (line 92)
+* po-yank-comment, PO Mode command: Modifying Comments. (line 60)
+* po-yank-msgstr, PO Mode command: Modifying Translations.
+ (line 98)
+* q, PO Mode command: Main PO Commands. (line 62)
+* Q, PO Mode command: Main PO Commands. (line 62)
+* q, PO Mode command: Main PO Commands. (line 36)
+* Q, PO Mode command: Main PO Commands. (line 33)
+* r, PO Mode command: Entry Positioning. (line 39)
+* RET, PO Mode command: Modifying Translations.
+ (line 22)
+* S, PO Mode command: C Sources Context. (line 89)
+* s, PO Mode command: C Sources Context. (line 53)
+* S, PO Mode command: C Sources Context. (line 45)
+* s, PO Mode command: C Sources Context. (line 37)
+* starting a string translation: Modifying Translations.
+ (line 63)
+* string normalization in entries: Normalizing. (line 30)
+* subedit minor mode: Subedit. (line 6)
+* T, PO Mode command: Translated Entries. (line 23)
+* t, PO Mode command: Translated Entries. (line 23)
+* T, PO Mode command: Translated Entries. (line 19)
+* t, PO Mode command: Translated Entries. (line 16)
+* TAB, PO Mode command: Fuzzy Entries. (line 36)
+* TAGS, and marking translatable strings: Marking. (line 31)
+* U, PO Mode command: Untranslated Entries.
+ (line 35)
+* u, PO Mode command: Untranslated Entries.
+ (line 35)
+* U, PO Mode command: Untranslated Entries.
+ (line 28)
+* u, PO Mode command: Untranslated Entries.
+ (line 25)
+* use the source, Luke: C Sources Context. (line 6)
+* using obsolete translations to make new entries: Modifying Translations.
+ (line 124)
+* using translation compendia: Compendium. (line 6)
+* V, PO Mode command: Main PO Commands. (line 50)
+* W, PO Mode command: Modifying Comments. (line 31)
+* w, PO Mode command: Modifying Translations.
+ (line 34)
+* x, PO Mode command: Entry Positioning. (line 42)
+* Y, PO Mode command: Modifying Comments. (line 35)
+* y, PO Mode command: Modifying Translations.
+ (line 38)
+
+
+File: gettext.info, Node: Autoconf Macro Index, Next: Index, Prev: PO Mode Index, Up: Top
+
+Autoconf Macro Index
+********************
+
+
+* Menu:
+
+* AM_GNU_GETTEXT: AM_GNU_GETTEXT. (line 6)
+* AM_GNU_GETTEXT_INTL_SUBDIR: AM_GNU_GETTEXT_INTL_SUBDIR.
+ (line 6)
+* AM_GNU_GETTEXT_NEED: AM_GNU_GETTEXT_NEED. (line 6)
+* AM_GNU_GETTEXT_VERSION: AM_GNU_GETTEXT_VERSION.
+ (line 6)
+* AM_ICONV: AM_ICONV. (line 6)
+* AM_PO_SUBDIRS: AM_PO_SUBDIRS. (line 6)
+* AM_XGETTEXT_OPTION: AM_XGETTEXT_OPTION. (line 6)
+
+
+File: gettext.info, Node: Index, Prev: Autoconf Macro Index, Up: Top
+
+General Index
+*************
+
+
+* Menu:
+
+* _, a macro to mark strings for translation: Mark Keywords. (line 45)
+* _nl_msg_cat_cntr: gettext grok. (line 62)
+* ABOUT-NLS file: Installing Localizations.
+ (line 13)
+* acconfig.h file: acconfig. (line 6)
+* accumulating translations: Creating Compendia. (line 14)
+* aclocal.m4 file: aclocal. (line 6)
+* adding keywords, xgettext: xgettext Invocation. (line 119)
+* ambiguities: Preparing Strings. (line 41)
+* apply a filter to translations: msgfilter Invocation.
+ (line 8)
+* apply command to all translations in a catalog: msgexec Invocation.
+ (line 8)
+* Arabic digits: c-format. (line 28)
+* attribute manipulation: msgattrib Invocation.
+ (line 8)
+* attribute, fuzzy: Fuzzy Entries. (line 6)
+* attributes of a PO file entry: Fuzzy Entries. (line 6)
+* attributes, manipulating: Manipulating. (line 56)
+* autoconf macros for gettext: autoconf macros. (line 6)
+* autopoint program, usage: autopoint Invocation.
+ (line 6)
+* auxiliary PO file: Auxiliary. (line 13)
+* available translations: Installing Localizations.
+ (line 6)
+* awk: gawk. (line 6)
+* awk-format flag: PO Files. (line 149)
+* backup old file, and msgmerge program: msgmerge Invocation. (line 65)
+* bash: bash. (line 6)
+* bibliography: References. (line 6)
+* big picture: Overview. (line 6)
+* bind_textdomain_codeset: Charset conversion. (line 28)
+* Boost format strings: xgettext Invocation. (line 254)
+* boost-format flag: PO Files. (line 198)
+* bug report address: Introduction. (line 24)
+* C and C-like languages: C. (line 6)
+* C trigraphs: xgettext Invocation. (line 241)
+* C#: C#. (line 6)
+* C# mode, and msgfmt program: msgfmt Invocation. (line 36)
+* C# mode, and msgunfmt program: msgunfmt Invocation. (line 19)
+* C# resources mode, and msgfmt program: msgfmt Invocation. (line 40)
+* C# resources mode, and msgunfmt program: msgunfmt Invocation.
+ (line 23)
+* C#, string concatenation: Preparing Strings. (line 168)
+* c-format flag: PO Files. (line 90)
+* c-format, and xgettext: c-format Flag. (line 48)
+* catalog encoding and msgexec output: msgexec Invocation. (line 25)
+* catclose, a catgets function: Interface to catgets.
+ (line 44)
+* catgets, a catgets function: Interface to catgets.
+ (line 25)
+* catgets, X/Open specification: catgets. (line 6)
+* catopen, a catgets function: Interface to catgets.
+ (line 13)
+* character encoding: Aspects. (line 67)
+* charset conversion at runtime: Charset conversion. (line 6)
+* charset of PO files: Header Entry. (line 106)
+* check format strings: msgfmt Invocation. (line 150)
+* checking of translations: Manipulating. (line 41)
+* clisp: Common Lisp. (line 6)
+* clisp C sources: clisp C. (line 6)
+* codeset: Aspects. (line 67)
+* comments in PO files: PO Files. (line 307)
+* comments, automatic: PO Files. (line 36)
+* comments, extracted: PO Files. (line 36)
+* comments, translator: PO Files. (line 36)
+* Common Lisp: Common Lisp. (line 6)
+* compare PO files: msgcmp Invocation. (line 8)
+* comparison of interfaces: Comparison. (line 6)
+* compatibility with X/Open msgfmt: msgfmt Invocation. (line 183)
+* compendium: Compendium. (line 6)
+* compendium, creating: Creating Compendia. (line 6)
+* concatenate PO files: msgcat Invocation. (line 8)
+* concatenating PO files into a compendium: Creating Compendia.
+ (line 14)
+* concatenation of strings: Preparing Strings. (line 117)
+* config.h.in file: config.h.in. (line 6)
+* context: Contexts. (line 6)
+* context, argument specification in xgettext: xgettext Invocation.
+ (line 119)
+* context, in MO files: MO Files. (line 71)
+* context, in PO files: PO Files. (line 202)
+* control characters: Preparing Strings. (line 190)
+* convert binary message catalog into PO file: msgunfmt Invocation.
+ (line 8)
+* convert translations to a different encoding: msgconv Invocation.
+ (line 8)
+* converting a package to use gettext: Prerequisites. (line 6)
+* country codes: Country Codes. (line 6)
+* create new PO file: msginit Invocation. (line 8)
+* creating a new PO file: Creating. (line 6)
+* creating compendia: Creating Compendia. (line 6)
+* csharp-format flag: PO Files. (line 145)
+* currency symbols: Aspects. (line 79)
+* date format: Aspects. (line 84)
+* dcngettext: Plural forms. (line 161)
+* dcpgettext: Contexts. (line 56)
+* dcpgettext_expr: Contexts. (line 112)
+* debugging messages marked as format strings: xgettext Invocation.
+ (line 258)
+* dialect: Manipulating. (line 28)
+* disabling NLS: lib/gettext.h. (line 6)
+* distribution tarball: Release Management. (line 6)
+* dngettext: Plural forms. (line 153)
+* dollar substitution: envsubst Invocation. (line 8)
+* domain ambiguities: Ambiguities. (line 6)
+* dpgettext: Contexts. (line 56)
+* dpgettext_expr: Contexts. (line 112)
+* duplicate elimination: Manipulating. (line 45)
+* duplicate removal: msguniq Invocation. (line 8)
+* editing comments in PO files: Modifying Comments. (line 6)
+* Editing PO Files: Editing. (line 6)
+* editing translations: Modifying Translations.
+ (line 6)
+* elisp-format flag: PO Files. (line 125)
+* Emacs Lisp: Emacs Lisp. (line 6)
+* Emacs PO Mode: PO Mode. (line 6)
+* encoding: Aspects. (line 67)
+* encoding conversion: Manipulating. (line 17)
+* encoding conversion at runtime: Charset conversion. (line 6)
+* encoding for your language: Header Entry. (line 135)
+* encoding list: Header Entry. (line 119)
+* encoding of PO files: Header Entry. (line 106)
+* environment variables: envsubst Invocation. (line 8)
+* envsubst program, usage: envsubst Invocation. (line 6)
+* eval_gettext function, usage: eval_gettext Invocation.
+ (line 6)
+* eval_ngettext function, usage: eval_ngettext Invocation.
+ (line 6)
+* evolution of packages: Overview. (line 127)
+* extracting parts of a PO file into a compendium: Creating Compendia.
+ (line 65)
+* FDL, GNU Free Documentation License: GNU FDL. (line 6)
+* file format, .mo: MO Files. (line 6)
+* file format, .po: PO Files. (line 6)
+* files, .po and .mo: Files. (line 6)
+* files, .pot: Overview. (line 67)
+* filter messages according to attributes: msgattrib Invocation.
+ (line 8)
+* find common messages: msgcomm Invocation. (line 8)
+* force use of fuzzy entries: msgfmt Invocation. (line 199)
+* format strings: c-format Flag. (line 6)
+* Free Pascal: Pascal. (line 6)
+* function attribute, __format__: xgettext Invocation. (line 205)
+* function attribute, __format_arg__: xgettext Invocation. (line 219)
+* fuzzy entries: Fuzzy Entries. (line 6)
+* fuzzy flag: PO Files. (line 80)
+* gawk: gawk. (line 6)
+* gcc-internal-format flag: PO Files. (line 177)
+* GCC-source: GCC-source. (line 6)
+* generate binary message catalog from PO file: msgfmt Invocation.
+ (line 8)
+* generate translation catalog in English: msgen Invocation. (line 8)
+* gettext files: Adjusting Files. (line 6)
+* gettext installation: Installation. (line 6)
+* gettext interface: Interface to gettext.
+ (line 6)
+* gettext program, usage: gettext Invocation. (line 6)
+* gettext vs catgets: Comparison. (line 6)
+* gettext, a programmer's view: gettext. (line 6)
+* gettext.h file: lib/gettext.h. (line 6)
+* gettextize program, usage: gettextize Invocation.
+ (line 34)
+* gfc-internal-format flag: PO Files. (line 181)
+* GNOME PO file editor: Gtranslator. (line 6)
+* GPL, GNU General Public License: GNU GPL. (line 6)
+* GUI programs: Contexts. (line 6)
+* guile: Scheme. (line 6)
+* hash table, inside MO files: MO Files. (line 55)
+* he, she, and they: Introduction. (line 15)
+* header entry of a PO file: Header Entry. (line 6)
+* help option: Preparing Strings. (line 109)
+* history of GNU gettext: History. (line 6)
+* i18n: Concepts. (line 6)
+* importing PO files: Normalizing. (line 55)
+* include file libintl.h <1>: lib/gettext.h. (line 29)
+* include file libintl.h <2>: Comparison. (line 33)
+* include file libintl.h <3>: Importing. (line 11)
+* include file libintl.h: Overview. (line 57)
+* initialization: Triggering. (line 6)
+* initialize new PO file: msginit Invocation. (line 8)
+* initialize translations from a compendium: Using Compendia. (line 12)
+* installing gettext: Installation. (line 6)
+* interface to catgets: Interface to catgets.
+ (line 6)
+* internationalization: Concepts. (line 16)
+* inttypes.h: Preparing Strings. (line 133)
+* ISO 3166: Country Codes. (line 6)
+* ISO 639: Language Codes. (line 6)
+* Java: Java. (line 6)
+* Java mode, and msgfmt program: msgfmt Invocation. (line 30)
+* Java mode, and msgunfmt program: msgunfmt Invocation. (line 16)
+* Java, string concatenation: Preparing Strings. (line 168)
+* java-format flag: PO Files. (line 141)
+* KDE format strings: xgettext Invocation. (line 250)
+* KDE PO file editor: KBabel. (line 6)
+* kde-format flag: PO Files. (line 194)
+* keyboard accelerator checking: msgfmt Invocation. (line 187)
+* l10n: Concepts. (line 6)
+* language codes: Language Codes. (line 6)
+* language selection: Locale Environment Variables.
+ (line 6)
+* language selection at runtime: gettext grok. (line 14)
+* large package: Ambiguities. (line 6)
+* LGPL, GNU Lesser General Public License: GNU LGPL. (line 6)
+* libiconv library: AM_ICONV. (line 21)
+* libintl for C#: C#. (line 178)
+* libintl for Java: Java. (line 105)
+* libintl library: AM_GNU_GETTEXT. (line 53)
+* librep Lisp: librep. (line 6)
+* librep-format flag: PO Files. (line 129)
+* License, GNU FDL: GNU FDL. (line 6)
+* License, GNU GPL: GNU GPL. (line 6)
+* License, GNU LGPL: GNU LGPL. (line 6)
+* Licenses: Licenses. (line 6)
+* LINGUAS file: po/LINGUAS. (line 6)
+* link with libintl: Overview. (line 62)
+* Linux <1>: Header Entry. (line 132)
+* Linux <2>: Overview. (line 62)
+* Linux: Aspects. (line 125)
+* Lisp: Common Lisp. (line 6)
+* lisp-format flag: PO Files. (line 121)
+* list of translation teams, where to find: Header Entry. (line 59)
+* locale categories: Aspects. (line 61)
+* locale category, LC_ALL: Triggering. (line 23)
+* locale category, LC_COLLATE: Triggering. (line 53)
+* locale category, LC_CTYPE <1>: Triggering. (line 23)
+* locale category, LC_CTYPE: Aspects. (line 67)
+* locale category, LC_MESSAGES <1>: Triggering. (line 53)
+* locale category, LC_MESSAGES: Aspects. (line 108)
+* locale category, LC_MONETARY <1>: Triggering. (line 53)
+* locale category, LC_MONETARY: Aspects. (line 79)
+* locale category, LC_NUMERIC <1>: Triggering. (line 53)
+* locale category, LC_NUMERIC: Aspects. (line 94)
+* locale category, LC_RESPONSES: Triggering. (line 53)
+* locale category, LC_TIME <1>: Triggering. (line 53)
+* locale category, LC_TIME: Aspects. (line 84)
+* locale program: Header Entry. (line 112)
+* localization: Concepts. (line 26)
+* lookup message translation <1>: eval_gettext Invocation.
+ (line 8)
+* lookup message translation: gettext Invocation. (line 9)
+* lookup plural message translation <1>: eval_ngettext Invocation.
+ (line 8)
+* lookup plural message translation: ngettext Invocation. (line 8)
+* magic signature of MO files: MO Files. (line 9)
+* Makefile.in.in extensions: po/Rules-*. (line 6)
+* Makevars file: po/Makevars. (line 6)
+* manipulating PO files: Manipulating. (line 6)
+* marking Perl sources: Perl. (line 93)
+* marking string initializers: Special cases. (line 6)
+* marking strings that require translation: Mark Keywords. (line 6)
+* marking strings, preparations: Preparing Strings. (line 6)
+* marking translatable strings: Overview. (line 34)
+* markup: Preparing Strings. (line 190)
+* menu entries: Contexts. (line 6)
+* menu, keyboard accelerator support: msgfmt Invocation. (line 187)
+* merge PO files: msgcat Invocation. (line 8)
+* merging two PO files: Manipulating. (line 10)
+* message catalog files location: Locating Catalogs. (line 6)
+* messages: Aspects. (line 108)
+* migration from earlier versions of gettext: Prerequisites. (line 6)
+* mkinstalldirs file: mkinstalldirs. (line 6)
+* mnemonics of menu entries: msgfmt Invocation. (line 187)
+* MO file's format: MO Files. (line 6)
+* modify message attributes: msgattrib Invocation.
+ (line 62)
+* msgattrib program, usage: msgattrib Invocation.
+ (line 6)
+* msgcat program, usage: msgcat Invocation. (line 6)
+* msgcmp program, usage: msgcmp Invocation. (line 6)
+* msgcomm program, usage: msgcomm Invocation. (line 6)
+* msgconv program, usage: msgconv Invocation. (line 6)
+* msgctxt: PO Files. (line 202)
+* msgen program, usage: msgen Invocation. (line 6)
+* msgexec program, usage: msgexec Invocation. (line 6)
+* msgfilter filter and catalog encoding: msgfilter Invocation.
+ (line 53)
+* msgfilter program, usage: msgfilter Invocation.
+ (line 6)
+* msgfmt program, usage: msgfmt Invocation. (line 6)
+* msggrep program, usage: msggrep Invocation. (line 6)
+* msgid: PO Files. (line 56)
+* msgid_plural: PO Files. (line 222)
+* msginit program, usage: msginit Invocation. (line 6)
+* msgmerge program, usage: msgmerge Invocation. (line 6)
+* msgstr: PO Files. (line 56)
+* msgunfmt program, usage: msgunfmt Invocation. (line 6)
+* msguniq program, usage: msguniq Invocation. (line 6)
+* multi-line strings: Normalizing. (line 65)
+* N_, a convenience macro: Comparison. (line 41)
+* Native Language Support: Concepts. (line 51)
+* Natural Language Support: Concepts. (line 51)
+* newlines in PO files: PO Files. (line 302)
+* ngettext: Plural forms. (line 84)
+* ngettext program, usage: ngettext Invocation. (line 6)
+* NLS: Concepts. (line 51)
+* no-awk-format flag: PO Files. (line 150)
+* no-boost-format flag: PO Files. (line 199)
+* no-c-format flag: PO Files. (line 91)
+* no-c-format, and xgettext: c-format Flag. (line 48)
+* no-csharp-format flag: PO Files. (line 146)
+* no-elisp-format flag: PO Files. (line 126)
+* no-gcc-internal-format flag: PO Files. (line 178)
+* no-gfc-internal-format flag: PO Files. (line 182)
+* no-java-format flag: PO Files. (line 142)
+* no-kde-format flag: PO Files. (line 195)
+* no-librep-format flag: PO Files. (line 130)
+* no-lisp-format flag: PO Files. (line 122)
+* no-objc-format flag: PO Files. (line 110)
+* no-object-pascal-format flag: PO Files. (line 154)
+* no-perl-brace-format flag: PO Files. (line 170)
+* no-perl-format flag: PO Files. (line 166)
+* no-php-format flag: PO Files. (line 174)
+* no-python-format flag: PO Files. (line 118)
+* no-qt-format flag: PO Files. (line 187)
+* no-qt-plural-format flag: PO Files. (line 191)
+* no-scheme-format flag: PO Files. (line 134)
+* no-sh-format flag: PO Files. (line 114)
+* no-smalltalk-format flag: PO Files. (line 138)
+* no-tcl-format flag: PO Files. (line 162)
+* no-ycp-format flag: PO Files. (line 158)
+* nplurals, in a PO file header: Plural forms. (line 178)
+* number format: Aspects. (line 94)
+* objc-format flag: PO Files. (line 109)
+* Object Pascal: Pascal. (line 6)
+* object-pascal-format flag: PO Files. (line 153)
+* obsolete entries: Obsolete Entries. (line 6)
+* optimization of gettext functions: Optimized gettext. (line 6)
+* orthography: Manipulating. (line 28)
+* outdigits: c-format. (line 28)
+* output to stdout, xgettext: xgettext Invocation. (line 48)
+* overview of gettext: Overview. (line 6)
+* package and version declaration in configure.ac: configure.ac.
+ (line 9)
+* package build and installation options: Installers. (line 6)
+* package distributor's view of gettext: Installers. (line 6)
+* package installer's view of gettext: Installers. (line 6)
+* package maintainer's view of gettext: Maintainers. (line 6)
+* paragraphs: Preparing Strings. (line 101)
+* Pascal: Pascal. (line 6)
+* Perl: Perl. (line 6)
+* Perl default keywords: Default Keywords. (line 6)
+* Perl invalid string interpolation: Interpolation I. (line 6)
+* Perl long lines: Long Lines. (line 6)
+* Perl parentheses: Parentheses. (line 6)
+* Perl pitfalls: Perl Pitfalls. (line 6)
+* Perl quote-like expressions: Quote-like Expressions.
+ (line 6)
+* Perl special keywords for hash-lookups: Special Keywords. (line 6)
+* Perl valid string interpolation: Interpolation II. (line 6)
+* perl-brace-format flag: PO Files. (line 169)
+* perl-format flag: PO Files. (line 165)
+* pgettext: Contexts. (line 33)
+* pgettext_expr: Contexts. (line 112)
+* PHP: PHP. (line 6)
+* php-format flag: PO Files. (line 173)
+* Pike: Pike. (line 6)
+* plural form formulas: Plural forms. (line 198)
+* plural forms: Plural forms. (line 6)
+* plural forms, in MO files: MO Files. (line 74)
+* plural forms, in PO files: PO Files. (line 222)
+* plural forms, translating: Translating plural forms.
+ (line 6)
+* plural, in a PO file header: Plural forms. (line 178)
+* PO files' format: PO Files. (line 6)
+* PO mode (Emacs) commands: Main PO Commands. (line 6)
+* PO template file: Template. (line 6)
+* po_file_domains: libgettextpo. (line 41)
+* po_file_free: libgettextpo. (line 36)
+* po_file_read: libgettextpo. (line 30)
+* po_message_iterator: libgettextpo. (line 50)
+* po_message_iterator_free: libgettextpo. (line 57)
+* po_message_msgid: libgettextpo. (line 70)
+* po_message_msgid_plural: libgettextpo. (line 75)
+* po_message_msgstr: libgettextpo. (line 80)
+* po_message_msgstr_plural: libgettextpo. (line 86)
+* po_next_message: libgettextpo. (line 62)
+* portability problems with sed: msgfilter Invocation.
+ (line 64)
+* POTFILES.in file: po/POTFILES.in. (line 6)
+* preparing programs for translation: Sources. (line 6)
+* preparing shell scripts for translation: Preparing Shell Scripts.
+ (line 6)
+* problems with catgets interface: Problems with catgets.
+ (line 6)
+* programming languages: Language Implementors.
+ (line 6)
+* Python: Python. (line 6)
+* python-format flag: PO Files. (line 117)
+* Qt format strings: xgettext Invocation. (line 246)
+* Qt mode, and msgfmt program: msgfmt Invocation. (line 46)
+* qt-format flag: PO Files. (line 186)
+* qt-plural-format flag: PO Files. (line 190)
+* quotation marks <1>: po/Rules-*. (line 11)
+* quotation marks: Header Entry. (line 186)
+* quote characters, use in PO files: Header Entry. (line 186)
+* range: flag: PO Files. (line 253)
+* recode-sr-latin program: msgfilter Invocation.
+ (line 92)
+* related reading: References. (line 6)
+* release: Release Management. (line 6)
+* RST: RST. (line 6)
+* Scheme: Scheme. (line 6)
+* scheme-format flag: PO Files. (line 133)
+* scripting languages: Language Implementors.
+ (line 6)
+* search messages in a catalog: msggrep Invocation. (line 8)
+* selecting message language: Locale Environment Variables.
+ (line 6)
+* sentences: Preparing Strings. (line 44)
+* setting up gettext at build time: Installers. (line 6)
+* setting up gettext at run time: Locale Environment Variables.
+ (line 6)
+* several domains: Ambiguities. (line 6)
+* sex: Introduction. (line 15)
+* sh-format flag: PO Files. (line 113)
+* she, he, and they: Introduction. (line 15)
+* shell format string: envsubst Invocation. (line 8)
+* shell scripts: sh. (line 6)
+* Smalltalk: Smalltalk. (line 6)
+* smalltalk-format flag: PO Files. (line 137)
+* sorting msgcat output: msgcat Invocation. (line 151)
+* sorting msgmerge output: msgmerge Invocation. (line 187)
+* sorting msgunfmt output: msgunfmt Invocation. (line 153)
+* sorting output of xgettext: xgettext Invocation. (line 328)
+* specifying plural form in a PO file: Plural forms. (line 178)
+* standard output, and msgcat: msgcat Invocation. (line 47)
+* standard output, and msgmerge program: msgmerge Invocation. (line 56)
+* string concatenation: Preparing Strings. (line 117)
+* string normalization in entries: Normalizing. (line 6)
+* style: Preparing Strings. (line 24)
+* supported languages, xgettext: xgettext Invocation. (line 56)
+* Tcl: Tcl. (line 6)
+* Tcl mode, and msgfmt program: msgfmt Invocation. (line 43)
+* Tcl mode, and msgunfmt program: msgunfmt Invocation. (line 26)
+* tcl-format flag: PO Files. (line 161)
+* template PO file: Overview. (line 67)
+* testing .po files for equivalence: xgettext Invocation. (line 338)
+* Tk's scripting language: Tcl. (line 6)
+* translated entries: Translated Entries. (line 6)
+* translating menu entries: Contexts. (line 6)
+* translation aspects: Aspects. (line 6)
+* Translation Matrix: Installing Localizations.
+ (line 6)
+* Translation Project: Why. (line 17)
+* turning off NLS support: lib/gettext.h. (line 6)
+* tutorial of gettext usage: Overview. (line 6)
+* unify duplicate translations: msguniq Invocation. (line 8)
+* untranslated entries: Untranslated Entries.
+ (line 6)
+* update translations from a compendium: Using Compendia. (line 20)
+* upgrading to new versions of gettext: Prerequisites. (line 6)
+* version control for backup files, msgmerge: msgmerge Invocation.
+ (line 71)
+* wxWidgets library: wxWidgets. (line 6)
+* xargs, and output from msgexec: msgexec Invocation. (line 14)
+* xgettext program, usage: xgettext Invocation. (line 6)
+* xmodmap program, and typing quotation marks: Header Entry. (line 198)
+* YaST2 scripting language: YCP. (line 6)
+* YCP: YCP. (line 6)
+* ycp-format flag: PO Files. (line 157)
+
+
+
+Tag Table:
+Node: Top2956
+Node: Introduction17401
+Node: Why19024
+Ref: Why-Footnote-122238
+Node: Concepts22394
+Node: Aspects25815
+Node: Files32349
+Node: Overview34258
+Node: Users44194
+Node: System Installation45105
+Node: Setting the GUI Locale46797
+Node: Setting the POSIX Locale48173
+Node: Locale Names49112
+Node: Locale Environment Variables51517
+Node: The LANGUAGE variable53730
+Node: Installing Localizations55630
+Node: PO Files56985
+Ref: PO Files-Footnote-169122
+Node: Sources69249
+Node: Importing70475
+Node: Triggering71158
+Node: Preparing Strings74358
+Node: Mark Keywords83401
+Node: Marking87861
+Node: c-format Flag95591
+Node: Special cases99510
+Node: Bug Report Address102253
+Node: Names104218
+Node: Libraries108503
+Node: Template111540
+Node: xgettext Invocation112265
+Node: Creating127823
+Node: msginit Invocation128708
+Node: Header Entry131610
+Node: Updating140573
+Node: msgmerge Invocation140788
+Node: Editing146578
+Node: KBabel146936
+Node: Gtranslator147074
+Node: PO Mode147216
+Node: Installation148870
+Node: Main PO Commands150834
+Node: Entry Positioning155922
+Node: Normalizing161390
+Node: Translated Entries165884
+Node: Fuzzy Entries167242
+Node: Untranslated Entries170423
+Node: Obsolete Entries172355
+Node: Modifying Translations175580
+Node: Modifying Comments183549
+Node: Subedit187976
+Node: C Sources Context191872
+Node: Auxiliary196996
+Node: Compendium200212
+Node: Creating Compendia200827
+Node: Using Compendia203311
+Node: Manipulating204251
+Node: msgcat Invocation208079
+Node: msgconv Invocation212833
+Node: msggrep Invocation216288
+Node: msgfilter Invocation222446
+Node: msguniq Invocation228985
+Node: msgcomm Invocation233150
+Node: msgcmp Invocation237471
+Node: msgattrib Invocation239628
+Node: msgen Invocation244589
+Node: msgexec Invocation248441
+Node: Colorizing251020
+Node: The --color option252049
+Node: The TERM variable253681
+Node: The --style option255133
+Node: Style rules256441
+Node: Customizing less263183
+Node: libgettextpo264586
+Node: Binaries269702
+Node: msgfmt Invocation270046
+Node: msgunfmt Invocation277198
+Node: MO Files281636
+Node: Programmers290214
+Node: catgets291396
+Node: Interface to catgets292810
+Node: Problems with catgets294819
+Node: gettext295734
+Node: Interface to gettext297237
+Node: Ambiguities299567
+Node: Locating Catalogs302282
+Ref: Locating Catalogs-Footnote-1303512
+Ref: Locating Catalogs-Footnote-2303738
+Node: Charset conversion303887
+Node: Contexts306341
+Node: Plural forms311847
+Ref: Plural forms-Footnote-1327784
+Node: Optimized gettext327906
+Node: Comparison329245
+Node: Using libintl.a333515
+Node: gettext grok333958
+Node: Temp Programmers336599
+Node: Temp Implementations337127
+Node: Temp catgets338507
+Node: Temp WSI340208
+Node: Temp Notes342210
+Node: Translators342713
+Node: Trans Intro 0343248
+Node: Trans Intro 1345997
+Node: Discussions347961
+Node: Organization351619
+Node: Central Coordination353695
+Node: National Teams354838
+Node: Sub-Cultures357365
+Node: Organizational Ideas358302
+Node: Mailing Lists359323
+Node: Information Flow361146
+Node: Translating plural forms363400
+Node: Prioritizing messages366769
+Node: Maintainers371076
+Node: Flat and Non-Flat373032
+Node: Prerequisites374525
+Node: gettextize Invocation378682
+Node: Adjusting Files386091
+Node: po/POTFILES.in387880
+Node: po/LINGUAS389129
+Node: po/Makevars390821
+Node: po/Rules-*391763
+Node: configure.ac393234
+Node: config.guess396256
+Node: mkinstalldirs397611
+Node: aclocal398016
+Node: acconfig400030
+Node: config.h.in400530
+Node: Makefile401998
+Node: src/Makefile404595
+Node: lib/gettext.h409316
+Node: autoconf macros411564
+Node: AM_GNU_GETTEXT412406
+Node: AM_GNU_GETTEXT_VERSION416371
+Node: AM_GNU_GETTEXT_NEED416826
+Node: AM_GNU_GETTEXT_INTL_SUBDIR417719
+Node: AM_PO_SUBDIRS418374
+Node: AM_XGETTEXT_OPTION419169
+Node: AM_ICONV420039
+Node: CVS Issues422254
+Node: Distributed CVS422845
+Node: Files under CVS424773
+Node: autopoint Invocation428049
+Node: Release Management429893
+Node: Installers430406
+Node: Programming Languages431633
+Node: Language Implementors432459
+Node: Programmers for other Languages437287
+Node: Translators for other Languages437871
+Node: c-format439568
+Node: objc-format441287
+Node: sh-format441642
+Node: python-format442447
+Node: lisp-format442888
+Node: elisp-format443217
+Node: librep-format443710
+Node: scheme-format444113
+Node: smalltalk-format444392
+Node: java-format444895
+Node: csharp-format445346
+Node: awk-format445724
+Node: object-pascal-format446052
+Node: ycp-format446438
+Node: tcl-format446840
+Node: perl-format447138
+Node: php-format447886
+Node: gcc-internal-format448254
+Node: gfc-internal-format449309
+Node: qt-format450006
+Node: qt-plural-format450447
+Node: kde-format450802
+Node: boost-format451215
+Node: Maintainers for other Languages451763
+Node: List of Programming Languages453001
+Node: C454284
+Node: sh455584
+Node: Preparing Shell Scripts456858
+Node: gettext.sh460250
+Node: gettext Invocation460800
+Node: ngettext Invocation462724
+Node: envsubst Invocation464485
+Node: eval_gettext Invocation465906
+Node: eval_ngettext Invocation466367
+Node: bash466881
+Node: Python468860
+Node: Common Lisp471183
+Node: clisp C471983
+Node: Emacs Lisp472698
+Node: librep473424
+Node: Scheme474159
+Node: Smalltalk474943
+Node: Java475977
+Node: C#481773
+Node: gawk490999
+Node: Pascal491911
+Node: wxWidgets493219
+Node: YCP494126
+Node: Tcl494865
+Node: Perl496275
+Node: General Problems499283
+Node: Default Keywords504771
+Node: Special Keywords505726
+Node: Quote-like Expressions507242
+Node: Interpolation I509520
+Node: Interpolation II513313
+Node: Parentheses515681
+Node: Long Lines517202
+Node: Perl Pitfalls519050
+Node: PHP523295
+Node: Pike524226
+Node: GCC-source524887
+Node: List of Data Formats525634
+Node: POT526103
+Node: RST526361
+Node: Glade526587
+Node: Conclusion526947
+Node: History527453
+Node: References531723
+Node: Language Codes533370
+Node: Usual Language Codes533885
+Node: Rare Language Codes538247
+Node: Country Codes539916
+Node: Licenses545805
+Node: GNU GPL547650
+Node: GNU LGPL566833
+Node: GNU FDL594972
+Node: Program Index617361
+Node: Option Index619247
+Node: Variable Index668348
+Node: PO Mode Index671605
+Node: Autoconf Macro Index685441
+Node: Index686248
+
+End Tag Table
+
+
+Local Variables:
+coding: utf-8
+End:
diff --git a/gtk+-mingw/share/info/libffi.info b/gtk+-mingw/share/info/libffi.info
new file mode 100644
index 0000000..402f760
--- /dev/null
+++ b/gtk+-mingw/share/info/libffi.info
@@ -0,0 +1,617 @@
+This is ../libffi/doc/libffi.info, produced by makeinfo version 4.13
+from ../libffi/doc/libffi.texi.
+
+This manual is for Libffi, a portable foreign-function interface
+library.
+
+ Copyright (C) 2008, 2010, 2011 Red Hat, Inc.
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or
+ (at your option) any later version. A copy of the license is
+ included in the section entitled "GNU General Public License".
+
+
+INFO-DIR-SECTION Development
+START-INFO-DIR-ENTRY
+* libffi: (libffi). Portable foreign-function interface library.
+END-INFO-DIR-ENTRY
+
+
+File: libffi.info, Node: Top, Next: Introduction, Up: (dir)
+
+libffi
+******
+
+This manual is for Libffi, a portable foreign-function interface
+library.
+
+ Copyright (C) 2008, 2010, 2011 Red Hat, Inc.
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or
+ (at your option) any later version. A copy of the license is
+ included in the section entitled "GNU General Public License".
+
+
+* Menu:
+
+* Introduction:: What is libffi?
+* Using libffi:: How to use libffi.
+* Missing Features:: Things libffi can't do.
+* Index:: Index.
+
+
+File: libffi.info, Node: Introduction, Next: Using libffi, Prev: Top, Up: Top
+
+1 What is libffi?
+*****************
+
+Compilers for high level languages generate code that follow certain
+conventions. These conventions are necessary, in part, for separate
+compilation to work. One such convention is the "calling convention".
+The calling convention is a set of assumptions made by the compiler
+about where function arguments will be found on entry to a function. A
+calling convention also specifies where the return value for a function
+is found. The calling convention is also sometimes called the "ABI" or
+"Application Binary Interface".
+
+ Some programs may not know at the time of compilation what arguments
+are to be passed to a function. For instance, an interpreter may be
+told at run-time about the number and types of arguments used to call a
+given function. `Libffi' can be used in such programs to provide a
+bridge from the interpreter program to compiled code.
+
+ The `libffi' library provides a portable, high level programming
+interface to various calling conventions. This allows a programmer to
+call any function specified by a call interface description at run time.
+
+ FFI stands for Foreign Function Interface. A foreign function
+interface is the popular name for the interface that allows code
+written in one language to call code written in another language. The
+`libffi' library really only provides the lowest, machine dependent
+layer of a fully featured foreign function interface. A layer must
+exist above `libffi' that handles type conversions for values passed
+between the two languages.
+
+
+File: libffi.info, Node: Using libffi, Next: Missing Features, Prev: Introduction, Up: Top
+
+2 Using libffi
+**************
+
+* Menu:
+
+* The Basics:: The basic libffi API.
+* Simple Example:: A simple example.
+* Types:: libffi type descriptions.
+* Multiple ABIs:: Different passing styles on one platform.
+* The Closure API:: Writing a generic function.
+* Closure Example:: A closure example.
+
+
+File: libffi.info, Node: The Basics, Next: Simple Example, Up: Using libffi
+
+2.1 The Basics
+==============
+
+`Libffi' assumes that you have a pointer to the function you wish to
+call and that you know the number and types of arguments to pass it, as
+well as the return type of the function.
+
+ The first thing you must do is create an `ffi_cif' object that
+matches the signature of the function you wish to call. This is a
+separate step because it is common to make multiple calls using a
+single `ffi_cif'. The "cif" in `ffi_cif' stands for Call InterFace.
+To prepare a call interface object, use the function `ffi_prep_cif'.
+
+ -- Function: ffi_status ffi_prep_cif (ffi_cif *CIF, ffi_abi ABI,
+ unsigned int NARGS, ffi_type *RTYPE, ffi_type **ARGTYPES)
+ This initializes CIF according to the given parameters.
+
+ ABI is the ABI to use; normally `FFI_DEFAULT_ABI' is what you
+ want. *note Multiple ABIs:: for more information.
+
+ NARGS is the number of arguments that this function accepts.
+
+ RTYPE is a pointer to an `ffi_type' structure that describes the
+ return type of the function. *Note Types::.
+
+ ARGTYPES is a vector of `ffi_type' pointers. ARGTYPES must have
+ NARGS elements. If NARGS is 0, this argument is ignored.
+
+ `ffi_prep_cif' returns a `libffi' status code, of type
+ `ffi_status'. This will be either `FFI_OK' if everything worked
+ properly; `FFI_BAD_TYPEDEF' if one of the `ffi_type' objects is
+ incorrect; or `FFI_BAD_ABI' if the ABI parameter is invalid.
+
+ If the function being called is variadic (varargs) then
+`ffi_prep_cif_var' must be used instead of `ffi_prep_cif'.
+
+ -- Function: ffi_status ffi_prep_cif_var (ffi_cif *CIF, ffi_abi
+ varabi, unsigned int NFIXEDARGS, unsigned int varntotalargs,
+ ffi_type *RTYPE, ffi_type **ARGTYPES)
+ This initializes CIF according to the given parameters for a call
+ to a variadic function. In general it's operation is the same as
+ for `ffi_prep_cif' except that:
+
+ NFIXEDARGS is the number of fixed arguments, prior to any variadic
+ arguments. It must be greater than zero.
+
+ NTOTALARGS the total number of arguments, including variadic and
+ fixed arguments.
+
+ Note that, different cif's must be prepped for calls to the same
+ function when different numbers of arguments are passed.
+
+ Also note that a call to `ffi_prep_cif_var' with
+ NFIXEDARGS=NOTOTALARGS is NOT equivalent to a call to
+ `ffi_prep_cif'.
+
+
+ To call a function using an initialized `ffi_cif', use the
+`ffi_call' function:
+
+ -- Function: void ffi_call (ffi_cif *CIF, void *FN, void *RVALUE, void
+ **AVALUES)
+ This calls the function FN according to the description given in
+ CIF. CIF must have already been prepared using `ffi_prep_cif'.
+
+ RVALUE is a pointer to a chunk of memory that will hold the result
+ of the function call. This must be large enough to hold the
+ result and must be suitably aligned; it is the caller's
+ responsibility to ensure this. If CIF declares that the function
+ returns `void' (using `ffi_type_void'), then RVALUE is ignored.
+ If RVALUE is `NULL', then the return value is discarded.
+
+ AVALUES is a vector of `void *' pointers that point to the memory
+ locations holding the argument values for a call. If CIF declares
+ that the function has no arguments (i.e., NARGS was 0), then
+ AVALUES is ignored. Note that argument values may be modified by
+ the callee (for instance, structs passed by value); the burden of
+ copying pass-by-value arguments is placed on the caller.
+
+
+File: libffi.info, Node: Simple Example, Next: Types, Prev: The Basics, Up: Using libffi
+
+2.2 Simple Example
+==================
+
+Here is a trivial example that calls `puts' a few times.
+
+ #include <stdio.h>
+ #include <ffi.h>
+
+ int main()
+ {
+ ffi_cif cif;
+ ffi_type *args[1];
+ void *values[1];
+ char *s;
+ int rc;
+
+ /* Initialize the argument info vectors */
+ args[0] = &ffi_type_pointer;
+ values[0] = &s;
+
+ /* Initialize the cif */
+ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+ &ffi_type_uint, args) == FFI_OK)
+ {
+ s = "Hello World!";
+ ffi_call(&cif, puts, &rc, values);
+ /* rc now holds the result of the call to puts */
+
+ /* values holds a pointer to the function's arg, so to
+ call puts() again all we need to do is change the
+ value of s */
+ s = "This is cool!";
+ ffi_call(&cif, puts, &rc, values);
+ }
+
+ return 0;
+ }
+
+
+File: libffi.info, Node: Types, Next: Multiple ABIs, Prev: Simple Example, Up: Using libffi
+
+2.3 Types
+=========
+
+* Menu:
+
+* Primitive Types:: Built-in types.
+* Structures:: Structure types.
+* Type Example:: Structure type example.
+
+
+File: libffi.info, Node: Primitive Types, Next: Structures, Up: Types
+
+2.3.1 Primitive Types
+---------------------
+
+`Libffi' provides a number of built-in type descriptors that can be
+used to describe argument and return types:
+
+`ffi_type_void'
+ The type `void'. This cannot be used for argument types, only for
+ return values.
+
+`ffi_type_uint8'
+ An unsigned, 8-bit integer type.
+
+`ffi_type_sint8'
+ A signed, 8-bit integer type.
+
+`ffi_type_uint16'
+ An unsigned, 16-bit integer type.
+
+`ffi_type_sint16'
+ A signed, 16-bit integer type.
+
+`ffi_type_uint32'
+ An unsigned, 32-bit integer type.
+
+`ffi_type_sint32'
+ A signed, 32-bit integer type.
+
+`ffi_type_uint64'
+ An unsigned, 64-bit integer type.
+
+`ffi_type_sint64'
+ A signed, 64-bit integer type.
+
+`ffi_type_float'
+ The C `float' type.
+
+`ffi_type_double'
+ The C `double' type.
+
+`ffi_type_uchar'
+ The C `unsigned char' type.
+
+`ffi_type_schar'
+ The C `signed char' type. (Note that there is not an exact
+ equivalent to the C `char' type in `libffi'; ordinarily you should
+ either use `ffi_type_schar' or `ffi_type_uchar' depending on
+ whether `char' is signed.)
+
+`ffi_type_ushort'
+ The C `unsigned short' type.
+
+`ffi_type_sshort'
+ The C `short' type.
+
+`ffi_type_uint'
+ The C `unsigned int' type.
+
+`ffi_type_sint'
+ The C `int' type.
+
+`ffi_type_ulong'
+ The C `unsigned long' type.
+
+`ffi_type_slong'
+ The C `long' type.
+
+`ffi_type_longdouble'
+ On platforms that have a C `long double' type, this is defined.
+ On other platforms, it is not.
+
+`ffi_type_pointer'
+ A generic `void *' pointer. You should use this for all pointers,
+ regardless of their real type.
+
+ Each of these is of type `ffi_type', so you must take the address
+when passing to `ffi_prep_cif'.
+
+
+File: libffi.info, Node: Structures, Next: Type Example, Prev: Primitive Types, Up: Types
+
+2.3.2 Structures
+----------------
+
+Although `libffi' has no special support for unions or bit-fields, it
+is perfectly happy passing structures back and forth. You must first
+describe the structure to `libffi' by creating a new `ffi_type' object
+for it.
+
+ -- ffi_type:
+ The `ffi_type' has the following members:
+ `size_t size'
+ This is set by `libffi'; you should initialize it to zero.
+
+ `unsigned short alignment'
+ This is set by `libffi'; you should initialize it to zero.
+
+ `unsigned short type'
+ For a structure, this should be set to `FFI_TYPE_STRUCT'.
+
+ `ffi_type **elements'
+ This is a `NULL'-terminated array of pointers to `ffi_type'
+ objects. There is one element per field of the struct.
+
+
+File: libffi.info, Node: Type Example, Prev: Structures, Up: Types
+
+2.3.3 Type Example
+------------------
+
+The following example initializes a `ffi_type' object representing the
+`tm' struct from Linux's `time.h'.
+
+ Here is how the struct is defined:
+
+ struct tm {
+ int tm_sec;
+ int tm_min;
+ int tm_hour;
+ int tm_mday;
+ int tm_mon;
+ int tm_year;
+ int tm_wday;
+ int tm_yday;
+ int tm_isdst;
+ /* Those are for future use. */
+ long int __tm_gmtoff__;
+ __const char *__tm_zone__;
+ };
+
+ Here is the corresponding code to describe this struct to `libffi':
+
+ {
+ ffi_type tm_type;
+ ffi_type *tm_type_elements[12];
+ int i;
+
+ tm_type.size = tm_type.alignment = 0;
+ tm_type.elements = &tm_type_elements;
+
+ for (i = 0; i < 9; i++)
+ tm_type_elements[i] = &ffi_type_sint;
+
+ tm_type_elements[9] = &ffi_type_slong;
+ tm_type_elements[10] = &ffi_type_pointer;
+ tm_type_elements[11] = NULL;
+
+ /* tm_type can now be used to represent tm argument types and
+ return types for ffi_prep_cif() */
+ }
+
+
+File: libffi.info, Node: Multiple ABIs, Next: The Closure API, Prev: Types, Up: Using libffi
+
+2.4 Multiple ABIs
+=================
+
+A given platform may provide multiple different ABIs at once. For
+instance, the x86 platform has both `stdcall' and `fastcall' functions.
+
+ `libffi' provides some support for this. However, this is
+necessarily platform-specific.
+
+
+File: libffi.info, Node: The Closure API, Next: Closure Example, Prev: Multiple ABIs, Up: Using libffi
+
+2.5 The Closure API
+===================
+
+`libffi' also provides a way to write a generic function - a function
+that can accept and decode any combination of arguments. This can be
+useful when writing an interpreter, or to provide wrappers for
+arbitrary functions.
+
+ This facility is called the "closure API". Closures are not
+supported on all platforms; you can check the `FFI_CLOSURES' define to
+determine whether they are supported on the current platform.
+
+ Because closures work by assembling a tiny function at runtime, they
+require special allocation on platforms that have a non-executable
+heap. Memory management for closures is handled by a pair of functions:
+
+ -- Function: void *ffi_closure_alloc (size_t SIZE, void **CODE)
+ Allocate a chunk of memory holding SIZE bytes. This returns a
+ pointer to the writable address, and sets *CODE to the
+ corresponding executable address.
+
+ SIZE should be sufficient to hold a `ffi_closure' object.
+
+ -- Function: void ffi_closure_free (void *WRITABLE)
+ Free memory allocated using `ffi_closure_alloc'. The argument is
+ the writable address that was returned.
+
+ Once you have allocated the memory for a closure, you must construct
+a `ffi_cif' describing the function call. Finally you can prepare the
+closure function:
+
+ -- Function: ffi_status ffi_prep_closure_loc (ffi_closure *CLOSURE,
+ ffi_cif *CIF, void (*FUN) (ffi_cif *CIF, void *RET, void
+ **ARGS, void *USER_DATA), void *USER_DATA, void *CODELOC)
+ Prepare a closure function.
+
+ CLOSURE is the address of a `ffi_closure' object; this is the
+ writable address returned by `ffi_closure_alloc'.
+
+ CIF is the `ffi_cif' describing the function parameters.
+
+ USER_DATA is an arbitrary datum that is passed, uninterpreted, to
+ your closure function.
+
+ CODELOC is the executable address returned by `ffi_closure_alloc'.
+
+ FUN is the function which will be called when the closure is
+ invoked. It is called with the arguments:
+ CIF
+ The `ffi_cif' passed to `ffi_prep_closure_loc'.
+
+ RET
+ A pointer to the memory used for the function's return value.
+ FUN must fill this, unless the function is declared as
+ returning `void'.
+
+ ARGS
+ A vector of pointers to memory holding the arguments to the
+ function.
+
+ USER_DATA
+ The same USER_DATA that was passed to `ffi_prep_closure_loc'.
+
+ `ffi_prep_closure_loc' will return `FFI_OK' if everything went ok,
+ and something else on error.
+
+ After calling `ffi_prep_closure_loc', you can cast CODELOC to the
+ appropriate pointer-to-function type.
+
+ You may see old code referring to `ffi_prep_closure'. This function
+is deprecated, as it cannot handle the need for separate writable and
+executable addresses.
+
+
+File: libffi.info, Node: Closure Example, Prev: The Closure API, Up: Using libffi
+
+2.6 Closure Example
+===================
+
+A trivial example that creates a new `puts' by binding `fputs' with
+`stdin'.
+
+ #include <stdio.h>
+ #include <ffi.h>
+
+ /* Acts like puts with the file given at time of enclosure. */
+ void puts_binding(ffi_cif *cif, unsigned int *ret, void* args[],
+ FILE *stream)
+ {
+ *ret = fputs(*(char **)args[0], stream);
+ }
+
+ int main()
+ {
+ ffi_cif cif;
+ ffi_type *args[1];
+ ffi_closure *closure;
+
+ int (*bound_puts)(char *);
+ int rc;
+
+ /* Allocate closure and bound_puts */
+ closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts);
+
+ if (closure)
+ {
+ /* Initialize the argument info vectors */
+ args[0] = &ffi_type_pointer;
+
+ /* Initialize the cif */
+ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+ &ffi_type_uint, args) == FFI_OK)
+ {
+ /* Initialize the closure, setting stream to stdout */
+ if (ffi_prep_closure_loc(closure, &cif, puts_binding,
+ stdout, bound_puts) == FFI_OK)
+ {
+ rc = bound_puts("Hello World!");
+ /* rc now holds the result of the call to fputs */
+ }
+ }
+ }
+
+ /* Deallocate both closure, and bound_puts */
+ ffi_closure_free(closure);
+
+ return 0;
+ }
+
+
+File: libffi.info, Node: Missing Features, Next: Index, Prev: Using libffi, Up: Top
+
+3 Missing Features
+******************
+
+`libffi' is missing a few features. We welcome patches to add support
+for these.
+
+ * Variadic closures.
+
+ * There is no support for bit fields in structures.
+
+ * The closure API is
+
+ * The "raw" API is undocumented.
+
+ Note that variadic support is very new and tested on a relatively
+small number of platforms.
+
+
+File: libffi.info, Node: Index, Prev: Missing Features, Up: Top
+
+Index
+*****
+
+
+* Menu:
+
+* : Structures. (line 12)
+* ABI: Introduction. (line 13)
+* Application Binary Interface: Introduction. (line 13)
+* calling convention: Introduction. (line 13)
+* cif: The Basics. (line 14)
+* closure API: The Closure API. (line 13)
+* closures: The Closure API. (line 13)
+* FFI: Introduction. (line 31)
+* ffi_call: The Basics. (line 63)
+* ffi_closure_alloc: The Closure API. (line 19)
+* ffi_closure_free: The Closure API. (line 26)
+* FFI_CLOSURES: The Closure API. (line 13)
+* ffi_prep_cif: The Basics. (line 16)
+* ffi_prep_cif_var: The Basics. (line 39)
+* ffi_prep_closure_loc: The Closure API. (line 34)
+* ffi_status <1>: The Closure API. (line 37)
+* ffi_status: The Basics. (line 18)
+* ffi_type: Structures. (line 11)
+* ffi_type_double: Primitive Types. (line 41)
+* ffi_type_float: Primitive Types. (line 38)
+* ffi_type_longdouble: Primitive Types. (line 71)
+* ffi_type_pointer: Primitive Types. (line 75)
+* ffi_type_schar: Primitive Types. (line 47)
+* ffi_type_sint: Primitive Types. (line 62)
+* ffi_type_sint16: Primitive Types. (line 23)
+* ffi_type_sint32: Primitive Types. (line 29)
+* ffi_type_sint64: Primitive Types. (line 35)
+* ffi_type_sint8: Primitive Types. (line 17)
+* ffi_type_slong: Primitive Types. (line 68)
+* ffi_type_sshort: Primitive Types. (line 56)
+* ffi_type_uchar: Primitive Types. (line 44)
+* ffi_type_uint: Primitive Types. (line 59)
+* ffi_type_uint16: Primitive Types. (line 20)
+* ffi_type_uint32: Primitive Types. (line 26)
+* ffi_type_uint64: Primitive Types. (line 32)
+* ffi_type_uint8: Primitive Types. (line 14)
+* ffi_type_ulong: Primitive Types. (line 65)
+* ffi_type_ushort: Primitive Types. (line 53)
+* ffi_type_void: Primitive Types. (line 10)
+* Foreign Function Interface: Introduction. (line 31)
+* void <1>: The Closure API. (line 20)
+* void: The Basics. (line 65)
+
+
+
+Tag Table:
+Node: Top712
+Node: Introduction1460
+Node: Using libffi3096
+Node: The Basics3582
+Node: Simple Example7224
+Node: Types8251
+Node: Primitive Types8534
+Node: Structures10354
+Node: Type Example11214
+Node: Multiple ABIs12437
+Node: The Closure API12808
+Node: Closure Example15752
+Node: Missing Features17311
+Node: Index17764
+
+End Tag Table
diff --git a/gtk+-mingw/share/info/libtool.info b/gtk+-mingw/share/info/libtool.info
new file mode 100644
index 0000000..9a1263a
--- /dev/null
+++ b/gtk+-mingw/share/info/libtool.info
@@ -0,0 +1,140 @@
+This is doc/libtool.info, produced by makeinfo version 4.13 from
+./doc/libtool.texi.
+
+INFO-DIR-SECTION GNU programming tools
+START-INFO-DIR-ENTRY
+* Libtool: (libtool). Generic shared library support script.
+END-INFO-DIR-ENTRY
+
+INFO-DIR-SECTION Individual utilities
+START-INFO-DIR-ENTRY
+* libtool-invocation: (libtool)Invoking libtool.
+ Running the `libtool' script.
+* libtoolize: (libtool)Invoking libtoolize. Adding libtool support.
+END-INFO-DIR-ENTRY
+
+ This file documents GNU Libtool 2.4.2
+
+ Copyright (C) 1996-2011 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the section entitled "GNU
+Free Documentation License".
+
+
+Indirect:
+libtool.info-1: 999
+libtool.info-2: 284584
+
+Tag Table:
+(Indirect)
+Node: Top999
+Node: Introduction8193
+Node: Motivation10020
+Node: Issues11340
+Node: Other implementations12818
+Node: Postmortem13361
+Node: Libtool paradigm14981
+Node: Using libtool15926
+Node: Creating object files18029
+Node: Linking libraries21766
+Ref: Linking libraries-Footnote-125593
+Node: Linking executables25734
+Ref: Linking executables-Footnote-130985
+Ref: Linking executables-Footnote-231278
+Node: Wrapper executables31358
+Node: Debugging executables33581
+Node: Installing libraries36404
+Ref: Installing libraries-Footnote-139566
+Node: Installing executables39637
+Node: Static libraries40473
+Node: Invoking libtool43750
+Node: Compile mode49393
+Node: Link mode52354
+Node: Execute mode61728
+Node: Install mode62508
+Node: Finish mode64881
+Node: Uninstall mode65743
+Node: Clean mode66184
+Node: Integrating libtool66643
+Node: Autoconf macros69477
+Node: Makefile rules73324
+Node: Using Automake74427
+Ref: Using Automake-Footnote-176008
+Node: Configuring76408
+Node: LT_INIT77660
+Ref: LT_INIT-Footnote-192591
+Node: Configure notes92844
+Node: Distributing96023
+Node: Invoking libtoolize96940
+Node: Autoconf and LTLIBOBJS103128
+Node: Static-only libraries103872
+Ref: Static-only libraries-Footnote-1105199
+Node: Other languages105308
+Node: C++ libraries106016
+Node: Tags107454
+Node: Versioning108868
+Node: Interfaces110236
+Node: Libtool versioning110869
+Node: Updating version info113082
+Node: Release numbers116110
+Node: Library tips117966
+Node: C header files120772
+Ref: C header files-Footnote-1124446
+Node: Inter-library dependencies124655
+Node: Dlopened modules127372
+Node: Building modules129259
+Node: Dlpreopening130460
+Node: Linking with dlopened modules136117
+Node: Finding the dlname141046
+Ref: Finding the dlname-Footnote-1142364
+Node: Dlopen issues142417
+Node: Using libltdl143472
+Node: Libltdl interface145314
+Ref: Libltdl interface-Footnote-1158964
+Node: Modules for libltdl159258
+Node: Thread Safety in libltdl161784
+Node: User defined module data162797
+Node: Module loaders for libltdl170290
+Ref: Module loaders for libltdl-Footnote-1179561
+Node: Distributing libltdl179667
+Ref: Distributing libltdl-Footnote-1193478
+Ref: Distributing libltdl-Footnote-2193774
+Node: Trace interface193924
+Node: FAQ194760
+Node: Stripped link flags195098
+Node: Troubleshooting196544
+Node: Libtool test suite197067
+Node: Test descriptions197845
+Node: When tests fail210238
+Node: Reporting bugs211242
+Node: Maintaining212860
+Node: New ports213603
+Node: Information sources214296
+Node: Porting inter-library dependencies216764
+Node: Tested platforms219490
+Node: Platform quirks227920
+Node: References229101
+Node: Compilers229951
+Ref: Compilers-Footnote-1231527
+Node: Reloadable objects231843
+Node: Multiple dependencies232202
+Node: Archivers233099
+Node: Cross compiling233689
+Node: File name conversion239701
+Node: File Name Conversion Failure242540
+Node: Native MinGW File Name Conversion243788
+Node: Cygwin/Windows File Name Conversion245351
+Node: Unix/Windows File Name Conversion246724
+Node: LT_CYGPATH247493
+Node: Cygwin to MinGW Cross250738
+Node: Windows DLLs255042
+Node: libtool script contents262320
+Node: Cheap tricks282713
+Node: GNU Free Documentation License284584
+Node: Combined Index309759
+
+End Tag Table
diff --git a/gtk+-mingw/share/info/libtool.info-1 b/gtk+-mingw/share/info/libtool.info-1
new file mode 100644
index 0000000..6d16648
--- /dev/null
+++ b/gtk+-mingw/share/info/libtool.info-1
@@ -0,0 +1,6698 @@
+This is doc/libtool.info, produced by makeinfo version 4.13 from
+./doc/libtool.texi.
+
+INFO-DIR-SECTION GNU programming tools
+START-INFO-DIR-ENTRY
+* Libtool: (libtool). Generic shared library support script.
+END-INFO-DIR-ENTRY
+
+INFO-DIR-SECTION Individual utilities
+START-INFO-DIR-ENTRY
+* libtool-invocation: (libtool)Invoking libtool.
+ Running the `libtool' script.
+* libtoolize: (libtool)Invoking libtoolize. Adding libtool support.
+END-INFO-DIR-ENTRY
+
+ This file documents GNU Libtool 2.4.2
+
+ Copyright (C) 1996-2011 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the section entitled "GNU
+Free Documentation License".
+
+
+File: libtool.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir)
+
+Shared library support for GNU
+******************************
+
+This file documents GNU Libtool, a script that allows package developers
+to provide generic shared library support. This edition documents
+version 2.4.2.
+
+ *Note Reporting bugs::, for information on how to report problems
+with GNU Libtool.
+
+* Menu:
+
+* Introduction:: What the heck is libtool?
+* Libtool paradigm:: How libtool's view of libraries is different.
+* Using libtool:: Example of using libtool to build libraries.
+* Invoking libtool:: Running the `libtool' script.
+* Integrating libtool:: Using libtool in your own packages.
+* Other languages:: Using libtool without a C compiler.
+* Versioning:: Using library interface versions.
+* Library tips:: Tips for library interface design.
+* Inter-library dependencies:: Libraries that depend on other libraries.
+* Dlopened modules:: `dlopen'ing libtool-created libraries.
+* Using libltdl:: Libtool's portable `dlopen' wrapper library.
+* Trace interface:: Libtool's trace interface.
+* FAQ:: Frequently Asked Questions
+* Troubleshooting:: When libtool doesn't work as advertised.
+* Maintaining:: Information used by the libtool maintainer.
+* GNU Free Documentation License:: License for this manual.
+* Combined Index:: Full index.
+
+ --- The Detailed Node Listing ---
+
+Introduction
+
+* Motivation:: Why does GNU need a libtool?
+* Issues:: The problems that need to be addressed.
+* Other implementations:: How other people have solved these issues.
+* Postmortem:: Learning from past difficulties.
+
+Using libtool
+
+* Creating object files:: Compiling object files for libraries.
+* Linking libraries:: Creating libraries from object files.
+* Linking executables:: Linking object files against libtool libraries.
+* Debugging executables:: Running GDB on libtool-generated programs.
+* Installing libraries:: Making libraries available to users.
+* Installing executables:: Making programs available to users.
+* Static libraries:: When shared libraries are not wanted.
+
+Linking executables
+
+* Wrapper executables:: Wrapper executables for some platforms.
+
+Invoking `libtool'
+
+* Compile mode:: Creating library object files.
+* Link mode:: Generating executables and libraries.
+* Execute mode:: Debugging libtool-generated programs.
+* Install mode:: Making libraries and executables public.
+* Finish mode:: Completing a library installation.
+* Uninstall mode:: Removing installed executables and libraries.
+* Clean mode:: Removing uninstalled executables and libraries.
+
+Integrating libtool with your package
+
+* Autoconf macros:: Autoconf macros exported by libtool.
+* Makefile rules:: Writing `Makefile' rules for libtool.
+* Using Automake:: Automatically supporting libtool.
+* Configuring:: Configuring libtool for a host system.
+* Distributing:: What files to distribute with your package.
+* Static-only libraries:: Sometimes shared libraries are just a pain.
+
+Configuring libtool
+
+* LT_INIT:: Configuring `libtool' in `configure.ac'.
+* Configure notes:: Platform-specific notes for configuration.
+
+Including libtool in your package
+
+* Invoking libtoolize:: `libtoolize' command line options.
+* Autoconf and LTLIBOBJS:: Autoconf automates LTLIBOBJS generation.
+
+Using libtool with other languages
+
+* C++ libraries:: Writing libraries for C++
+* Tags:: Tags
+
+Library interface versions
+
+* Interfaces:: What are library interfaces?
+* Libtool versioning:: Libtool's versioning system.
+* Updating version info:: Changing version information before releases.
+* Release numbers:: Breaking binary compatibility for aesthetics.
+
+Tips for interface design
+
+* C header files:: How to write portable include files.
+
+Dlopened modules
+
+* Building modules:: Creating dlopenable objects and libraries.
+* Dlpreopening:: Dlopening that works on static platforms.
+* Linking with dlopened modules:: Using dlopenable modules in libraries.
+* Finding the dlname:: Choosing the right file to `dlopen'.
+* Dlopen issues:: Unresolved problems that need your attention.
+
+Using libltdl
+
+* Libltdl interface:: How to use libltdl in your programs.
+* Modules for libltdl:: Creating modules that can be `dlopen'ed.
+* Thread Safety in libltdl:: Registering callbacks for multi-thread safety.
+* User defined module data:: Associating data with loaded modules.
+* Module loaders for libltdl:: Creating user defined module loaders.
+* Distributing libltdl:: How to distribute libltdl with your package.
+
+Frequently Asked Questions about libtool
+
+* Stripped link flags:: Dropped flags when creating a library
+
+Troubleshooting
+
+* Libtool test suite:: Libtool's self-tests.
+* Reporting bugs:: How to report problems with libtool.
+
+The libtool test suite
+
+* Test descriptions:: The contents of the old test suite.
+* When tests fail:: What to do when a test fails.
+
+Maintenance notes for libtool
+
+* New ports:: How to port libtool to new systems.
+* Tested platforms:: When libtool was last tested.
+* Platform quirks:: Information about different library systems.
+* libtool script contents:: Configuration information that libtool uses.
+* Cheap tricks:: Making libtool maintainership easier.
+
+Porting libtool to new systems
+
+* Information sources:: Where to find relevant documentation
+* Porting inter-library dependencies:: Implementation details explained
+
+Platform quirks
+
+* References:: Finding more information.
+* Compilers:: Creating object files from source files.
+* Reloadable objects:: Binding object files together.
+* Multiple dependencies:: Removing duplicate dependent libraries.
+* Archivers:: Programs that create static archives.
+* Cross compiling:: Issues that arise when cross compiling.
+* File name conversion:: Converting file names between platforms.
+* Windows DLLs:: Windows header defines.
+
+File name conversion
+
+* File Name Conversion Failure:: What happens when file name conversion fails
+* Native MinGW File Name Conversion:: MSYS file name conversion idiosyncrasies
+* Cygwin/Windows File Name Conversion:: Using `cygpath' to convert Cygwin file names
+* Unix/Windows File Name Conversion:: Using Wine to convert Unix paths
+* LT_CYGPATH:: Invoking `cygpath' from other environments
+* Cygwin to MinGW Cross:: Other notes concerning MinGW cross
+
+
+File: libtool.info, Node: Introduction, Next: Libtool paradigm, Prev: Top, Up: Top
+
+1 Introduction
+**************
+
+In the past, if you were a source code package developer and wanted to
+take advantage of the power of shared libraries, you needed to write
+custom support code for each platform on which your package ran. You
+also had to design a configuration interface so that the package
+installer could choose what sort of libraries were built.
+
+ GNU Libtool simplifies your job by encapsulating both the
+platform-specific dependencies, and the user interface, in a single
+script. GNU Libtool is designed so that the complete functionality of
+each host type is available via a generic interface, but nasty quirks
+are hidden from the programmer.
+
+ GNU Libtool's consistent interface is reassuring... users don't need
+to read obscure documentation in order to have their favorite source
+package build shared libraries. They just run your package `configure'
+script (or equivalent), and libtool does all the dirty work.
+
+ There are several examples throughout this document. All assume the
+same environment: we want to build a library, `libhello', in a generic
+way.
+
+ `libhello' could be a shared library, a static library, or both...
+whatever is available on the host system, as long as libtool has been
+ported to it.
+
+ This chapter explains the original design philosophy of libtool.
+Feel free to skip to the next chapter, unless you are interested in
+history, or want to write code to extend libtool in a consistent way.
+
+* Menu:
+
+* Motivation:: Why does GNU need a libtool?
+* Issues:: The problems that need to be addressed.
+* Other implementations:: How other people have solved these issues.
+* Postmortem:: Learning from past difficulties.
+
+
+File: libtool.info, Node: Motivation, Next: Issues, Up: Introduction
+
+1.1 Motivation for writing libtool
+==================================
+
+Since early 1995, several different GNU developers have recognized the
+importance of having shared library support for their packages. The
+primary motivation for such a change is to encourage modularity and
+reuse of code (both conceptually and physically) in GNU programs.
+
+ Such a demand means that the way libraries are built in GNU packages
+needs to be general, to allow for any library type the package installer
+might want. The problem is compounded by the absence of a standard
+procedure for creating shared libraries on different platforms.
+
+ The following sections outline the major issues facing shared library
+support in GNU, and how shared library support could be standardized
+with libtool.
+
+ The following specifications were used in developing and evaluating
+this system:
+
+ 1. The system must be as elegant as possible.
+
+ 2. The system must be fully integrated with the GNU Autoconf and
+ Automake utilities, so that it will be easy for GNU maintainers to
+ use. However, the system must not require these tools, so that it
+ can be used by non-GNU packages.
+
+ 3. Portability to other (non-GNU) architectures and tools is
+ desirable.
+
+
+File: libtool.info, Node: Issues, Next: Other implementations, Prev: Motivation, Up: Introduction
+
+1.2 Implementation issues
+=========================
+
+The following issues need to be addressed in any reusable shared library
+system, specifically libtool:
+
+ 1. The package installer should be able to control what sort of
+ libraries are built.
+
+ 2. It can be tricky to run dynamically linked programs whose
+ libraries have not yet been installed. `LD_LIBRARY_PATH' must be
+ set properly (if it is supported), or programs fail to run.
+
+ 3. The system must operate consistently even on hosts that don't
+ support shared libraries.
+
+ 4. The commands required to build shared libraries may differ wildly
+ from host to host. These need to be determined at configure time
+ in a consistent way.
+
+ 5. It is not always obvious with what prefix or suffix a shared
+ library should be installed. This makes it difficult for
+ `Makefile' rules, since they generally assume that file names are
+ the same from host to host.
+
+ 6. The system needs a simple library version number abstraction, so
+ that shared libraries can be upgraded in place. The programmer
+ should be informed how to design the interfaces to the library to
+ maximize binary compatibility.
+
+ 7. The install `Makefile' target should warn the package installer to
+ set the proper environment variables (`LD_LIBRARY_PATH' or
+ equivalent), or run `ldconfig'.
+
+
+File: libtool.info, Node: Other implementations, Next: Postmortem, Prev: Issues, Up: Introduction
+
+1.3 Other implementations
+=========================
+
+Even before libtool was developed, many free software packages built and
+installed their own shared libraries. At first, these packages were
+examined to avoid reinventing existing features.
+
+ Now it is clear that none of these packages have documented the
+details of shared library systems that libtool requires. So, other
+packages have been more or less abandoned as influences.
+
+
+File: libtool.info, Node: Postmortem, Prev: Other implementations, Up: Introduction
+
+1.4 A postmortem analysis of other implementations
+==================================================
+
+In all fairness, each of the implementations that were examined do the
+job that they were intended to do, for a number of different host
+systems. However, none of these solutions seem to function well as a
+generalized, reusable component.
+
+ Most were too complex to use (much less modify) without understanding
+exactly what the implementation does, and they were generally not
+documented.
+
+ The main difficulty is that different vendors have different views of
+what libraries are, and none of the packages that were examined seemed
+to be confident enough to settle on a single paradigm that just _works_.
+
+ Ideally, libtool would be a standard that would be implemented as
+series of extensions and modifications to existing library systems to
+make them work consistently. However, it is not an easy task to
+convince operating system developers to mend their evil ways, and
+people want to build shared libraries right now, even on buggy, broken,
+confused operating systems.
+
+ For this reason, libtool was designed as an independent shell script.
+It isolates the problems and inconsistencies in library building that
+plague `Makefile' writers by wrapping the compiler suite on different
+platforms with a consistent, powerful interface.
+
+ With luck, libtool will be useful to and used by the GNU community,
+and that the lessons that were learned in writing it will be taken up by
+designers of future library systems.
+
+
+File: libtool.info, Node: Libtool paradigm, Next: Using libtool, Prev: Introduction, Up: Top
+
+2 The libtool paradigm
+**********************
+
+At first, libtool was designed to support an arbitrary number of library
+object types. After libtool was ported to more platforms, a new
+paradigm gradually developed for describing the relationship between
+libraries and programs.
+
+ In summary, "libraries are programs with multiple entry points, and
+more formally defined interfaces."
+
+ Version 0.7 of libtool was a complete redesign and rewrite of
+libtool to reflect this new paradigm. So far, it has proved to be
+successful: libtool is simpler and more useful than before.
+
+ The best way to introduce the libtool paradigm is to contrast it with
+the paradigm of existing library systems, with examples from each. It
+is a new way of thinking, so it may take a little time to absorb, but
+when you understand it, the world becomes simpler.
+
+
+File: libtool.info, Node: Using libtool, Next: Invoking libtool, Prev: Libtool paradigm, Up: Top
+
+3 Using libtool
+***************
+
+It makes little sense to talk about using libtool in your own packages
+until you have seen how it makes your life simpler. The examples in
+this chapter introduce the main features of libtool by comparing the
+standard library building procedure to libtool's operation on two
+different platforms:
+
+`a23'
+ An Ultrix 4.2 platform with only static libraries.
+
+`burger'
+ A NetBSD/i386 1.2 platform with shared libraries.
+
+ You can follow these examples on your own platform, using the
+preconfigured libtool script that was installed with libtool (*note
+Configuring::).
+
+ Source files for the following examples are taken from the `demo'
+subdirectory of the libtool distribution. Assume that we are building a
+library, `libhello', out of the files `foo.c' and `hello.c'.
+
+ Note that the `foo.c' source file uses the `cos' math library
+function, which is usually found in the standalone math library, and not
+the C library (*note Trigonometric Functions: (libc)Trig Functions.).
+So, we need to add `-lm' to the end of the link line whenever we link
+`foo.lo' into an executable or a library (*note Inter-library
+dependencies::).
+
+ The same rule applies whenever you use functions that don't appear in
+the standard C library... you need to add the appropriate `-lNAME' flag
+to the end of the link line when you link against those objects.
+
+ After we have built that library, we want to create a program by
+linking `main.o' against `libhello'.
+
+* Menu:
+
+* Creating object files:: Compiling object files for libraries.
+* Linking libraries:: Creating libraries from object files.
+* Linking executables:: Linking object files against libtool libraries.
+* Debugging executables:: Running GDB on libtool-generated programs.
+* Installing libraries:: Making libraries available to users.
+* Installing executables:: Making programs available to users.
+* Static libraries:: When shared libraries are not wanted.
+
+
+File: libtool.info, Node: Creating object files, Next: Linking libraries, Up: Using libtool
+
+3.1 Creating object files
+=========================
+
+To create an object file from a source file, the compiler is invoked
+with the `-c' flag (and any other desired flags):
+
+ burger$ gcc -g -O -c main.c
+ burger$
+
+ The above compiler command produces an object file, usually named
+`main.o', from the source file `main.c'.
+
+ For most library systems, creating object files that become part of a
+static library is as simple as creating object files that are linked to
+form an executable:
+
+ burger$ gcc -g -O -c foo.c
+ burger$ gcc -g -O -c hello.c
+ burger$
+
+ Shared libraries, however, may only be built from
+"position-independent code" (PIC). So, special flags must be passed to
+the compiler to tell it to generate PIC rather than the standard
+position-dependent code.
+
+ Since this is a library implementation detail, libtool hides the
+complexity of PIC compiler flags and uses separate library object files
+(the PIC one lives in the `.libs' subdirectory and the static one lives
+in the current directory). On systems without shared libraries, the
+PIC library object files are not created, whereas on systems where all
+code is PIC, such as AIX, the static ones are not created.
+
+ To create library object files for `foo.c' and `hello.c', simply
+invoke libtool with the standard compilation command as arguments
+(*note Compile mode::):
+
+ a23$ libtool --mode=compile gcc -g -O -c foo.c
+ gcc -g -O -c foo.c -o foo.o
+ a23$ libtool --mode=compile gcc -g -O -c hello.c
+ gcc -g -O -c hello.c -o hello.o
+ a23$
+
+ Note that libtool silently creates an additional control file on each
+`compile' invocation. The `.lo' file is the libtool object, which
+Libtool uses to determine what object file may be built into a shared
+library. On `a23', only static libraries are supported so the library
+objects look like this:
+
+ # foo.lo - a libtool object file
+ # Generated by ltmain.sh (GNU libtool) 2.4.2
+ #
+ # Please DO NOT delete this file!
+ # It is necessary for linking the library.
+
+ # Name of the PIC object.
+ pic_object=none
+
+ # Name of the non-PIC object.
+ non_pic_object='foo.o'
+
+ On shared library systems, libtool automatically generates an
+additional PIC object by inserting the appropriate PIC generation flags
+into the compilation command:
+
+ burger$ libtool --mode=compile gcc -g -O -c foo.c
+ mkdir .libs
+ gcc -g -O -c foo.c -fPIC -DPIC -o .libs/foo.o
+ gcc -g -O -c foo.c -o foo.o >/dev/null 2>&1
+ burger$
+
+ Note that Libtool automatically created `.libs' directory upon its
+first execution, where PIC library object files will be stored.
+
+ Since `burger' supports shared libraries, and requires PIC objects
+to build them, Libtool has compiled a PIC object this time, and made a
+note of it in the libtool object:
+
+ # foo.lo - a libtool object file
+ # Generated by ltmain.sh (GNU libtool) 2.4.2
+ #
+ # Please DO NOT delete this file!
+ # It is necessary for linking the library.
+
+ # Name of the PIC object.
+ pic_object='.libs/foo.o'
+
+ # Name of the non-PIC object.
+ non_pic_object='foo.o'
+
+ Notice that the second run of GCC has its output discarded. This is
+done so that compiler warnings aren't annoyingly duplicated. If you
+need to see both sets of warnings (you might have conditional code
+inside `#ifdef PIC' for example), you can turn off suppression with the
+`-no-suppress' option to libtool's compile mode:
+
+ burger$ libtool --mode=compile gcc -no-suppress -g -O -c hello.c
+ gcc -g -O -c hello.c -fPIC -DPIC -o .libs/hello.o
+ gcc -g -O -c hello.c -o hello.o
+ burger$
+
+
+File: libtool.info, Node: Linking libraries, Next: Linking executables, Prev: Creating object files, Up: Using libtool
+
+3.2 Linking libraries
+=====================
+
+Without libtool, the programmer would invoke the `ar' command to create
+a static library:
+
+ burger$ ar cru libhello.a hello.o foo.o
+ burger$
+
+ But of course, that would be too simple, so many systems require that
+you run the `ranlib' command on the resulting library (to give it
+better karma, or something):
+
+ burger$ ranlib libhello.a
+ burger$
+
+ It seems more natural to use the C compiler for this task, given
+libtool's "libraries are programs" approach. So, on platforms without
+shared libraries, libtool simply acts as a wrapper for the system `ar'
+(and possibly `ranlib') commands.
+
+ Again, the libtool control file name (`.la' suffix) differs from the
+standard library name (`.a' suffix). The arguments to libtool are the
+same ones you would use to produce an executable named `libhello.la'
+with your compiler (*note Link mode::):
+
+ a23$ libtool --mode=link gcc -g -O -o libhello.la foo.o hello.o
+ *** Warning: Linking the shared library libhello.la against the
+ *** non-libtool objects foo.o hello.o is not portable!
+ ar cru .libs/libhello.a
+ ranlib .libs/libhello.a
+ creating libhello.la
+ (cd .libs && rm -f libhello.la && ln -s ../libhello.la libhello.la)
+ a23$
+
+ Aha! Libtool caught a common error... trying to build a library
+from standard objects instead of special `.lo' object files. This
+doesn't matter so much for static libraries, but on shared library
+systems, it is of great importance. (Note that you may replace
+`libhello.la' with `libhello.a' in which case libtool won't issue the
+warning any more. But although this method works, this is not intended
+to be used because it makes you lose the benefits of using Libtool.)
+
+ So, let's try again, this time with the library object files.
+Remember also that we need to add `-lm' to the link command line because
+`foo.c' uses the `cos' math library function (*note Using libtool::).
+
+ Another complication in building shared libraries is that we need to
+specify the path to the directory in which they (eventually) will be
+installed (in this case, `/usr/local/lib')(1):
+
+ a23$ libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \
+ -rpath /usr/local/lib -lm
+ ar cru .libs/libhello.a foo.o hello.o
+ ranlib .libs/libhello.a
+ creating libhello.la
+ (cd .libs && rm -f libhello.la && ln -s ../libhello.la libhello.la)
+ a23$
+
+ Now, let's try the same trick on the shared library platform:
+
+ burger$ libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \
+ -rpath /usr/local/lib -lm
+ rm -fr .libs/libhello.a .libs/libhello.la
+ ld -Bshareable -o .libs/libhello.so.0.0 .libs/foo.o .libs/hello.o -lm
+ ar cru .libs/libhello.a foo.o hello.o
+ ranlib .libs/libhello.a
+ creating libhello.la
+ (cd .libs && rm -f libhello.la && ln -s ../libhello.la libhello.la)
+ burger$
+
+ Now that's significantly cooler... Libtool just ran an obscure `ld'
+command to create a shared library, as well as the static library.
+
+ Note how libtool creates extra files in the `.libs' subdirectory,
+rather than the current directory. This feature is to make it easier
+to clean up the build directory, and to help ensure that other programs
+fail horribly if you accidentally forget to use libtool when you should.
+
+ Again, you may want to have a look at the `.la' file in order to see
+what Libtool stores in it. In particular, you will see that Libtool
+uses this file to remember the destination directory for the library
+(the argument to `-rpath') as well as the dependency on the math
+library (`-lm').
+
+ ---------- Footnotes ----------
+
+ (1) If you don't specify an `rpath', then libtool builds a libtool
+convenience archive, not a shared library (*note Static libraries::).
+
+
+File: libtool.info, Node: Linking executables, Next: Debugging executables, Prev: Linking libraries, Up: Using libtool
+
+3.3 Linking executables
+=======================
+
+If you choose at this point to "install" the library (put it in a
+permanent location) before linking executables against it, then you
+don't need to use libtool to do the linking. Simply use the appropriate
+`-L' and `-l' flags to specify the library's location.
+
+ Some system linkers insist on encoding the full directory name of
+each shared library in the resulting executable. Libtool has to work
+around this misfeature by special magic to ensure that only permanent
+directory names are put into installed executables.
+
+ The importance of this bug must not be overlooked: it won't cause
+programs to crash in obvious ways. It creates a security hole, and
+possibly even worse, if you are modifying the library source code after
+you have installed the package, you will change the behaviour of the
+installed programs!
+
+ So, if you want to link programs against the library before you
+install it, you must use libtool to do the linking.
+
+ Here's the old way of linking against an uninstalled library:
+
+ burger$ gcc -g -O -o hell.old main.o libhello.a -lm
+ burger$
+
+ Libtool's way is almost the same(1) (*note Link mode::):
+
+ a23$ libtool --mode=link gcc -g -O -o hell main.o libhello.la
+ gcc -g -O -o hell main.o ./.libs/libhello.a -lm
+ a23$
+
+ That looks too simple to be true. All libtool did was transform
+`libhello.la' to `./.libs/libhello.a', but remember that `a23' has no
+shared libraries. Notice that Libtool also remembered that
+`libhello.la' depends on `-lm', so even though we didn't specify `-lm'
+on the libtool command line(2) Libtool has added it to the `gcc' link
+line for us.
+
+ On `burger' Libtool links against the uninstalled shared library:
+
+ burger$ libtool --mode=link gcc -g -O -o hell main.o libhello.la
+ gcc -g -O -o .libs/hell main.o -L./.libs -R/usr/local/lib -lhello -lm
+ creating hell
+ burger$
+
+ Now assume `libhello.la' had already been installed, and you want to
+link a new program with it. You could figure out where it lives by
+yourself, then run:
+
+ burger$ gcc -g -O -o test test.o -L/usr/local/lib -lhello -lm
+
+ However, unless `/usr/local/lib' is in the standard library search
+path, you won't be able to run `test'. However, if you use libtool to
+link the already-installed libtool library, it will do The Right Thing
+(TM) for you:
+
+ burger$ libtool --mode=link gcc -g -O -o test test.o \
+ /usr/local/lib/libhello.la
+ gcc -g -O -o .libs/test test.o -Wl,--rpath \
+ -Wl,/usr/local/lib /usr/local/lib/libhello.a -lm
+ creating test
+ burger$
+
+ Note that libtool added the necessary run-time path flag, as well as
+`-lm', the library libhello.la depended upon. Nice, huh?
+
+ Notice that the executable, `hell', was actually created in the
+`.libs' subdirectory. Then, a wrapper script (or, on certain
+platforms, a wrapper executable *note Wrapper executables::) was
+created in the current directory.
+
+ Since libtool created a wrapper script, you should use libtool to
+install it and debug it too. However, since the program does not depend
+on any uninstalled libtool library, it is probably usable even without
+the wrapper script.
+
+ On NetBSD 1.2, libtool encodes the installation directory of
+`libhello', by using the `-R/usr/local/lib' compiler flag. Then, the
+wrapper script guarantees that the executable finds the correct shared
+library (the one in `./.libs') until it is properly installed.
+
+ Let's compare the two different programs:
+
+ burger$ time ./hell.old
+ Welcome to GNU Hell!
+ ** This is not GNU Hello. There is no built-in mail reader. **
+ 0.21 real 0.02 user 0.08 sys
+ burger$ time ./hell
+ Welcome to GNU Hell!
+ ** This is not GNU Hello. There is no built-in mail reader. **
+ 0.63 real 0.09 user 0.59 sys
+ burger$
+
+ The wrapper script takes significantly longer to execute, but at
+least the results are correct, even though the shared library hasn't
+been installed yet.
+
+ So, what about all the space savings that shared libraries are
+supposed to yield?
+
+ burger$ ls -l hell.old libhello.a
+ -rwxr-xr-x 1 gord gord 15481 Nov 14 12:11 hell.old
+ -rw-r--r-- 1 gord gord 4274 Nov 13 18:02 libhello.a
+ burger$ ls -l .libs/hell .libs/libhello.*
+ -rwxr-xr-x 1 gord gord 11647 Nov 14 12:10 .libs/hell
+ -rw-r--r-- 1 gord gord 4274 Nov 13 18:44 .libs/libhello.a
+ -rwxr-xr-x 1 gord gord 12205 Nov 13 18:44 .libs/libhello.so.0.0
+ burger$
+
+ Well, that sucks. Maybe I should just scrap this project and take up
+basket weaving.
+
+ Actually, it just proves an important point: shared libraries incur
+overhead because of their (relative) complexity. In this situation, the
+price of being dynamic is eight kilobytes, and the payoff is about four
+kilobytes. So, having a shared `libhello' won't be an advantage until
+we link it against at least a few more programs.
+
+* Menu:
+
+* Wrapper executables:: Wrapper executables for some platforms.
+
+ ---------- Footnotes ----------
+
+ (1) However, you should avoid using `-L' or `-l' flags to link
+against an uninstalled libtool library. Just specify the relative path
+to the `.la' file, such as `../intl/libintl.la'. This is a design
+decision to eliminate any ambiguity when linking against uninstalled
+shared libraries.
+
+ (2) And why should we? `main.o' doesn't directly depend on `-lm'
+after all.
+
+
+File: libtool.info, Node: Wrapper executables, Up: Linking executables
+
+3.3.1 Wrapper executables for uninstalled programs
+--------------------------------------------------
+
+Some platforms, notably those hosted on Windows such as Cygwin and
+MinGW, use a wrapper executable rather than a wrapper script to ensure
+proper operation of uninstalled programs linked by libtool against
+uninstalled shared libraries. The wrapper executable thus performs the
+same function as the wrapper script used on other platforms, but allows
+to satisfy the `make' rules for the program, whose name ends in
+`$(EXEEXT)'. The actual program executable is created below .libs, and
+its name will end in `$(EXEEXT)' and may or may not contain an `lt-'
+prefix. This wrapper executable sets various environment values so
+that the program executable may locate its (uninstalled) shared
+libraries, and then launches the program executable.
+
+ The wrapper executable provides a debug mode, enabled by passing the
+command-line option `--lt-debug' (see below). When executing in debug
+mode, diagnostic information will be printed to `stderr' before the
+program executable is launched.
+
+ Finally, the wrapper executable supports a number of command line
+options that may be useful when debugging the operation of the wrapper
+system. All of these options begin with `--lt-', and if present they
+and their arguments will be removed from the argument list passed on to
+the program executable. Therefore, the program executable may not
+employ command line options that begin with `--lt-'. (In fact, the
+wrapper executable will detect any command line options that begin with
+`--lt-' and abort with an error message if the option is not
+recognized). If this presents a problem, please contact the Libtool
+team at the Libtool bug reporting address <bug-libtool@gnu.org>.
+
+ These command line options include:
+
+`--lt-dump-script'
+ Causes the wrapper to print a copy of the wrapper _script_ to
+ `stdout', and exit.
+
+`--lt-debug'
+ Causes the wrapper to print diagnostic information to `stdout',
+ before launching the program executable.
+
+
+ For consistency, both the wrapper _script_ and the wrapper
+_executable_ support these options.
+
+
+File: libtool.info, Node: Debugging executables, Next: Installing libraries, Prev: Linking executables, Up: Using libtool
+
+3.4 Debugging executables
+=========================
+
+If `hell' was a complicated program, you would certainly want to test
+and debug it before installing it on your system. In the above
+section, you saw how the libtool wrapper script makes it possible to run
+the program directly, but unfortunately, this mechanism interferes with
+the debugger:
+
+ burger$ gdb hell
+ GDB is free software and you are welcome to distribute copies of it
+ under certain conditions; type "show copying" to see the conditions.
+ There is no warranty for GDB; type "show warranty" for details.
+ GDB 4.16 (i386-unknown-netbsd), (C) 1996 Free Software Foundation, Inc.
+
+ "hell": not in executable format: File format not recognized
+
+ (gdb) quit
+ burger$
+
+ Sad. It doesn't work because GDB doesn't know where the executable
+lives. So, let's try again, by invoking GDB directly on the executable:
+
+ burger$ gdb .libs/hell
+ GNU gdb 5.3 (i386-unknown-netbsd)
+ Copyright 2002 Free Software Foundation, Inc.
+ GDB is free software, covered by the GNU General Public License,
+ and you are welcome to change it and/or distribute copies of it
+ under certain conditions. Type "show copying" to see the conditions.
+ There is no warranty for GDB. Type "show warranty" for details.
+ (gdb) break main
+ Breakpoint 1 at 0x8048547: file main.c, line 29.
+ (gdb) run
+ Starting program: /home/src/libtool/demo/.libs/hell
+ /home/src/libtool/demo/.libs/hell: can't load library 'libhello.so.0'
+
+ Program exited with code 020.
+ (gdb) quit
+ burger$
+
+ Argh. Now GDB complains because it cannot find the shared library
+that `hell' is linked against. So, we must use libtool in order to
+properly set the library path and run the debugger. Fortunately, we can
+forget all about the `.libs' directory, and just run it on the
+executable wrapper (*note Execute mode::):
+
+ burger$ libtool --mode=execute gdb hell
+ GNU gdb 5.3 (i386-unknown-netbsd)
+ Copyright 2002 Free Software Foundation, Inc.
+ GDB is free software, covered by the GNU General Public License,
+ and you are welcome to change it and/or distribute copies of it
+ under certain conditions. Type "show copying" to see the conditions.
+ There is no warranty for GDB. Type "show warranty" for details.
+ (gdb) break main
+ Breakpoint 1 at 0x8048547: file main.c, line 29.
+ (gdb) run
+ Starting program: /home/src/libtool/demo/.libs/hell
+
+ Breakpoint 1, main (argc=1, argv=0xbffffc40) at main.c:29
+ 29 printf ("Welcome to GNU Hell!\n");
+ (gdb) quit
+ The program is running. Quit anyway (and kill it)? (y or n) y
+ burger$
+
+
+File: libtool.info, Node: Installing libraries, Next: Installing executables, Prev: Debugging executables, Up: Using libtool
+
+3.5 Installing libraries
+========================
+
+Installing libraries on a non-libtool system is quite
+straightforward... just copy them into place:(1)
+
+ burger$ su
+ Password: ********
+ burger# cp libhello.a /usr/local/lib/libhello.a
+ burger#
+
+ Oops, don't forget the `ranlib' command:
+
+ burger# ranlib /usr/local/lib/libhello.a
+ burger#
+
+ Libtool installation is quite simple, as well. Just use the
+`install' or `cp' command that you normally would (*note Install
+mode::):
+
+ a23# libtool --mode=install cp libhello.la /usr/local/lib/libhello.la
+ cp libhello.la /usr/local/lib/libhello.la
+ cp .libs/libhello.a /usr/local/lib/libhello.a
+ ranlib /usr/local/lib/libhello.a
+ a23#
+
+ Note that the libtool library `libhello.la' is also installed, to
+help libtool with uninstallation (*note Uninstall mode::) and linking
+(*note Linking executables::) and to help programs with dlopening
+(*note Dlopened modules::).
+
+ Here is the shared library example:
+
+ burger# libtool --mode=install install -c libhello.la \
+ /usr/local/lib/libhello.la
+ install -c .libs/libhello.so.0.0 /usr/local/lib/libhello.so.0.0
+ install -c libhello.la /usr/local/lib/libhello.la
+ install -c .libs/libhello.a /usr/local/lib/libhello.a
+ ranlib /usr/local/lib/libhello.a
+ burger#
+
+ It is safe to specify the `-s' (strip symbols) flag if you use a
+BSD-compatible install program when installing libraries. Libtool will
+either ignore the `-s' flag, or will run a program that will strip only
+debugging and compiler symbols from the library.
+
+ Once the libraries have been put in place, there may be some
+additional configuration that you need to do before using them. First,
+you must make sure that where the library is installed actually agrees
+with the `-rpath' flag you used to build it.
+
+ Then, running `libtool -n finish LIBDIR' can give you further hints
+on what to do (*note Finish mode::):
+
+ burger# libtool -n finish /usr/local/lib
+ PATH="$PATH:/sbin" ldconfig -m /usr/local/lib
+ -----------------------------------------------------------------
+ Libraries have been installed in:
+ /usr/local/lib
+
+ To link against installed libraries in a given directory, LIBDIR,
+ you must use the `-LLIBDIR' flag during linking.
+
+ You will also need to do one of the following:
+ - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
+ during execution
+ - add LIBDIR to the `LD_RUN_PATH' environment variable
+ during linking
+ - use the `-RLIBDIR' linker flag
+
+ See any operating system documentation about shared libraries for
+ more information, such as the ld and ld.so manual pages.
+ -----------------------------------------------------------------
+ burger#
+
+ After you have completed these steps, you can go on to begin using
+the installed libraries. You may also install any executables that
+depend on libraries you created.
+
+ ---------- Footnotes ----------
+
+ (1) Don't strip static libraries though, or they will be unusable.
+
+
+File: libtool.info, Node: Installing executables, Next: Static libraries, Prev: Installing libraries, Up: Using libtool
+
+3.6 Installing executables
+==========================
+
+If you used libtool to link any executables against uninstalled libtool
+libraries (*note Linking executables::), you need to use libtool to
+install the executables after the libraries have been installed (*note
+Installing libraries::).
+
+ So, for our Ultrix example, we would run:
+
+ a23# libtool --mode=install -c hell /usr/local/bin/hell
+ install -c hell /usr/local/bin/hell
+ a23#
+
+ On shared library systems that require wrapper scripts, libtool just
+ignores the wrapper script and installs the correct binary:
+
+ burger# libtool --mode=install -c hell /usr/local/bin/hell
+ install -c .libs/hell /usr/local/bin/hell
+ burger#
+
+
+File: libtool.info, Node: Static libraries, Prev: Installing executables, Up: Using libtool
+
+3.7 Linking static libraries
+============================
+
+Why return to `ar' and `ranlib' silliness when you've had a taste of
+libtool? Well, sometimes it is desirable to create a static archive
+that can never be shared. The most frequent case is when you have a
+set of object files that you use to build several different libraries.
+You can create a "convenience library" out of those objects, and link
+against that with the other libraries, instead of listing all the
+object files every time.
+
+ If you just want to link this convenience library into programs, then
+you could just ignore libtool entirely, and use the old `ar' and
+`ranlib' commands (or the corresponding GNU Automake `_LIBRARIES'
+rules). You can even install a convenience library using GNU Libtool,
+though you probably don't want to and hence GNU Automake doesn't allow
+you to do so.
+
+ burger$ libtool --mode=install ./install-sh -c libhello.a \
+ /local/lib/libhello.a
+ ./install-sh -c libhello.a /local/lib/libhello.a
+ ranlib /local/lib/libhello.a
+ burger$
+
+ Using libtool for static library installation protects your library
+from being accidentally stripped (if the installer used the `-s' flag),
+as well as automatically running the correct `ranlib' command.
+
+ But libtool libraries are more than just collections of object files:
+they can also carry library dependency information, which old archives
+do not. If you want to create a libtool static convenience library, you
+can omit the `-rpath' flag and use `-static' to indicate that you're
+only interested in a static library. When you link a program with such
+a library, libtool will actually link all object files and dependency
+libraries into the program.
+
+ If you omit both `-rpath' and `-static', libtool will create a
+convenience library that can be used to create other libtool libraries,
+even shared ones. Just like in the static case, the library behaves as
+an alias to a set of object files and dependency libraries, but in this
+case the object files are suitable for inclusion in shared libraries.
+But be careful not to link a single convenience library, directly or
+indirectly, into a single program or library, otherwise you may get
+errors about symbol redefinitions.
+
+ The key is remembering that a convenience library contains PIC
+objects, and can be linked where a list of PIC objects makes sense;
+i.e. into a shared library. A static convenience library contains
+non-PIC objects, so can be linked into an old static library, or a
+program.
+
+ When GNU Automake is used, you should use `noinst_LTLIBRARIES'
+instead of `lib_LTLIBRARIES' for convenience libraries, so that the
+`-rpath' option is not passed when they are linked.
+
+ As a rule of thumb, link a libtool convenience library into at most
+one libtool library, and never into a program, and link libtool static
+convenience libraries only into programs, and only if you need to carry
+library dependency information to the user of the static convenience
+library.
+
+ Another common situation where static linking is desirable is in
+creating a standalone binary. Use libtool to do the linking and add the
+`-all-static' flag.
+
+
+File: libtool.info, Node: Invoking libtool, Next: Integrating libtool, Prev: Using libtool, Up: Top
+
+4 Invoking `libtool'
+********************
+
+The `libtool' program has the following synopsis:
+
+ libtool [OPTION]... [MODE-ARG]...
+
+and accepts the following options:
+
+`--config'
+ Display libtool configuration variables and exit.
+
+`--debug'
+ Dump a trace of shell script execution to standard output. This
+ produces a lot of output, so you may wish to pipe it to `less' (or
+ `more') or redirect to a file.
+
+`-n'
+`--dry-run'
+ Don't create, modify, or delete any files, just show what commands
+ would be executed by libtool.
+
+`--features'
+ Display basic configuration options. This provides a way for
+ packages to determine whether shared or static libraries will be
+ built.
+
+`--finish'
+ Same as `--mode=finish'.
+
+`-h'
+ Display short help message.
+
+`--help'
+ Display a help message and exit. If `--mode=MODE' is specified,
+ then detailed help for MODE is displayed.
+
+`--help-all'
+ Display help for the general options as well as detailed help for
+ each operation mode, and exit.
+
+`--mode=MODE'
+ Use MODE as the operation mode. When using libtool from the
+ command line, you can give just MODE (or a unique abbreviation of
+ it) as the first argument as a shorthand for the full
+ `--mode=MODE'. For example, the following are equivalent:
+
+ $ libtool --mode=execute --dry-run gdb prog.exe
+ $ libtool execute --dry-run gdb prog.exe
+ $ libtool exe --dry-run gdb prog.exe
+ $ libtool e --dry-run gdb prog.exe
+
+ MODE must be set to one of the following:
+
+ `compile'
+ Compile a source file into a libtool object.
+
+ `execute'
+ Automatically set the library path so that another program
+ can use uninstalled libtool-generated programs or libraries.
+
+ `link'
+ Create a library or an executable.
+
+ `install'
+ Install libraries or executables.
+
+ `finish'
+ Complete the installation of libtool libraries on the system.
+
+ `uninstall'
+ Delete installed libraries or executables.
+
+ `clean'
+ Delete uninstalled libraries or executables.
+
+`--tag=TAG'
+ Use configuration variables from tag TAG (*note Tags::).
+
+`--preserve-dup-deps'
+ Do not remove duplicate dependencies in libraries. When building
+ packages with static libraries, the libraries may depend
+ circularly on each other (shared libs can too, but for those it
+ doesn't matter), so there are situations, where -la -lb -la is
+ required, and the second -la may not be stripped or the link will
+ fail. In cases where these duplications are required, this option
+ will preserve them, only stripping the libraries that libtool
+ knows it can safely.
+
+`--quiet'
+`--silent'
+ Do not print out any progress or informational messages.
+
+`-v'
+`--verbose'
+ Print out progress and informational messages (enabled by default),
+ as well as additional messages not ordinary seen by default.
+
+`--no-quiet'
+`--no-silent'
+ Print out the progress and informational messages that are seen by
+ default. This option has no effect on whether the additional
+ messages seen in `--verbose' mode are shown.
+
+`--no-verbose'
+ Do not print out any additional informational messages beyond
+ those ordinarily seen by default. This option has no effect on
+ whether the ordinary progress and informational messages enabled
+ by `--no-quiet' are shown.
+
+ Thus, there are now three different message levels (not counting
+ `--debug'), depending on whether the normal messages and/or the
+ additional verbose messages are displayed. Note that there is no
+ mechanism to diplay verbose messages, without also displaying
+ normal messages.
+
+ *default*
+ Normal messages are displayed, verbose messages are not
+ displayed. In addition to being the default mode, it can be
+ forcibly achieved by using both option `--no-verbose' and
+ either option `--no-silent' or option `--no-quiet'.
+
+ *silent*
+ Neither normal messages nor verbose messages are displayed.
+ This mode can be achieved using either option `--silent' or
+ option `--quiet'.
+
+ *verbose*
+ Both normal messages and verbose messages are displayed. This
+ mode can be achieved using either option `-v' or option
+ `--verbose'.
+
+`--version'
+ Print libtool version information and exit.
+
+ The current `libtool' implementation is done with a shell script
+that needs to be invoked by the shell which `configure' chose for
+configuring `libtool' (*note The Autoconf Manual:
+(autoconf)config.status Invocation.). This shell is set in the
+she-bang (`#!') line of the `libtool' script. Using a different shell
+may cause undefined behavior.
+
+ The MODE-ARGS are a variable number of arguments, depending on the
+selected operation mode. In general, each MODE-ARG is interpreted by
+programs libtool invokes, rather than libtool itself.
+
+* Menu:
+
+* Compile mode:: Creating library object files.
+* Link mode:: Generating executables and libraries.
+* Execute mode:: Debugging libtool-generated programs.
+* Install mode:: Making libraries and executables public.
+* Finish mode:: Completing a library installation.
+* Uninstall mode:: Removing installed executables and libraries.
+* Clean mode:: Removing uninstalled executables and libraries.
+
+
+File: libtool.info, Node: Compile mode, Next: Link mode, Up: Invoking libtool
+
+4.1 Compile mode
+================
+
+For "compile" mode, MODE-ARGS is a compiler command to be used in
+creating a "standard" object file. These arguments should begin with
+the name of the C compiler, and contain the `-c' compiler flag so that
+only an object file is created.
+
+ Libtool determines the name of the output file by removing the
+directory component from the source file name, then substituting the
+source code suffix (e.g. `.c' for C source code) with the library
+object suffix, `.lo'.
+
+ If shared libraries are being built, any necessary PIC generation
+flags are substituted into the compilation command.
+
+ The following components of MODE-ARGS are treated specially:
+
+`-o'
+ Note that the `-o' option is now fully supported. It is emulated
+ on the platforms that don't support it (by locking and moving the
+ objects), so it is really easy to use libtool, just with minor
+ modifications to your Makefiles. Typing for example
+ libtool --mode=compile gcc -c foo/x.c -o foo/x.lo
+ will do what you expect.
+
+ Note, however, that, if the compiler does not support `-c' and
+ `-o', it is impossible to compile `foo/x.c' without overwriting an
+ existing `./x.o'. Therefore, if you do have a source file
+ `./x.c', make sure you introduce dependencies in your `Makefile'
+ to make sure `./x.o' (or `./x.lo') is re-created after any
+ sub-directory's `x.lo':
+
+ x.o x.lo: foo/x.lo bar/x.lo
+
+ This will also ensure that make won't try to use a temporarily
+ corrupted `x.o' to create a program or library. It may cause
+ needless recompilation on platforms that support `-c' and `-o'
+ together, but it's the only way to make it safe for those that
+ don't.
+
+`-no-suppress'
+ If both PIC and non-PIC objects are being built, libtool will
+ normally suppress the compiler output for the PIC object
+ compilation to save showing very similar, if not identical
+ duplicate output for each object. If the `-no-suppress' option is
+ given in compile mode, libtool will show the compiler output for
+ both objects.
+
+`-prefer-pic'
+ Libtool will try to build only PIC objects.
+
+`-prefer-non-pic'
+ Libtool will try to build only non-PIC objects.
+
+`-shared'
+ Even if Libtool was configured with `--enable-static', the object
+ file Libtool builds will not be suitable for static linking.
+ Libtool will signal an error if it was configured with
+ `--disable-shared', or if the host does not support shared
+ libraries.
+
+`-static'
+ Even if libtool was configured with `--disable-static', the object
+ file Libtool builds *will* be suitable for static linking.
+
+`-Wc,FLAG'
+`-Xcompiler FLAG'
+ Pass a flag directly to the compiler. With `-Wc,', multiple flags
+ may be separated by commas, whereas `-Xcompiler ' passes through
+ commas unchanged.
+
+
+File: libtool.info, Node: Link mode, Next: Execute mode, Prev: Compile mode, Up: Invoking libtool
+
+4.2 Link mode
+=============
+
+"Link" mode links together object files (including library objects) to
+form another library or to create an executable program.
+
+ MODE-ARGS consist of a command using the C compiler to create an
+output file (with the `-o' flag) from several object files.
+
+ The following components of MODE-ARGS are treated specially:
+
+`-all-static'
+ If OUTPUT-FILE is a program, then do not link it against any
+ shared libraries at all. If OUTPUT-FILE is a library, then only
+ create a static library. In general, this flag cannot be used
+ together with `disable-static' (*note LT_INIT::).
+
+`-avoid-version'
+ Tries to avoid versioning (*note Versioning::) for libraries and
+ modules, i.e. no version information is stored and no symbolic
+ links are created. If the platform requires versioning, this
+ option has no effect.
+
+`-bindir'
+ Pass the absolute name of the directory for installing executable
+ programs (*note Directory Variables: (standards)Directory
+ Variables.). `libtool' may use this value to install shared
+ libraries there on systems that do not provide for any library
+ hardcoding and use the directory of a program and the `PATH'
+ variable as library search path. This is typically used for DLLs
+ on Windows or other systems using the PE (Portable Executable)
+ format. On other systems, `-bindir' is ignored. The default
+ value used is `LIBDIR/../bin' for libraries installed to `LIBDIR'.
+ You should not use `-bindir' for modules.
+
+`-dlopen FILE'
+ Same as `-dlpreopen FILE', if native dlopening is not supported on
+ the host platform (*note Dlopened modules::) or if the program is
+ linked with `-static', `-static-libtool-libs', or `-all-static'.
+ Otherwise, no effect. If FILE is `self' Libtool will make sure
+ that the program can `dlopen' itself, either by enabling
+ `-export-dynamic' or by falling back to `-dlpreopen self'.
+
+`-dlpreopen FILE'
+ Link FILE into the output program, and add its symbols to the list
+ of preloaded symbols (*note Dlpreopening::). If FILE is `self',
+ the symbols of the program itself will be added to preloaded
+ symbol lists. If FILE is `force' Libtool will make sure that a
+ preloaded symbol list is always _defined_, regardless of whether
+ it's empty or not.
+
+`-export-dynamic'
+ Allow symbols from OUTPUT-FILE to be resolved with `dlsym' (*note
+ Dlopened modules::).
+
+`-export-symbols SYMFILE'
+ Tells the linker to export only the symbols listed in SYMFILE.
+ The symbol file should end in `.sym' and must contain the name of
+ one symbol per line. This option has no effect on some platforms.
+ By default all symbols are exported.
+
+`-export-symbols-regex REGEX'
+ Same as `-export-symbols', except that only symbols matching the
+ regular expression REGEX are exported. By default all symbols are
+ exported.
+
+`-LLIBDIR'
+ Search LIBDIR for required libraries that have already been
+ installed.
+
+`-lNAME'
+ OUTPUT-FILE requires the installed library `libNAME'. This option
+ is required even when OUTPUT-FILE is not an executable.
+
+`-module'
+ Creates a library that can be dlopened (*note Dlopened modules::).
+ This option doesn't work for programs. Module names don't need to
+ be prefixed with `lib'. In order to prevent name clashes,
+ however, `libNAME' and `NAME' must not be used at the same time in
+ your package.
+
+`-no-fast-install'
+ Disable fast-install mode for the executable OUTPUT-FILE. Useful
+ if the program won't be necessarily installed.
+
+`-no-install'
+ Link an executable OUTPUT-FILE that can't be installed and
+ therefore doesn't need a wrapper script on systems that allow
+ hardcoding of library paths. Useful if the program is only used
+ in the build tree, e.g., for testing or generating other files.
+
+`-no-undefined'
+ Declare that OUTPUT-FILE does not depend on any libraries other
+ than the ones listed on the command line, i.e., after linking, it
+ will not have unresolved symbols. Some platforms require all
+ symbols in shared libraries to be resolved at library creation
+ (*note Inter-library dependencies::), and using this parameter
+ allows `libtool' to assume that this will not happen.
+
+`-o OUTPUT-FILE'
+ Create OUTPUT-FILE from the specified objects and libraries.
+
+`-objectlist FILE'
+ Use a list of object files found in FILE to specify objects.
+
+`-precious-files-regex REGEX'
+ Prevents removal of files from the temporary output directory whose
+ names match this regular expression. You might specify `\.bbg?$'
+ to keep those files created with `gcc -ftest-coverage' for example.
+
+`-release RELEASE'
+ Specify that the library was generated by release RELEASE of your
+ package, so that users can easily tell which versions are newer
+ than others. Be warned that no two releases of your package will
+ be binary compatible if you use this flag. If you want binary
+ compatibility, use the `-version-info' flag instead (*note
+ Versioning::).
+
+`-rpath LIBDIR'
+ If OUTPUT-FILE is a library, it will eventually be installed in
+ LIBDIR. If OUTPUT-FILE is a program, add LIBDIR to the run-time
+ path of the program. On platforms that don't support hardcoding
+ library paths into executables and only search PATH for shared
+ libraries, such as when OUTPUT-FILE is a Windows (or other PE
+ platform) DLL, the `.la' control file will be installed in LIBDIR,
+ but see `-bindir' above for the eventual destination of the `.dll'
+ or other library file itself.
+
+`-R LIBDIR'
+ If OUTPUT-FILE is a program, add LIBDIR to its run-time path. If
+ OUTPUT-FILE is a library, add `-RLIBDIR' to its DEPENDENCY_LIBS,
+ so that, whenever the library is linked into a program, LIBDIR
+ will be added to its run-time path.
+
+`-shared'
+ If OUTPUT-FILE is a program, then link it against any uninstalled
+ shared libtool libraries (this is the default behavior). If
+ OUTPUT-FILE is a library, then only create a shared library. In
+ the later case, libtool will signal an error if it was configured
+ with `--disable-shared', or if the host does not support shared
+ libraries.
+
+`-shrext SUFFIX'
+ If OUTPUT-FILE is a libtool library, replace the system's standard
+ file name extension for shared libraries with SUFFIX (most systems
+ use `.so' here). This option is helpful in certain cases where an
+ application requires that shared libraries (typically modules)
+ have an extension other than the default one. Please note you
+ must supply the full file name extension including any leading dot.
+
+`-static'
+ If OUTPUT-FILE is a program, then do not link it against any
+ uninstalled shared libtool libraries. If OUTPUT-FILE is a
+ library, then only create a static library.
+
+`-static-libtool-libs'
+ If OUTPUT-FILE is a program, then do not link it against any
+ shared libtool libraries. If OUTPUT-FILE is a library, then only
+ create a static library.
+
+`-version-info CURRENT[:REVISION[:AGE]]'
+ If OUTPUT-FILE is a libtool library, use interface version
+ information CURRENT, REVISION, and AGE to build it (*note
+ Versioning::). Do *not* use this flag to specify package release
+ information, rather see the `-release' flag.
+
+`-version-number MAJOR[:MINOR[:REVISION]]'
+ If OUTPUT-FILE is a libtool library, compute interface version
+ information so that the resulting library uses the specified
+ major, minor and revision numbers. This is designed to permit
+ libtool to be used with existing projects where identical version
+ numbers are already used across operating systems. New projects
+ should use the `-version-info' flag instead.
+
+`-weak LIBNAME'
+ if OUTPUT-FILE is a libtool library, declare that it provides a
+ weak LIBNAME interface. This is a hint to libtool that there is
+ no need to append LIBNAME to the list of dependency libraries of
+ OUTPUT-FILE, because linking against OUTPUT-FILE already supplies
+ the same interface (*note Linking with dlopened modules::).
+
+`-Wc,FLAG'
+`-Xcompiler FLAG'
+ Pass a linker-specific flag directly to the compiler. With `-Wc,',
+ multiple flags may be separated by commas, whereas `-Xcompiler '
+ passes through commas unchanged.
+
+`-Wl,FLAG'
+`-Xlinker FLAG'
+ Pass a linker-specific flag directly to the linker.
+
+`-XCClinker FLAG'
+ Pass a link-specific flag to the compiler driver (`CC') during
+ linking.
+
+ If the OUTPUT-FILE ends in `.la', then a libtool library is created,
+which must be built only from library objects (`.lo' files). The
+`-rpath' option is required. In the current implementation, libtool
+libraries may not depend on other uninstalled libtool libraries (*note
+Inter-library dependencies::).
+
+ If the OUTPUT-FILE ends in `.a', then a standard library is created
+using `ar' and possibly `ranlib'.
+
+ If OUTPUT-FILE ends in `.o' or `.lo', then a reloadable object file
+is created from the input files (generally using `ld -r'). This method
+is often called "partial linking".
+
+ Otherwise, an executable program is created.
+
+
+File: libtool.info, Node: Execute mode, Next: Install mode, Prev: Link mode, Up: Invoking libtool
+
+4.3 Execute mode
+================
+
+For "execute" mode, the library path is automatically set, then a
+program is executed.
+
+ The first of the MODE-ARGS is treated as a program name, with the
+rest as arguments to that program.
+
+ The following components of MODE-ARGS are treated specially:
+
+`-dlopen FILE'
+ Add the directory containing FILE to the library path.
+
+ This mode sets the library path environment variable according to any
+`-dlopen' flags.
+
+ If any of the ARGS are libtool executable wrappers, then they are
+translated into the name of their corresponding uninstalled binary, and
+any of their required library directories are added to the library path.
+
+
+File: libtool.info, Node: Install mode, Next: Finish mode, Prev: Execute mode, Up: Invoking libtool
+
+4.4 Install mode
+================
+
+In "install" mode, libtool interprets most of the elements of MODE-ARGS
+as an installation command beginning with `cp', or a BSD-compatible
+`install' program.
+
+ The following components of MODE-ARGS are treated specially:
+
+`-inst-prefix-dir INST-PREFIX-DIR'
+ When installing into a temporary staging area, rather than the
+ final `prefix', this argument is used to reflect the temporary
+ path, in much the same way `automake' uses `DESTDIR'. For
+ instance, if `prefix' is `/usr/local', but INST-PREFIX-DIR is
+ `/tmp', then the object will be installed under `/tmp/usr/local/'.
+ If the installed object is a libtool library, then the internal
+ fields of that library will reflect only `prefix', not
+ INST-PREFIX-DIR:
+
+ # Directory that this library needs to be installed in:
+ libdir='/usr/local/lib'
+
+ not
+
+ # Directory that this library needs to be installed in:
+ libdir='/tmp/usr/local/lib'
+
+ `inst-prefix' is also used to insure that if the installed object
+ must be relinked upon installation, that it is relinked against
+ the libraries in INST-PREFIX-DIR/`prefix', not `prefix'.
+
+ In truth, this option is not really intended for use when calling
+ libtool directly; it is automatically used when `libtool
+ --mode=install' calls `libtool --mode=relink'. Libtool does this
+ by analyzing the destination path given in the original `libtool
+ --mode=install' command and comparing it to the expected
+ installation path established during `libtool --mode=link'.
+
+ Thus, end-users need change nothing, and `automake'-style `make
+ install DESTDIR=/tmp' will Just Work(tm) most of the time. For
+ systems where fast installation can not be turned on, relinking
+ may be needed. In this case, a `DESTDIR' install will fail.
+
+ Currently it is not generally possible to install into a temporary
+ staging area that contains needed third-party libraries which are
+ not yet visible at their final location.
+
+ The rest of the MODE-ARGS are interpreted as arguments to the `cp'
+or `install' command.
+
+ The command is run, and any necessary unprivileged post-installation
+commands are also completed.
+
+
+File: libtool.info, Node: Finish mode, Next: Uninstall mode, Prev: Install mode, Up: Invoking libtool
+
+4.5 Finish mode
+===============
+
+"Finish" mode has two functions. One is to help system administrators
+install libtool libraries so that they can be located and linked into
+user programs. To invoke this functionality, pass the name of a library
+directory as MODE-ARG. Running this command may require superuser
+privileges, and the `--dry-run' option may be useful.
+
+ The second is to facilitate transferring libtool libraries to a
+native compilation environment after they were built in a
+cross-compilation environment. Cross-compilation environments may rely
+on recent libtool features, and running libtool in finish mode will
+make it easier to work with older versions of libtool. This task is
+performed whenever the MODE-ARG is a `.la' file.
+
+
+File: libtool.info, Node: Uninstall mode, Next: Clean mode, Prev: Finish mode, Up: Invoking libtool
+
+4.6 Uninstall mode
+==================
+
+"Uninstall" mode deletes installed libraries, executables and objects.
+
+ The first MODE-ARG is the name of the program to use to delete files
+(typically `/bin/rm').
+
+ The remaining MODE-ARGS are either flags for the deletion program
+(beginning with a `-'), or the names of files to delete.
+
+
+File: libtool.info, Node: Clean mode, Prev: Uninstall mode, Up: Invoking libtool
+
+4.7 Clean mode
+==============
+
+"Clean" mode deletes uninstalled libraries, executables, objects and
+libtool's temporary files associated with them.
+
+ The first MODE-ARG is the name of the program to use to delete files
+(typically `/bin/rm').
+
+ The remaining MODE-ARGS are either flags for the deletion program
+(beginning with a `-'), or the names of files to delete.
+
+
+File: libtool.info, Node: Integrating libtool, Next: Other languages, Prev: Invoking libtool, Up: Top
+
+5 Integrating libtool with your package
+***************************************
+
+This chapter describes how to integrate libtool with your packages so
+that your users can install hassle-free shared libraries.
+
+ There are several ways in which Libtool may be integrated in your
+package, described in the following sections. Typically, the Libtool
+macro files as well as `ltmain.sh' are copied into your package using
+`libtoolize' and `aclocal' after setting up the `configure.ac' and
+toplevel `Makefile.am', then `autoconf' adds the needed tests to the
+`configure' script. These individual steps are often automated with
+`autoreconf'.
+
+ Here is a diagram showing how such a typical Libtool configuration
+works when preparing a package for distribution, assuming that `m4' has
+been chosen as location for additional Autoconf macros, and `build-aux'
+as location for auxiliary build tools (*note The Autoconf Manual:
+(autoconf)Input.):
+
+ libtool.m4 -----. .--> aclocal.m4 -----.
+ ltoptions.m4 ---+ .-> aclocal* -+ +--> autoconf*
+ ltversion.m4 ---+--+ `--> [copy in m4/] --+ |
+ ltsugar.m4 -----+ | ^ | \/
+ lt~obsolete.m4 -+ +-> libtoolize* -----' | configure
+ [ltdl.m4] ------+ | |
+ `----------------------------------'
+
+ ltmain.sh -----------> libtoolize* -> [copy in build-aux/]
+
+ During configuration, the `libtool' script is generated either
+through `config.status' or `config.lt':
+
+ .--> config.status* --.
+ configure* --+ +--> libtool
+ `--> [config.lt*] ----' ^
+ |
+ ltmain.sh --------------------------------'
+
+ At `make' run time, `libtool' is then invoked as needed as a wrapper
+around compilers, linkers, install and cleanup programs.
+
+ There are alternatives choices to several parts of the setup; for
+example, the Libtool macro files can either be copied or symlinked into
+the package, or copied into `aclocal.m4'. As another example, an
+external, pre-configured `libtool' script may be used, by-passing most
+of the tests and package-specific setup for Libtool.
+
+* Menu:
+
+* Autoconf macros:: Autoconf macros exported by libtool.
+* Makefile rules:: Writing `Makefile' rules for libtool.
+* Using Automake:: Automatically supporting libtool.
+* Configuring:: Configuring libtool for a host system.
+* Distributing:: What files to distribute with your package.
+* Static-only libraries:: Sometimes shared libraries are just a pain.
+
+
+File: libtool.info, Node: Autoconf macros, Next: Makefile rules, Up: Integrating libtool
+
+5.1 Autoconf macros exported by libtool
+=======================================
+
+Libtool uses a number of macros to interrogate the host system when it
+is being built, and you can use some of them yourself too. Although
+there are a great many other macros in the libtool installed m4 files,
+these do not form part of the published interface, and are subject to
+change between releases.
+
+Macros in the `LT_CMD_' namespace check for various shell commands:
+
+ -- Macro: LT_CMD_MAX_LEN
+ Finds the longest command line that can be safely passed to
+ `$SHELL' without being truncated, and store in the shell variable
+ `$max_cmd_len'. It is only an approximate value, but command
+ lines of this length or shorter are guaranteed not to be truncated.
+
+Macros in the `LT_FUNC_' namespace check characteristics of library
+functions:
+
+ -- Macro: LT_FUNC_DLSYM_USCORE
+ `AC_DEFINE' the preprocessor symbol `DLSYM_USCORE' if we have to
+ add an underscore to symbol-names passed in to `dlsym'.
+
+Macros in the `LT_LIB_' namespace check characteristics of system
+libraries:
+
+ -- Macro: LT_LIB_M
+ Set `LIBM' to the math library or libraries required on this
+ machine, if any.
+
+ -- Macro: LT_LIB_DLLOAD
+ This is the macro used by `libltdl' to determine which dlloaders
+ to use on this machine, if any. Several shell variables are set
+ (and `AC_SUBST'ed) depending on the dlload interfaces are
+ available on this machine. `LT_DLLOADERS' contains a list of
+ libtool libraries that can be used, and if necessary also sets
+ `LIBADD_DLOPEN' if additional system libraries are required by the
+ `dlopen' loader, and `LIBADD_SHL_LOAD' if additional system
+ libraries are required by the `shl_load' loader, respectively.
+ Finally some symbols are set in `config.h' depending on the
+ loaders that are found to work: `HAVE_LIBDL', `HAVE_SHL_LOAD',
+ `HAVE_DYLD', `HAVE_DLD'.
+
+Macros in the `LT_PATH_' namespace search the system for the full path
+to particular system commands:
+
+ -- Macro: LT_PATH_LD
+ Add a `--with-gnu-ld' option to `configure'. Try to find the path
+ to the linker used by `$CC', and whether it is the GNU linker.
+ The result is stored in the shell variable `$LD', which is
+ `AC_SUBST'ed.
+
+ -- Macro: LT_PATH_NM
+ Try to find a BSD-compatible `nm' or a MS-compatible `dumpbin'
+ command on this machine. The result is stored in the shell
+ variable `$NM', which is `AC_SUBST'ed.
+
+Macros in the `LT_SYS_' namespace probe for system characteristics:
+
+ -- Macro: LT_SYS_DLOPEN_SELF
+ Tests whether a program can dlopen itself, and then also whether
+ the same program can still dlopen itself when statically linked.
+ Results are stored in the shell variables `$enable_dlopen_self' and
+ `enable_dlopen_self_static' respectively.
+
+ -- Macro: LT_SYS_DLOPEN_DEPLIBS
+ Define the preprocessor symbol `LTDL_DLOPEN_DEPLIBS' if the OS
+ needs help to load dependent libraries for `dlopen' (or
+ equivalent).
+
+ -- Macro: LT_SYS_DLSEARCH_PATH
+ Define the preprocessor symbol `LT_DLSEARCH_PATH' to the system
+ default library search path.
+
+ -- Macro: LT_SYS_MODULE_EXT
+ Define the preprocessor symbol `LT_MODULE_EXT' to the extension
+ used for runtime loadable modules. If you use libltdl to open
+ modules, then you can simply use the libtool library extension,
+ `.la'.
+
+ -- Macro: LT_SYS_MODULE_PATH
+ Define the preprocessor symbol `LT_MODULE_PATH_VAR' to the name of
+ the shell environment variable that determines the run-time module
+ search path.
+
+ -- Macro: LT_SYS_SYMBOL_USCORE
+ Set the shell variable `sys_symbol_underscore' to `no' unless the
+ compiler prefixes global symbols with an underscore.
+
+
+File: libtool.info, Node: Makefile rules, Next: Using Automake, Prev: Autoconf macros, Up: Integrating libtool
+
+5.2 Writing `Makefile' rules for libtool
+========================================
+
+Libtool is fully integrated with Automake (*note Introduction:
+(automake)Top.), starting with Automake version 1.2.
+
+ If you want to use libtool in a regular `Makefile' (or
+`Makefile.in'), you are on your own. If you're not using Automake, and
+you don't know how to incorporate libtool into your package you need to
+do one of the following:
+
+ 1. Download the latest Automake distribution from your nearest GNU
+ mirror, install it, and start using it.
+
+ 2. Learn how to write `Makefile' rules by hand. They're sometimes
+ complex, but if you're clever enough to write rules for compiling
+ your old libraries, then you should be able to figure out new
+ rules for libtool libraries (hint: examine the `Makefile.in' in
+ the `tests/demo' subdirectory of the libtool distribution... note
+ especially that it was automatically generated from the
+ `Makefile.am' by Automake).
+
+
+File: libtool.info, Node: Using Automake, Next: Configuring, Prev: Makefile rules, Up: Integrating libtool
+
+5.3 Using Automake with libtool
+===============================
+
+Libtool library support is implemented under the `LTLIBRARIES' primary.
+
+ Here are some samples from the Automake `Makefile.am' in the libtool
+distribution's `demo' subdirectory.
+
+ First, to link a program against a libtool library, just use the
+`program_LDADD'(1) variable:
+
+ bin_PROGRAMS = hell hell_static
+
+ # Build hell from main.c and libhello.la
+ hell_SOURCES = main.c
+ hell_LDADD = libhello.la
+
+ # Create a statically linked version of hell.
+ hell_static_SOURCES = main.c
+ hell_static_LDADD = libhello.la
+ hell_static_LDFLAGS = -static
+
+ You may use the `program_LDFLAGS' variable to stuff in any flags you
+want to pass to libtool while linking `program' (such as `-static' to
+avoid linking uninstalled shared libtool libraries).
+
+ Building a libtool library is almost as trivial... note the use of
+`libhello_la_LDFLAGS' to pass the `-version-info' (*note Versioning::)
+option to libtool:
+
+ # Build a libtool library, libhello.la for installation in libdir.
+ lib_LTLIBRARIES = libhello.la
+ libhello_la_SOURCES = hello.c foo.c
+ libhello_la_LDFLAGS = -version-info 3:12:1
+
+ The `-rpath' option is passed automatically by Automake (except for
+libraries listed as `noinst_LTLIBRARIES'), so you should not specify it.
+
+ *Note Building a Shared Library: (automake)A Shared Library, for
+more information.
+
+ ---------- Footnotes ----------
+
+ (1) Since GNU Automake 1.5, the flags `-dlopen' or `-dlpreopen'
+(*note Link mode::) can be employed with the `program_LDADD' variable.
+Unfortunately, older releases didn't accept these flags, so if you are
+stuck with an ancient Automake, we recommend quoting the flag itself,
+and setting `program_DEPENDENCIES' too:
+
+ program_LDADD = "-dlopen" libfoo.la
+ program_DEPENDENCIES = libfoo.la
+
+
+File: libtool.info, Node: Configuring, Next: Distributing, Prev: Using Automake, Up: Integrating libtool
+
+5.4 Configuring libtool
+=======================
+
+Libtool requires intimate knowledge of your compiler suite and operating
+system in order to be able to create shared libraries and link against
+them properly. When you install the libtool distribution, a
+system-specific libtool script is installed into your binary directory.
+
+ However, when you distribute libtool with your own packages (*note
+Distributing::), you do not always know the compiler suite and
+operating system that are used to compile your package.
+
+ For this reason, libtool must be "configured" before it can be used.
+This idea should be familiar to anybody who has used a GNU `configure'
+script. `configure' runs a number of tests for system features, then
+generates the `Makefile's (and possibly a `config.h' header file),
+after which you can run `make' and build the package.
+
+ Libtool adds its own tests to your `configure' script in order to
+generate a libtool script for the installer's host machine.
+
+* Menu:
+
+* LT_INIT:: Configuring `libtool' in `configure.ac'.
+* Configure notes:: Platform-specific notes for configuration.
+
+
+File: libtool.info, Node: LT_INIT, Next: Configure notes, Up: Configuring
+
+5.4.1 The `LT_INIT' macro
+-------------------------
+
+If you are using GNU Autoconf (or Automake), you should add a call to
+`LT_INIT' to your `configure.ac' file. This macro adds many new tests
+to the `configure' script so that the generated libtool script will
+understand the characteristics of the host. It's the most important of
+a number of macros defined by Libtool:
+
+ -- Macro: LT_PREREQ (VERSION)
+ Ensure that a recent enough version of Libtool is being used. If
+ the version of Libtool used for `LT_INIT' is earlier than VERSION,
+ print an error message to the standard error output and exit with
+ failure (exit status is 63). For example:
+
+ LT_PREREQ([2.4.2])
+
+ -- Macro: LT_INIT (OPTIONS)
+ -- Macro: AC_PROG_LIBTOOL
+ -- Macro: AM_PROG_LIBTOOL
+ Add support for the `--enable-shared', `--disable-shared',
+ `--enable-static', `--disable-static', `--with-pic', and
+ `--without-pic' `configure' flags.(1) `AC_PROG_LIBTOOL' and
+ `AM_PROG_LIBTOOL' are deprecated names for older versions of this
+ macro; `autoupdate' will upgrade your `configure.ac' files.
+
+ By default, this macro turns on shared libraries if they are
+ available, and also enables static libraries if they don't
+ conflict with the shared libraries. You can modify these defaults
+ by passing either `disable-shared' or `disable-static' in the
+ option list to `LT_INIT', or using `AC_DISABLE_SHARED' or
+ `AC_DISABLE_STATIC'.
+
+ # Turn off shared libraries during beta-testing, since they
+ # make the build process take too long.
+ LT_INIT([disable-shared])
+
+ The user may specify modified forms of the configure flags
+ `--enable-shared' and `--enable-static' to choose whether shared
+ or static libraries are built based on the name of the package.
+ For example, to have shared `bfd' and `gdb' libraries built, but
+ not shared `libg++', you can run all three `configure' scripts as
+ follows:
+
+ trick$ ./configure --enable-shared=bfd,gdb
+
+ In general, specifying `--enable-shared=PKGS' is the same as
+ configuring with `--enable-shared' every package named in the
+ comma-separated PKGS list, and every other package with
+ `--disable-shared'. The `--enable-static=PKGS' flag behaves
+ similarly, but it uses `--enable-static' and `--disable-static'.
+ The same applies to the `--enable-fast-install=PKGS' flag, which
+ uses `--enable-fast-install' and `--disable-fast-install'.
+
+ The package name `default' matches any packages that have not set
+ their name in the `PACKAGE' environment variable.
+
+ The `--with-pic' and `--without-pic' configure flags can be used
+ to specify whether or not `libtool' uses PIC objects. By default,
+ `libtool' uses PIC objects for shared libraries and non-PIC
+ objects for static libraries. The `--with-pic' option also
+ accepts a comma-separated list of package names. Specifying
+ `--with-pic=PKGS' is the same as configuring every package in PKGS
+ with `--with-pic' and every other package with the default
+ configuration. The package name `default' is treated the same as
+ for `--enable-shared' and `--enable-static'.
+
+ This macro also sets the shell variable `LIBTOOL_DEPS', that you
+ can use to automatically update the libtool script if it becomes
+ out-of-date. In order to do that, add to your `configure.ac':
+
+ LT_INIT
+ AC_SUBST([LIBTOOL_DEPS])
+
+ and, to `Makefile.in' or `Makefile.am':
+
+ LIBTOOL_DEPS = @LIBTOOL_DEPS@
+ libtool: $(LIBTOOL_DEPS)
+ $(SHELL) ./config.status libtool
+
+ If you are using GNU Automake, you can omit the assignment, as
+ Automake will take care of it. You'll obviously have to create
+ some dependency on `libtool'.
+
+ Aside from `disable-static' and `disable-shared', there are other
+ options that you can pass to `LT_INIT' to modify its behaviour.
+ Here is a full list:
+
+ `dlopen'
+ Enable checking for dlopen support. This option should be
+ used if the package makes use of the `-dlopen' and
+ `-dlpreopen' libtool flags, otherwise libtool will assume
+ that the system does not support dlopening.
+
+ `win32-dll'
+ This option should be used if the package has been ported to
+ build clean dlls on win32 platforms. Usually this means that
+ any library data items are exported with
+ `__declspec(dllexport)' and imported with
+ `__declspec(dllimport)'. If this macro is not used, libtool
+ will assume that the package libraries are not dll clean and
+ will build only static libraries on win32 hosts.
+
+ Provision must be made to pass `-no-undefined' to `libtool'
+ in link mode from the package `Makefile'. Naturally, if you
+ pass `-no-undefined', you must ensure that all the library
+ symbols *really are* defined at link time!
+
+ `disable-fast-install'
+ Change the default behaviour for `LT_INIT' to disable
+ optimization for fast installation. The user may still
+ override this default, depending on platform support, by
+ specifying `--enable-fast-install' to `configure'.
+
+ `shared'
+ Change the default behaviour for `LT_INIT' to enable shared
+ libraries. This is the default on all systems where Libtool
+ knows how to create shared libraries. The user may still
+ override this default by specifying `--disable-shared' to
+ `configure'.
+
+ `disable-shared'
+ Change the default behaviour for `LT_INIT' to disable shared
+ libraries. The user may still override this default by
+ specifying `--enable-shared' to `configure'.
+
+ `static'
+ Change the default behaviour for `LT_INIT' to enable static
+ libraries. This is the default on all systems where shared
+ libraries have been disabled for some reason, and on most
+ systems where shared libraries have been enabled. If shared
+ libraries are enabled, the user may still override this
+ default by specifying `--disable-static' to `configure'.
+
+ `disable-static'
+ Change the default behaviour for `LT_INIT' to disable static
+ libraries. The user may still override this default by
+ specifying `--enable-static' to `configure'.
+
+ `pic-only'
+ Change the default behaviour for `libtool' to try to use only
+ PIC objects. The user may still override this default by
+ specifying `--without-pic' to `configure'.
+
+ `no-pic'
+ Change the default behaviour of `libtool' to try to use only
+ non-PIC objects. The user may still override this default by
+ specifying `--with-pic' to `configure'.
+
+
+
+ -- Macro: LT_LANG (LANGUAGE)
+ Enable `libtool' support for the language given if it has not yet
+ already been enabled. Languages accepted are "C++", "Fortran 77",
+ "Java", "Go", and "Windows Resource".
+
+ If Autoconf language support macros such as `AC_PROG_CXX' are used
+ in your `configure.ac', Libtool language support will automatically
+ be enabled.
+
+ Conversely using `LT_LANG' to enable language support for Libtool
+ will automatically enable Autoconf language support as well.
+
+ Both of the following examples are therefore valid ways of adding
+ C++ language support to Libtool.
+
+ LT_INIT
+ LT_LANG([C++])
+
+ LT_INIT
+ AC_PROG_CXX
+
+
+ -- Macro: AC_LIBTOOL_DLOPEN
+ This macro is deprecated, the `dlopen' option to `LT_INIT' should
+ be used instead.
+
+ -- Macro: AC_LIBTOOL_WIN32_DLL
+ This macro is deprecated, the `win32-dll' option to `LT_INIT'
+ should be used instead.
+
+ -- Macro: AC_DISABLE_FAST_INSTALL
+ This macro is deprecated, the `disable-fast-install' option to
+ `LT_INIT' should be used instead.
+
+ -- Macro: AC_DISABLE_SHARED
+ -- Macro: AM_DISABLE_SHARED
+ Change the default behaviour for `LT_INIT' to disable shared
+ libraries. The user may still override this default by specifying
+ `--enable-shared'. The option `disable-shared' to `LT_INIT' is a
+ shorthand for this. `AM_DISABLE_SHARED' is a deprecated alias for
+ `AC_DISABLE_SHARED'.
+
+ -- Macro: AC_ENABLE_SHARED
+ -- Macro: AM_ENABLE_SHARED
+ Change the default behaviour for `LT_INIT' to enable shared
+ libraries. This is the default on all systems where Libtool knows
+ how to create shared libraries. The user may still override this
+ default by specifying `--disable-shared'. The option `shared' to
+ `LT_INIT' is a shorthand for this. `AM_ENABLE_SHARED' is a
+ deprecated alias for `AC_ENABLE_SHARED'.
+
+ -- Macro: AC_DISABLE_STATIC
+ -- Macro: AM_DISABLE_STATIC
+ Change the default behaviour for `LT_INIT' to disable static
+ libraries. The user may still override this default by specifying
+ `--enable-static'. The option `disable-static' to `LT_INIT' is a
+ shorthand for this. `AM_DISABLE_STATIC' is a deprecated alias for
+ `AC_DISABLE_STATIC'.
+
+ -- Macro: AC_ENABLE_STATIC
+ -- Macro: AM_ENABLE_STATIC
+ Change the default behaviour for `LT_INIT' to enable static
+ libraries. This is the default on all systems where shared
+ libraries have been disabled for some reason, and on most systems
+ where shared libraries have been enabled. If shared libraries are
+ enabled, the user may still override this default by specifying
+ `--disable-static'. The option `static' to `LT_INIT' is a
+ shorthand for this. `AM_ENABLE_STATIC' is a deprecated alias for
+ `AC_ENABLE_STATIC'.
+
+ The tests in `LT_INIT' also recognize the following environment
+variables:
+
+ -- Variable: CC
+ The C compiler that will be used by the generated `libtool'. If
+ this is not set, `LT_INIT' will look for `gcc' or `cc'.
+
+ -- Variable: CFLAGS
+ Compiler flags used to generate standard object files. If this is
+ not set, `LT_INIT' will not use any such flags. It affects only
+ the way `LT_INIT' runs tests, not the produced `libtool'.
+
+ -- Variable: CPPFLAGS
+ C preprocessor flags. If this is not set, `LT_INIT' will not use
+ any such flags. It affects only the way `LT_INIT' runs tests, not
+ the produced `libtool'.
+
+ -- Variable: LD
+ The system linker to use (if the generated `libtool' requires one).
+ If this is not set, `LT_INIT' will try to find out what is the
+ linker used by `CC'.
+
+ -- Variable: LDFLAGS
+ The flags to be used by `libtool' when it links a program. If
+ this is not set, `LT_INIT' will not use any such flags. It
+ affects only the way `LT_INIT' runs tests, not the produced
+ `libtool'.
+
+ -- Variable: LIBS
+ The libraries to be used by `LT_INIT' when it links a program. If
+ this is not set, `LT_INIT' will not use any such flags. It
+ affects only the way `LT_INIT' runs tests, not the produced
+ `libtool'.
+
+ -- Variable: NM
+ Program to use rather than checking for `nm'.
+
+ -- Variable: RANLIB
+ Program to use rather than checking for `ranlib'.
+
+ -- Variable: LN_S
+ A command that creates a link of a program, a soft-link if
+ possible, a hard-link otherwise. `LT_INIT' will check for a
+ suitable program if this variable is not set.
+
+ -- Variable: DLLTOOL
+ Program to use rather than checking for `dlltool'. Only meaningful
+ for Cygwin/MS-Windows.
+
+ -- Variable: OBJDUMP
+ Program to use rather than checking for `objdump'. Only meaningful
+ for Cygwin/MS-Windows.
+
+ -- Variable: AS
+ Program to use rather than checking for `as'. Only used on
+ Cygwin/MS-Windows at the moment.
+
+ -- Variable: MANIFEST_TOOL
+ Program to use rather than checking for `mt', the Manifest Tool.
+ Only used on Cygwin/MS-Windows at the moment.
+
+ With 1.3 era libtool, if you wanted to know any details of what
+libtool had discovered about your architecture and environment, you had
+to run the script with `--config' and grep through the results. This
+idiom was supported up to and including 1.5.x era libtool, where it was
+possible to call the generated libtool script from `configure.ac' as
+soon as `LT_INIT' had completed. However, one of the features of
+libtool 1.4 was that the libtool configuration was migrated out of a
+separate `ltconfig' file, and added to the `LT_INIT' macro (nee
+`AC_PROG_LIBTOOL'), so the results of the configuration tests were
+available directly to code in `configure.ac', rendering the call out to
+the generated libtool script obsolete.
+
+ Starting with libtool 2.0, the multipass generation of the libtool
+script has been consolidated into a single `config.status' pass, which
+happens after all the code in `configure.ac' has completed. The
+implication of this is that the libtool script does not exist during
+execution of code from `configure.ac', and so obviously it cannot be
+called for `--config' details anymore. If you are upgrading projects
+that used this idiom to libtool 2.0 or newer, you should replace those
+calls with direct references to the equivalent Autoconf shell variables
+that are set by the configure time tests before being passed to
+`config.status' for inclusion in the generated libtool script.
+
+ -- Macro: LT_OUTPUT
+ By default, the configured `libtool' script is generated by the
+ call to `AC_OUTPUT' command, and there is rarely any need to use
+ `libtool' from `configure'. However, sometimes it is necessary to
+ run configure time compile and link tests using `libtool'. You
+ can add `LT_OUTPUT' to your `configure.ac' any time after
+ `LT_INIT' and any `LT_LANG' calls; that done, `libtool' will be
+ created by a specially generated `config.lt' file, and available
+ for use in later tests.
+
+ Also, when `LT_OUTPUT' is used, for backwards compatibility with
+ Automake regeneration rules, `config.status' will call `config.lt'
+ to regenerate `libtool', rather than generating the file itself.
+
+ When you invoke the `libtoolize' program (*note Invoking
+libtoolize::), it will tell you where to find a definition of
+`LT_INIT'. If you use Automake, the `aclocal' program will
+automatically add `LT_INIT' support to your `configure' script when it
+sees the invocation of `LT_INIT' in `configure.ac'.
+
+ Because of these changes, and the runtime version compatibility
+checks Libtool now executes, we now advise *against* including a copy of
+`libtool.m4' (and brethren) in `acinclude.m4'. Instead, you should set
+your project macro directory with `AC_CONFIG_MACRO_DIR'. When you
+`libtoolize' your project, a copy of the relevant macro definitions
+will be placed in your `AC_CONFIG_MACRO_DIR', where `aclocal' can
+reference them directly from `aclocal.m4'.
+
+ ---------- Footnotes ----------
+
+ (1) `LT_INIT' requires that you define the `Makefile' variable
+`top_builddir' in your `Makefile.in'. Automake does this
+automatically, but Autoconf users should set it to the relative path to
+the top of your build directory (`../..', for example).
+
+
+File: libtool.info, Node: Configure notes, Prev: LT_INIT, Up: Configuring
+
+5.4.2 Platform-specific configuration notes
+-------------------------------------------
+
+While Libtool tries to hide as many platform-specific features as
+possible, some have to be taken into account when configuring either
+the Libtool package or a libtoolized package.
+
+ * You currently need GNU make to build the Libtool package itself.
+
+ * On AIX there are two different styles of shared linking, one in
+ which symbols are bound at link-time and one in which symbols are
+ bound at runtime only, similar to ELF. In case of doubt use
+ `LDFLAGS=-Wl,-brtl' for the latter style.
+
+ * On AIX, native tools are to be preferred over binutils; especially
+ for C++ code, if using the AIX Toolbox GCC 4.0 and binutils,
+ configure with `AR=/usr/bin/ar LD=/usr/bin/ld NM='/usr/bin/nm -B''.
+
+ * On AIX, the `/bin/sh' is very slow due to its inefficient handling
+ of here-documents. A modern shell is preferable:
+ CONFIG_SHELL=/bin/bash; export $CONFIG_SHELL
+ $CONFIG_SHELL ./configure [...]
+
+ * For C++ code with templates, it may be necessary to specify the
+ way the compiler will generate the instantiations. For Portland
+ pgCC version5, use `CXX='pgCC --one_instantiation_per_object'' and
+ avoid parallel `make'.
+
+ * On Darwin, for C++ code with templates you need two level shared
+ libraries. Libtool builds these by default if
+ `MACOSX_DEPLOYMENT_TARGET' is set to 10.3 or later at `configure'
+ time. See `rdar://problem/4135857' for more information on this
+ issue.
+
+ * The default shell on UNICOS 9, a ksh 88e variant, is too buggy to
+ correctly execute the libtool script. Users are advised to
+ install a modern shell such as GNU bash.
+
+ * Some HP-UX `sed' programs are horribly broken, and cannot handle
+ libtool's requirements, so users may report unusual problems.
+ There is no workaround except to install a working `sed' (such as
+ GNU sed) on these systems.
+
+ * The vendor-distributed NCR MP-RAS `cc' programs emits copyright on
+ standard error that confuse tests on size of `conftest.err'. The
+ workaround is to specify `CC' when run configure with `CC='cc
+ -Hnocopyr''.
+
+ * Any earlier DG/UX system with ELF executables, such as R3.10 or
+ R4.10, is also likely to work, but hasn't been explicitly tested.
+
+ * On Reliant Unix libtool has only been tested with the Siemens
+ C-compiler and an old version of `gcc' provided by Marco Walther.
+
+ * `libtool.m4', `ltdl.m4' and the `configure.ac' files are marked to
+ use autoconf-mode, which is distributed with GNU Emacs 21,
+ Autoconf itself, and all recent releases of XEmacs.
+
+ * When building on some GNU/Linux systems for multilib targets
+ `libtool' sometimes guesses the wrong paths that the linker and
+ dynamic linker search by default. If this occurs, you may override
+ libtool's guesses at `configure' time by setting the `autoconf'
+ cache variables `lt_cv_sys_lib_search_path_spec' and
+ `lt_cv_sys_lib_dlsearch_path_spec' respectively to the correct
+ search paths.
+
+
+
+File: libtool.info, Node: Distributing, Next: Static-only libraries, Prev: Configuring, Up: Integrating libtool
+
+5.5 Including libtool in your package
+=====================================
+
+In order to use libtool, you need to include the following files with
+your package:
+
+`config.guess'
+ Attempt to guess a canonical system name.
+
+`config.sub'
+ Canonical system name validation subroutine script.
+
+`install-sh'
+ BSD-compatible `install' replacement script.
+
+`ltmain.sh'
+ A generic script implementing basic libtool functionality.
+
+ Note that the libtool script itself should _not_ be included with
+your package. *Note Configuring::.
+
+ You should use the `libtoolize' program, rather than manually
+copying these files into your package.
+
+* Menu:
+
+* Invoking libtoolize:: `libtoolize' command line options.
+* Autoconf and LTLIBOBJS:: Autoconf automates LTLIBOBJS generation.
+
+
+File: libtool.info, Node: Invoking libtoolize, Next: Autoconf and LTLIBOBJS, Up: Distributing
+
+5.5.1 Invoking `libtoolize'
+---------------------------
+
+The `libtoolize' program provides a standard way to add libtool support
+to your package. In the future, it may implement better usage
+checking, or other features to make libtool even easier to use.
+
+ The `libtoolize' program has the following synopsis:
+
+ libtoolize [OPTION]...
+
+and accepts the following options:
+
+`--copy'
+`-c'
+ Copy files from the libtool data directory rather than creating
+ symlinks.
+
+`--debug'
+ Dump a trace of shell script execution to standard output. This
+ produces a lot of output, so you may wish to pipe it to `less' (or
+ `more') or redirect to a file.
+
+`--dry-run'
+`-n'
+ Don't run any commands that modify the file system, just print them
+ out.
+
+`--force'
+`-f'
+ Replace existing libtool files. By default, `libtoolize' won't
+ overwrite existing files.
+
+`--help'
+ Display a help message and exit.
+
+`--ltdl [TARGET-DIRECTORY-NAME]'
+ Install libltdl in the TARGET-DIRECTORY-NAME subdirectory of your
+ package. Normally, the directory is extracted from the argument
+ to `LT_CONFIG_LTDL_DIR' in `configure.ac', though you can also
+ specify a subdirectory name here if you are not using Autoconf for
+ example. If `libtoolize' can't determine the target directory,
+ `libltdl' is used as the default.
+
+`--no-warn'
+ Normally, Libtoolize tries to diagnose use of deprecated libtool
+ macros and other stylistic issues. If you are deliberately using
+ outdated calling conventions, this option prevents Libtoolize from
+ explaining how to update your project's Libtool conventions.
+
+`--nonrecursive'
+ If passed in conjunction with `--ltdl', this option will cause the
+ `libltdl' installed by `libtoolize' to be set up for use with a
+ non-recursive `automake' build. To make use of it, you will need
+ to add the following to the `Makefile.am' of the parent project:
+
+ ## libltdl/Makefile.inc appends to the following variables
+ ## so we set them here before including it:
+ BUILT_SOURCES =
+
+ AM_CPPFLAGS =
+ AM_LDFLAGS =
+
+ include_HEADERS =
+ noinst_LTLIBRARIES =
+ lib_LTLIBRARIES =
+ EXTRA_LTLIBRARIES =
+
+ EXTRA_DIST =
+
+ CLEANFILES =
+ MOSTLYCLEANFILES =
+
+ include libltdl/Makefile.inc
+
+
+`--quiet'
+`-q'
+ Work silently. `libtoolize --quiet' is used by GNU Automake to
+ add libtool files to your package if necessary.
+
+`--recursive'
+ If passed in conjunction with `--ltdl', this option will cause the
+ `libtoolize' installed `libltdl' to be set up for use with a
+ recursive `automake' build. To make use of it, you will need to
+ adjust the parent project's `configure.ac':
+
+ AC_CONFIG_FILES([libltdl/Makefile])
+
+ and `Makefile.am':
+
+ SUBDIRS += libltdl
+
+`--subproject'
+ If passed in conjunction with `--ltdl', this option will cause the
+ `libtoolize' installed `libltdl' to be set up for independent
+ configuration and compilation as a self-contained subproject. To
+ make use of it, you should arrange for your build to call
+ `libltdl/configure', and then run `make' in the `libltdl'
+ directory (or the subdirectory you put libltdl into). If your
+ project uses Autoconf, you can use the supplied `LT_WITH_LTDL'
+ macro, or else call `AC_CONFIG_SUBDIRS' directly.
+
+ Previous releases of `libltdl' built exclusively in this mode, but
+ now it is the default mode both for backwards compatibility and
+ because, for example, it is suitable for use in projects that wish
+ to use `libltdl', but not use the Autotools for their own build
+ process.
+
+`--verbose'
+`-v'
+ Work noisily! Give a blow by blow account of what `libtoolize' is
+ doing.
+
+`--version'
+ Print `libtoolize' version information and exit.
+
+ Sometimes it can be useful to pass options to `libtoolize' even
+though it is called by another program, such as `autoreconf'. A
+limited number of options are parsed from the environment variable
+`LIBTOOLIZE_OPTIONS': currently `--debug', `--no-warn', `--quiet' and
+`--verbose'. Multiple options passed in `LIBTOOLIZE_OPTIONS' must be
+separated with a space, comma or a colon.
+
+ By default, a warning is issued for unknown options found in
+`LIBTOOLIZE_OPTIONS' unless the first such option is `--no-warn'.
+Where `libtoolize' has always quit on receipt of an unknown option at
+the command line, this and all previous releases of `libtoolize' will
+continue unabated whatever the content of `LIBTOOLIZE_OPTIONS' (modulo
+some possible warning messages).
+
+ trick$ LIBTOOLIZE_OPTIONS=--no-warn,--quiet autoreconf --install
+
+ If `libtoolize' detects an explicit call to `AC_CONFIG_MACRO_DIR'
+(*note The Autoconf Manual: (autoconf)Input.) in your `configure.ac',
+it will put the Libtool macros in the specified directory.
+
+ In the future other Autotools will automatically check the contents
+of `AC_CONFIG_MACRO_DIR', but at the moment it is more portable to add
+the macro directory to `ACLOCAL_AMFLAGS' in `Makefile.am', which is
+where the tools currently look. If `libtoolize' doesn't see
+`AC_CONFIG_MACRO_DIR', it too will honour the first `-I' argument in
+`ACLOCAL_AMFLAGS' when choosing a directory to store libtool
+configuration macros in. It is perfectly sensible to use both
+`AC_CONFIG_MACRO_DIR' and `ACLOCAL_AMFLAGS', as long as they are kept
+in synchronisation.
+
+ ACLOCAL_AMFLAGS = -I m4
+
+ When you bootstrap your project with `aclocal', then you will need
+to explicitly pass the same macro directory with `aclocal''s `-I' flag:
+
+ trick$ aclocal -I m4
+
+ If `libtoolize' detects an explicit call to `AC_CONFIG_AUX_DIR'
+(*note The Autoconf Manual: (autoconf)Input.) in your `configure.ac', it
+will put the other support files in the specified directory. Otherwise
+they too end up in the project root directory.
+
+ Unless `--no-warn' is passed, `libtoolize' displays hints for adding
+libtool support to your package, as well.
+
+
+File: libtool.info, Node: Autoconf and LTLIBOBJS, Prev: Invoking libtoolize, Up: Distributing
+
+5.5.2 Autoconf and `LTLIBOBJS'
+------------------------------
+
+People used to add code like the following to their `configure.ac':
+
+ LTLIBOBJS=`echo "$LIBOBJS" | sed 's/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'`
+ AC_SUBST([LTLIBOBJS])
+
+This is no longer required (since Autoconf 2.54), and doesn't take
+Automake's deansification support into account either, so doesn't work
+correctly even with ancient Autoconfs!
+
+ Provided you are using a recent (2.54 or better) incarnation of
+Autoconf, the call to `AC_OUTPUT' takes care of setting `LTLIBOBJS' up
+correctly, so you can simply delete such snippets from your
+`configure.ac' if you had them.
+
+
+File: libtool.info, Node: Static-only libraries, Prev: Distributing, Up: Integrating libtool
+
+5.6 Static-only libraries
+=========================
+
+When you are developing a package, it is often worthwhile to configure
+your package with the `--disable-shared' flag, or to override the
+defaults for `LT_INIT' by using the `disable-shared' option (*note The
+`LT_INIT' macro: LT_INIT.). This prevents libtool from building shared
+libraries, which has several advantages:
+
+ * compilation is twice as fast, which can speed up your development
+ cycle,
+
+ * debugging is easier because you don't need to deal with any
+ complexities added by shared libraries, and
+
+ * you can see how libtool behaves on static-only platforms.
+
+ You may want to put a small note in your package `README' to let
+other developers know that `--disable-shared' can save them time. The
+following example note is taken from the GIMP(1) distribution `README':
+
+ The GIMP uses GNU Libtool in order to build shared libraries on a
+ variety of systems. While this is very nice for making usable
+ binaries, it can be a pain when trying to debug a program. For that
+ reason, compilation of shared libraries can be turned off by
+ specifying the `--disable-shared' option to `configure'.
+
+ ---------- Footnotes ----------
+
+ (1) GNU Image Manipulation Program, for those who haven't taken the
+plunge. See `http://www.gimp.org/'.
+
+
+File: libtool.info, Node: Other languages, Next: Versioning, Prev: Integrating libtool, Up: Top
+
+6 Using libtool with other languages
+************************************
+
+Libtool was first implemented in order to add support for writing shared
+libraries in the C language. However, over time, libtool is being
+integrated with other languages, so that programmers are free to reap
+the benefits of shared libraries in their favorite programming language.
+
+ This chapter describes how libtool interacts with other languages,
+and what special considerations you need to make if you do not use C.
+
+* Menu:
+
+* C++ libraries:: Writing libraries for C++
+* Tags:: Tags
+
+
+File: libtool.info, Node: C++ libraries, Next: Tags, Up: Other languages
+
+6.1 Writing libraries for C++
+=============================
+
+Creating libraries of C++ code should be a fairly straightforward
+process, because its object files differ from C ones in only three ways:
+
+ 1. Because of name mangling, C++ libraries are only usable by the C++
+ compiler that created them. This decision was made by the
+ designers of C++ in order to protect users from conflicting
+ implementations of features such as constructors, exception
+ handling, and RTTI.
+
+ 2. On some systems, the C++ compiler must take special actions for the
+ dynamic linker to run dynamic (i.e., run-time) initializers. This
+ means that we should not call `ld' directly to link such
+ libraries, and we should use the C++ compiler instead.
+
+ 3. C++ compilers will link some Standard C++ library in by default,
+ but libtool does not know which are these libraries, so it cannot
+ even run the inter-library dependence analyzer to check how to
+ link it in. Therefore, running `ld' to link a C++ program or
+ library is deemed to fail.
+
+ Because of these three issues, Libtool has been designed to always
+use the C++ compiler to compile and link C++ programs and libraries. In
+some instances the `main()' function of a program must also be compiled
+with the C++ compiler for static C++ objects to be properly initialized.
+
+
+File: libtool.info, Node: Tags, Prev: C++ libraries, Up: Other languages
+
+6.2 Tags
+========
+
+Libtool supports multiple languages through the use of tags.
+Technically a tag corresponds to a set of configuration variables
+associated with a language. These variables tell `libtool' how it
+should create objects and libraries for each language.
+
+ Tags are defined at `configure'-time for each language activated in
+the package (see `LT_LANG' in *note LT_INIT::). Here is the
+correspondence between language names and tags names.
+
+Language name Tag name
+C CC
+C++ CXX
+Java GCJ
+Fortran 77 F77
+Fortran FC
+Go GO
+Windows Resource RC
+
+ `libtool' tries to automatically infer which tag to use from the
+compiler command being used to compile or link. If it can't infer a
+tag, then it defaults to the configuration for the `C' language.
+
+ The tag can also be specified using `libtool''s `--tag=TAG' option
+(*note Invoking libtool::). It is a good idea to do so in `Makefile'
+rules, because that will allow users to substitute the compiler without
+relying on `libtool' inference heuristics. When no tag is specified,
+`libtool' will default to `CC'; this tag always exists.
+
+ Finally, the set of tags available in a particular project can be
+retrieved by tracing for the `LT_SUPPORTED_TAG' macro (*note Trace
+interface::).
+
+
+File: libtool.info, Node: Versioning, Next: Library tips, Prev: Other languages, Up: Top
+
+7 Library interface versions
+****************************
+
+The most difficult issue introduced by shared libraries is that of
+creating and resolving runtime dependencies. Dependencies on programs
+and libraries are often described in terms of a single name, such as
+`sed'. So, one may say "libtool depends on sed," and that is good
+enough for most purposes.
+
+ However, when an interface changes regularly, we need to be more
+specific: "Gnus 5.1 requires Emacs 19.28 or above." Here, the
+description of an interface consists of a name, and a "version number."
+
+ Even that sort of description is not accurate enough for some
+purposes. What if Emacs 20 changes enough to break Gnus 5.1?
+
+ The same problem exists in shared libraries: we require a formal
+version system to describe the sorts of dependencies that programs have
+on shared libraries, so that the dynamic linker can guarantee that
+programs are linked only against libraries that provide the interface
+they require.
+
+* Menu:
+
+* Interfaces:: What are library interfaces?
+* Libtool versioning:: Libtool's versioning system.
+* Updating version info:: Changing version information before releases.
+* Release numbers:: Breaking binary compatibility for aesthetics.
+
+
+File: libtool.info, Node: Interfaces, Next: Libtool versioning, Up: Versioning
+
+7.1 What are library interfaces?
+================================
+
+Interfaces for libraries may be any of the following (and more):
+
+ * global variables: both names and types
+
+ * global functions: argument types and number, return types, and
+ function names
+
+ * standard input, standard output, standard error, and file formats
+
+ * sockets, pipes, and other inter-process communication protocol
+ formats
+
+ Note that static functions do not count as interfaces, because they
+are not directly available to the user of the library.
+
+
+File: libtool.info, Node: Libtool versioning, Next: Updating version info, Prev: Interfaces, Up: Versioning
+
+7.2 Libtool's versioning system
+===============================
+
+Libtool has its own formal versioning system. It is not as flexible as
+some, but it is definitely the simplest of the more powerful versioning
+systems.
+
+ Think of a library as exporting several sets of interfaces,
+arbitrarily represented by integers. When a program is linked against
+a library, it may use any subset of those interfaces.
+
+ Libtool's description of the interfaces that a program uses is
+simple: it encodes the least and the greatest interface numbers in the
+resulting binary (FIRST-INTERFACE, LAST-INTERFACE).
+
+ The dynamic linker is guaranteed that if a library supports _every_
+interface number between FIRST-INTERFACE and LAST-INTERFACE, then the
+program can be relinked against that library.
+
+ Note that this can cause problems because libtool's compatibility
+requirements are actually stricter than is necessary.
+
+ Say `libhello' supports interfaces 5, 16, 17, 18, and 19, and that
+libtool is used to link `test' against `libhello'.
+
+ Libtool encodes the numbers 5 and 19 in `test', and the dynamic
+linker will only link `test' against libraries that support _every_
+interface between 5 and 19. So, the dynamic linker refuses to link
+`test' against `libhello'!
+
+ In order to eliminate this problem, libtool only allows libraries to
+declare consecutive interface numbers. So, `libhello' can declare at
+most that it supports interfaces 16 through 19. Then, the dynamic
+linker will link `test' against `libhello'.
+
+ So, libtool library versions are described by three integers:
+
+CURRENT
+ The most recent interface number that this library implements.
+
+REVISION
+ The implementation number of the CURRENT interface.
+
+AGE
+ The difference between the newest and oldest interfaces that this
+ library implements. In other words, the library implements all the
+ interface numbers in the range from number `CURRENT - AGE' to
+ `CURRENT'.
+
+ If two libraries have identical CURRENT and AGE numbers, then the
+dynamic linker chooses the library with the greater REVISION number.
+
+
+File: libtool.info, Node: Updating version info, Next: Release numbers, Prev: Libtool versioning, Up: Versioning
+
+7.3 Updating library version information
+========================================
+
+If you want to use libtool's versioning system, then you must specify
+the version information to libtool using the `-version-info' flag
+during link mode (*note Link mode::).
+
+ This flag accepts an argument of the form
+`CURRENT[:REVISION[:AGE]]'. So, passing `-version-info 3:12:1' sets
+CURRENT to 3, REVISION to 12, and AGE to 1.
+
+ If either REVISION or AGE are omitted, they default to 0. Also note
+that AGE must be less than or equal to the CURRENT interface number.
+
+ Here are a set of rules to help you update your library version
+information:
+
+ 1. Start with version information of `0:0:0' for each libtool library.
+
+ 2. Update the version information only immediately before a public
+ release of your software. More frequent updates are unnecessary,
+ and only guarantee that the current interface number gets larger
+ faster.
+
+ 3. If the library source code has changed at all since the last
+ update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+
+ 4. If any interfaces have been added, removed, or changed since the
+ last update, increment CURRENT, and set REVISION to 0.
+
+ 5. If any interfaces have been added since the last public release,
+ then increment AGE.
+
+ 6. If any interfaces have been removed or changed since the last
+ public release, then set AGE to 0.
+
+ *_Never_* try to set the interface numbers so that they correspond
+to the release number of your package. This is an abuse that only
+fosters misunderstanding of the purpose of library versions. Instead,
+use the `-release' flag (*note Release numbers::), but be warned that
+every release of your package will not be binary compatible with any
+other release.
+
+ The following explanation may help to understand the above rules a
+bit better: consider that there are three possible kinds of reactions
+from users of your library to changes in a shared library:
+
+ 1. Programs using the previous version may use the new version as
+ drop-in replacement, and programs using the new version can also
+ work with the previous one. In other words, no recompiling nor
+ relinking is needed. In this case, bump REVISION only, don't touch
+ CURRENT nor AGE.
+
+ 2. Programs using the previous version may use the new version as
+ drop-in replacement, but programs using the new version may use
+ APIs not present in the previous one. In other words, a program
+ linking against the new version may fail with "unresolved symbols"
+ if linking against the old version at runtime: set REVISION to 0,
+ bump CURRENT and AGE.
+
+ 3. Programs may need to be changed, recompiled, relinked in order to
+ use the new version. Bump CURRENT, set REVISION and AGE to 0.
+
+In the above description, _programs_ using the library in question may
+also be replaced by other libraries using it.
+
+
+File: libtool.info, Node: Release numbers, Prev: Updating version info, Up: Versioning
+
+7.4 Managing release information
+================================
+
+Often, people want to encode the name of the package release into the
+shared library so that it is obvious to the user which package their
+programs are linked against. This convention is used especially on
+GNU/Linux:
+
+ trick$ ls /usr/lib/libbfd*
+ /usr/lib/libbfd.a /usr/lib/libbfd.so.2.7.0.2
+ /usr/lib/libbfd.so
+ trick$
+
+ On `trick', `/usr/lib/libbfd.so' is a symbolic link to
+`libbfd.so.2.7.0.2', which was distributed as a part of
+`binutils-2.7.0.2'.
+
+ Unfortunately, this convention conflicts directly with libtool's
+idea of library interface versions, because the library interface
+rarely changes at the same time that the release number does, and the
+library suffix is never the same across all platforms.
+
+ So, in order to accommodate both views, you can use the `-release'
+flag in order to set release information for libraries for which you do
+not want to use `-version-info'. For the `libbfd' example, the next
+release that uses libtool should be built with `-release 2.9.0', which
+will produce the following files on GNU/Linux:
+
+ trick$ ls /usr/lib/libbfd*
+ /usr/lib/libbfd-2.9.0.so /usr/lib/libbfd.a
+ /usr/lib/libbfd.so
+ trick$
+
+ In this case, `/usr/lib/libbfd.so' is a symbolic link to
+`libbfd-2.9.0.so'. This makes it obvious that the user is dealing with
+`binutils-2.9.0', without compromising libtool's idea of interface
+versions.
+
+ Note that this option causes a modification of the library name, so
+do not use it unless you want to break binary compatibility with any
+past library releases. In general, you should only use `-release' for
+package-internal libraries or for ones whose interfaces change very
+frequently.
+
+
+File: libtool.info, Node: Library tips, Next: Inter-library dependencies, Prev: Versioning, Up: Top
+
+8 Tips for interface design
+***************************
+
+Writing a good library interface takes a lot of practice and thorough
+understanding of the problem that the library is intended to solve.
+
+ If you design a good interface, it won't have to change often, you
+won't have to keep updating documentation, and users won't have to keep
+relearning how to use the library.
+
+ Here is a brief list of tips for library interface design that may
+help you in your exploits:
+
+Plan ahead
+ Try to make every interface truly minimal, so that you won't need
+ to delete entry points very often.
+
+Avoid interface changes
+ Some people love redesigning and changing entry points just for
+ the heck of it (note: _renaming_ a function is considered changing
+ an entry point). Don't be one of those people. If you must
+ redesign an interface, then try to leave compatibility functions
+ behind so that users don't need to rewrite their existing code.
+
+Use opaque data types
+ The fewer data type definitions a library user has access to, the
+ better. If possible, design your functions to accept a generic
+ pointer (that you can cast to an internal data type), and provide
+ access functions rather than allowing the library user to directly
+ manipulate the data. That way, you have the freedom to change the
+ data structures without changing the interface.
+
+ This is essentially the same thing as using abstract data types and
+ inheritance in an object-oriented system.
+
+Use header files
+ If you are careful to document each of your library's global
+ functions and variables in header files, and include them in your
+ library source files, then the compiler will let you know if you
+ make any interface changes by accident (*note C header files::).
+
+Use the `static' keyword (or equivalent) whenever possible
+ The fewer global functions your library has, the more flexibility
+ you'll have in changing them. Static functions and variables may
+ change forms as often as you like... your users cannot access
+ them, so they aren't interface changes.
+
+Be careful with array dimensions
+ The number of elements in a global array is part of an interface,
+ even if the header just declares `extern int foo[];'. This is
+ because on i386 and some other SVR4/ELF systems, when an
+ application references data in a shared library the size of that
+ data (whatever its type) is included in the application
+ executable. If you might want to change the size of an array or
+ string then provide a pointer not the actual array.
+
+* Menu:
+
+* C header files:: How to write portable include files.
+
+
+File: libtool.info, Node: C header files, Up: Library tips
+
+8.1 Writing C header files
+==========================
+
+Writing portable C header files can be difficult, since they may be read
+by different types of compilers:
+
+C++ compilers
+ C++ compilers require that functions be declared with full
+ prototypes, since C++ is more strongly typed than C. C functions
+ and variables also need to be declared with the `extern "C"'
+ directive, so that the names aren't mangled. *Note C++
+ libraries::, for other issues relevant to using C++ with libtool.
+
+ANSI C compilers
+ ANSI C compilers are not as strict as C++ compilers, but functions
+ should be prototyped to avoid unnecessary warnings when the header
+ file is `#include'd.
+
+non-ANSI C compilers
+ Non-ANSI compilers will report errors if functions are prototyped.
+
+ These complications mean that your library interface headers must use
+some C preprocessor magic in order to be usable by each of the above
+compilers.
+
+ `foo.h' in the `tests/demo' subdirectory of the libtool distribution
+serves as an example for how to write a header file that can be safely
+installed in a system directory.
+
+ Here are the relevant portions of that file:
+
+ /* BEGIN_C_DECLS should be used at the beginning of your declarations,
+ so that C++ compilers don't mangle their names. Use END_C_DECLS at
+ the end of C declarations. */
+ #undef BEGIN_C_DECLS
+ #undef END_C_DECLS
+ #ifdef __cplusplus
+ # define BEGIN_C_DECLS extern "C" {
+ # define END_C_DECLS }
+ #else
+ # define BEGIN_C_DECLS /* empty */
+ # define END_C_DECLS /* empty */
+ #endif
+
+ /* PARAMS is a macro used to wrap function prototypes, so that
+ compilers that don't understand ANSI C prototypes still work,
+ and ANSI C compilers can issue warnings about type mismatches. */
+ #undef PARAMS
+ #if defined (__STDC__) || defined (_AIX) \
+ || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
+ || defined(WIN32) || defined(__cplusplus)
+ # define PARAMS(protos) protos
+ #else
+ # define PARAMS(protos) ()
+ #endif
+
+ These macros are used in `foo.h' as follows:
+
+ #ifndef FOO_H
+ #define FOO_H 1
+
+ /* The above macro definitions. */
+ #include "..."
+
+ BEGIN_C_DECLS
+
+ int foo PARAMS((void));
+ int hello PARAMS((void));
+
+ END_C_DECLS
+
+ #endif /* !FOO_H */
+
+ Note that the `#ifndef FOO_H' prevents the body of `foo.h' from
+being read more than once in a given compilation.
+
+ Also the only thing that must go outside the
+`BEGIN_C_DECLS'/`END_C_DECLS' pair are `#include' lines. Strictly
+speaking it is only C symbol names that need to be protected, but your
+header files will be more maintainable if you have a single pair of
+these macros around the majority of the header contents.
+
+ You should use these definitions of `PARAMS', `BEGIN_C_DECLS', and
+`END_C_DECLS' into your own headers. Then, you may use them to create
+header files that are valid for C++, ANSI, and non-ANSI compilers(1).
+
+ Do not be naive about writing portable code. Following the tips
+given above will help you miss the most obvious problems, but there are
+definitely other subtle portability issues. You may need to cope with
+some of the following issues:
+
+ * Pre-ANSI compilers do not always support the `void *' generic
+ pointer type, and so need to use `char *' in its place.
+
+ * The `const', `inline' and `signed' keywords are not supported by
+ some compilers, especially pre-ANSI compilers.
+
+ * The `long double' type is not supported by many compilers.
+
+ ---------- Footnotes ----------
+
+ (1) We used to recommend `__P', `__BEGIN_DECLS' and `__END_DECLS'.
+This was bad advice since symbols (even preprocessor macro names) that
+begin with an underscore are reserved for the use of the compiler.
+
+
+File: libtool.info, Node: Inter-library dependencies, Next: Dlopened modules, Prev: Library tips, Up: Top
+
+9 Inter-library dependencies
+****************************
+
+By definition, every shared library system provides a way for
+executables to depend on libraries, so that symbol resolution is
+deferred until runtime.
+
+ An "inter-library dependency" is one in which a library depends on
+other libraries. For example, if the libtool library `libhello' uses
+the `cos' function, then it has an inter-library dependency on `libm',
+the math library that implements `cos'.
+
+ Some shared library systems provide this feature in an
+internally-consistent way: these systems allow chains of dependencies of
+potentially infinite length.
+
+ However, most shared library systems are restricted in that they only
+allow a single level of dependencies. In these systems, programs may
+depend on shared libraries, but shared libraries may not depend on other
+shared libraries.
+
+ In any event, libtool provides a simple mechanism for you to declare
+inter-library dependencies: for every library `libNAME' that your own
+library depends on, simply add a corresponding `-lNAME' option to the
+link line when you create your library. To make an example of our
+`libhello' that depends on `libm':
+
+ burger$ libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \
+ -rpath /usr/local/lib -lm
+ burger$
+
+ When you link a program against `libhello', you don't need to
+specify the same `-l' options again: libtool will do that for you, in
+order to guarantee that all the required libraries are found. This
+restriction is only necessary to preserve compatibility with static
+library systems and simple dynamic library systems.
+
+ Some platforms, such as Windows, do not even allow you this
+flexibility. In order to build a shared library, it must be entirely
+self-contained or it must have dependencies known at link time (that is,
+have references only to symbols that are found in the `.lo' files or
+the specified `-l' libraries), and you need to specify the
+`-no-undefined' flag. By default, libtool builds only static libraries
+on these kinds of platforms.
+
+ The simple-minded inter-library dependency tracking code of libtool
+releases prior to 1.2 was disabled because it was not clear when it was
+possible to link one library with another, and complex failures would
+occur. A more complex implementation of this concept was re-introduced
+before release 1.3, but it has not been ported to all platforms that
+libtool supports. The default, conservative behavior is to avoid
+linking one library with another, introducing their inter-dependencies
+only when a program is linked with them.
+
+
+File: libtool.info, Node: Dlopened modules, Next: Using libltdl, Prev: Inter-library dependencies, Up: Top
+
+10 Dlopened modules
+*******************
+
+It can sometimes be confusing to discuss "dynamic linking", because the
+term is used to refer to two different concepts:
+
+ 1. Compiling and linking a program against a shared library, which is
+ resolved automatically at run time by the dynamic linker. In this
+ process, dynamic linking is transparent to the application.
+
+ 2. The application calling functions such as `dlopen' that load
+ arbitrary, user-specified modules at runtime. This type of dynamic
+ linking is explicitly controlled by the application.
+
+ To mitigate confusion, this manual refers to the second type of
+dynamic linking as "dlopening" a module.
+
+ The main benefit to dlopening object modules is the ability to access
+compiled object code to extend your program, rather than using an
+interpreted language. In fact, dlopen calls are frequently used in
+language interpreters to provide an efficient way to extend the
+language.
+
+ Libtool provides support for dlopened modules. However, you should
+indicate that your package is willing to use such support, by using the
+`LT_INIT' option `dlopen' in `configure.ac'. If this option is not
+given, libtool will assume no dlopening mechanism is available, and
+will try to simulate it.
+
+ This chapter discusses how you as a dlopen application developer
+might use libtool to generate dlopen-accessible modules.
+
+* Menu:
+
+* Building modules:: Creating dlopenable objects and libraries.
+* Dlpreopening:: Dlopening that works on static platforms.
+* Linking with dlopened modules:: Using dlopenable modules in libraries.
+* Finding the dlname:: Choosing the right file to `dlopen'.
+* Dlopen issues:: Unresolved problems that need your attention.
+
+
+File: libtool.info, Node: Building modules, Next: Dlpreopening, Up: Dlopened modules
+
+10.1 Building modules to dlopen
+===============================
+
+On some operating systems, a program symbol must be specially declared
+in order to be dynamically resolved with the `dlsym' (or equivalent)
+function. Libtool provides the `-export-dynamic' and `-module' link
+flags (*note Link mode::), for you to make that declaration. You need
+to use these flags if you are linking an application program that
+dlopens other modules or a libtool library that will also be dlopened.
+
+ For example, if we wanted to build a shared library, `hello', that
+would later be dlopened by an application, we would add `-module' to
+the other link flags:
+
+ burger$ libtool --mode=link gcc -module -o hello.la foo.lo \
+ hello.lo -rpath /usr/local/lib -lm
+ burger$
+
+ If symbols from your _executable_ are needed to satisfy unresolved
+references in a library you want to dlopen you will have to use the flag
+`-export-dynamic'. You should use `-export-dynamic' while linking the
+executable that calls dlopen:
+
+ burger$ libtool --mode=link gcc -export-dynamic -o helldl main.o
+ burger$
+
+
+File: libtool.info, Node: Dlpreopening, Next: Linking with dlopened modules, Prev: Building modules, Up: Dlopened modules
+
+10.2 Dlpreopening
+=================
+
+Libtool provides special support for dlopening libtool object and
+libtool library files, so that their symbols can be resolved _even on
+platforms without any `dlopen' and `dlsym' functions_.
+
+ Consider the following alternative ways of loading code into your
+program, in order of increasing "laziness":
+
+ 1. Linking against object files that become part of the program
+ executable, whether or not they are referenced. If an object file
+ cannot be found, then the compile time linker refuses to create
+ the executable.
+
+ 2. Declaring a static library to the linker, so that it is searched
+ at link time in order to satisfy any undefined references in the
+ above object files. If the static library cannot be found, then
+ the compile time linker refuses to create the executable.
+
+ 3. Declaring a shared library to the runtime linker, so that it is
+ searched at runtime in order to satisfy any undefined references
+ in the above files. If the shared library cannot be found, then
+ the dynamic linker aborts the program before it runs.
+
+ 4. Dlopening a module, so that the application can resolve its own,
+ dynamically-computed references. If there is an error opening the
+ module, or the module is not found, then the application can
+ recover without crashing.
+
+ Libtool emulates `-dlopen' on static platforms by linking objects
+into the program at compile time, and creating data structures that
+represent the program's symbol table. In order to use this feature,
+you must declare the objects you want your application to dlopen by
+using the `-dlopen' or `-dlpreopen' flags when you link your program
+(*note Link mode::).
+
+ -- Data Type: lt_dlsymlist typedef struct { const char *NAME;
+ void *ADDRESS; } lt_dlsymlist
+ The NAME attribute is a null-terminated character string of the
+ symbol name, such as `"fprintf"'. The ADDRESS attribute is a
+ generic pointer to the appropriate object, such as `&fprintf'.
+
+ -- Variable: const lt_dlsymlist lt_preloaded_symbols[]
+ An array of `lt_dlsymlist' structures, representing all the
+ preloaded symbols linked into the program proper. For each module
+ `-dlpreopen'ed by the Libtool linked program there is an element
+ with the NAME of the module and an ADDRESS of `0', followed by all
+ symbols exported from this file. For the executable itself the
+ special name `@PROGRAM@' is used. The last element of all has a
+ NAME and ADDRESS of `0'.
+
+ To facilitate inclusion of symbol lists into libraries,
+ `lt_preloaded_symbols' is `#define'd to a suitably unique name in
+ `ltdl.h'.
+
+ This variable may not be declared `const' on some systems due to
+ relocation issues.
+
+ Some compilers may allow identifiers that are not valid in ANSI C,
+such as dollar signs. Libtool only recognizes valid ANSI C symbols (an
+initial ASCII letter or underscore, followed by zero or more ASCII
+letters, digits, and underscores), so non-ANSI symbols will not appear
+in `lt_preloaded_symbols'.
+
+ -- Function: int lt_dlpreload (const lt_dlsymlist *PRELOADED)
+ Register the list of preloaded modules PRELOADED. If PRELOADED is
+ `NULL', then all previously registered symbol lists, except the
+ list set by `lt_dlpreload_default', are deleted. Return 0 on
+ success.
+
+ -- Function: int lt_dlpreload_default (const lt_dlsymlist *PRELOADED)
+ Set the default list of preloaded modules to PRELOADED, which
+ won't be deleted by `lt_dlpreload'. Note that this function does
+ _not_ require libltdl to be initialized using `lt_dlinit' and can
+ be used in the program to register the default preloaded modules.
+ Instead of calling this function directly, most programs will use
+ the macro `LTDL_SET_PRELOADED_SYMBOLS'.
+
+ Return 0 on success.
+
+ -- Macro: LTDL_SET_PRELOADED_SYMBOLS
+ Set the default list of preloaded symbols. Should be used in your
+ program to initialize libltdl's list of preloaded modules.
+
+ #include <ltdl.h>
+
+ int main() {
+ /* ... */
+ LTDL_SET_PRELOADED_SYMBOLS();
+ /* ... */
+ }
+
+ -- Function Type: int lt_dlpreload_callback_func (lt_dlhandle HANDLE)
+ Functions of this type can be passed to `lt_dlpreload_open', which
+ in turn will call back into a function thus passed for each
+ preloaded module that it opens.
+
+ -- Function: int lt_dlpreload_open (const char *ORIGINATOR,
+ lt_dlpreload_callback_func *FUNC)
+ Load all of the preloaded modules for ORIGINATOR. For every
+ module opened in this way, call FUNC.
+
+ To open all of the modules preloaded into `libhell.la' (presumably
+ from within the `libhell.a' initialisation code):
+
+ #define preloaded_symbols lt_libhell_LTX_preloaded_symbols
+
+ static int hell_preload_callback (lt_dlhandle handle);
+
+ int
+ hell_init (void)
+ {
+ ...
+ if (lt_dlpreload (&preloaded_symbols) == 0)
+ {
+ lt_dlpreload_open ("libhell", preload_callback);
+ }
+ ...
+ }
+
+ Note that to prevent clashes between multiple preloaded modules,
+ the preloaded symbols are accessed via a mangled symbol name: to
+ get the symbols preloaded into `libhell', you must prefix
+ `preloaded_symbols' with `lt_'; the originator name, `libhell' in
+ this case; and `_LTX_'. That is,
+ `lt_libhell_LTX_preloaded_symbols' here.
+
+
+File: libtool.info, Node: Linking with dlopened modules, Next: Finding the dlname, Prev: Dlpreopening, Up: Dlopened modules
+
+10.3 Linking with dlopened modules
+==================================
+
+When, say, an interpreter application uses dlopened modules to extend
+the list of methods it provides, an obvious abstraction for the
+maintainers of the interpreter is to have all methods (including the
+built in ones supplied with the interpreter) accessed through dlopen.
+For one thing, the dlopening functionality will be tested even during
+routine invocations. For another, only one subsystem has to be written
+for getting methods into the interpreter.
+
+ The downside of this abstraction is, of course, that environments
+that provide only static linkage can't even load the intrinsic
+interpreter methods. Not so! We can statically link those methods by
+*dlpreopening* them.
+
+ Unfortunately, since platforms such as AIX and cygwin require that
+all library symbols must be resolved at compile time, the interpreter
+maintainers will need to provide a library to both its own dlpreopened
+modules, and third-party modules loaded by dlopen. In itself, that is
+not so bad, except that the interpreter too must provide those same
+symbols otherwise it will be impossible to resolve all the symbols
+required by the modules as they are loaded. Things are even worse if
+the code that loads the modules for the interpreter is itself in a
+library - and that is usually the case for any non-trivial application.
+Modern platforms take care of this by automatically loading all of a
+module's dependency libraries as the module is loaded (libltdl can do
+this even on platforms that can't do it by themselves). In the end,
+this leads to problems with duplicated symbols and prevents modules
+from loading, and prevents the application from compiling when modules
+are preloaded.
+
+ ,-------------. ,------------------. ,-----------------.
+ | Interpreter |----> Module------------> Third-party |
+ `-------------' | Loader | |Dlopened Modules |
+ | | | `-----------------'
+ |,-------v--------.| |
+ || Dlpreopened || |
+ || Modules || |
+ |`----------------'| |
+ | | | |
+ |,-------v--------.| ,--------v--------.
+ ||Module Interface|| |Module Interface |
+ || Library || | Library |
+ |`----------------'| `-----------------'
+ `------------------'
+
+ Libtool has the concept of "weak library interfaces" to circumvent
+this problem. Recall that the code that dlopens method-provider
+modules for the interpreter application resides in a library: All of
+the modules and the dlopener library itself should be linked against
+the common library that resolves the module symbols at compile time.
+To guard against duplicate symbol definitions, and for dlpreopened
+modules to work at all in this scenario, the dlopener library must
+declare that it provides a weak library interface to the common symbols
+in the library it shares with the modules. That way, when `libtool'
+links the *Module Loader* library with some *Dlpreopened Modules* that
+were in turn linked against the *Module Interface Library*, it knows
+that the *Module Loader* provides an already loaded *Module Interface
+Library* to resolve symbols for the *Dlpreopened Modules*, and doesn't
+ask the compiler driver to link an identical *Module Interface Library*
+dependency library too.
+
+ In conjunction with Automake, the `Makefile.am' for the *Module
+Loader* might look like this:
+
+ lib_LTLIBRARIES = libinterface.la libloader.la
+
+ libinterface_la_SOURCES = interface.c interface.h
+ libinterface_la_LDFLAGS = -version-info 3:2:1
+
+ libloader_la_SOURCES = loader.c
+ libloader_la_LDFLAGS = -weak libinterface.la \
+ -version-info 3:2:1 \
+ -dlpreopen ../modules/intrinsics.la
+ libloader_la_LIBADD = $(libinterface_la_OBJECTS)
+
+ And the `Makefile.am' for the `intrinsics.la' module in a sibling
+`modules' directory might look like this:
+
+ AM_CPPFLAGS = -I$(srcdir)/../libloader
+ AM_LDFLAGS = -no-undefined -module -avoid-version \
+ -export-dynamic
+
+ noinst_LTLIBRARIES = intrinsics.la
+
+ intrinsics_la_LIBADD = ../libloader/libinterface.la
+
+ ../libloader/libinterface.la:
+ cd ../libloader && $(MAKE) $(AM_MAKEFLAGS) libinterface.la
+
+ For a more complex example, see the sources of `libltdl' in the
+Libtool distribution, which is built with the help of the `-weak'
+option.
+
+
+File: libtool.info, Node: Finding the dlname, Next: Dlopen issues, Prev: Linking with dlopened modules, Up: Dlopened modules
+
+10.4 Finding the correct name to dlopen
+=======================================
+
+After a library has been linked with `-module', it can be dlopened.
+Unfortunately, because of the variation in library names, your package
+needs to determine the correct file to dlopen.
+
+ The most straightforward and flexible implementation is to determine
+the name at runtime, by finding the installed `.la' file, and searching
+it for the following lines:
+
+ # The name that we can `dlopen'.
+ dlname='DLNAME'
+
+ If DLNAME is empty, then the library cannot be dlopened. Otherwise,
+it gives the dlname of the library. So, if the library was installed
+as `/usr/local/lib/libhello.la', and the DLNAME was `libhello.so.3',
+then `/usr/local/lib/libhello.so.3' should be dlopened.
+
+ If your program uses this approach, then it should search the
+directories listed in the `LD_LIBRARY_PATH'(1) environment variable, as
+well as the directory where libraries will eventually be installed.
+Searching this variable (or equivalent) will guarantee that your
+program can find its dlopened modules, even before installation,
+provided you have linked them using libtool.
+
+ ---------- Footnotes ----------
+
+ (1) `LIBPATH' on AIX, and `SHLIB_PATH' on HP-UX.
+
+
+File: libtool.info, Node: Dlopen issues, Prev: Finding the dlname, Up: Dlopened modules
+
+10.5 Unresolved dlopen issues
+=============================
+
+The following problems are not solved by using libtool's dlopen support:
+
+ * Dlopen functions are generally only available on shared library
+ platforms. If you want your package to be portable to static
+ platforms, you have to use either libltdl (*note Using libltdl::)
+ or develop your own alternatives to dlopening dynamic code. Most
+ reasonable solutions involve writing wrapper functions for the
+ `dlopen' family, which do package-specific tricks when dlopening
+ is unsupported or not available on a given platform.
+
+ * There are major differences in implementations of the `dlopen'
+ family of functions. Some platforms do not even use the same
+ function names (notably HP-UX, with its `shl_load' family).
+
+ * The application developer must write a custom search function in
+ order to discover the correct module filename to supply to
+ `dlopen'.
+
+
+File: libtool.info, Node: Using libltdl, Next: Trace interface, Prev: Dlopened modules, Up: Top
+
+11 Using libltdl
+****************
+
+Libtool provides a small library, called `libltdl', that aims at hiding
+the various difficulties of dlopening libraries from programmers. It
+consists of a few headers and small C source files that can be
+distributed with applications that need dlopening functionality. On
+some platforms, whose dynamic linkers are too limited for a simple
+implementation of `libltdl' services, it requires GNU DLD, or it will
+only emulate dynamic linking with libtool's dlpreopening mechanism.
+
+libltdl supports currently the following dynamic linking mechanisms:
+
+ * `dlopen' (POSIX compliant systems, GNU/Linux, etc.)
+
+ * `shl_load' (HP-UX)
+
+ * `LoadLibrary' (Win16 and Win32)
+
+ * `load_add_on' (BeOS)
+
+ * `NSAddImage' or `NSLinkModule' (Darwin and Mac OS X)
+
+ * GNU DLD (emulates dynamic linking for static libraries)
+
+ * libtool's dlpreopen (see *note Dlpreopening::)
+
+libltdl is licensed under the terms of the GNU Lesser General Public
+License, with the following exception:
+
+ As a special exception to the GNU Lesser General Public License,
+ if you distribute this file as part of a program or library that
+ is built using GNU Libtool, you may include it under the same
+ distribution terms that you use for the rest of that program.
+
+* Menu:
+
+* Libltdl interface:: How to use libltdl in your programs.
+* Modules for libltdl:: Creating modules that can be `dlopen'ed.
+* Thread Safety in libltdl:: Registering callbacks for multi-thread safety.
+* User defined module data:: Associating data with loaded modules.
+* Module loaders for libltdl:: Creating user defined module loaders.
+* Distributing libltdl:: How to distribute libltdl with your package.
+
+
+File: libtool.info, Node: Libltdl interface, Next: Modules for libltdl, Up: Using libltdl
+
+11.1 How to use libltdl in your programs
+========================================
+
+The libltdl API is similar to the POSIX dlopen interface, which is very
+simple but powerful.
+
+To use libltdl in your program you have to include the header file
+`ltdl.h':
+
+ #include <ltdl.h>
+
+The early releases of libltdl used some symbols that violated the POSIX
+namespace conventions. These symbols are now deprecated, and have been
+replaced by those described here. If you have code that relies on the
+old deprecated symbol names, defining `LT_NON_POSIX_NAMESPACE' before
+you include `ltdl.h' provides conversion macros. Whichever set of
+symbols you use, the new API is not binary compatible with the last, so
+you will need to recompile your application in order to use this
+version of libltdl.
+
+Note that libltdl is not well tested in a multithreaded environment,
+though the intention is that it should work (*note Using libltdl in a
+multi threaded environment: Thread Safety in libltdl.). It was
+reported that GNU/Linux's glibc 2.0's `dlopen' with `RTLD_LAZY' (which
+libltdl uses by default) is not thread-safe, but this problem is
+supposed to be fixed in glibc 2.1. On the other hand, `RTLD_NOW' was
+reported to introduce problems in multi-threaded applications on
+FreeBSD. Working around these problems is left as an exercise for the
+reader; contributions are certainly welcome.
+
+The following macros are defined by including `ltdl.h':
+
+ -- Macro: LT_PATHSEP_CHAR
+ `LT_PATHSEP_CHAR' is the system-dependent path separator, that is,
+ `;' on Windows and `:' everywhere else.
+
+ -- Macro: LT_DIRSEP_CHAR
+ If `LT_DIRSEP_CHAR' is defined, it can be used as directory
+ separator in addition to `/'. On Windows, this contains `\'.
+
+The following types are defined in `ltdl.h':
+
+ -- Type: lt_dlhandle
+ `lt_dlhandle' is a module "handle". Every lt_dlopened module has
+ a handle associated with it.
+
+ -- Type: lt_dladvise
+ `lt_dladvise' is used to control optional module loading modes.
+ If it is not used, the default mode of the underlying system module
+ loader is used.
+
+ -- Type: lt_dlsymlist
+ `lt_dlsymlist' is a symbol list for dlpreopened modules. This
+ structure is described in *note Dlpreopening::.
+
+libltdl provides the following functions:
+
+ -- Function: int lt_dlinit (void)
+ Initialize libltdl. This function must be called before using
+ libltdl and may be called several times. Return 0 on success,
+ otherwise the number of errors.
+
+ -- Function: int lt_dlexit (void)
+ Shut down libltdl and close all modules. This function will only
+ then shut down libltdl when it was called as many times as
+ `lt_dlinit' has been successfully called. Return 0 on success,
+ otherwise the number of errors.
+
+ -- Function: lt_dlhandle lt_dlopen (const char *FILENAME)
+ Open the module with the file name FILENAME and return a handle
+ for it. `lt_dlopen' is able to open libtool dynamic modules,
+ preloaded static modules, the program itself and native dynamic
+ modules(1).
+
+ Unresolved symbols in the module are resolved using its dependency
+ libraries and previously dlopened modules. If the executable using
+ this module was linked with the `-export-dynamic' flag, then the
+ global symbols in the executable will also be used to resolve
+ references in the module.
+
+ If FILENAME is `NULL' and the program was linked with
+ `-export-dynamic' or `-dlopen self', `lt_dlopen' will return a
+ handle for the program itself, which can be used to access its
+ symbols.
+
+ If libltdl cannot find the library and the file name FILENAME does
+ not have a directory component it will additionally look in the
+ following search paths for the module (in the following order):
+
+ 1. user-defined search path: This search path can be changed by
+ the program using the functions `lt_dlsetsearchpath',
+ `lt_dladdsearchdir' and `lt_dlinsertsearchdir'.
+
+ 2. libltdl's search path: This search path is the value of the
+ environment variable `LTDL_LIBRARY_PATH'.
+
+ 3. system library search path: The system dependent library
+ search path (e.g. on GNU/Linux it is `LD_LIBRARY_PATH').
+
+ Each search path must be a list of absolute directories separated
+ by `LT_PATHSEP_CHAR', for example, `"/usr/lib/mypkg:/lib/foo"'.
+ The directory names may not contain the path separator.
+
+ If the same module is loaded several times, the same handle is
+ returned. If `lt_dlopen' fails for any reason, it returns `NULL'.
+
+ -- Function: lt_dlhandle lt_dlopenext (const char *FILENAME)
+ The same as `lt_dlopen', except that it tries to append different
+ file name extensions to the file name. If the file with the file
+ name FILENAME cannot be found libltdl tries to append the
+ following extensions:
+
+ 1. the libtool archive extension `.la'
+
+ 2. the extension used for native dynamically loadable modules on
+ the host platform, e.g., `.so', `.sl', etc.
+
+ This lookup strategy was designed to allow programs that don't
+ have knowledge about native dynamic libraries naming conventions
+ to be able to `dlopen' such libraries as well as libtool modules
+ transparently.
+
+ -- Function: lt_dlhandle lt_dlopenadvise (const char *FILENAME,
+ lt_dladvise ADVISE)
+ The same as `lt_dlopen', except that it also requires an additional
+ argument which may contain additional hints to the underlying
+ system module loader. The ADVISE parameter is opaque and can only
+ be accessed with the functions documented below.
+
+ Note that this function does not change the content of ADVISE, so
+ unlike the other calls in this API takes a direct `lt_dladvise'
+ type, and not a pointer to the same.
+
+ -- Function: int lt_dladvise_init (lt_dladvise *ADVISE)
+ The ADVISE parameter can be used to pass hints to the module
+ loader when using `lt_dlopenadvise' to perform the loading. The
+ ADVISE parameter needs to be initialised by this function before
+ it can be used. Any memory used by ADVISE needs to be recycled
+ with `lt_dladvise_destroy' when it is no longer needed.
+
+ On failure, `lt_dladvise_init' returns non-zero and sets an error
+ message that can be retrieved with `lt_dlerror'.
+
+ -- Function: int lt_dladvise_destroy (lt_dladvise *ADVISE)
+ Recycle the memory used by ADVISE. For an example, see the
+ documentation for `lt_dladvise_ext'.
+
+ On failure, `lt_dladvise_destroy' returns non-zero and sets an
+ error message that can be retrieved with `lt_dlerror'.
+
+ -- Function: int lt_dladvise_ext (lt_dladvise *ADVISE)
+ Set the `ext' hint on ADVISE. Passing an ADVISE parameter to
+ `lt_dlopenadvise' with this hint set causes it to try to append
+ different file name extensions like `lt_dlopenext'.
+
+ The following example is equivalent to calling `lt_dlopenext
+ (filename)':
+
+ lt_dlhandle
+ my_dlopenext (const char *filename)
+ {
+ lt_dlhandle handle = 0;
+ lt_dladvise advise;
+
+ if (!lt_dladvise_init (&advise) && !lt_dladvise_ext (&advise))
+ handle = lt_dlopenadvise (filename, advise);
+
+ lt_dladvise_destroy (&advise);
+
+ return handle;
+ }
+
+ On failure, `lt_dladvise_ext' returns non-zero and sets an error
+ message that can be retrieved with `lt_dlerror'.
+
+ -- Function: int lt_dladvise_global (lt_dladvise *ADVISE)
+ Set the `symglobal' hint on ADVISE. Passing an ADVISE parameter
+ to `lt_dlopenadvise' with this hint set causes it to try to make
+ the loaded module's symbols globally available for resolving
+ unresolved symbols in subsequently loaded modules.
+
+ If neither the `symglobal' nor the `symlocal' hints are set, or if
+ a module is loaded without using the `lt_dlopenadvise' call in any
+ case, then the visibility of the module's symbols will be as per
+ the default for the underlying module loader and OS. Even if a
+ suitable hint is passed, not all loaders are able to act upon it in
+ which case `lt_dlgetinfo' will reveal whether the hint was actually
+ followed.
+
+ On failure, `lt_dladvise_global' returns non-zero and sets an error
+ message that can be retrieved with `lt_dlerror'.
+
+ -- Function: int lt_dladvise_local (lt_dladvise *ADVISE)
+ Set the `symlocal' hint on ADVISE. Passing an ADVISE parameter to
+ `lt_dlopenadvise' with this hint set causes it to try to keep the
+ loaded module's symbols hidden so that they are not visible to
+ subsequently loaded modules.
+
+ If neither the `symglobal' nor the `symlocal' hints are set, or if
+ a module is loaded without using the `lt_dlopenadvise' call in any
+ case, then the visibility of the module's symbols will be as per
+ the default for the underlying module loader and OS. Even if a
+ suitable hint is passed, not all loaders are able to act upon it in
+ which case `lt_dlgetinfo' will reveal whether the hint was actually
+ followed.
+
+ On failure, `lt_dladvise_local' returns non-zero and sets an error
+ message that can be retrieved with `lt_dlerror'.
+
+ -- Function: int lt_dladvise_resident (lt_dladvise *ADVISE)
+ Set the `resident' hint on ADVISE. Passing an ADVISE parameter to
+ `lt_dlopenadvise' with this hint set causes it to try to make the
+ loaded module resident in memory, so that it cannot be unloaded
+ with a later call to `lt_dlclose'.
+
+ On failure, `lt_dladvise_resident' returns non-zero and sets an
+ error message that can be retrieved with `lt_dlerror'.
+
+ -- Function: int lt_dladvise_preload (lt_dladvise *ADVISE)
+ Set the `preload' hint on ADVISE. Passing an ADVISE parameter to
+ `lt_dlopenadvise' with this hint set causes it to load only
+ preloaded modules, so that if a suitable preloaded module is not
+ found, `lt_dlopenadvise' will return `NULL'.
+
+ -- Function: int lt_dlclose (lt_dlhandle HANDLE)
+ Decrement the reference count on the module HANDLE. If it drops
+ to zero and no other module depends on this module, then the
+ module is unloaded. Return 0 on success.
+
+ -- Function: void * lt_dlsym (lt_dlhandle HANDLE, const char *NAME)
+ Return the address in the module HANDLE, where the symbol given by
+ the null-terminated string NAME is loaded. If the symbol cannot
+ be found, `NULL' is returned.
+
+ -- Function: const char * lt_dlerror (void)
+ Return a human readable string describing the most recent error
+ that occurred from any of libltdl's functions. Return `NULL' if
+ no errors have occurred since initialization or since it was last
+ called.
+
+ -- Function: int lt_dladdsearchdir (const char *SEARCH_DIR)
+ Append the search directory SEARCH_DIR to the current user-defined
+ library search path. Return 0 on success.
+
+ -- Function: int lt_dlinsertsearchdir (const char *BEFORE,
+ const char *SEARCH_DIR)
+ Insert the search directory SEARCH_DIR into the user-defined
+ library search path, immediately before the element starting at
+ address BEFORE. If BEFORE is `NULL', then SEARCH_DIR is appending
+ as if `lt_dladdsearchdir' had been called. Return 0 on success.
+
+ -- Function: int lt_dlsetsearchpath (const char *SEARCH_PATH)
+ Replace the current user-defined library search path with
+ SEARCH_PATH, which must be a list of absolute directories separated
+ by `LT_PATHSEP_CHAR'. Return 0 on success.
+
+ -- Function: const char * lt_dlgetsearchpath (void)
+ Return the current user-defined library search path.
+
+ -- Function: int lt_dlforeachfile (const char *SEARCH_PATH,
+ int (*FUNC) (const char *FILENAME, void * DATA), void * DATA)
+ In some applications you may not want to load individual modules
+ with known names, but rather find all of the modules in a set of
+ directories and load them all during initialisation. With this
+ function you can have libltdl scan the `LT_PATHSEP_CHAR'-delimited
+ directory list in SEARCH_PATH for candidates, and pass them, along
+ with DATA to your own callback function, FUNC. If SEARCH_PATH is
+ `NULL', then search all of the standard locations that `lt_dlopen'
+ would examine. This function will continue to make calls to FUNC
+ for each file that it discovers in SEARCH_PATH until one of these
+ calls returns non-zero, or until the files are exhausted.
+ `lt_dlforeachfile' returns the value returned by the last call
+ made to FUNC.
+
+ For example you could define FUNC to build an ordered "argv"-like
+ vector of files using DATA to hold the address of the start of the
+ vector.
+
+ -- Function: int lt_dlmakeresident (lt_dlhandle HANDLE)
+ Mark a module so that it cannot be `lt_dlclose'd. This can be
+ useful if a module implements some core functionality in your
+ project that would cause your code to crash if removed. Return 0
+ on success.
+
+ If you use `lt_dlopen (NULL)' to get a HANDLE for the running
+ binary, that handle will always be marked as resident, and
+ consequently cannot be successfully `lt_dlclose'd.
+
+ -- Function: int lt_dlisresident (lt_dlhandle HANDLE)
+ Check whether a particular module has been marked as resident,
+ returning 1 if it has or 0 otherwise. If there is an error while
+ executing this function, return -1 and set an error message for
+ retrieval with `lt_dlerror'.
+
+ ---------- Footnotes ----------
+
+ (1) Some platforms, notably Mac OS X, differentiate between a
+runtime library that cannot be opened by `lt_dlopen' and a dynamic
+module that can. For maximum portability you should try to ensure that
+you only pass `lt_dlopen' objects that have been compiled with libtool's
+`-module' flag.
+
+
+File: libtool.info, Node: Modules for libltdl, Next: Thread Safety in libltdl, Prev: Libltdl interface, Up: Using libltdl
+
+11.2 Creating modules that can be `dlopen'ed
+============================================
+
+Libtool modules are created like normal libtool libraries with a few
+exceptions:
+
+ You have to link the module with libtool's `-module' switch, and you
+should link any program that is intended to dlopen the module with
+`-dlopen MODULENAME.LA' where possible, so that libtool can dlpreopen
+the module on platforms that do not support dlopening. If the module
+depends on any other libraries, make sure you specify them either when
+you link the module or when you link programs that dlopen it. If you
+want to disable versioning (*note Versioning::) for a specific module
+you should link it with the `-avoid-version' switch. Note that libtool
+modules don't need to have a "lib" prefix. However, Automake 1.4 or
+higher is required to build such modules.
+
+ Usually a set of modules provide the same interface, i.e. exports
+the same symbols, so that a program can dlopen them without having to
+know more about their internals: In order to avoid symbol conflicts all
+exported symbols must be prefixed with "modulename_LTX_" (MODULENAME is
+the name of the module). Internal symbols must be named in such a way
+that they won't conflict with other modules, for example, by prefixing
+them with "_modulename_". Although some platforms support having the
+same symbols defined more than once it is generally not portable and it
+makes it impossible to dlpreopen such modules.
+
+ libltdl will automatically cut the prefix off to get the real name of
+the symbol. Additionally, it supports modules that do not use a prefix
+so that you can also dlopen non-libtool modules.
+
+ `foo1.c' gives an example of a portable libtool module. Exported
+symbols are prefixed with "foo1_LTX_", internal symbols with "_foo1_".
+Aliases are defined at the beginning so that the code is more readable.
+
+ /* aliases for the exported symbols */
+ #define foo foo1_LTX_foo
+ #define bar foo1_LTX_bar
+
+ /* a global variable definition */
+ int bar = 1;
+
+ /* a private function */
+ int _foo1_helper() {
+ return bar;
+ }
+
+ /* an exported function */
+ int foo() {
+ return _foo1_helper();
+ }
+
+The `Makefile.am' contains the necessary rules to build the module
+`foo1.la':
+
+ ...
+ lib_LTLIBRARIES = foo1.la
+
+ foo1_la_SOURCES = foo1.c
+ foo1_la_LDFLAGS = -module
+ ...
+
+
+File: libtool.info, Node: Thread Safety in libltdl, Next: User defined module data, Prev: Modules for libltdl, Up: Using libltdl
+
+11.3 Using libltdl in a multi threaded environment
+==================================================
+
+Libltdl provides a wrapper around whatever dynamic run-time object
+loading mechanisms are provided by the host system, many of which are
+themselves not thread safe. Consequently libltdl cannot itself be
+consistently thread safe.
+
+ If you wish to use libltdl in a multithreaded environment, then you
+must mutex lock around libltdl calls, since they may in turn be calling
+non-thread-safe system calls on some target hosts.
+
+ Some old releases of libtool provided a mutex locking API that was
+unusable with POSIX threads, so callers were forced to lock around all
+libltdl API calls anyway. That mutex locking API was next to useless,
+and is not present in current releases.
+
+ Some future release of libtool may provide a new POSIX thread
+compliant mutex locking API.
+
+
+File: libtool.info, Node: User defined module data, Next: Module loaders for libltdl, Prev: Thread Safety in libltdl, Up: Using libltdl
+
+11.4 Data associated with loaded modules
+========================================
+
+Some of the internal information about each loaded module that is
+maintained by libltdl is available to the user, in the form of this
+structure:
+
+ -- Type: struct lt_dlinfo { char *FILENAME; char *NAME; int REF_COUNT;
+ int IS_RESIDENT; int IS_SYMGLOBAL; int IS_SYMLOCAL;}
+ `lt_dlinfo' is used to store information about a module. The
+ FILENAME attribute is a null-terminated character string of the
+ real module file name. If the module is a libtool module then
+ NAME is its module name (e.g. `"libfoo"' for `"dir/libfoo.la"'),
+ otherwise it is set to `NULL'. The REF_COUNT attribute is a
+ reference counter that describes how often the same module is
+ currently loaded. The remaining fields can be compared to any
+ hints that were passed to `lt_dlopenadvise' to determine whether
+ the underlying loader was able to follow them.
+
+ The following function will return a pointer to libltdl's internal
+copy of this structure for the given HANDLE:
+
+ -- Function: const lt_dlinfo * lt_dlgetinfo (lt_dlhandle HANDLE)
+ Return a pointer to a struct that contains some information about
+ the module HANDLE. The contents of the struct must not be
+ modified. Return `NULL' on failure.
+
+ Furthermore, in order to save you from having to keep a list of the
+handles of all the modules you have loaded, these functions allow you to
+iterate over libltdl's list of loaded modules:
+
+ -- Type: lt_dlinterface_id
+ The opaque type used to hold the module interface details for each
+ registered libltdl client.
+
+ -- Type: int lt_dlhandle_interface (lt_dlhandle HANDLE,
+ const char *ID_STRING)
+ Functions of this type are called to check that a handle conforms
+ to a library's expected module interface when iterating over the
+ global handle list. You should be careful to write a callback
+ function of this type that can correctly identify modules that
+ belong to this client, both to prevent other clients from
+ accidentally finding your loaded modules with the iterator
+ functions below, and vice versa. The best way to do this is to
+ check that module HANDLE conforms to the interface specification
+ of your loader using `lt_dlsym'.
+
+ The callback may be given *every* module loaded by all the libltdl
+ module clients in the current address space, including any modules
+ loaded by other libraries such as libltdl itself, and should
+ return non-zero if that module does not fulfill the interface
+ requirements of your loader.
+
+ int
+ my_interface_cb (lt_dlhandle handle, const char *id_string)
+ {
+ char *(*module_id) (void) = NULL;
+
+ /* A valid my_module must provide all of these symbols. */
+ if (!((module_id = (char*(*)(void)) lt_dlsym ("module_version"))
+ && lt_dlsym ("my_module_entrypoint")))
+ return 1;
+
+ if (strcmp (id_string, module_id()) != 0)
+ return 1;
+
+ return 0;
+ }
+
+ -- Function: lt_dlinterface_id lt_dlinterface_register
+ (const char *ID_STRING, lt_dlhandle_interface *IFACE)
+ Use this function to register your interface validator with
+ libltdl, and in return obtain a unique key to store and retrieve
+ per-module data. You supply an ID_STRING and IFACE so that the
+ resulting `lt_dlinterface_id' can be used to filter the module
+ handles returned by the iteration functions below. If IFACE is
+ `NULL', all modules will be matched.
+
+ -- Function: void lt_dlinterface_free (lt_dlinterface_id IFACE)
+ Release the data associated with IFACE.
+
+ -- Function: int lt_dlhandle_map (lt_dlinterface_id IFACE,
+ int (*FUNC) (lt_dlhandle HANDLE, void * DATA), void * DATA)
+ For each module that matches IFACE, call the function FUNC. When
+ writing the FUNC callback function, the argument HANDLE is the
+ handle of a loaded module, and DATA is the last argument passed to
+ `lt_dlhandle_map'. As soon as FUNC returns a non-zero value for
+ one of the handles, `lt_dlhandle_map' will stop calling FUNC and
+ immediately return that non-zero value. Otherwise 0 is eventually
+ returned when FUNC has been successfully called for all matching
+ modules.
+
+ -- Function: lt_dlhandle lt_dlhandle_iterate
+ (lt_dlinterface_id IFACE, lt_dlhandle PLACE)
+ Iterate over the module handles loaded by IFACE, returning the
+ first matching handle in the list if PLACE is `NULL', and the next
+ one on subsequent calls. If PLACE is the last element in the list
+ of eligible modules, this function returns `NULL'.
+
+ lt_dlhandle handle = 0;
+ lt_dlinterface_id iface = my_interface_id;
+
+ while ((handle = lt_dlhandle_iterate (iface, handle)))
+ {
+ ...
+ }
+
+ -- Function: lt_dlhandle lt_dlhandle_fetch (lt_dlinterface_id IFACE,
+ const char *MODULE_NAME)
+ Search through the module handles loaded by IFACE for a module
+ named MODULE_NAME, returning its handle if found or else `NULL' if
+ no such named module has been loaded by IFACE.
+
+ However, you might still need to maintain your own list of loaded
+module handles (in parallel with the list maintained inside libltdl) if
+there were any other data that your application wanted to associate
+with each open module. Instead, you can use the following API calls to
+do that for you. You must first obtain a unique interface id from
+libltdl as described above, and subsequently always use it to retrieve
+the data you stored earlier. This allows different libraries to each
+store their own data against loaded modules, without interfering with
+one another.
+
+ -- Function: void * lt_dlcaller_set_data (lt_dlinterface_id KEY,
+ lt_dlhandle HANDLE, void * DATA)
+ Set DATA as the set of data uniquely associated with KEY and
+ HANDLE for later retrieval. This function returns the DATA
+ previously associated with KEY and HANDLE if any. A result of 0,
+ may indicate that a diagnostic for the last error (if any) is
+ available from `lt_dlerror()'.
+
+ For example, to correctly remove some associated data:
+
+ void *stale = lt_dlcaller_set_data (key, handle, 0);
+ if (stale != NULL)
+ {
+ free (stale);
+ }
+ else
+ {
+ char *error_msg = lt_dlerror ();
+
+ if (error_msg != NULL)
+ {
+ my_error_handler (error_msg);
+ return STATUS_FAILED;
+ }
+ }
+
+ -- Function: void * lt_dlcaller_get_data (lt_dlinterface_id KEY,
+ lt_dlhandle HANDLE)
+ Return the address of the data associated with KEY and HANDLE, or
+ else `NULL' if there is none.
+
+ Old versions of libltdl also provided a simpler, but similar, API
+based around `lt_dlcaller_id'. Unfortunately, it had no provision for
+detecting whether a module belonged to a particular interface as
+libltdl didn't support multiple loaders in the same address space at
+that time. Those APIs are no longer supported as there would be no way
+to stop clients of the old APIs from seeing (and accidentally altering)
+modules loaded by other libraries.
+
+
+File: libtool.info, Node: Module loaders for libltdl, Next: Distributing libltdl, Prev: User defined module data, Up: Using libltdl
+
+11.5 How to create and register new module loaders
+==================================================
+
+Sometimes libltdl's many ways of gaining access to modules are not
+sufficient for the purposes of a project. You can write your own
+loader, and register it with libltdl so that `lt_dlopen' will be able
+to use it.
+
+ Writing a loader involves writing at least three functions that can
+be called by `lt_dlopen', `lt_dlsym' and `lt_dlclose'. Optionally, you
+can provide a finalisation function to perform any cleanup operations
+when `lt_dlexit' executes, and a symbol prefix string that will be
+prepended to any symbols passed to `lt_dlsym'. These functions must
+match the function pointer types below, after which they can be
+allocated to an instance of `lt_user_dlloader' and registered.
+
+ Registering the loader requires that you choose a name for it, so
+that it can be recognised by `lt_dlloader_find' and removed with
+`lt_dlloader_remove'. The name you choose must be unique, and not
+already in use by libltdl's builtin loaders:
+
+"dlopen"
+ The system dynamic library loader, if one exists.
+
+"dld"
+ The GNU dld loader, if `libdld' was installed when libltdl was
+ built.
+
+"dlpreload"
+ The loader for `lt_dlopen'ing of preloaded static modules.
+
+ The prefix "dl" is reserved for loaders supplied with future
+versions of libltdl, so you should not use that for your own loader
+names.
+
+The following types are defined in `ltdl.h':
+
+ -- Type: lt_module
+ `lt_module' is a dlloader dependent module. The dynamic module
+ loader extensions communicate using these low level types.
+
+ -- Type: lt_dlloader
+ `lt_dlloader' is a handle for module loader types.
+
+ -- Type: lt_user_data
+ `lt_user_data' is used for specifying loader instance data.
+
+ -- Type: struct lt_user_dlloader {const char *SYM_PREFIX;
+ lt_module_open *MODULE_OPEN; lt_module_close *MODULE_CLOSE;
+ lt_find_sym *FIND_SYM; lt_dlloader_exit *DLLOADER_EXIT; }
+ If you want to define a new way to open dynamic modules, and have
+ the `lt_dlopen' API use it, you need to instantiate one of these
+ structures and pass it to `lt_dlloader_add'. You can pass whatever
+ you like in the DLLOADER_DATA field, and it will be passed back as
+ the value of the first parameter to each of the functions
+ specified in the function pointer fields.
+
+ -- Type: lt_module lt_module_open (const char *FILENAME)
+ The type of the loader function for an `lt_dlloader' module
+ loader. The value set in the dlloader_data field of the `struct
+ lt_user_dlloader' structure will be passed into this function in
+ the LOADER_DATA parameter. Implementation of such a function
+ should attempt to load the named module, and return an `lt_module'
+ suitable for passing in to the associated `lt_module_close' and
+ `lt_sym_find' function pointers. If the function fails it should
+ return `NULL', and set the error message with `lt_dlseterror'.
+
+ -- Type: int lt_module_close (lt_user_data LOADER_DATA,
+ lt_module MODULE)
+ The type of the unloader function for a user defined module loader.
+ Implementation of such a function should attempt to release any
+ resources tied up by the MODULE module, and then unload it from
+ memory. If the function fails for some reason, set the error
+ message with `lt_dlseterror' and return non-zero.
+
+ -- Type: void * lt_find_sym (lt_module MODULE, const char *SYMBOL)
+ The type of the symbol lookup function for a user defined module
+ loader. Implementation of such a function should return the
+ address of the named SYMBOL in the module MODULE, or else set the
+ error message with `lt_dlseterror' and return `NULL' if lookup
+ fails.
+
+ -- Type: int lt_dlloader_exit (lt_user_data LOADER_DATA)
+ The type of the finalisation function for a user defined module
+ loader. Implementation of such a function should free any
+ resources associated with the loader, including any user specified
+ data in the `dlloader_data' field of the `lt_user_dlloader'. If
+ non-`NULL', the function will be called by `lt_dlexit', and
+ `lt_dlloader_remove'.
+
+ For example:
+
+ int
+ register_myloader (void)
+ {
+ lt_user_dlloader dlloader;
+
+ /* User modules are responsible for their own initialisation. */
+ if (myloader_init () != 0)
+ return MYLOADER_INIT_ERROR;
+
+ dlloader.sym_prefix = NULL;
+ dlloader.module_open = myloader_open;
+ dlloader.module_close = myloader_close;
+ dlloader.find_sym = myloader_find_sym;
+ dlloader.dlloader_exit = myloader_exit;
+ dlloader.dlloader_data = (lt_user_data)myloader_function;
+
+ /* Add my loader as the default module loader. */
+ if (lt_dlloader_add (lt_dlloader_next (NULL), &dlloader,
+ "myloader") != 0)
+ return ERROR;
+
+ return OK;
+ }
+
+ Note that if there is any initialisation required for the loader, it
+must be performed manually before the loader is registered - libltdl
+doesn't handle user loader initialisation.
+
+ Finalisation _is_ handled by libltdl however, and it is important to
+ensure the `dlloader_exit' callback releases any resources claimed
+during the initialisation phase.
+
+libltdl provides the following functions for writing your own module
+loaders:
+
+ -- Function: int lt_dlloader_add (lt_dlloader *PLACE,
+ lt_user_dlloader *DLLOADER, const char *LOADER_NAME)
+ Add a new module loader to the list of all loaders, either as the
+ last loader (if PLACE is `NULL'), else immediately before the
+ loader passed as PLACE. LOADER_NAME will be returned by
+ `lt_dlloader_name' if it is subsequently passed a newly registered
+ loader. These LOADER_NAMEs must be unique, or
+ `lt_dlloader_remove' and `lt_dlloader_find' cannot work. Returns
+ 0 for success.
+
+ /* Make myloader be the last one. */
+ if (lt_dlloader_add (NULL, myloader) != 0)
+ perror (lt_dlerror ());
+
+ -- Function: int lt_dlloader_remove (const char *LOADER_NAME)
+ Remove the loader identified by the unique name, LOADER_NAME.
+ Before this can succeed, all modules opened by the named loader
+ must have been closed. Returns 0 for success, otherwise an error
+ message can be obtained from `lt_dlerror'.
+
+ /* Remove myloader. */
+ if (lt_dlloader_remove ("myloader") != 0)
+ perror (lt_dlerror ());
+
+ -- Function: lt_dlloader * lt_dlloader_next (lt_dlloader *PLACE)
+ Iterate over the module loaders, returning the first loader if
+ PLACE is `NULL', and the next one on subsequent calls. The handle
+ is for use with `lt_dlloader_add'.
+
+ /* Make myloader be the first one. */
+ if (lt_dlloader_add (lt_dlloader_next (NULL), myloader) != 0)
+ return ERROR;
+
+ -- Function: lt_dlloader * lt_dlloader_find (const char *LOADER_NAME)
+ Return the first loader with a matching LOADER_NAME identifier, or
+ else `NULL', if the identifier is not found.
+
+ The identifiers that may be used by libltdl itself, if the host
+ architecture supports them are "dlopen"(1), "dld" and "dlpreload".
+
+ /* Add a user loader as the next module loader to be tried if
+ the standard dlopen loader were to fail when lt_dlopening. */
+ if (lt_dlloader_add (lt_dlloader_find ("dlopen"), myloader) != 0)
+ return ERROR;
+
+ -- Function: const char * lt_dlloader_name (lt_dlloader *PLACE)
+ Return the identifying name of PLACE, as obtained from
+ `lt_dlloader_next' or `lt_dlloader_find'. If this function fails,
+ it will return `NULL' and set an error for retrieval with
+ `lt_dlerror'.
+
+ -- Function: lt_user_data * lt_dlloader_data (lt_dlloader *PLACE)
+ Return the address of the `dlloader_data' of PLACE, as obtained
+ from `lt_dlloader_next' or `lt_dlloader_find'. If this function
+ fails, it will return `NULL' and set an error for retrieval with
+ `lt_dlerror'.
+
+11.5.1 Error handling within user module loaders
+------------------------------------------------
+
+ -- Function: int lt_dladderror (const char *DIAGNOSTIC)
+ This function allows you to integrate your own error messages into
+ `lt_dlerror'. Pass in a suitable diagnostic message for return by
+ `lt_dlerror', and an error identifier for use with `lt_dlseterror'
+ is returned.
+
+ If the allocation of an identifier fails, this function returns -1.
+
+ int myerror = lt_dladderror ("Doh!");
+ if (myerror < 0)
+ perror (lt_dlerror ());
+
+ -- Function: int lt_dlseterror (int ERRORCODE)
+ When writing your own module loaders, you should use this function
+ to raise errors so that they are propagated through the
+ `lt_dlerror' interface. All of the standard errors used by
+ libltdl are declared in `ltdl.h', or you can add more of your own
+ with `lt_dladderror'. This function returns 0 on success.
+
+ if (lt_dlseterror (LTDL_ERROR_NO_MEMORY) != 0)
+ perror (lt_dlerror ());
+
+---------- Footnotes ----------
+
+ (1) This is used for the host dependent module loading API -
+`shl_load' and `LoadLibrary' for example
+
+
+File: libtool.info, Node: Distributing libltdl, Prev: Module loaders for libltdl, Up: Using libltdl
+
+11.6 How to distribute libltdl with your package
+================================================
+
+Even though libltdl is installed together with libtool, you may wish to
+include libltdl in the distribution of your package, for the
+convenience of users of your package that don't have libtool or libltdl
+installed, or if you are using features of a very new version of
+libltdl that you don't expect your users to have yet. In such cases,
+you must decide which flavor of libltdl you want to use: a convenience
+library or an installable libtool library.
+
+ The most simplistic way to add `libltdl' to your package is to copy
+all the `libltdl' source files to a subdirectory within your package
+and to build and link them along with the rest of your sources. To
+help you do this, the m4 macros for Autoconf are available in
+`ltdl.m4'. You must ensure that they are available in `aclocal.m4'
+before you run Autoconf(1). Having made the macros available, you must
+add a call to the `LTDL_INIT' macro (after the call to `LT_INIT') to
+your package's `configure.ac' to perform the configure time checks
+required to build the library correctly. Unfortunately, this method
+has problems if you then try to link the package binaries with an
+installed libltdl, or a library that depends on libltdl, because of the
+duplicate symbol definitions. For example, ultimately linking against
+two different versions of libltdl, or against both a local convenience
+library and an installed libltdl is bad. Ensuring that only one copy
+of the libltdl sources are linked into any program is left as an
+exercise for the reader.
+
+ -- Macro: LT_CONFIG_LTDL_DIR (DIRECTORY)
+ Declare DIRECTORY to be the location of the `libltdl' source
+ files, for `libtoolize --ltdl' to place them. *Note Invoking
+ libtoolize::, for more details. Provided that you add an
+ appropriate `LT_CONFIG_LTDL_DIR' call in your `configure.ac'
+ before calling `libtoolize', the appropriate `libltdl' files will
+ be installed automatically.
+
+ -- Macro: LTDL_INIT (OPTIONS)
+ -- Macro: LT_WITH_LTDL
+ -- Macro: AC_WITH_LTDL
+ `AC_WITH_LTDL' and `LT_WITH_LTDL' are deprecated names for older
+ versions of this macro; `autoupdate' will update your
+ `configure.ac' file.
+
+ This macro adds the following options to the `configure' script:
+
+ `--with-ltdl-include INSTALLED-LTDL-HEADER-DIR'
+ The `LTDL_INIT' macro will look in the standard header file
+ locations to find the installed `libltdl' headers. If
+ `LTDL_INIT' can't find them by itself, the person who builds
+ your package can use this option to tell `configure' where
+ the installed `libltdl' headers are.
+
+ `--with-ltdl-lib INSTALLED-LTDL-LIBRARY-DIR'
+ Similarly, the person building your package can use this
+ option to help `configure' find the installed `libltdl.la'.
+
+ `--with-included-ltdl'
+ If there is no installed `libltdl', or in any case if the
+ person building your package would rather use the `libltdl'
+ sources shipped with the package in the subdirectory named by
+ `LT_CONFIG_LTDL_DIR', they should pass this option to
+ `configure'.
+
+ If the `--with-included-ltdl' is not passed at configure time, and
+ an installed `libltdl' is not found(2), then `configure' will exit
+ immediately with an error that asks the user to either specify the
+ location of an installed `libltdl' using the `--with-ltdl-include'
+ and `--with-ltdl-lib' options, or to build with the `libltdl'
+ sources shipped with the package by passing `--with-included-ltdl'.
+
+ If an installed `libltdl' is found, then `LIBLTDL' is set to the
+ link flags needed to use it, and `LTDLINCL' to the preprocessor
+ flags needed to find the installed headers, and `LTDLDEPS' will be
+ empty. Note, however, that no version checking is performed. You
+ should manually check for the `libltdl' features you need in
+ `configure.ac':
+
+ LT_INIT([dlopen])
+ LTDL_INIT
+
+ # The lt_dladvise_init symbol was added with libtool-2.2
+ if test "x$with_included_ltdl" != "xyes"; then
+ save_CFLAGS="$CFLAGS"
+ save_LDFLAGS="$LDFLAGS"
+ CFLAGS="$CFLAGS $LTDLINCL"
+ LDFLAGS="$LDFLAGS $LIBLTDL"
+ AC_CHECK_LIB([ltdl], [lt_dladvise_init],
+ [],
+ [AC_MSG_ERROR([installed libltdl is too old])])
+ LDFLAGS="$save_LDFLAGS"
+ CFLAGS="$save_CFLAGS"
+ fi
+
+ OPTIONS may include no more than one of the following build modes
+ depending on how you want your project to build `libltdl':
+ `nonrecursive', `recursive', or `subproject'. In order for
+ `libtoolize' to detect this option correctly, if you supply one of
+ these arguments, they must be given literally (i.e., macros or
+ shell variables that expand to the correct ltdl mode will not
+ work).
+
+ `nonrecursive'
+ This is how the Libtool project distribution builds the
+ `libltdl' we ship and install. If you wish to use Automake
+ to build `libltdl' without invoking a recursive make to
+ descend into the `libltdl' subdirectory, then use this
+ option. You will need to set your configuration up carefully
+ to make this work properly, and you will need releases of
+ Autoconf and Automake that support `subdir-objects' and
+ `LIBOBJDIR' properly. In your `configure.ac', add:
+
+ AM_INIT_AUTOMAKE([subdir-objects])
+ AC_CONFIG_HEADERS([config.h])
+ LT_CONFIG_LTDL_DIR([libltdl])
+ LT_INIT([dlopen])
+ LTDL_INIT([nonrecursive])
+
+ You _have to_ use a config header, but it may have a name
+ different than `config.h'.
+
+ Also, add the following near the top of your `Makefile.am':
+
+ AM_CPPFLAGS =
+ AM_LDFLAGS =
+
+ BUILT_SOURCES =
+ EXTRA_DIST =
+ CLEANFILES =
+ MOSTLYCLEANFILES =
+
+ include_HEADERS =
+ noinst_LTLIBRARIES =
+ lib_LTLIBRARIES =
+ EXTRA_LTLIBRARIES =
+
+ include libltdl/Makefile.inc
+
+ Unless you build no other libraries from this `Makefile.am',
+ you will also need to change `lib_LTLIBRARIES' to assign with
+ `+=' so that the `libltdl' targets declared in `Makefile.inc'
+ are not overwritten.
+
+ `recursive'
+ This build mode still requires that you use Automake, but (in
+ contrast with `nonrecursive') uses the more usual device of
+ starting another `make' process in the `libltdl'
+ subdirectory. To use this mode, you should add to your
+ `configure.ac':
+
+ AM_INIT_AUTOMAKE
+ AC_CONFIG_HEADERS([config.h])
+ LT_CONFIG_LTDL_DIR([libltdl])
+ LT_INIT([dlopen])
+ LTDL_INIT([recursive])
+ AC_CONFIG_FILES([libltdl/Makefile])
+
+ Again, you _have to_ use a config header, but it may have a
+ name different than `config.h' if you like.
+
+ Also, add this to your `Makefile.am':
+
+ SUBDIRS = libltdl
+
+ `subproject'
+ This mode is the default unless you explicitly add
+ `recursive' or `nonrecursive' to your `LTDL_INIT' options;
+ `subproject' is the only mode supported by previous releases
+ of libltdl. Even if you do not use Autoconf in the parent
+ project, then, in `subproject' mode, still `libltdl' contains
+ all the necessary files to configure and build itself - you
+ just need to arrange for your build system to call
+ `libltdl/configure' with appropriate options, and then run
+ `make' in the `libltdl' subdirectory.
+
+ If you _are_ using Autoconf and Automake, then you will need
+ to add the following to your `configure.ac':
+
+ LT_CONFIG_LTDL_DIR([libltdl])
+ LTDL_INIT
+
+ and to `Makefile.am':
+
+ SUBDIRS = libltdl
+
+ Aside from setting the libltdl build mode, there are other keywords
+ that you can pass to `LTDL_INIT' to modify its behavior when
+ `--with-included-ltdl' has been given:
+
+ `convenience'
+ This is the default unless you explicitly add `installable' to
+ your `LTDL_INIT' options.
+
+ This keyword will cause options to be passed to the
+ `configure' script in the subdirectory named by
+ `LT_CONFIG_LTDL_DIR' in order to cause it to be built as a
+ convenience library. If you're not using automake, you will
+ need to define `top_build_prefix', `top_builddir', and
+ `top_srcdir' in your makefile so that `LIBLTDL', `LTDLDEPS',
+ and `LTDLINCL' expand correctly.
+
+ One advantage of the convenience library is that it is not
+ installed, so the fact that you use `libltdl' will not be
+ apparent to the user, and it won't overwrite a pre-installed
+ version of `libltdl' the system might already have in the
+ installation directory. On the other hand, if you want to
+ upgrade `libltdl' for any reason (e.g. a bugfix) you'll have
+ to recompile your package instead of just replacing the
+ shared installed version of `libltdl'. However, if your
+ programs or libraries are linked with other libraries that
+ use such a pre-installed version of `libltdl', you may get
+ linker errors or run-time crashes. Another problem is that
+ you cannot link the convenience library into more than one
+ libtool library, then link a single program with those
+ libraries, because you may get duplicate symbols. In general
+ you can safely use the convenience library in programs that
+ don't depend on other libraries that might use `libltdl' too.
+
+ `installable'
+ This keyword will pass options to the `configure' script in
+ the subdirectory named by `LT_CONFIG_LTDL_DIR' in order to
+ cause it to be built as an installable library. If you're not
+ using automake, you will need to define `top_build_prefix',
+ `top_builddir' and `top_srcdir' in your makefile so that
+ `LIBLTDL', `LTDLDEPS', and `LTDLINCL' are expanded properly.
+
+ Be aware that you could overwrite another `libltdl' already
+ installed to the same directory if you use this option.
+
+ Whatever method you use, `LTDL_INIT' will define the shell variable
+`LIBLTDL' to the link flag that you should use to link with `libltdl',
+the shell variable `LTDLDEPS' to the files that can be used as a
+dependency in `Makefile' rules, and the shell variable `LTDLINCL' to
+the preprocessor flag that you should use to compile programs that
+include `ltdl.h'. So, when you want to link a program with libltdl, be
+it a convenience, installed or installable library, just use
+`$(LTDLINCL)' for preprocessing and compilation, and `$(LIBLTDL)' for
+linking.
+
+ * If your package is built using an installed version of `libltdl',
+ `LIBLTDL' will be set to the compiler flags needed to link against
+ the installed library, `LTDLDEPS' will be empty, and `LTDLINCL'
+ will be set to the compiler flags needed to find the `libltdl'
+ header files.
+
+ * If your package is built using the convenience libltdl, `LIBLTDL'
+ and `LTDLDEPS' will be the pathname for the convenience version of
+ libltdl (starting with `${top_builddir}/' or
+ `${top_build_prefix}') and `LTDLINCL' will be `-I' followed by the
+ directory that contains `ltdl.h' (starting with `${top_srcdir}/').
+
+ * If an installable version of the included `libltdl' is being
+ built, its pathname starting with `${top_builddir}/' or
+ `${top_build_prefix}', will be stored in `LIBLTDL' and `LTDLDEPS',
+ and `LTDLINCL' will be set just like in the case of convenience
+ library.
+
+ You should probably also use the `dlopen' option to `LT_INIT' in
+your `configure.ac', otherwise libtool will assume no dlopening
+mechanism is supported, and revert to dlpreopening, which is probably
+not what you want. Avoid using the `-static', `-static-libtool-libs',
+or `-all-static' switches when linking programs with libltdl. This
+will not work on all platforms, because the dlopening functions may not
+be available for static linking.
+
+ The following example shows you how to embed an installable libltdl
+in your package. In order to use the convenience variant, just replace
+the `LTDL_INIT' option `installable' with `convenience'. We assume
+that libltdl was embedded using `libtoolize --ltdl'.
+
+ configure.ac:
+ ...
+ # Name the subdirectory that contains libltdl sources
+ LT_CONFIG_LTDL_DIR([libltdl])
+
+ # Configure libtool with dlopen support if possible
+ LT_INIT([dlopen])
+
+ # Enable building of the installable libltdl library
+ LTDL_INIT([installable])
+ ...
+
+ Makefile.am:
+ ...
+ SUBDIRS = libltdl
+
+ AM_CPPFLAGS = $(LTDLINCL)
+
+ myprog_LDFLAGS = -export-dynamic
+ myprog_LDADD = $(LIBLTDL) -dlopen self -dlopen foo1.la
+ myprog_DEPENDENCIES = $(LTDLDEPS) foo1.la
+ ...
+
+ -- Macro: LTDL_INSTALLABLE
+ -- Macro: AC_LIBLTDL_INSTALLABLE
+ These macros are deprecated, the `installable' option to
+ `LTDL_INIT' should be used instead.
+
+ -- Macro: LTDL_CONVENIENCE
+ -- Macro: AC_LIBLTDL_CONVENIENCE
+ These macros are deprecated, the `convenience' option to
+ `LTDL_INIT' should be used instead.
+
+ ---------- Footnotes ----------
+
+ (1) We used to recommend adding the contents of `ltdl.m4' to
+`acinclude.m4', but with `aclocal' from a modern Automake (1.8 or
+newer) and this release of libltdl that is not only unnecessary but
+makes it easy to forget to upgrade `acinclude.m4' if you move to a
+different release of libltdl.
+
+ (2) Even if libltdl is installed, `LTDL_INIT' may fail to detect it
+if libltdl depends on symbols provided by libraries other than the C
+library.
+
+
+File: libtool.info, Node: Trace interface, Next: FAQ, Prev: Using libltdl, Up: Top
+
+12 Libtool's trace interface
+****************************
+
+This section describes macros whose sole purpose is to be traced using
+Autoconf's `--trace' option (*note The Autoconf Manual:
+(autoconf)autoconf Invocation.) to query the Libtool configuration of a
+project. These macros are called by Libtool internals and should never
+be called by user code; they should only be traced.
+
+ -- Macro: LT_SUPPORTED_TAG (TAG)
+ This macro is called once for each language enabled in the
+ package. Its only argument, TAG, is the tag-name corresponding to
+ the language (*note Tags::).
+
+ You can therefore retrieve the list of all tags enabled in a
+ project using the following command:
+ autoconf --trace 'LT_SUPPORTED_TAG:$1'
+
+
+File: libtool.info, Node: FAQ, Next: Troubleshooting, Prev: Trace interface, Up: Top
+
+13 Frequently Asked Questions about libtool
+*******************************************
+
+This chapter covers some questions that often come up on the mailing
+lists.
+
+* Menu:
+
+* Stripped link flags:: Dropped flags when creating a library
+
+
+File: libtool.info, Node: Stripped link flags, Up: FAQ
+
+13.1 Why does libtool strip link flags when creating a library?
+===============================================================
+
+When creating a shared library, but not when compiling or creating a
+program, `libtool' drops some flags from the command line provided by
+the user. This is done because flags unknown to `libtool' may
+interfere with library creation or require additional support from
+`libtool', and because omitting flags is usually the conservative
+choice for a successful build.
+
+ If you encounter flags that you think are useful to pass, as a
+work-around you can prepend flags with `-Wc,' or `-Xcompiler ' to allow
+them to be passed through to the compiler driver (*note Link mode::).
+Another possibility is to add flags already to the compiler command at
+`configure' run time:
+
+ ./configure CC='gcc -m64'
+
+ If you think `libtool' should let some flag through by default,
+here's how you can test such an inclusion: grab the Libtool development
+tree, edit the `ltmain.m4sh' file in the `libltdl/config' subdirectory
+to pass through the flag (search for `Flags to be passed through'),
+re-bootstrap and build with the flags in question added to `LDFLAGS',
+`CFLAGS', `CXXFLAGS', etc. on the `configure' command line as
+appropriate. Run the testsuite as described in the `README' file and
+report results to the Libtool bug reporting address
+<bug-libtool@gnu.org>.
+
+
+File: libtool.info, Node: Troubleshooting, Next: Maintaining, Prev: FAQ, Up: Top
+
+14 Troubleshooting
+******************
+
+Libtool is under constant development, changing to remain up-to-date
+with modern operating systems. If libtool doesn't work the way you
+think it should on your platform, you should read this chapter to help
+determine what the problem is, and how to resolve it.
+
+* Menu:
+
+* Libtool test suite:: Libtool's self-tests.
+* Reporting bugs:: How to report problems with libtool.
+
+
+File: libtool.info, Node: Libtool test suite, Next: Reporting bugs, Up: Troubleshooting
+
+14.1 The libtool test suite
+===========================
+
+Libtool comes with two integrated sets of tests to check that your build
+is sane, that test its capabilities, and report obvious bugs in the
+libtool program. These tests, too, are constantly evolving, based on
+past problems with libtool, and known deficiencies in other operating
+systems.
+
+ As described in the `README' file, you may run `make -k check' after
+you have built libtool (possibly before you install it) in order to
+make sure that it meets basic functional requirements.
+
+* Menu:
+
+* Test descriptions:: The contents of the old test suite.
+* When tests fail:: What to do when a test fails.
+
+
+File: libtool.info, Node: Test descriptions, Next: When tests fail, Up: Libtool test suite
+
+14.1.1 Description of test suite
+--------------------------------
+
+Here is a list of the current programs in the old test suite, and what
+they test for:
+
+`cdemo-conf.test'
+`cdemo-make.test'
+`cdemo-exec.test'
+`cdemo-static.test'
+`cdemo-static-make.test'
+`cdemo-static-exec.test'
+`cdemo-shared.test'
+`cdemo-shared-make.test'
+`cdemo-shared-exec.test'
+`cdemo-undef.test'
+`cdemo-undef-make.test'
+`cdemo-undef-exec.test'
+ These programs check to see that the `tests/cdemo' subdirectory of
+ the libtool distribution can be configured and built correctly.
+
+ The `tests/cdemo' subdirectory contains a demonstration of libtool
+ convenience libraries, a mechanism that allows build-time static
+ libraries to be created, in a way that their components can be
+ later linked into programs or other libraries, even shared ones.
+
+ The tests matching `cdemo-*make.test' and `cdemo-*exec.test' are
+ executed three times, under three different libtool configurations:
+ `cdemo-conf.test' configures `cdemo/libtool' to build both static
+ and shared libraries (the default for platforms that support
+ both), `cdemo-static.test' builds only static libraries
+ (`--disable-shared'), and `cdemo-shared.test' builds only shared
+ libraries (`--disable-static').
+
+ The test `cdemo-undef.test' tests the generation of shared
+ libraries with undefined symbols on systems that allow this.
+
+`demo-conf.test'
+`demo-make.test'
+`demo-exec.test'
+`demo-inst.test'
+`demo-unst.test'
+`demo-static.test'
+`demo-static-make.test'
+`demo-static-exec.test'
+`demo-static-inst.test'
+`demo-static-unst.test'
+`demo-shared.test'
+`demo-shared-make.test'
+`demo-shared-exec.test'
+`demo-shared-inst.test'
+`demo-shared-unst.test'
+`demo-nofast.test'
+`demo-nofast-make.test'
+`demo-nofast-exec.test'
+`demo-nofast-inst.test'
+`demo-nofast-unst.test'
+`demo-pic.test'
+`demo-pic-make.test'
+`demo-pic-exec.test'
+`demo-nopic.test'
+`demo-nopic-make.test'
+`demo-nopic-exec.test'
+ These programs check to see that the `tests/demo' subdirectory of
+ the libtool distribution can be configured, built, installed, and
+ uninstalled correctly.
+
+ The `tests/demo' subdirectory contains a demonstration of a trivial
+ package that uses libtool. The tests matching `demo-*make.test',
+ `demo-*exec.test', `demo-*inst.test' and `demo-*unst.test' are
+ executed four times, under four different libtool configurations:
+ `demo-conf.test' configures `demo/libtool' to build both static
+ and shared libraries, `demo-static.test' builds only static
+ libraries (`--disable-shared'), and `demo-shared.test' builds only
+ shared libraries (`--disable-static'). `demo-nofast.test'
+ configures `demo/libtool' to disable the fast-install mode
+ (`--enable-fast-install=no'). `demo-pic.test' configures
+ `demo/libtool' to prefer building PIC code (`--with-pic'),
+ `demo-nopic.test' to prefer non-PIC code (`--without-pic').
+
+`demo-deplibs.test'
+ Many systems cannot link static libraries into shared libraries.
+ libtool uses a `deplibs_check_method' to prevent such cases. This
+ tests checks whether libtool's `deplibs_check_method' works
+ properly.
+
+`demo-hardcode.test'
+ On all systems with shared libraries, the location of the library
+ can be encoded in executables that are linked against it *note
+ Linking executables::. This test checks the conditions under
+ which your system linker hardcodes the library location, and
+ guarantees that they correspond to libtool's own notion of how
+ your linker behaves.
+
+`demo-relink.test'
+`depdemo-relink.test'
+ These tests check whether variable `shlibpath_overrides_runpath' is
+ properly set. If the test fails, it will indicate what the
+ variable should have been set to.
+
+`demo-noinst-link.test'
+ Checks whether libtool will not try to link with a previously
+ installed version of a library when it should be linking with a
+ just-built one.
+
+`depdemo-conf.test'
+`depdemo-make.test'
+`depdemo-exec.test'
+`depdemo-inst.test'
+`depdemo-unst.test'
+`depdemo-static.test'
+`depdemo-static-make.test'
+`depdemo-static-exec.test'
+`depdemo-static-inst.test'
+`depdemo-static-unst.test'
+`depdemo-shared.test'
+`depdemo-shared-make.test'
+`depdemo-shared-exec.test'
+`depdemo-shared-inst.test'
+`depdemo-shared-unst.test'
+`depdemo-nofast.test'
+`depdemo-nofast-make.test'
+`depdemo-nofast-exec.test'
+`depdemo-nofast-inst.test'
+`depdemo-nofast-unst.test'
+ These programs check to see that the `tests/depdemo' subdirectory
+ of the libtool distribution can be configured, built, installed,
+ and uninstalled correctly.
+
+ The `tests/depdemo' subdirectory contains a demonstration of
+ inter-library dependencies with libtool. The test programs link
+ some interdependent libraries.
+
+ The tests matching `depdemo-*make.test', `depdemo-*exec.test',
+ `depdemo-*inst.test' and `depdemo-*unst.test' are executed four
+ times, under four different libtool configurations:
+ `depdemo-conf.test' configures `depdemo/libtool' to build both
+ static and shared libraries, `depdemo-static.test' builds only
+ static libraries (`--disable-shared'), and `depdemo-shared.test'
+ builds only shared libraries (`--disable-static').
+ `depdemo-nofast.test' configures `depdemo/libtool' to disable the
+ fast-install mode (`--enable-fast-install=no').
+
+`mdemo-conf.test'
+`mdemo-make.test'
+`mdemo-exec.test'
+`mdemo-inst.test'
+`mdemo-unst.test'
+`mdemo-static.test'
+`mdemo-static-make.test'
+`mdemo-static-exec.test'
+`mdemo-static-inst.test'
+`mdemo-static-unst.test'
+`mdemo-shared.test'
+`mdemo-shared-make.test'
+`mdemo-shared-exec.test'
+`mdemo-shared-inst.test'
+`mdemo-shared-unst.test'
+ These programs check to see that the `tests/mdemo' subdirectory of
+ the libtool distribution can be configured, built, installed, and
+ uninstalled correctly.
+
+ The `tests/mdemo' subdirectory contains a demonstration of a
+ package that uses libtool and the system independent dlopen wrapper
+ `libltdl' to load modules. The library `libltdl' provides a
+ dlopen wrapper for various platforms (POSIX) including support for
+ dlpreopened modules (*note Dlpreopening::).
+
+ The tests matching `mdemo-*make.test', `mdemo-*exec.test',
+ `mdemo-*inst.test' and `mdemo-*unst.test' are executed three
+ times, under three different libtool configurations:
+ `mdemo-conf.test' configures `mdemo/libtool' to build both static
+ and shared libraries, `mdemo-static.test' builds only static
+ libraries (`--disable-shared'), and `mdemo-shared.test' builds
+ only shared libraries (`--disable-static').
+
+`mdemo-dryrun.test'
+ This test checks whether libtool's `--dry-run' mode works properly.
+
+`mdemo2-conf.test'
+`mdemo2-exec.test'
+`mdemo2-make.test'
+ These programs check to see that the `tests/mdemo2' subdirectory of
+ the libtool distribution can be configured, built, and executed
+ correctly.
+
+ The `tests/mdemo2' directory contains a demonstration of a package
+ that attempts to link with a library (from the `tests/mdemo'
+ directory) that itself does dlopening of libtool modules.
+
+`link.test'
+ This test guarantees that linking directly against a non-libtool
+ static library works properly.
+
+`link-2.test'
+ This test makes sure that files ending in `.lo' are never linked
+ directly into a program file.
+
+`nomode.test'
+ Check whether we can actually get help for libtool.
+
+`objectlist.test'
+ Check that a nonexistent objectlist file is properly detected.
+
+`pdemo-conf.test'
+`pdemo-make.test'
+`pdemo-exec.test'
+`pdemo-inst.test'
+ These programs check to see that the `tests/pdemo' subdirectory of
+ the libtool distribution can be configured, built, and executed
+ correctly.
+
+ The `pdemo-conf.test' lowers the `max_cmd_len' variable in the
+ generated libtool script to test the measures to evade command line
+ length limitations.
+
+`quote.test'
+ This program checks libtool's metacharacter quoting.
+
+`sh.test'
+ Checks for some nonportable or dubious or undesired shell
+ constructs in shell scripts.
+
+`suffix.test'
+ When other programming languages are used with libtool (*note
+ Other languages::), the source files may end in suffixes other
+ than `.c'. This test validates that libtool can handle suffixes
+ for all the file types that it supports, and that it fails when
+ the suffix is invalid.
+
+`tagdemo-conf.test'
+`tagdemo-make.test'
+`tagdemo-exec.test'
+`tagdemo-static.test'
+`tagdemo-static-make.test'
+`tagdemo-static-exec.test'
+`tagdemo-shared.test'
+`tagdemo-shared-make.test'
+`tagdemo-shared-exec.test'
+`tagdemo-undef.test'
+`tagdemo-undef-make.test'
+`tagdemo-undef-exec.test'
+ These programs check to see that the `tests/tagdemo' subdirectory
+ of the libtool distribution can be configured, built, and executed
+ correctly.
+
+ The `tests/tagdemo' directory contains a demonstration of a package
+ that uses libtool's multi-language support through configuration
+ tags. It generates a library from C++ sources, which is then
+ linked to a C++ program.
+
+`f77demo-conf.test'
+`f77demo-make.test'
+`f77demo-exec.test'
+`f77demo-static.test'
+`f77demo-static-make.test'
+`f77demo-static-exec.test'
+`f77demo-shared.test'
+`f77demo-shared-make.test'
+`f77demo-shared-exec.test'
+ These programs check to see that the `tests/f77demo' subdirectory
+ of the libtool distribution can be configured, built, and executed
+ correctly.
+
+ The `tests/f77demo' tests test Fortran 77 support in libtool by
+ creating libraries from Fortran 77 sources, and mixed Fortran and C
+ sources, and a Fortran 77 program to use the former library, and a
+ C program to use the latter library.
+
+`fcdemo-conf.test'
+`fcdemo-make.test'
+`fcdemo-exec.test'
+`fcdemo-static.test'
+`fcdemo-static-make.test'
+`fcdemo-static-exec.test'
+`fcdemo-shared.test'
+`fcdemo-shared-make.test'
+`fcdemo-shared-exec.test'
+ These programs check to see that the `tests/fcdemo' subdirectory
+ of the libtool distribution can be configured, built, and executed
+ correctly.
+
+ The `tests/fcdemo' is similar to the `tests/f77demo' directory,
+ except that Fortran 90 is used in combination with the `FC'
+ interface provided by Autoconf and Automake.
+
+
+ The new, Autotest-based test suite uses keywords to classify certain
+test groups:
+
+`CXX'
+`F77'
+`FC'
+`GCJ'
+ The test group exercises one of these `libtool' language tags.
+
+`autoconf'
+`automake'
+ These keywords denote that the respective external program is
+ needed by the test group. The tests are typically skipped if the
+ program is not installed. The `automake' keyword may also denote
+ use of the `aclocal' program.
+
+`interactive'
+ This test group may require user interaction on some systems.
+ Typically, this means closing a popup window about a DLL load
+ error on Windows.
+
+`libltdl'
+ Denote that the `libltdl' library is exercised by the test group.
+
+`libtool'
+`libtoolize'
+ Denote that the `libtool' or `libtoolize' scripts are exercised by
+ the test group, respectively.
+
+`recursive'
+ Denote that this test group may recursively re-invoke the test
+ suite itself, with changed settings and maybe a changed `libtool'
+ script. You may use the `INNER_TESTSUITEFLAGS' variable to pass
+ additional settings to this recursive invocation. Typically,
+ recursive invocations delimit the set of tests with another
+ keyword, for example by passing `-k libtool' right before the
+ expansion of the `INNER_TESTSUITEFLAGS' variable (without an
+ intervening space, so you get the chance for further delimitation).
+
+ Test groups with the keyword `recursive' should not be denoted with
+ keywords, in order to avoid infinite recursion. As a consequence,
+ recursive test groups themselves should never require user
+ interaction, while the test groups they invoke may do so.
+
+ There is a convenience target `check-noninteractive' that runs all
+tests from both test suites that do not cause user interaction on
+Windows. Conversely, the target `check-interactive' runs the
+complement of tests and might require closing popup windows about DLL
+load errors on Windows.
+
+
+File: libtool.info, Node: When tests fail, Prev: Test descriptions, Up: Libtool test suite
+
+14.1.2 When tests fail
+----------------------
+
+When the tests in the old test suite are run via `make check', output
+is caught in per-test `tests/TEST-NAME.log' files and summarized in the
+`test-suite.log' file. The exit status of each program tells the
+`Makefile' whether or not the test succeeded.
+
+ If a test fails, it means that there is either a programming error in
+libtool, or in the test program itself.
+
+ To investigate a particular test, you may run it directly, as you
+would a normal program. When the test is invoked in this way, it
+produces output that may be useful in determining what the problem is.
+
+ The new, Autotest-based test suite produces as output a file
+`tests/testsuite.log' which contains information about failed tests.
+
+ You can pass options to the test suite through the `make' variable
+`TESTSUITEFLAGS' (*note The Autoconf Manual: (autoconf)testsuite
+Invocation.).
+
+
+File: libtool.info, Node: Reporting bugs, Prev: Libtool test suite, Up: Troubleshooting
+
+14.2 Reporting bugs
+===================
+
+If you think you have discovered a bug in libtool, you should think
+twice: the libtool maintainer is notorious for passing the buck (or
+maybe that should be "passing the bug"). Libtool was invented to fix
+known deficiencies in shared library implementations, so, in a way, most
+of the bugs in libtool are actually bugs in other operating systems.
+However, the libtool maintainer would definitely be happy to add support
+for somebody else's buggy operating system. [I wish there was a good
+way to do winking smiley-faces in Texinfo.]
+
+ Genuine bugs in libtool include problems with shell script
+portability, documentation errors, and failures in the test suite
+(*note Libtool test suite::).
+
+ First, check the documentation and help screens to make sure that the
+behaviour you think is a problem is not already mentioned as a feature.
+
+ Then, you should read the Emacs guide to reporting bugs (*note
+Reporting Bugs: (emacs)Bugs.). Some of the details listed there are
+specific to Emacs, but the principle behind them is a general one.
+
+ Finally, send a bug report to the Libtool bug reporting address
+<bug-libtool@gnu.org> with any appropriate _facts_, such as test suite
+output (*note When tests fail::), all the details needed to reproduce
+the bug, and a brief description of why you think the behaviour is a
+bug. Be sure to include the word "libtool" in the subject line, as
+well as the version number you are using (which can be found by typing
+`libtool --version').
+
+
+File: libtool.info, Node: Maintaining, Next: GNU Free Documentation License, Prev: Troubleshooting, Up: Top
+
+15 Maintenance notes for libtool
+********************************
+
+This chapter contains information that the libtool maintainer finds
+important. It will be of no use to you unless you are considering
+porting libtool to new systems, or writing your own libtool.
+
+* Menu:
+
+* New ports:: How to port libtool to new systems.
+* Tested platforms:: When libtool was last tested.
+* Platform quirks:: Information about different library systems.
+* libtool script contents:: Configuration information that libtool uses.
+* Cheap tricks:: Making libtool maintainership easier.
+
+
+File: libtool.info, Node: New ports, Next: Tested platforms, Up: Maintaining
+
+15.1 Porting libtool to new systems
+===================================
+
+Before you embark on porting libtool to an unsupported system, it is
+worthwhile to send e-mail to the Libtool mailing list
+<libtool@gnu.org>, to make sure that you are not duplicating existing
+work.
+
+ If you find that any porting documentation is missing, please
+complain! Complaints with patches and improvements to the
+documentation, or to libtool itself, are more than welcome.
+
+* Menu:
+
+* Information sources:: Where to find relevant documentation
+* Porting inter-library dependencies:: Implementation details explained
+
+
+File: libtool.info, Node: Information sources, Next: Porting inter-library dependencies, Up: New ports
+
+15.1.1 Information sources
+--------------------------
+
+Once it is clear that a new port is necessary, you'll generally need the
+following information:
+
+canonical system name
+ You need the output of `config.guess' for this system, so that you
+ can make changes to the libtool configuration process without
+ affecting other systems.
+
+man pages for `ld' and `cc'
+ These generally describe what flags are used to generate PIC, to
+ create shared libraries, and to link against only static
+ libraries. You may need to follow some cross references to find
+ the information that is required.
+
+man pages for `ld.so', `rtld', or equivalent
+ These are a valuable resource for understanding how shared
+ libraries are loaded on the system.
+
+man page for `ldconfig', or equivalent
+ This page usually describes how to install shared libraries.
+
+output from `ls -l /lib /usr/lib'
+ This shows the naming convention for shared libraries on the
+ system, including which names should be symbolic links.
+
+any additional documentation
+ Some systems have special documentation on how to build and install
+ shared libraries.
+
+ If you know how to program the Bourne shell, then you can complete
+the port yourself; otherwise, you'll have to find somebody with the
+relevant skills who will do the work. People on the libtool mailing
+list are usually willing to volunteer to help you with new ports, so
+you can send the information to them.
+
+ To do the port yourself, you'll definitely need to modify the
+`libtool.m4' macros in order to make platform-specific changes to the
+configuration process. You should search that file for the `PORTME'
+keyword, which will give you some hints on what you'll need to change.
+In general, all that is involved is modifying the appropriate
+configuration variables (*note libtool script contents::).
+
+ Your best bet is to find an already-supported system that is similar
+to yours, and make your changes based on that. In some cases, however,
+your system will differ significantly from every other supported system,
+and it may be necessary to add new configuration variables, and modify
+the `ltmain.in' script accordingly. Be sure to write to the mailing
+list before you make changes to `ltmain.in', since they may have advice
+on the most effective way of accomplishing what you want.
+
+
+File: libtool.info, Node: Porting inter-library dependencies, Prev: Information sources, Up: New ports
+
+15.1.2 Porting inter-library dependencies support
+-------------------------------------------------
+
+Since version 1.2c, libtool has re-introduced the ability to do
+inter-library dependency on some platforms, thanks to a patch by Toshio
+Kuratomi <badger@prtr-13.ucsc.edu>. Here's a shortened version of the
+message that contained his patch:
+
+ The basic architecture is this: in `libtool.m4', the person who
+writes libtool makes sure `$deplibs' is included in `$archive_cmds'
+somewhere and also sets the variable `$deplibs_check_method', and maybe
+`$file_magic_cmd' when `deplibs_check_method' is file_magic.
+
+ `deplibs_check_method' can be one of five things:
+`file_magic [REGEX]'
+ looks in the library link path for libraries that have the right
+ libname. Then it runs `$file_magic_cmd' on the library and checks
+ for a match against the extended regular expression REGEX. When
+ `file_magic_test_file' is set by `libtool.m4', it is used as an
+ argument to `$file_magic_cmd' in order to verify whether the
+ regular expression matches its output, and warn the user otherwise.
+
+`test_compile'
+ just checks whether it is possible to link a program out of a list
+ of libraries, and checks which of those are listed in the output of
+ `ldd'. It is currently unused, and will probably be dropped in the
+ future.
+
+`pass_all'
+ will pass everything without any checking. This may work on
+ platforms in which code is position-independent by default and
+ inter-library dependencies are properly supported by the dynamic
+ linker, for example, on DEC OSF/1 3 and 4.
+
+`none'
+ It causes deplibs to be reassigned `deplibs=""'. That way
+ `archive_cmds' can contain deplibs on all platforms, but not have
+ deplibs used unless needed.
+
+`unknown'
+ is the default for all systems unless overridden in `libtool.m4'.
+ It is the same as `none', but it documents that we really don't
+ know what the correct value should be, and we welcome patches that
+ improve it.
+
+ Then in `ltmain.in' we have the real workhorse: a little
+initialization and postprocessing (to setup/release variables for use
+with eval echo libname_spec etc.) and a case statement that decides the
+method that is being used. This is the real code... I wish I could
+condense it a little more, but I don't think I can without function
+calls. I've mostly optimized it (moved things out of loops, etc.) but
+there is probably some fat left. I thought I should stop while I was
+ahead, work on whatever bugs you discover, etc. before thinking about
+more than obvious optimizations.
+
+
+File: libtool.info, Node: Tested platforms, Next: Platform quirks, Prev: New ports, Up: Maintaining
+
+15.2 Tested platforms
+=====================
+
+This table describes when libtool was last known to be tested on
+platforms where it claims to support shared libraries:
+
+ -------------------------------------------------------
+ canonical host name compiler libtool results
+ (tools versions) release
+ -------------------------------------------------------
+ alpha-dec-osf5.1 cc 1.3e ok (1.910)
+ alpha-dec-osf4.0f gcc 1.3e ok (1.910)
+ alpha-dec-osf4.0f cc 1.3e ok (1.910)
+ alpha-dec-osf3.2 gcc 0.8 ok
+ alpha-dec-osf3.2 cc 0.8 ok
+ alpha-dec-osf2.1 gcc 1.2f NS
+ alpha*-unknown-linux-gnu gcc 1.3b ok
+ (egcs-1.1.2, GNU ld 2.9.1.0.23)
+ hppa2.0w-hp-hpux11.00 cc 1.2f ok
+ hppa2.0-hp-hpux10.20 cc 1.3.2 ok
+ hppa1.1-hp-hpux10.20 gcc 1.2f ok
+ hppa1.1-hp-hpux10.20 cc 1.3c ok (1.821)
+ hppa1.1-hp-hpux10.10 gcc 1.2f ok
+ hppa1.1-hp-hpux10.10 cc 1.2f ok
+ hppa1.1-hp-hpux9.07 gcc 1.2f ok
+ hppa1.1-hp-hpux9.07 cc 1.2f ok
+ hppa1.1-hp-hpux9.05 gcc 1.2f ok
+ hppa1.1-hp-hpux9.05 cc 1.2f ok
+ hppa1.1-hp-hpux9.01 gcc 1.2f ok
+ hppa1.1-hp-hpux9.01 cc 1.2f ok
+ i*86-*-beos gcc 1.2f ok
+ i*86-*-bsdi4.0.1 gcc 1.3c ok
+ (gcc-2.7.2.1)
+ i*86-*-bsdi4.0 gcc 1.2f ok
+ i*86-*-bsdi3.1 gcc 1.2e NS
+ i*86-*-bsdi3.0 gcc 1.2e NS
+ i*86-*-bsdi2.1 gcc 1.2e NS
+ i*86-pc-cygwin gcc 1.3b NS
+ (egcs-1.1 stock b20.1 compiler)
+ i*86-*-dguxR4.20MU01 gcc 1.2 ok
+ i*86-*-freebsd4.3 gcc 1.3e ok (1.912)
+ i*86-*-freebsdelf4.0 gcc 1.3c ok
+ (egcs-1.1.2)
+ i*86-*-freebsdelf3.2 gcc 1.3c ok
+ (gcc-2.7.2.1)
+ i*86-*-freebsdelf3.1 gcc 1.3c ok
+ (gcc-2.7.2.1)
+ i*86-*-freebsdelf3.0 gcc 1.3c ok
+ i*86-*-freebsd3.0 gcc 1.2e ok
+ i*86-*-freebsd2.2.8 gcc 1.3c ok
+ (gcc-2.7.2.1)
+ i*86-*-freebsd2.2.6 gcc 1.3b ok
+ (egcs-1.1 & gcc-2.7.2.1, native ld)
+ i*86-*-freebsd2.1.5 gcc 0.5 ok
+ i*86-*-netbsd1.5 gcc 1.3e ok (1.901)
+ (egcs-1.1.2)
+ i*86-*-netbsd1.4 gcc 1.3c ok
+ (egcs-1.1.1)
+ i*86-*-netbsd1.4.3A gcc 1.3e ok (1.901)
+ i*86-*-netbsd1.3.3 gcc 1.3c ok
+ (gcc-2.7.2.2+myc2)
+ i*86-*-netbsd1.3.2 gcc 1.2e ok
+ i*86-*-netbsd1.3I gcc 1.2e ok
+ (egcs 1.1?)
+ i*86-*-netbsd1.2 gcc 0.9g ok
+ i*86-*-linux-gnu gcc 1.3e ok (1.901)
+ (Red Hat 7.0, gcc "2.96")
+ i*86-*-linux-gnu gcc 1.3e ok (1.911)
+ (SuSE 7.0, gcc 2.95.2)
+ i*86-*-linux-gnulibc1 gcc 1.2f ok
+ i*86-*-openbsd2.5 gcc 1.3c ok
+ (gcc-2.8.1)
+ i*86-*-openbsd2.4 gcc 1.3c ok
+ (gcc-2.8.1)
+ i*86-*-solaris2.7 gcc 1.3b ok
+ (egcs-1.1.2, native ld)
+ i*86-*-solaris2.6 gcc 1.2f ok
+ i*86-*-solaris2.5.1 gcc 1.2f ok
+ i*86-ncr-sysv4.3.03 gcc 1.2f ok
+ i*86-ncr-sysv4.3.03 cc 1.2e ok
+ (cc -Hnocopyr)
+ i*86-pc-sco3.2v5.0.5 cc 1.3c ok
+ i*86-pc-sco3.2v5.0.5 gcc 1.3c ok
+ (gcc 95q4c)
+ i*86-pc-sco3.2v5.0.5 gcc 1.3c ok
+ (egcs-1.1.2)
+ i*86-sco-sysv5uw7.1.1 gcc 1.3e ok (1.901)
+ (gcc-2.95.2, SCO linker)
+ i*86-UnixWare7.1.0-sysv5 cc 1.3c ok
+ i*86-UnixWare7.1.0-sysv5 gcc 1.3c ok
+ (egcs-1.1.1)
+ m68k-next-nextstep3 gcc 1.2f NS
+ m68k-sun-sunos4.1.1 gcc 1.2f NS
+ (gcc-2.5.7)
+ m88k-dg-dguxR4.12TMU01 gcc 1.2 ok
+ m88k-motorola-sysv4 gcc 1.3 ok
+ (egcs-1.1.2)
+ mips-sgi-irix6.5 gcc 1.2f ok
+ (gcc-2.8.1)
+ mips-sgi-irix6.4 gcc 1.2f ok
+ mips-sgi-irix6.3 gcc 1.3b ok
+ (egcs-1.1.2, native ld)
+ mips-sgi-irix6.3 cc 1.3b ok
+ (cc 7.0)
+ mips-sgi-irix6.2 gcc 1.2f ok
+ mips-sgi-irix6.2 cc 0.9 ok
+ mips-sgi-irix5.3 gcc 1.2f ok
+ (egcs-1.1.1)
+ mips-sgi-irix5.3 gcc 1.2f NS
+ (gcc-2.6.3)
+ mips-sgi-irix5.3 cc 0.8 ok
+ mips-sgi-irix5.2 gcc 1.3b ok
+ (egcs-1.1.2, native ld)
+ mips-sgi-irix5.2 cc 1.3b ok
+ (cc 3.18)
+ mips-sni-sysv4 cc 1.3.5 ok
+ (Siemens C-compiler)
+ mips-sni-sysv4 gcc 1.3.5 ok
+ (gcc-2.7.2.3, GNU assembler 2.8.1, native ld)
+ mipsel-unknown-openbsd2.1 gcc 1.0 ok
+ powerpc-apple-darwin6.4 gcc 1.5 ok
+ (apple dev tools released 12/2002)
+ powerpc-ibm-aix4.3.1.0 gcc 1.2f ok
+ (egcs-1.1.1)
+ powerpc-ibm-aix4.2.1.0 gcc 1.2f ok
+ (egcs-1.1.1)
+ powerpc-ibm-aix4.1.5.0 gcc 1.2f ok
+ (egcs-1.1.1)
+ powerpc-ibm-aix4.1.5.0 gcc 1.2f NS
+ (gcc-2.8.1)
+ powerpc-ibm-aix4.1.4.0 gcc 1.0 ok
+ powerpc-ibm-aix4.1.4.0 xlc 1.0i ok
+ rs6000-ibm-aix4.1.5.0 gcc 1.2f ok
+ (gcc-2.7.2)
+ rs6000-ibm-aix4.1.4.0 gcc 1.2f ok
+ (gcc-2.7.2)
+ rs6000-ibm-aix3.2.5 gcc 1.0i ok
+ rs6000-ibm-aix3.2.5 xlc 1.0i ok
+ sparc-sun-solaris2.8 gcc 1.3e ok (1.913)
+ (gcc-2.95.3 & native ld)
+ sparc-sun-solaris2.7 gcc 1.3e ok (1.913)
+ (gcc-2.95.3 & native ld)
+ sparc-sun-solaris2.6 gcc 1.3e ok (1.913)
+ (gcc-2.95.3 & native ld)
+ sparc-sun-solaris2.5.1 gcc 1.3e ok (1.911)
+ sparc-sun-solaris2.5 gcc 1.3b ok
+ (egcs-1.1.2, GNU ld 2.9.1 & native ld)
+ sparc-sun-solaris2.5 cc 1.3b ok
+ (SC 3.0.1)
+ sparc-sun-solaris2.4 gcc 1.0a ok
+ sparc-sun-solaris2.4 cc 1.0a ok
+ sparc-sun-solaris2.3 gcc 1.2f ok
+ sparc-sun-sunos4.1.4 gcc 1.2f ok
+ sparc-sun-sunos4.1.4 cc 1.0f ok
+ sparc-sun-sunos4.1.3_U1 gcc 1.2f ok
+ sparc-sun-sunos4.1.3C gcc 1.2f ok
+ sparc-sun-sunos4.1.3 gcc 1.3b ok
+ (egcs-1.1.2, GNU ld 2.9.1 & native ld)
+ sparc-sun-sunos4.1.3 cc 1.3b ok
+ sparc-unknown-bsdi4.0 gcc 1.2c ok
+ sparc-unknown-linux-gnulibc1 gcc 1.2f ok
+ sparc-unknown-linux-gnu gcc 1.3b ok
+ (egcs-1.1.2, GNU ld 2.9.1.0.23)
+ sparc64-unknown-linux-gnu gcc 1.2f ok
+
+ Notes:
+ - "ok" means "all tests passed".
+ - "NS" means "Not Shared", but OK for static libraries
+
+ Note: The vendor-distributed HP-UX `sed'(1) programs are horribly
+broken, and cannot handle libtool's requirements, so users may report
+unusual problems. There is no workaround except to install a working
+`sed' (such as GNU `sed') on these systems.
+
+ Note: The vendor-distributed NCR MP-RAS `cc' programs emits
+copyright on standard error that confuse tests on size of
+`conftest.err'. The workaround is to specify `CC' when run `configure'
+with `CC='cc -Hnocopyr''.
+
+
+File: libtool.info, Node: Platform quirks, Next: libtool script contents, Prev: Tested platforms, Up: Maintaining
+
+15.3 Platform quirks
+====================
+
+This section is dedicated to the sanity of the libtool maintainers. It
+describes the programs that libtool uses, how they vary from system to
+system, and how to test for them.
+
+ Because libtool is a shell script, it can be difficult to understand
+just by reading it from top to bottom. This section helps show why
+libtool does things a certain way. Combined with the scripts
+themselves, you should have a better sense of how to improve libtool, or
+write your own.
+
+* Menu:
+
+* References:: Finding more information.
+* Compilers:: Creating object files from source files.
+* Reloadable objects:: Binding object files together.
+* Multiple dependencies:: Removing duplicate dependent libraries.
+* Archivers:: Programs that create static archives.
+* Cross compiling:: Issues that arise when cross compiling.
+* File name conversion:: Converting file names between platforms.
+* Windows DLLs:: Windows header defines.
+
+
+File: libtool.info, Node: References, Next: Compilers, Up: Platform quirks
+
+15.3.1 References
+-----------------
+
+The following is a list of valuable documentation references:
+
+ * SGI's IRIX Manual Pages can be found at
+ `http://techpubs.sgi.com/cgi-bin/infosrch.cgi?cmd=browse&db=man'.
+
+ * Sun's free service area
+ (`http://www.sun.com/service/online/free.html') and documentation
+ server (`http://docs.sun.com/').
+
+ * Compaq's Tru64 UNIX online documentation is at
+ (`http://tru64unix.compaq.com/faqs/publications/pub_page/doc_list.html')
+ with C++ documentation at
+ (`http://tru64unix.compaq.com/cplus/docs/index.htm').
+
+ * Hewlett-Packard has online documentation at
+ (`http://docs.hp.com/index.html').
+
+ * IBM has online documentation at
+ (`http://www.rs6000.ibm.com/resource/aix_resource/Pubs/').
+
+
+File: libtool.info, Node: Compilers, Next: Reloadable objects, Prev: References, Up: Platform quirks
+
+15.3.2 Compilers
+----------------
+
+The only compiler characteristics that affect libtool are the flags
+needed (if any) to generate PIC objects. In general, if a C compiler
+supports certain PIC flags, then any derivative compilers support the
+same flags. Until there are some noteworthy exceptions to this rule,
+this section will document only C compilers.
+
+ The following C compilers have standard command line options,
+regardless of the platform:
+
+`gcc'
+ This is the GNU C compiler, which is also the system compiler for
+ many free operating systems (FreeBSD, GNU/Hurd, GNU/Linux, Lites,
+ NetBSD, and OpenBSD, to name a few).
+
+ The `-fpic' or `-fPIC' flags can be used to generate
+ position-independent code. `-fPIC' is guaranteed to generate
+ working code, but the code is slower on m68k, m88k, and Sparc
+ chips. However, using `-fpic' on those chips imposes arbitrary
+ size limits on the shared libraries.
+
+ The rest of this subsection lists compilers by the operating system
+that they are bundled with:
+
+`aix3*'
+`aix4*'
+ Most AIX compilers have no PIC flags, since AIX (with the
+ exception of AIX for IA-64) runs on PowerPC and RS/6000 chips. (1)
+
+`hpux10*'
+ Use `+Z' to generate PIC.
+
+`osf3*'
+ Digital/UNIX 3.x does not have PIC flags, at least not on the
+ PowerPC platform.
+
+`solaris2*'
+ Use `-KPIC' to generate PIC.
+
+`sunos4*'
+ Use `-PIC' to generate PIC.
+
+ ---------- Footnotes ----------
+
+ (1) All code compiled for the PowerPC and RS/6000 chips
+(`powerpc-*-*', `powerpcle-*-*', and `rs6000-*-*') is
+position-independent, regardless of the operating system or compiler
+suite. So, "regular objects" can be used to build shared libraries on
+these systems and no special PIC compiler flags are required.
+
+
+File: libtool.info, Node: Reloadable objects, Next: Multiple dependencies, Prev: Compilers, Up: Platform quirks
+
+15.3.3 Reloadable objects
+-------------------------
+
+On all known systems, a reloadable object can be created by running `ld
+-r -o OUTPUT.o INPUT1.o INPUT2.o'. This reloadable object may be
+treated as exactly equivalent to other objects.
+
+
+File: libtool.info, Node: Multiple dependencies, Next: Archivers, Prev: Reloadable objects, Up: Platform quirks
+
+15.3.4 Multiple dependencies
+----------------------------
+
+On most modern platforms the order in which dependent libraries are
+listed has no effect on object generation. In theory, there are
+platforms that require libraries that provide missing symbols to other
+libraries to be listed after those libraries whose symbols they provide.
+
+ Particularly, if a pair of static archives each resolve some of the
+other's symbols, it might be necessary to list one of those archives
+both before and after the other one. Libtool does not currently cope
+with this situation well, since duplicate libraries are removed from
+the link line by default. Libtool provides the command line option
+`--preserve-dup-deps' to preserve all duplicate dependencies in cases
+where it is necessary.
+
+
+File: libtool.info, Node: Archivers, Next: Cross compiling, Prev: Multiple dependencies, Up: Platform quirks
+
+15.3.5 Archivers
+----------------
+
+On all known systems, building a static library can be accomplished by
+running `ar cru libNAME.a OBJ1.o OBJ2.o ...', where the `.a' file is
+the output library, and each `.o' file is an object file.
+
+ On all known systems, if there is a program named `ranlib', then it
+must be used to "bless" the created library before linking against it,
+with the `ranlib libNAME.a' command. Some systems, like Irix, use the
+`ar ts' command, instead.
+
+
+File: libtool.info, Node: Cross compiling, Next: File name conversion, Prev: Archivers, Up: Platform quirks
+
+15.3.6 Cross compiling
+----------------------
+
+Most build systems support the ability to compile libraries and
+applications on one platform for use on a different platform, provided
+a compiler capable of generating the appropriate output is available.
+In such cross compiling scenarios, the platform on which the libraries
+or applications are compiled is called the "build platform", while the
+platform on which the libraries or applications are intended to be used
+or executed is called the "host platform". *note The GNU Build System:
+(automake)GNU Build System, of which libtool is a part, supports cross
+compiling via arguments passed to the configure script: `--build=...'
+and `--host=...'. However, when the build platform and host platform
+are very different, libtool is required to make certain accommodations
+to support these scenarios.
+
+ In most cases, because the build platform and host platform differ,
+the cross-compiled libraries and executables can't be executed or
+tested on the build platform where they were compiled. The testsuites
+of most build systems will often skip any tests that involve executing
+such foreign executables when cross-compiling. However, if the build
+platform and host platform are sufficiently similar, it is often
+possible to run cross-compiled applications. Libtool's own testsuite
+often attempts to execute cross-compiled tests, but will mark any
+failures as _skipped_ since the failure might simply be due to the
+differences between the two platforms.
+
+ In addition to cases where the host platform and build platform are
+extremely similar (e.g. `i586-pc-linux-gnu' and `i686-pc-linux-gnu'),
+there is another case in which cross-compiled host applications may be
+executed on the build platform. This is possible when the build
+platform supports an emulation or API-enhanced environment for the host
+platform. One example of this situation would be if the build platform
+were MinGW, and the host platform were Cygwin (or vice versa). Both of
+these platforms can actually operate within a single Windows instance,
+so Cygwin applications can be launched from a MinGW context, and vice
+versa--provided certain care is taken. Another example would be if the
+build platform were GNU/Linux on an x86 32bit processor, and the host
+platform were MinGW. In this situation, the Wine
+(http://www.winehq.org/) environment can be used to launch Windows
+applications from the GNU/Linux operating system; again, provided
+certain care is taken.
+
+ One particular issue occurs when a Windows platform such as MinGW,
+Cygwin, or MSYS is the host or build platform, while the other platform
+is a Unix-style system. In these cases, there are often conflicts
+between the format of the file names and paths expected within host
+platform libraries and executables, and those employed on the build
+platform.
+
+ This situation is best described using a concrete example: suppose
+the build platform is GNU/Linux with canonical triplet
+`i686-pc-linux-gnu'. Suppose further that the host platform is MinGW
+with canonical triplet `i586-pc-mingw32'. On the GNU/Linux platform
+there is a cross compiler following the usual naming conventions of
+such compilers, where the compiler name is prefixed by the host
+canonical triplet (or suitable alias). (For more information
+concerning canonical triplets and platform aliases, see *note
+Specifying Target Triplets: (autoconf)Specifying Target Triplets. and
+*note Canonicalizing: (autoconf)Canonicalizing.) In this case, the C
+compiler is named `i586-pc-mingw32-gcc'.
+
+ As described in *note Wrapper executables::, for the MinGW host
+platform libtool uses a wrapper executable to set various environment
+variables before launching the actual program executable. Like the
+program executable, the wrapper executable is cross-compiled for the
+host platform (that is, for MinGW). As described above, ordinarily a
+host platform executable cannot be executed on the build platform, but
+in this case the Wine environment could be used to launch the MinGW
+application from GNU/Linux. However, the wrapper executable, as a host
+platform (MinGW) application, must set the `PATH' variable so that the
+true application's dependent libraries can be located--but the contents
+of the `PATH' variable must be structured for MinGW. Libtool must use
+the Wine file name mapping facilities to determine the correct value so
+that the wrapper executable can set the `PATH' variable to point to the
+correct location.
+
+ For example, suppose we are compiling an application in `/var/tmp' on
+GNU/Linux, using separate source code and build directories:
+
+ `/var/tmp/foo-1.2.3/app/' (application source code)
+ `/var/tmp/foo-1.2.3/lib/' (library source code)
+ `/var/tmp/BUILD/app/' (application build objects here)
+ `/var/tmp/BUILD/lib/' (library build objects here)
+
+ Since the library will be built in `/var/tmp/BUILD/lib', the wrapper
+executable (which will be in `/var/tmp/BUILD/app') must add that
+directory to `PATH' (actually, it must add the directory named OBJDIR
+under `/var/tmp/BUILD/lib', but we'll ignore that detail for now).
+However, Windows does not have a concept of Unix-style file or
+directory names such as `/var/tmp/BUILD/lib'. Therefore, Wine provides
+a mapping from Windows file names such as `C:\Program Files' to specific
+Unix-style file names. Wine also provides a utility that can be used
+to map Unix-style file names to Windows file names.
+
+ In this case, the wrapper executable should actually add the value
+
+ Z:\var\tmp\BUILD\lib
+
+to the `PATH'. libtool contains support for path conversions of this
+type, for a certain limited set of build and host platform
+combinations. In this case, libtool will invoke Wine's `winepath'
+utility to ensure that the correct `PATH' value is used. For more
+information, see *note File name conversion::.
+
+
+File: libtool.info, Node: File name conversion, Next: Windows DLLs, Prev: Cross compiling, Up: Platform quirks
+
+15.3.7 File name conversion
+---------------------------
+
+In certain situations, libtool must convert file names and paths between
+formats appropriate to different platforms. Usually this occurs when
+cross-compiling, and affects only the ability to launch host platform
+executables on the build platform using an emulation or API-enhancement
+environment such as Wine. Failure to convert paths (*note File Name
+Conversion Failure::) will cause a warning to be issued, but rarely
+causes the build to fail--and should have no affect on the compiled
+products, once installed properly on the host platform. For more
+information, *note Cross compiling::.
+
+ However, file name conversion may also occur in another scenario:
+when using a Unix emulation system on Windows (such as Cygwin or MSYS),
+combined with a native Windows compiler such as MinGW or MSVC. Only a
+limited set of such scenarios are currently supported; in other cases
+file name conversion is skipped. The lack of file name conversion
+usually means that uninstalled executables can't be launched, but only
+rarely causes the build to fail (*note File Name Conversion Failure::).
+
+ libtool supports file name conversion in the following scenarios:
+
+build platform host platform Notes
+---------------------------------------------------------------------------
+MinGW (MSYS) MinGW (Windows) *note Native MinGW File Name
+ Conversion::
+Cygwin MinGW (Windows) *note Cygwin/Windows File Name
+ Conversion::
+Unix + Wine MinGW (Windows) Requires Wine. *note Unix/Windows
+ File Name Conversion::
+MinGW (MSYS) Cygwin Requires `LT_CYGPATH'. *note
+ LT_CYGPATH::. Provided for testing
+ purposes only.
+Unix + Wine Cygwin Requires both Wine and
+ `LT_CYGPATH', but does not yet work
+ with Cygwin 1.7.7 and Wine-1.2.
+ See *note Unix/Windows File Name
+ Conversion:: and *note LT_CYGPATH::.
+
+* Menu:
+
+* File Name Conversion Failure:: What happens when file name conversion fails
+* Native MinGW File Name Conversion:: MSYS file name conversion idiosyncrasies
+* Cygwin/Windows File Name Conversion:: Using `cygpath' to convert Cygwin file names
+* Unix/Windows File Name Conversion:: Using Wine to convert Unix paths
+* LT_CYGPATH:: Invoking `cygpath' from other environments
+* Cygwin to MinGW Cross:: Other notes concerning MinGW cross
+
+
+File: libtool.info, Node: File Name Conversion Failure, Next: Native MinGW File Name Conversion, Up: File name conversion
+
+15.3.7.1 File Name Conversion Failure
+.....................................
+
+In most cases, file name conversion is not needed or attempted.
+However, when libtool detects that a specific combination of build and
+host platform does require file name conversion, it is possible that
+the conversion may fail. In these cases, you may see a warning such as
+the following:
+
+ Could not determine the host file name corresponding to
+ `... a file name ...'
+ Continuing, but uninstalled executables may not work.
+
+or
+
+ Could not determine the host path corresponding to
+ `... a path ...'
+ Continuing, but uninstalled executables may not work.
+
+This should not cause the build to fail. At worst, it means that the
+wrapper executable will specify file names or paths appropriate for the
+build platform. Since those are not appropriate for the host platform,
+the uninstalled executables would not operate correctly, even when the
+wrapper executable is launched via the appropriate emulation or
+API-enhancement (e.g. Wine). Simply install the executables on the
+host platform, and execute them there.
+
+
+File: libtool.info, Node: Native MinGW File Name Conversion, Next: Cygwin/Windows File Name Conversion, Prev: File Name Conversion Failure, Up: File name conversion
+
+15.3.7.2 Native MinGW File Name Conversion
+..........................................
+
+MSYS is a Unix emulation environment for Windows, and is specifically
+designed such that in normal usage it _pretends_ to be MinGW or native
+Windows, but understands Unix-style file names and paths, and supports
+standard Unix tools and shells. Thus, "native" MinGW builds are
+actually an odd sort of cross-compile, from an MSYS Unix emulation
+environment "pretending" to be MinGW, to actual native Windows.
+
+ When an MSYS shell launches a native Windows executable (as opposed
+to other _MSYS_ executables), it uses a system of heuristics to detect
+any command-line arguments that contain file names or paths. It
+automatically converts these file names from the MSYS (Unix-like)
+format, to the corresponding Windows file name, before launching the
+executable. However, this auto-conversion facility is only available
+when using the MSYS runtime library. The wrapper executable itself is
+a MinGW application (that is, it does not use the MSYS runtime
+library). The wrapper executable must set `PATH' to, and call
+`_spawnv' with, values that have already been converted from MSYS
+format to Windows. Thus, when libtool writes the source code for the
+wrapper executable, it must manually convert MSYS paths to Windows
+format, so that the Windows values can be hard-coded into the wrapper
+executable.
+
+
+File: libtool.info, Node: Cygwin/Windows File Name Conversion, Next: Unix/Windows File Name Conversion, Prev: Native MinGW File Name Conversion, Up: File name conversion
+
+15.3.7.3 Cygwin/Windows File Name Conversion
+............................................
+
+Cygwin provides a Unix emulation environment for Windows. As part of
+that emulation, it provides a file system mapping that presents the
+Windows file system in a Unix-compatible manner. Cygwin also provides
+a utility `cygpath' that can be used to convert file names and paths
+between the two representations. In a correctly configured Cygwin
+installation, `cygpath' is always present, and is in the `PATH'.
+
+ Libtool uses `cygpath' to convert from Cygwin (Unix-style) file names
+and paths to Windows format when the build platform is Cygwin and the
+host platform is MinGW.
+
+ When the host platform is Cygwin, but the build platform is MSYS or
+some Unix system, libtool also uses `cygpath' to convert from Windows
+to Cygwin format (after first converting from the build platform format
+to Windows format; see *note Native MinGW File Name Conversion:: and
+*note Unix/Windows File Name Conversion::). Because the build platform
+is not Cygwin, `cygpath' is not (and should not be) in the `PATH'.
+Therefore, in this configuration the environment variable `LT_CYGPATH'
+is required. *Note LT_CYGPATH::.
+
+
+File: libtool.info, Node: Unix/Windows File Name Conversion, Next: LT_CYGPATH, Prev: Cygwin/Windows File Name Conversion, Up: File name conversion
+
+15.3.7.4 Unix/Windows File Name Conversion
+..........................................
+
+Wine (http://www.winehq.org/) provides an interpretation environment for
+some Unix platforms in which Windows applications can be executed. It
+provides a mapping between the Unix file system and a virtual Windows
+file system used by the Windows programs. For the file name conversion
+to work, Wine must be installed and properly configured on the build
+platform, and the `winepath' application must be in the build
+platform's `PATH'. In addition, on 32bit GNU/Linux it is usually
+helpful if the binfmt extension is enabled.
+
+
+File: libtool.info, Node: LT_CYGPATH, Next: Cygwin to MinGW Cross, Prev: Unix/Windows File Name Conversion, Up: File name conversion
+
+15.3.7.5 LT_CYGPATH
+...................
+
+For some cross-compile configurations (where the host platform is
+Cygwin), the `cygpath' program is used to convert file names from the
+build platform notation to the Cygwin form (technically, this
+conversion is from Windows notation to Cygwin notation; the conversion
+from the build platform format to Windows notation is performed via
+other means). However, because the `cygpath' program is not (and
+should not be) in the `PATH' on the build platform, `LT_CYGPATH' must
+specify the full build platform file name (that is, the full Unix or
+MSYS file name) of the `cygpath' program.
+
+ The reason `cygpath' should not be in the build platform `PATH' is
+twofold: first, `cygpath' is usually installed in the same directory as
+many other Cygwin executables, such as `sed', `cp', etc. If the build
+platform environment had this directory in its `PATH', then these
+Cygwin versions of common Unix utilities might be used in preference to
+the ones provided by the build platform itself, with deleterious
+effects. Second, especially when Cygwin-1.7 or later is used, multiple
+Cygwin installations can coexist within the same Windows instance.
+Each installation will have separate "mount tables" specified in
+`CYGROOT-N/etc/fstab'. These "mount tables" control how that instance
+of Cygwin will map Windows file names and paths to Cygwin form. Each
+installation's `cygpath' utility automatically deduces the appropriate
+`/etc/fstab' file. Since each `CYGROOT-N/etc/fstab' mount table may
+specify different mappings, it matters which `cygpath' is used.
+
+ Note that `cygpath' is a Cygwin application; to execute this tool
+from Unix requires a working and properly configured Wine installation,
+as well as enabling the GNU/Linux `binfmt' extension. Furthermore, the
+Cygwin `setup.exe' tool should have been used, via Wine, to properly
+install Cygwin into the Wine file system (and registry).
+
+ Unfortunately, Wine support for Cygwin is intermittent. Recent
+releases of Cygwin (1.7 and above) appear to require more Windows API
+support than Wine provides (as of Wine version 1.2); most Cygwin
+applications fail to execute. This includes `cygpath' itself. Hence,
+it is best _not_ to use the LT_CYGPATH machinery in libtool when
+performing Unix to Cygwin cross-compiles. Similarly, it is best _not_
+to enable the GNU/Linux binfmt support in this configuration, because
+while Wine will fail to execute the compiled Cygwin applications, it
+will still exit with status zero. This tends to confuse build systems
+and test suites (including libtool's own testsuite, resulting in
+spurious reported failures). Wine support for the older Cygwin-1.5
+series appears satisfactory, but the Cygwin team no longer supports
+Cygwin-1.5. It is hoped that Wine will eventually be improved such that
+Cygwin-1.7 will again operate correctly under Wine. Until then,
+libtool will report warnings as described in *note File Name Conversion
+Failure:: in these scenarios.
+
+ However, `LT_CYGPATH' is also used for the MSYS to Cygwin cross
+compile scenario, and operates as expected.
+
+
+File: libtool.info, Node: Cygwin to MinGW Cross, Prev: LT_CYGPATH, Up: File name conversion
+
+15.3.7.6 Cygwin to MinGW Cross
+..............................
+
+There are actually three different scenarios that could all
+legitimately be called a "Cygwin to MinGW" cross compile. The current
+(and standard) definition is when there is a compiler that produces
+native Windows libraries and applications, but which itself is a Cygwin
+application, just as would be expected in any other cross compile setup.
+
+ However, historically there were two other definitions, which we
+will refer to as the _fake_ one, and the _lying_ one.
+
+ In the _fake_ Cygwin to MinGW cross compile case, you actually use a
+native MinGW compiler, but you do so from within a Cygwin environment:
+
+ export PATH="/c/MinGW/bin:${PATH}"
+ configure --build=i686-pc-cygwin \
+ --host=mingw32 \
+ NM=/c/MinGW/bin/nm.exe
+
+ In this way, the build system "knows" that you are cross compiling,
+and the file name conversion logic will be used. However, because the
+tools (`mingw32-gcc', `nm', `ar') used are actually native Windows
+applications, they will not understand any Cygwin (that is, Unix-like)
+absolute file names passed as command line arguments (and, unlike MSYS,
+Cygwin does not automatically convert such arguments). However, so
+long as only relative file names are used in the build system, and
+non-Windows-supported Unix idioms such as symlinks and mount points are
+avoided, this scenario should work.
+
+ If you must use absolute file names, you will have to force Libtool
+to convert file names for the toolchain in this case, by doing the
+following before you run configure:
+
+ export lt_cv_to_tool_file_cmd=func_convert_file_cygwin_to_w32
+
+ In the _lying_ Cygwin to MinGW cross compile case, you lie to the
+build system:
+
+ export PATH="/c/MinGW/bin:${PATH}"
+ configure --build=i686-pc-mingw32 \
+ --host=i686-pc-mingw32 \
+ --disable-dependency-tracking
+
+and claim that the build platform is MinGW, even though you are actually
+running under _Cygwin_ and not MinGW. In this case, libtool does _not_
+know that you are performing a cross compile, and thinks instead that
+you are performing a native MinGW build. However, as described in
+(*note Native MinGW File Name Conversion::), that scenario triggers an
+"MSYS to Windows" file name conversion. This, of course, is the wrong
+conversion since we are actually running under Cygwin. Also, the
+toolchain is expecting Windows file names (not Cygwin) but unless told
+so Libtool will feed Cygwin file names to the toolchain in this case.
+To force the correct file name conversions in this situation, you
+should do the following _before_ running configure:
+
+ export lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ export lt_cv_to_tool_file_cmd=func_convert_file_cygwin_to_w32
+
+ Note that this relies on internal implementation details of libtool,
+and is subject to change. Also, `--disable-dependency-tracking' is
+required, because otherwise the MinGW GCC will generate dependency
+files that contain Windows file names. This, in turn, will confuse the
+Cygwin `make' program, which does not accept Windows file names:
+
+ Makefile:1: *** target pattern contains no `%'. Stop.
+
+ There have also always been a number of other details required for
+the _lying_ case to operate correctly, such as the use of so-called
+"identity mounts":
+
+ # CYGWIN-ROOT/etc/fstab
+ D:/foo /foo some_fs binary 0 0
+ D:/bar /bar some_fs binary 0 0
+ E:/grill /grill some_fs binary 0 0
+
+ In this way, top-level directories of each drive are available using
+identical names within Cygwin.
+
+ Note that you also need to ensure that the standard Unix directories
+(like `/bin', `/lib', `/usr', `/etc') appear in the root of a drive.
+This means that you must install Cygwin itself into the `C:/' root
+directory (or `D:/', or `E:/', etc)--instead of the recommended
+installation into `C:/cygwin/'. In addition, all file names used in
+the build system must be relative, symlinks should not be used within
+the source or build directory trees, and all `-M*' options to `gcc'
+except `-MMD' must be avoided.
+
+ This is quite a fragile setup, but it has been in historical use,
+and so is documented here.
+
+
+File: libtool.info, Node: Windows DLLs, Prev: File name conversion, Up: Platform quirks
+
+15.3.8 Windows DLLs
+-------------------
+
+This topic describes a couple of ways to portably create Windows Dynamic
+Link Libraries (DLLs). Libtool knows how to create DLLs using GNU tools
+and using Microsoft tools.
+
+ A typical library has a "hidden" implementation with an interface
+described in a header file. On just about every system, the interface
+could be something like this:
+
+ Example `foo.h':
+
+ #ifndef FOO_H
+ #define FOO_H
+
+ int one (void);
+ int two (void);
+ extern int three;
+
+ #endif /* FOO_H */
+
+And the implementation could be something like this:
+
+ Example `foo.c':
+
+ #include "foo.h"
+
+ int one (void)
+ {
+ return 1;
+ }
+
+ int two (void)
+ {
+ return three - one ();
+ }
+
+ int three = 3;
+
+ When using contemporary GNU tools to create the Windows DLL, the
+above code will work there too, thanks to its auto-import/auto-export
+features. But that is not the case when using older GNU tools or
+perhaps more interestingly when using proprietary tools. In those
+cases the code will need additional decorations on the interface
+symbols with `__declspec(dllimport)' and `__declspec(dllexport)'
+depending on whether the library is built or it's consumed and how it's
+built and consumed. However, it should be noted that it would have
+worked also with Microsoft tools, if only the variable `three' hadn't
+been there, due to the fact the Microsoft tools will automatically
+import functions (but sadly not variables) and Libtool will
+automatically export non-static symbols as described next.
+
+ With Microsoft tools, Libtool digs through the object files that
+make up the library, looking for non-static symbols to automatically
+export. I.e., Libtool with Microsoft tools tries to mimic the
+auto-export feature of contemporary GNU tools. It should be noted that
+the GNU auto-export feature is turned off when an explicit
+`__declspec(dllexport)' is seen. The GNU tools do this to not make
+more symbols visible for projects that have already taken the trouble
+to decorate symbols. There is no similar way to limit which symbols
+are visible in the code when Libtool is using Microsoft tools. In
+order to limit symbol visibility in that case you need to use one of
+the options `-export-symbols' or `-export-symbols-regex'.
+
+ No matching help with auto-import is provided by Libtool, which is
+why variables must be decorated to import them from a DLL for
+everything but contemporary GNU tools. As stated above, functions are
+automatically imported by both contemporary GNU tools and Microsoft
+tools, but for other proprietary tools the auto-import status of
+functions is unknown.
+
+ When the objects that form the library are built, there are generally
+two copies built for each object. One copy is used when linking the DLL
+and one copy is used for the static library. On Windows systems, a pair
+of defines are commonly used to discriminate how the interface symbols
+should be decorated. The first define is `-DDLL_EXPORT' which is
+automatically provided by Libtool when `libtool' builds the copy of the
+object that is destined for the DLL. The second define is
+`-DLIBFOO_BUILD' (or similar) which is often added by the package
+providing the library and is used when building the library, but not
+when consuming the library.
+
+ However, the matching double compile is not performed when consuming
+libraries. It is therefore not possible to reliably distinguish if the
+consumer is importing from a DLL or if it is going to use a static
+library.
+
+ With contemporary GNU tools, auto-import often saves the day, but see
+the GNU ld documentation and its `--enable-auto-import' option for some
+corner cases when it does not (*note `--enable-auto-import':
+(ld)Options.).
+
+ With Microsoft tools you typically get away with always compiling the
+code such that variables are expected to be imported from a DLL and
+functions are expected to be found in a static library. The tools will
+then automatically import the function from a DLL if that is where they
+are found. If the variables are not imported from a DLL as expected,
+but are found in a static library that is otherwise pulled in by some
+function, the linker will issue a warning (LNK4217) that a locally
+defined symbol is imported, but it still works. In other words, this
+scheme will not work to only consume variables from a library. There is
+also a price connected to this liberal use of imports in that an extra
+indirection is introduced when you are consuming the static version of
+the library. That extra indirection is unavoidable when the DLL is
+consumed, but it is not needed when consuming the static library.
+
+ For older GNU tools and other proprietary tools there is no generic
+way to make it possible to consume either of the DLL or the static
+library without user intervention, the tools need to be told what is
+intended. One common assumption is that if a DLL is being built
+(`DLL_EXPORT' is defined) then that DLL is going to consume any
+dependent libraries as DLLs. If that assumption is made everywhere, it
+is possible to select how an end-user application is consuming
+libraries by adding a single flag `-DDLL_EXPORT' when a DLL build is
+required. This is of course an all or nothing deal, either everything
+as DLLs or everything as static libraries.
+
+ To sum up the above, the header file of the foo library needs to be
+changed into something like this:
+
+ Modified `foo.h':
+
+ #ifndef FOO_H
+ #define FOO_H
+
+ #if defined _WIN32 && !defined __GNUC__
+ # ifdef LIBFOO_BUILD
+ # ifdef DLL_EXPORT
+ # define LIBFOO_SCOPE __declspec (dllexport)
+ # define LIBFOO_SCOPE_VAR extern __declspec (dllexport)
+ # endif
+ # elif defined _MSC_VER
+ # define LIBFOO_SCOPE
+ # define LIBFOO_SCOPE_VAR extern __declspec (dllimport)
+ # elif defined DLL_EXPORT
+ # define LIBFOO_SCOPE __declspec (dllimport)
+ # define LIBFOO_SCOPE_VAR extern __declspec (dllimport)
+ # endif
+ #endif
+ #ifndef LIBFOO_SCOPE
+ # define LIBFOO_SCOPE
+ # define LIBFOO_SCOPE_VAR extern
+ #endif
+
+ LIBFOO_SCOPE int one (void);
+ LIBFOO_SCOPE int two (void);
+ LIBFOO_SCOPE_VAR int three;
+
+ #endif /* FOO_H */
+
+ When the targets are limited to contemporary GNU tools and Microsoft
+tools, the above can be simplified to the following:
+
+ Simplified `foo.h':
+
+ #ifndef FOO_H
+ #define FOO_H
+
+ #if defined _WIN32 && !defined __GNUC__ && !defined LIBFOO_BUILD
+ # define LIBFOO_SCOPE_VAR extern __declspec (dllimport)
+ #else
+ # define LIBFOO_SCOPE_VAR extern
+ #endif
+
+ int one (void);
+ int two (void);
+ LIBFOO_SCOPE_VAR int three;
+
+ #endif /* FOO_H */
+
+ This last simplified version can of course only work when Libtool is
+used to build the DLL, as no symbols would be exported otherwise (i.e.,
+when using Microsoft tools).
+
+ It should be noted that there are various projects that attempt to
+relax these requirements by various low level tricks, but they are not
+discussed here. Examples are FlexDLL
+(http://alain.frisch.fr/flexdll.html) and edll
+(http://edll.sourceforge.net/).
+
+
+File: libtool.info, Node: libtool script contents, Next: Cheap tricks, Prev: Platform quirks, Up: Maintaining
+
+15.4 `libtool' script contents
+==============================
+
+Since version 1.4, the `libtool' script is generated by `configure'
+(*note Configuring::). In earlier versions, `configure' achieved this
+by calling a helper script called `ltconfig'. From libtool version 0.7
+to 1.0, this script simply set shell variables, then sourced the
+libtool backend, `ltmain.sh'. `ltconfig' from libtool version 1.1
+through 1.3 inlined the contents of `ltmain.sh' into the generated
+`libtool', which improved performance on many systems. The tests that
+`ltconfig' used to perform are now kept in `libtool.m4' where they can
+be written using Autoconf. This has the runtime performance benefits
+of inlined `ltmain.sh', _and_ improves the build time a little while
+considerably easing the amount of raw shell code that used to need
+maintaining.
+
+ The convention used for naming variables that hold shell commands for
+delayed evaluation, is to use the suffix `_cmd' where a single line of
+valid shell script is needed, and the suffix `_cmds' where multiple
+lines of shell script *may* be delayed for later evaluation. By
+convention, `_cmds' variables delimit the evaluation units with the `~'
+character where necessary.
+
+ Here is a listing of each of the configuration variables, and how
+they are used within `ltmain.sh' (*note Configuring::):
+
+ -- Variable: AR
+ The name of the system library archiver.
+
+ -- Variable: CC
+ The name of the compiler used to configure libtool. This will
+ always contain the compiler for the current language (*note
+ Tags::).
+
+ -- Variable: ECHO
+ An `echo' program that does not interpret backslashes as an escape
+ character. It may be given only one argument, so due quoting is
+ necessary.
+
+ -- Variable: LD
+ The name of the linker that libtool should use internally for
+ reloadable linking and possibly shared libraries.
+
+ -- Variable: LTCC
+ -- Variable: LTCFLAGS
+ The name of the C compiler and C compiler flags used to configure
+ libtool.
+
+ -- Variable: NM
+ The name of a BSD- or MS-compatible program that produces listings
+ of global symbols. For BSD `nm', the symbols should be in one the
+ following formats:
+
+ ADDRESS C GLOBAL-VARIABLE-NAME
+ ADDRESS D GLOBAL-VARIABLE-NAME
+ ADDRESS T GLOBAL-FUNCTION-NAME
+
+ For MS `dumpbin', the symbols should be in one of the following
+ formats:
+
+ COUNTER SIZE UNDEF notype External | GLOBAL-VAR
+ COUNTER ADDRESS SECTION notype External | GLOBAL-VAR
+ COUNTER ADDRESS SECTION notype () External | GLOBAL-FUNC
+
+ The SIZE of the global variables are not zero and the SECTION of
+ the global functions are not "UNDEF". Symbols in "pick any"
+ sections ("pick any" appears in the section header) are not global
+ either.
+
+ -- Variable: RANLIB
+ Set to the name of the `ranlib' program, if any.
+
+ -- Variable: allow_undefined_flag
+ The flag that is used by `archive_cmds' in order to declare that
+ there will be unresolved symbols in the resulting shared library.
+ Empty, if no such flag is required. Set to `unsupported' if there
+ is no way to generate a shared library with references to symbols
+ that aren't defined in that library.
+
+ -- Variable: always_export_symbols
+ Whether libtool should automatically generate a list of exported
+ symbols using `export_symbols_cmds' before linking an archive.
+ Set to `yes' or `no'. Default is `no'.
+
+ -- Variable: archive_cmds
+ -- Variable: archive_expsym_cmds
+ -- Variable: old_archive_cmds
+ Commands used to create shared libraries, shared libraries with
+ `-export-symbols' and static libraries, respectively.
+
+ -- Variable: archiver_list_spec
+ Specify filename containing input files for `AR'.
+
+ -- Variable: old_archive_from_new_cmds
+ If the shared library depends on a static library,
+ `old_archive_from_new_cmds' contains the commands used to create
+ that static library. If this variable is not empty,
+ `old_archive_cmds' is not used.
+
+ -- Variable: old_archive_from_expsyms_cmds
+ If a static library must be created from the export symbol list in
+ order to correctly link with a shared library,
+ `old_archive_from_expsyms_cmds' contains the commands needed to
+ create that static library. When these commands are executed, the
+ variable `soname' contains the name of the shared library in
+ question, and the `$objdir/$newlib' contains the path of the
+ static library these commands should build. After executing these
+ commands, libtool will proceed to link against `$objdir/$newlib'
+ instead of `soname'.
+
+ -- Variable: lock_old_archive_extraction
+ Set to `yes' if the extraction of a static library requires locking
+ the library file. This is required on Darwin.
+
+ -- Variable: build
+ -- Variable: build_alias
+ -- Variable: build_os
+ Set to the specified and canonical names of the system that
+ libtool was built on.
+
+ -- Variable: build_libtool_libs
+ Whether libtool should build shared libraries on this system. Set
+ to `yes' or `no'.
+
+ -- Variable: build_old_libs
+ Whether libtool should build static libraries on this system. Set
+ to `yes' or `no'.
+
+ -- Variable: compiler_c_o
+ Whether the compiler supports the `-c' and `-o' options
+ simultaneously. Set to `yes' or `no'.
+
+ -- Variable: compiler_needs_object
+ Whether the compiler has to see an object listed on the command
+ line in order to successfully invoke the linker. If `no', then a
+ set of convenience archives or a set of object file names can be
+ passed via linker-specific options or linker scripts.
+
+ -- Variable: dlopen_support
+ Whether `dlopen' is supported on the platform. Set to `yes' or
+ `no'.
+
+ -- Variable: dlopen_self
+ Whether it is possible to `dlopen' the executable itself. Set to
+ `yes' or `no'.
+
+ -- Variable: dlopen_self_static
+ Whether it is possible to `dlopen' the executable itself, when it
+ is linked statically (`-all-static'). Set to `yes' or `no'.
+
+ -- Variable: exclude_expsyms
+ List of symbols that should not be listed in the preloaded symbols.
+
+ -- Variable: export_dynamic_flag_spec
+ Compiler link flag that allows a dlopened shared library to
+ reference symbols that are defined in the program.
+
+ -- Variable: export_symbols_cmds
+ Commands to extract exported symbols from `libobjs' to the file
+ `export_symbols'.
+
+ -- Variable: extract_expsyms_cmds
+ Commands to extract the exported symbols list from a shared
+ library. These commands are executed if there is no file
+ `$objdir/$soname-def', and should write the names of the exported
+ symbols to that file, for the use of
+ `old_archive_from_expsyms_cmds'.
+
+ -- Variable: fast_install
+ Determines whether libtool will privilege the installer or the
+ developer. The assumption is that installers will seldom run
+ programs in the build tree, and the developer will seldom install.
+ This is only meaningful on platforms where
+ `shlibpath_overrides_runpath' is not `yes', so `fast_install' will
+ be set to `needless' in this case. If `fast_install' set to
+ `yes', libtool will create programs that search for installed
+ libraries, and, if a program is run in the build tree, a new copy
+ will be linked on-demand to use the yet-to-be-installed libraries.
+ If set to `no', libtool will create programs that use the
+ yet-to-be-installed libraries, and will link a new copy of the
+ program at install time. The default value is `yes' or
+ `needless', depending on platform and configuration flags, and it
+ can be turned from `yes' to `no' with the configure flag
+ `--disable-fast-install'.
+
+ On some systems, the linker always hardcodes paths to dependent
+ libraries into the output. In this case, `fast_install' is never
+ set to `yes', and relinking at install time is triggered. This
+ also means that `DESTDIR' installation does not work as expected.
+
+ -- Variable: file_magic_glob
+ How to find potential files when `deplibs_check_method' is
+ `file_magic'. `file_magic_glob' is a `sed' expression, and the
+ `sed' instance is fed potential file names that are transformed by
+ the `file_magic_glob' expression. Useful when the shell does not
+ support the shell option `nocaseglob', making `want_nocaseglob'
+ inappropriate. Normally disabled (i.e. `file_magic_glob' is
+ empty).
+
+ -- Variable: finish_cmds
+ Commands to tell the dynamic linker how to find shared libraries
+ in a specific directory.
+
+ -- Variable: finish_eval
+ Same as `finish_cmds', except the commands are not displayed.
+
+ -- Variable: global_symbol_pipe
+ A pipeline that takes the output of `NM', and produces a listing of
+ raw symbols followed by their C names. For example:
+
+ $ eval "$NM progname | $global_symbol_pipe"
+ D SYMBOL1 C-SYMBOL1
+ T SYMBOL2 C-SYMBOL2
+ C SYMBOL3 C-SYMBOL3
+ ...
+ $
+
+ The first column contains the symbol type (used to tell data from
+ code) but its meaning is system dependent.
+
+ -- Variable: global_symbol_to_cdecl
+ A pipeline that translates the output of `global_symbol_pipe' into
+ proper C declarations. Since some platforms, such as HP/UX, have
+ linkers that differentiate code from data, data symbols are
+ declared as data, and code symbols are declared as functions.
+
+ -- Variable: hardcode_action
+ Either `immediate' or `relink', depending on whether shared
+ library paths can be hardcoded into executables before they are
+ installed, or if they need to be relinked.
+
+ -- Variable: hardcode_direct
+ Set to `yes' or `no', depending on whether the linker hardcodes
+ directories if a library is directly specified on the command line
+ (such as `DIR/libNAME.a') when `hardcode_libdir_flag_spec' is
+ specified.
+
+ -- Variable: hardcode_direct_absolute
+ Some architectures hardcode "absolute" library directories that
+ can not be overridden by `shlibpath_var' when `hardcode_direct' is
+ `yes'. In that case set `hardcode_direct_absolute' to `yes', or
+ otherwise `no'.
+
+ -- Variable: hardcode_into_libs
+ Whether the platform supports hardcoding of run-paths into
+ libraries. If enabled, linking of programs will be much simpler
+ but libraries will need to be relinked during installation. Set
+ to `yes' or `no'.
+
+ -- Variable: hardcode_libdir_flag_spec
+ Flag to hardcode a `libdir' variable into a binary, so that the
+ dynamic linker searches `libdir' for shared libraries at runtime.
+ If it is empty, libtool will try to use some other hardcoding
+ mechanism.
+
+ -- Variable: hardcode_libdir_separator
+ If the compiler only accepts a single `hardcode_libdir_flag', then
+ this variable contains the string that should separate multiple
+ arguments to that flag.
+
+ -- Variable: hardcode_minus_L
+ Set to `yes' or `no', depending on whether the linker hardcodes
+ directories specified by `-L' flags into the resulting executable
+ when `hardcode_libdir_flag_spec' is specified.
+
+ -- Variable: hardcode_shlibpath_var
+ Set to `yes' or `no', depending on whether the linker hardcodes
+ directories by writing the contents of `$shlibpath_var' into the
+ resulting executable when `hardcode_libdir_flag_spec' is
+ specified. Set to `unsupported' if directories specified by
+ `$shlibpath_var' are searched at run time, but not at link time.
+
+ -- Variable: host
+ -- Variable: host_alias
+ -- Variable: host_os
+ Set to the specified and canonical names of the system that
+ libtool was configured for.
+
+ -- Variable: include_expsyms
+ List of symbols that must always be exported when using
+ `export_symbols'.
+
+ -- Variable: inherit_rpath
+ Whether the linker adds runtime paths of dependency libraries to
+ the runtime path list, requiring libtool to relink the output when
+ installing. Set to `yes' or `no'. Default is `no'.
+
+ -- Variable: install_override_mode
+ Permission mode override for installation of shared libraries. If
+ the runtime linker fails to load libraries with wrong permissions,
+ then it may fail to execute programs that are needed during
+ installation, because these need the library that has just been
+ installed. In this case, it is necessary to pass the mode to
+ `install' with `-m INSTALL_OVERRIDE_MODE'.
+
+ -- Variable: libext
+ The standard old archive suffix (normally `a').
+
+ -- Variable: libname_spec
+ The format of a library name prefix. On all Unix systems, static
+ libraries are called `libNAME.a', but on some systems (such as
+ OS/2 or MS-DOS), the library is just called `NAME.a'.
+
+ -- Variable: library_names_spec
+ A list of shared library names. The first is the name of the file,
+ the rest are symbolic links to the file. The name in the list is
+ the file name that the linker finds when given `-lNAME'.
+
+ -- Variable: link_all_deplibs
+ Whether libtool must link a program against all its dependency
+ libraries. Set to `yes' or `no'. Default is `unknown', which is
+ a synonym for `yes'.
+
+ -- Variable: link_static_flag
+ Linker flag (passed through the C compiler) used to prevent dynamic
+ linking.
+
+ -- Variable: macro_version
+ -- Variable: macro_revision
+ The release and revision from which the libtool.m4 macros were
+ taken. This is used to ensure that macros and `ltmain.sh'
+ correspond to the same Libtool version.
+
+ -- Variable: max_cmd_len
+ The approximate longest command line that can be passed to `$SHELL'
+ without being truncated, as computed by `LT_CMD_MAX_LEN'.
+
+ -- Variable: need_lib_prefix
+ Whether we can `dlopen' modules without a `lib' prefix. Set to
+ `yes' or `no'. By default, it is `unknown', which means the same
+ as `yes', but documents that we are not really sure about it.
+ `no' means that it is possible to `dlopen' a module without the
+ `lib' prefix.
+
+ -- Variable: need_version
+ Whether versioning is required for libraries, i.e. whether the
+ dynamic linker requires a version suffix for all libraries. Set
+ to `yes' or `no'. By default, it is `unknown', which means the
+ same as `yes', but documents that we are not really sure about it.
+
+ -- Variable: need_locks
+ Whether files must be locked to prevent conflicts when compiling
+ simultaneously. Set to `yes' or `no'.
+
+ -- Variable: nm_file_list_spec
+ Specify filename containing input files for `NM'.
+
+ -- Variable: no_builtin_flag
+ Compiler flag to disable builtin functions that conflict with
+ declaring external global symbols as `char'.
+
+ -- Variable: no_undefined_flag
+ The flag that is used by `archive_cmds' in order to declare that
+ there will be no unresolved symbols in the resulting shared
+ library. Empty, if no such flag is required.
+
+ -- Variable: objdir
+ The name of the directory that contains temporary libtool files.
+
+ -- Variable: objext
+ The standard object file suffix (normally `o').
+
+ -- Variable: pic_flag
+ Any additional compiler flags for building library object files.
+
+ -- Variable: postinstall_cmds
+ -- Variable: old_postinstall_cmds
+ Commands run after installing a shared or static library,
+ respectively.
+
+ -- Variable: postuninstall_cmds
+ -- Variable: old_postuninstall_cmds
+ Commands run after uninstalling a shared or static library,
+ respectively.
+
+ -- Variable: postlink_cmds
+ Commands necessary for finishing linking programs. `postlink_cmds'
+ are executed immediately after the program is linked. Any
+ occurrence of the string `@OUTPUT@' in `postlink_cmds' is replaced
+ by the name of the created executable (i.e. not the wrapper, if a
+ wrapper is generated) prior to execution. Similarly,
+ `@TOOL_OUTPUT@' is replaced by the toolchain format of `@OUTPUT@'.
+ Normally disabled (i.e. `postlink_cmds' empty).
+
+ -- Variable: reload_cmds
+ -- Variable: reload_flag
+ Commands to create a reloadable object. Set `reload_cmds' to
+ `false' on systems that cannot create reloadable objects.
+
+ -- Variable: runpath_var
+ The environment variable that tells the linker which directories to
+ hardcode in the resulting executable.
+
+ -- Variable: shlibpath_overrides_runpath
+ Indicates whether it is possible to override the hard-coded library
+ search path of a program with an environment variable. If this is
+ set to no, libtool may have to create two copies of a program in
+ the build tree, one to be installed and one to be run in the build
+ tree only. When each of these copies is created depends on the
+ value of `fast_install'. The default value is `unknown', which is
+ equivalent to `no'.
+
+ -- Variable: shlibpath_var
+ The environment variable that tells the dynamic linker where to
+ find shared libraries.
+
+ -- Variable: soname_spec
+ The name coded into shared libraries, if different from the real
+ name of the file.
+
+ -- Variable: striplib
+ -- Variable: old_striplib
+ Command to strip a shared (`striplib') or static (`old_striplib')
+ library, respectively. If these variables are empty, the strip
+ flag in the install mode will be ignored for libraries (*note
+ Install mode::).
+
+ -- Variable: sys_lib_dlsearch_path_spec
+ Expression to get the run-time system library search path.
+ Directories that appear in this list are never hard-coded into
+ executables.
+
+ -- Variable: sys_lib_search_path_spec
+ Expression to get the compile-time system library search path.
+ This variable is used by libtool when it has to test whether a
+ certain library is shared or static. The directories listed in
+ `shlibpath_var' are automatically appended to this list, every time
+ libtool runs (i.e., not at configuration time), because some
+ linkers use this variable to extend the library search path.
+ Linker switches such as `-L' also augment the search path.
+
+ -- Variable: thread_safe_flag_spec
+ Linker flag (passed through the C compiler) used to generate
+ thread-safe libraries.
+
+ -- Variable: to_host_file_cmd
+ If the toolchain is not native to the build platform (e.g. if you
+ are using MSYS to drive the scripting, but are using the MinGW
+ native Windows compiler) this variable describes how to convert
+ file names from the format used by the build platform to the
+ format used by host platform. Normally set to
+ `func_convert_file_noop', libtool will autodetect most cases in
+ which other values should be used. On rare occasions, it may be
+ necessary to override the autodetected value (*note Cygwin to
+ MinGW Cross::).
+
+ -- Variable: to_tool_file_cmd
+ If the toolchain is not native to the build platform (e.g. if you
+ are using some Unix to drive the scripting together with a Windows
+ toolchain running in Wine) this variable describes how to convert
+ file names from the format used by the build platform to the
+ format used by the toolchain. Normally set to
+ `func_convert_file_noop'.
+
+ -- Variable: version_type
+ The library version numbering type. One of `libtool',
+ `freebsd-aout', `freebsd-elf', `irix', `linux', `osf', `sunos',
+ `windows', or `none'.
+
+ -- Variable: want_nocaseglob
+ Find potential files using the shell option `nocaseglob', when
+ `deplibs_check_method' is `file_magic'. Normally set to `no'. Set
+ to `yes' to enable the `nocaseglob' shell option when looking for
+ potential file names in a case-insensitive manner.
+
+ -- Variable: whole_archive_flag_spec
+ Compiler flag to generate shared objects from convenience archives.
+
+ -- Variable: wl
+ The C compiler flag that allows libtool to pass a flag directly to
+ the linker. Used as: `${wl}SOME-FLAG'.
+
+ Variables ending in `_cmds' or `_eval' contain a `~'-separated list
+of commands that are `eval'ed one after another. If any of the
+commands return a nonzero exit status, libtool generally exits with an
+error message.
+
+ Variables ending in `_spec' are `eval'ed before being used by
+libtool.
+
+
+File: libtool.info, Node: Cheap tricks, Prev: libtool script contents, Up: Maintaining
+
+15.5 Cheap tricks
+=================
+
+Here are a few tricks that you can use in order to make maintainership
+easier:
+
+ * When people report bugs, ask them to use the `--config',
+ `--debug', or `--features' flags, if you think they will help you.
+ These flags are there to help you get information directly, rather
+ than having to trust second-hand observation.
+
+ * Rather than reconfiguring libtool every time I make a change to
+ `ltmain.in', I keep a permanent `libtool' script in my `PATH',
+ which sources `ltmain.in' directly.
+
+ The following steps describe how to create such a script, where
+ `/home/src/libtool' is the directory containing the libtool source
+ tree, `/home/src/libtool/libtool' is a libtool script that has been
+ configured for your platform, and `~/bin' is a directory in your
+ `PATH':
+
+ trick$ cd ~/bin
+ trick$ sed 's%^\(macro_version=\).*$%\1@VERSION@%;
+ s%^\(macro_revision=\).*$%\1@package_revision@%;
+ /^# ltmain\.sh/q' /home/src/libtool/libtool > libtool
+ trick$ echo '. /home/src/libtool/ltmain.in' >> libtool
+ trick$ chmod +x libtool
+ trick$ libtool --version
+ ltmain.sh (GNU @PACKAGE@@TIMESTAMP@) @VERSION@
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ This is free software; see the source for copying conditions. There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ trick$
+
+ The output of the final `libtool --version' command shows that the
+`ltmain.in' script is being used directly. Now, modify `~/bin/libtool'
+or `/home/src/libtool/ltmain.in' directly in order to test new changes
+without having to rerun `configure'.
+
diff --git a/gtk+-mingw/share/info/libtool.info-2 b/gtk+-mingw/share/info/libtool.info-2
new file mode 100644
index 0000000..607fef5
--- /dev/null
+++ b/gtk+-mingw/share/info/libtool.info-2
@@ -0,0 +1,1227 @@
+This is doc/libtool.info, produced by makeinfo version 4.13 from
+./doc/libtool.texi.
+
+INFO-DIR-SECTION GNU programming tools
+START-INFO-DIR-ENTRY
+* Libtool: (libtool). Generic shared library support script.
+END-INFO-DIR-ENTRY
+
+INFO-DIR-SECTION Individual utilities
+START-INFO-DIR-ENTRY
+* libtool-invocation: (libtool)Invoking libtool.
+ Running the `libtool' script.
+* libtoolize: (libtool)Invoking libtoolize. Adding libtool support.
+END-INFO-DIR-ENTRY
+
+ This file documents GNU Libtool 2.4.2
+
+ Copyright (C) 1996-2011 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the section entitled "GNU
+Free Documentation License".
+
+
+File: libtool.info, Node: GNU Free Documentation License, Next: Combined Index, Prev: Maintaining, Up: Top
+
+Appendix A GNU Free Documentation License
+*****************************************
+
+ Version 1.3, 3 November 2008
+
+ Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+ `http://fsf.org/'
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document "free" in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book.
+ We recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it
+ can be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You
+ accept the license if you copy, modify or distribute the work in a
+ way requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in
+ the notice that says that the Document is released under this
+ License. If a section does not fit the above definition of
+ Secondary then it is not allowed to be designated as Invariant.
+ The Document may contain zero Invariant Sections. If the Document
+ does not identify any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images
+ composed of pixels) generic paint programs or (for drawings) some
+ widely available drawing editor, and that is suitable for input to
+ text formatters or for automatic translation to a variety of
+ formats suitable for input to text formatters. A copy made in an
+ otherwise Transparent file format whose markup, or absence of
+ markup, has been arranged to thwart or discourage subsequent
+ modification by readers is not Transparent. An image format is
+ not Transparent if used for any substantial amount of text. A
+ copy that is not "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and
+ standard-conforming simple HTML, PostScript or PDF designed for
+ human modification. Examples of transparent image formats include
+ PNG, XCF and JPG. Opaque formats include proprietary formats that
+ can be read and edited only by proprietary word processors, SGML or
+ XML for which the DTD and/or processing tools are not generally
+ available, and the machine-generated HTML, PostScript or PDF
+ produced by some word processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ The "publisher" means any person or entity that distributes copies
+ of the Document to the public.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow
+ the conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the
+ title equally prominent and visible. You may add other material
+ on the covers in addition. Copying with changes limited to the
+ covers, as long as they preserve the title of the Document and
+ satisfy these conditions, can be treated as verbatim copying in
+ other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a
+ machine-readable Transparent copy along with each Opaque copy, or
+ state in or with each Opaque copy a computer-network location from
+ which the general network-using public has access to download
+ using public-standard network protocols a complete Transparent
+ copy of the Document, free of added material. If you use the
+ latter option, you must take reasonably prudent steps, when you
+ begin distribution of Opaque copies in quantity, to ensure that
+ this Transparent copy will remain thus accessible at the stated
+ location until at least one year after the last time you
+ distribute an Opaque copy (directly or through your agents or
+ retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of
+ copies, to give them a chance to provide you with an updated
+ version of the Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with
+ the Modified Version filling the role of the Document, thus
+ licensing distribution and modification of the Modified Version to
+ whoever possesses a copy of it. In addition, you must do these
+ things in the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of
+ previous versions (which should, if there were any, be listed
+ in the History section of the Document). You may use the
+ same title as a previous version if the original publisher of
+ that version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on
+ the Title Page. If there is no section Entitled "History" in
+ the Document, create one stating the title, year, authors,
+ and publisher of the Document as given on its Title Page,
+ then add an item describing the Modified Version as stated in
+ the previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in
+ the "History" section. You may omit a network location for a
+ work that was published at least four years before the
+ Document itself, or if the original publisher of the version
+ it refers to gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the
+ section all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section
+ titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option
+ designate some or all of these sections as invariant. To do this,
+ add their titles to the list of Invariant Sections in the Modified
+ Version's license notice. These titles must be distinct from any
+ other section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end
+ of the list of Cover Texts in the Modified Version. Only one
+ passage of Front-Cover Text and one of Back-Cover Text may be
+ added by (or through arrangements made by) any one entity. If the
+ Document already includes a cover text for the same cover,
+ previously added by you or by arrangement made by the same entity
+ you are acting on behalf of, you may not add another; but you may
+ replace the old one, on explicit permission from the previous
+ publisher that added the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination
+ all of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the
+ documents in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow
+ this License in all other respects regarding verbatim copying of
+ that document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of
+ a storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly
+ and finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from
+ you under this License. If your rights have been terminated and
+ not permanently reinstated, receipt of a copy of some or all of
+ the same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ `http://www.gnu.org/copyleft/'.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If
+ the Document does not specify a version number of this License,
+ you may choose any version ever published (not as a draft) by the
+ Free Software Foundation. If the Document specifies that a proxy
+ can decide which future versions of this License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+ "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ "Incorporate" means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is "eligible for relicensing" if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
+
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with
+ the Front-Cover Texts being LIST, and with the Back-Cover Texts
+ being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+
+File: libtool.info, Node: Combined Index, Prev: GNU Free Documentation License, Up: Top
+
+Combined Index
+**************
+
+
+* Menu:
+
+* -no-suppress, libtool compile mode option: Creating object files.
+ (line 92)
+* -weak option: Linking with dlopened modules.
+ (line 94)
+* .la files: Linking libraries. (line 24)
+* .libs subdirectory: Linking libraries. (line 77)
+* .lo files: Creating object files.
+ (line 28)
+* AC_CONFIG_AUX_DIR: Invoking libtoolize. (line 157)
+* AC_CONFIG_MACRO_DIR: Invoking libtoolize. (line 136)
+* AC_DISABLE_FAST_INSTALL: LT_INIT. (line 185)
+* AC_DISABLE_SHARED: LT_INIT. (line 189)
+* AC_DISABLE_STATIC: LT_INIT. (line 206)
+* AC_ENABLE_SHARED: LT_INIT. (line 197)
+* AC_ENABLE_STATIC: LT_INIT. (line 214)
+* AC_LIBLTDL_CONVENIENCE: Distributing libltdl.
+ (line 302)
+* AC_LIBLTDL_INSTALLABLE: Distributing libltdl.
+ (line 297)
+* AC_LIBTOOL_DLOPEN: LT_INIT. (line 177)
+* AC_LIBTOOL_WIN32_DLL: LT_INIT. (line 181)
+* AC_PROG_LIBTOOL: LT_INIT. (line 22)
+* AC_WITH_LTDL: Distributing libltdl.
+ (line 42)
+* aclocal: LT_INIT. (line 322)
+* allow_undefined_flag: libtool script contents.
+ (line 76)
+* always_export_symbols: libtool script contents.
+ (line 83)
+* AM_DISABLE_SHARED: LT_INIT. (line 190)
+* AM_DISABLE_STATIC: LT_INIT. (line 207)
+* AM_ENABLE_SHARED: LT_INIT. (line 198)
+* AM_ENABLE_STATIC: LT_INIT. (line 215)
+* AM_PROG_LIBTOOL: LT_INIT. (line 23)
+* application-level dynamic linking <1>: Dlopened modules. (line 6)
+* application-level dynamic linking: Using libltdl. (line 6)
+* ar: Linking libraries. (line 6)
+* AR: libtool script contents.
+ (line 30)
+* archive_cmds: libtool script contents.
+ (line 88)
+* archive_expsym_cmds: libtool script contents.
+ (line 89)
+* archiver_list_spec: libtool script contents.
+ (line 94)
+* AS: LT_INIT. (line 278)
+* autoconf traces: Trace interface. (line 6)
+* avoiding shared libraries: Static-only libraries.
+ (line 6)
+* bug reports: Reporting bugs. (line 6)
+* buggy system linkers: Linking executables. (line 11)
+* bugs, subtle ones caused by buggy linkers: Linking executables.
+ (line 16)
+* build: libtool script contents.
+ (line 118)
+* build_alias: libtool script contents.
+ (line 119)
+* build_libtool_libs: libtool script contents.
+ (line 124)
+* build_old_libs: libtool script contents.
+ (line 128)
+* build_os: libtool script contents.
+ (line 120)
+* C header files, portable: C header files. (line 6)
+* C++, pitfalls: C++ libraries. (line 6)
+* C++, using: Other languages. (line 6)
+* C, not using: Other languages. (line 6)
+* CC <1>: LT_INIT. (line 228)
+* CC: libtool script contents.
+ (line 33)
+* cdemo-conf.test: Test descriptions. (line 21)
+* cdemo-exec.test: Test descriptions. (line 21)
+* cdemo-make.test: Test descriptions. (line 21)
+* cdemo-shared-exec.test: Test descriptions. (line 21)
+* cdemo-shared-make.test: Test descriptions. (line 21)
+* cdemo-shared.test: Test descriptions. (line 21)
+* cdemo-static-exec.test: Test descriptions. (line 21)
+* cdemo-static-make.test: Test descriptions. (line 21)
+* cdemo-static.test: Test descriptions. (line 21)
+* cdemo-undef-exec.test: Test descriptions. (line 21)
+* cdemo-undef-make.test: Test descriptions. (line 21)
+* cdemo-undef.test: Test descriptions. (line 21)
+* CFLAGS: LT_INIT. (line 232)
+* check-interactive: Test descriptions. (line 334)
+* check-noninteractive: Test descriptions. (line 334)
+* clean mode: Clean mode. (line 6)
+* command options, libtool: Invoking libtool. (line 6)
+* command options, libtoolize: Invoking libtoolize. (line 6)
+* compile mode: Compile mode. (line 6)
+* compiler_c_o: libtool script contents.
+ (line 132)
+* compiler_needs_object: libtool script contents.
+ (line 136)
+* compiling object files: Creating object files.
+ (line 6)
+* complexity of library systems: Postmortem. (line 11)
+* config.guess: Distributing. (line 10)
+* config.sub: Distributing. (line 13)
+* configuring libtool: Configuring. (line 6)
+* convenience libraries: Static libraries. (line 6)
+* CPPFLAGS: LT_INIT. (line 237)
+* cross compile: Cross compiling. (line 6)
+* Cygwin to MinGW Cross: Cygwin to MinGW Cross.
+ (line 6)
+* debugging libraries: Static-only libraries.
+ (line 6)
+* definition of libraries: Libtool paradigm. (line 11)
+* demo-conf.test: Test descriptions. (line 66)
+* demo-deplibs.test: Test descriptions. (line 84)
+* demo-exec.test: Test descriptions. (line 66)
+* demo-hardcode.test: Test descriptions. (line 90)
+* demo-inst.test: Test descriptions. (line 66)
+* demo-make.test: Test descriptions. (line 66)
+* demo-nofast-exec.test: Test descriptions. (line 66)
+* demo-nofast-inst.test: Test descriptions. (line 66)
+* demo-nofast-make.test: Test descriptions. (line 66)
+* demo-nofast-unst.test: Test descriptions. (line 66)
+* demo-nofast.test: Test descriptions. (line 66)
+* demo-noinst-link.test: Test descriptions. (line 104)
+* demo-nopic-exec.test: Test descriptions. (line 66)
+* demo-nopic-make.test: Test descriptions. (line 66)
+* demo-nopic.test: Test descriptions. (line 66)
+* demo-pic-exec.test: Test descriptions. (line 66)
+* demo-pic-make.test: Test descriptions. (line 66)
+* demo-pic.test: Test descriptions. (line 66)
+* demo-relink.test: Test descriptions. (line 99)
+* demo-shared-exec.test: Test descriptions. (line 66)
+* demo-shared-inst.test: Test descriptions. (line 66)
+* demo-shared-make.test: Test descriptions. (line 66)
+* demo-shared-unst.test: Test descriptions. (line 66)
+* demo-shared.test: Test descriptions. (line 66)
+* demo-static-exec.test: Test descriptions. (line 66)
+* demo-static-inst.test: Test descriptions. (line 66)
+* demo-static-make.test: Test descriptions. (line 66)
+* demo-static-unst.test: Test descriptions. (line 66)
+* demo-static.test: Test descriptions. (line 66)
+* demo-unst.test: Test descriptions. (line 66)
+* depdemo-conf.test: Test descriptions. (line 128)
+* depdemo-exec.test: Test descriptions. (line 128)
+* depdemo-inst.test: Test descriptions. (line 128)
+* depdemo-make.test: Test descriptions. (line 128)
+* depdemo-nofast-exec.test: Test descriptions. (line 128)
+* depdemo-nofast-inst.test: Test descriptions. (line 128)
+* depdemo-nofast-make.test: Test descriptions. (line 128)
+* depdemo-nofast-unst.test: Test descriptions. (line 128)
+* depdemo-nofast.test: Test descriptions. (line 128)
+* depdemo-relink.test: Test descriptions. (line 99)
+* depdemo-shared-exec.test: Test descriptions. (line 128)
+* depdemo-shared-inst.test: Test descriptions. (line 128)
+* depdemo-shared-make.test: Test descriptions. (line 128)
+* depdemo-shared-unst.test: Test descriptions. (line 128)
+* depdemo-shared.test: Test descriptions. (line 128)
+* depdemo-static-exec.test: Test descriptions. (line 128)
+* depdemo-static-inst.test: Test descriptions. (line 128)
+* depdemo-static-make.test: Test descriptions. (line 128)
+* depdemo-static-unst.test: Test descriptions. (line 128)
+* depdemo-static.test: Test descriptions. (line 128)
+* depdemo-unst.test: Test descriptions. (line 128)
+* dependencies between libraries: Inter-library dependencies.
+ (line 6)
+* dependency versioning: Versioning. (line 6)
+* deplibs_check_method: Porting inter-library dependencies.
+ (line 6)
+* design issues: Issues. (line 6)
+* design of library interfaces: Library tips. (line 6)
+* design philosophy: Motivation. (line 6)
+* developing libraries: Static-only libraries.
+ (line 6)
+* dlclose <1>: Dlopened modules. (line 6)
+* dlclose: Using libltdl. (line 6)
+* dlerror: Using libltdl. (line 6)
+* DLLTOOL: LT_INIT. (line 270)
+* dlopen <1>: Dlopened modules. (line 6)
+* dlopen: Using libltdl. (line 6)
+* dlopen_self: libtool script contents.
+ (line 146)
+* dlopen_self_static: libtool script contents.
+ (line 150)
+* dlopen_support: libtool script contents.
+ (line 142)
+* dlopening modules <1>: Dlopened modules. (line 6)
+* dlopening modules: Using libltdl. (line 6)
+* dlopening, pitfalls: Dlopen issues. (line 6)
+* dlsym <1>: Dlopened modules. (line 6)
+* dlsym: Using libltdl. (line 6)
+* double-compilation, avoiding: Static-only libraries.
+ (line 6)
+* dynamic dependencies: Versioning. (line 6)
+* dynamic linking, applications <1>: Using libltdl. (line 6)
+* dynamic linking, applications: Dlopened modules. (line 6)
+* dynamic modules, names: Finding the dlname. (line 6)
+* ECHO: libtool script contents.
+ (line 38)
+* eliding shared libraries: Static-only libraries.
+ (line 6)
+* examples of using libtool: Using libtool. (line 6)
+* exclude_expsyms: libtool script contents.
+ (line 154)
+* execute mode: Execute mode. (line 6)
+* export_dynamic_flag_spec: libtool script contents.
+ (line 157)
+* export_symbols_cmds: libtool script contents.
+ (line 161)
+* extract_expsyms_cmds: libtool script contents.
+ (line 165)
+* f77demo-conf.test: Test descriptions. (line 263)
+* f77demo-exec.test: Test descriptions. (line 263)
+* f77demo-make.test: Test descriptions. (line 263)
+* f77demo-shared-exec.test: Test descriptions. (line 263)
+* f77demo-shared-make.test: Test descriptions. (line 263)
+* f77demo-shared.test: Test descriptions. (line 263)
+* f77demo-static-exec.test: Test descriptions. (line 263)
+* f77demo-static-make.test: Test descriptions. (line 263)
+* f77demo-static.test: Test descriptions. (line 263)
+* failed tests: When tests fail. (line 6)
+* fast_install: libtool script contents.
+ (line 172)
+* fcdemo-conf.test: Test descriptions. (line 281)
+* fcdemo-exec.test: Test descriptions. (line 281)
+* fcdemo-make.test: Test descriptions. (line 281)
+* fcdemo-shared-exec.test: Test descriptions. (line 281)
+* fcdemo-shared-make.test: Test descriptions. (line 281)
+* fcdemo-shared.test: Test descriptions. (line 281)
+* fcdemo-static-exec.test: Test descriptions. (line 281)
+* fcdemo-static-make.test: Test descriptions. (line 281)
+* fcdemo-static.test: Test descriptions. (line 281)
+* FDL, GNU Free Documentation License: GNU Free Documentation License.
+ (line 6)
+* file name conversion: File name conversion.
+ (line 6)
+* File Name Conversion - Cygwin to Windows: Cygwin/Windows File Name Conversion.
+ (line 6)
+* File Name Conversion - Failure: File Name Conversion Failure.
+ (line 6)
+* File Name Conversion - MinGW: Native MinGW File Name Conversion.
+ (line 6)
+* File Name Conversion - Unix to Windows: Unix/Windows File Name Conversion.
+ (line 6)
+* file_magic: Porting inter-library dependencies.
+ (line 18)
+* file_magic_cmd: Porting inter-library dependencies.
+ (line 18)
+* file_magic_glob: libtool script contents.
+ (line 194)
+* file_magic_test_file: Porting inter-library dependencies.
+ (line 18)
+* finish mode: Finish mode. (line 6)
+* finish_cmds: libtool script contents.
+ (line 203)
+* finish_eval: libtool script contents.
+ (line 207)
+* formal versioning: Libtool versioning. (line 6)
+* func_convert_file_cygwin_to_w32: Cygwin to MinGW Cross.
+ (line 61)
+* global functions: Library tips. (line 45)
+* global_symbol_pipe: libtool script contents.
+ (line 210)
+* global_symbol_to_cdecl: libtool script contents.
+ (line 224)
+* hardcode_action: libtool script contents.
+ (line 230)
+* hardcode_direct: libtool script contents.
+ (line 235)
+* hardcode_direct_absolute: libtool script contents.
+ (line 241)
+* hardcode_into_libs: libtool script contents.
+ (line 247)
+* hardcode_libdir_flag_spec: libtool script contents.
+ (line 253)
+* hardcode_libdir_separator: libtool script contents.
+ (line 259)
+* hardcode_minus_L: libtool script contents.
+ (line 264)
+* hardcode_shlibpath_var: libtool script contents.
+ (line 269)
+* header files: Library tips. (line 39)
+* host: libtool script contents.
+ (line 276)
+* host_alias: libtool script contents.
+ (line 277)
+* host_os: libtool script contents.
+ (line 278)
+* implementation of libtool: libtool script contents.
+ (line 6)
+* include files, portable: C header files. (line 6)
+* include_expsyms: libtool script contents.
+ (line 282)
+* inferring tags: Tags. (line 6)
+* inherit_rpath: libtool script contents.
+ (line 286)
+* install: Installing libraries.
+ (line 19)
+* install mode: Install mode. (line 6)
+* install-sh: Distributing. (line 16)
+* install_override_mode: libtool script contents.
+ (line 291)
+* installation, finishing: Installing libraries.
+ (line 54)
+* inter-library dependencies: Inter-library dependencies.
+ (line 6)
+* inter-library dependency: Porting inter-library dependencies.
+ (line 6)
+* language names: Tags. (line 6)
+* languages, non-C: Other languages. (line 6)
+* LD <1>: LT_INIT. (line 242)
+* LD: libtool script contents.
+ (line 43)
+* LDFLAGS: LT_INIT. (line 247)
+* libext: libtool script contents.
+ (line 299)
+* libltdl: Using libltdl. (line 6)
+* libname_spec: libtool script contents.
+ (line 302)
+* libraries, definition of: Libtool paradigm. (line 11)
+* libraries, finishing installation: Installing libraries.
+ (line 54)
+* libraries, stripping: Installing libraries.
+ (line 44)
+* library interfaces: Interfaces. (line 6)
+* library interfaces, design: Library tips. (line 6)
+* library object file: Creating object files.
+ (line 28)
+* library_names_spec: libtool script contents.
+ (line 307)
+* LIBS: LT_INIT. (line 253)
+* libtool: Invoking libtool. (line 6)
+* libtool command options: Invoking libtool. (line 6)
+* libtool examples: Using libtool. (line 6)
+* libtool implementation: libtool script contents.
+ (line 6)
+* libtool libraries: Linking libraries. (line 24)
+* libtool library versions: Libtool versioning. (line 6)
+* libtool specifications: Motivation. (line 20)
+* libtoolize: Invoking libtoolize. (line 6)
+* libtoolize command options: Invoking libtoolize. (line 6)
+* LIBTOOLIZE_OPTIONS: Invoking libtoolize. (line 120)
+* link mode: Link mode. (line 6)
+* link-2.test: Test descriptions. (line 198)
+* link.test: Test descriptions. (line 194)
+* link_all_deplibs: libtool script contents.
+ (line 312)
+* link_static_flag: libtool script contents.
+ (line 317)
+* linking against installed libraries: Linking executables. (line 6)
+* linking against uninstalled libraries: Linking executables. (line 25)
+* linking with installed libtool libraries: Linking executables.
+ (line 50)
+* linking, dlopen: Linking with dlopened modules.
+ (line 6)
+* linking, dlpreopen: Linking with dlopened modules.
+ (line 6)
+* linking, partial: Link mode. (line 207)
+* LN_S: LT_INIT. (line 265)
+* lock_old_archive_extraction: libtool script contents.
+ (line 114)
+* LT_CMD_MAX_LEN: Autoconf macros. (line 15)
+* LT_CONFIG_LTDL_DIR: Distributing libltdl.
+ (line 32)
+* lt_cv_to_host_file_cmd: Cygwin to MinGW Cross.
+ (line 61)
+* lt_cv_to_tool_file_cmd: Cygwin to MinGW Cross.
+ (line 61)
+* LT_CYGPATH: LT_CYGPATH. (line 6)
+* LT_DIRSEP_CHAR: Libltdl interface. (line 40)
+* lt_dladderror: Module loaders for libltdl.
+ (line 191)
+* lt_dladdsearchdir: Libltdl interface. (line 244)
+* lt_dladvise: Libltdl interface. (line 50)
+* lt_dladvise_destroy: Libltdl interface. (line 147)
+* lt_dladvise_ext: Libltdl interface. (line 154)
+* lt_dladvise_global: Libltdl interface. (line 179)
+* lt_dladvise_init: Libltdl interface. (line 137)
+* lt_dladvise_local: Libltdl interface. (line 196)
+* lt_dladvise_preload: Libltdl interface. (line 222)
+* lt_dladvise_resident: Libltdl interface. (line 213)
+* lt_dlcaller_get_data: User defined module data.
+ (line 154)
+* lt_dlcaller_set_data: User defined module data.
+ (line 128)
+* lt_dlclose: Libltdl interface. (line 228)
+* lt_dlerror: Libltdl interface. (line 238)
+* lt_dlexit: Libltdl interface. (line 66)
+* lt_dlforeachfile: Libltdl interface. (line 264)
+* lt_dlgetinfo: User defined module data.
+ (line 26)
+* lt_dlgetsearchpath: Libltdl interface. (line 260)
+* lt_dlhandle: Libltdl interface. (line 46)
+* lt_dlhandle_fetch: User defined module data.
+ (line 112)
+* lt_dlhandle_interface: User defined module data.
+ (line 40)
+* lt_dlhandle_iterate: User defined module data.
+ (line 97)
+* lt_dlhandle_map: User defined module data.
+ (line 86)
+* lt_dlinfo: User defined module data.
+ (line 12)
+* lt_dlinit: Libltdl interface. (line 61)
+* lt_dlinsertsearchdir: Libltdl interface. (line 249)
+* lt_dlinterface_free: User defined module data.
+ (line 82)
+* lt_dlinterface_id: User defined module data.
+ (line 35)
+* lt_dlinterface_register: User defined module data.
+ (line 74)
+* lt_dlisresident: Libltdl interface. (line 292)
+* lt_dlloader: Module loaders for libltdl.
+ (line 45)
+* lt_dlloader_add: Module loaders for libltdl.
+ (line 132)
+* lt_dlloader_data: Module loaders for libltdl.
+ (line 182)
+* lt_dlloader_exit: Module loaders for libltdl.
+ (line 86)
+* lt_dlloader_find: Module loaders for libltdl.
+ (line 164)
+* lt_dlloader_name: Module loaders for libltdl.
+ (line 176)
+* lt_dlloader_next: Module loaders for libltdl.
+ (line 155)
+* lt_dlloader_remove: Module loaders for libltdl.
+ (line 145)
+* lt_dlmakeresident: Libltdl interface. (line 282)
+* lt_dlopen: Libltdl interface. (line 72)
+* lt_dlopenadvise: Libltdl interface. (line 127)
+* lt_dlopenext: Libltdl interface. (line 110)
+* lt_dlpreload: Dlpreopening. (line 69)
+* lt_dlpreload_callback_func: Dlpreopening. (line 97)
+* lt_dlpreload_default: Dlpreopening. (line 75)
+* lt_dlpreload_open: Dlpreopening. (line 103)
+* lt_dlseterror: Module loaders for libltdl.
+ (line 203)
+* lt_dlsetsearchpath: Libltdl interface. (line 255)
+* lt_dlsym: Libltdl interface. (line 233)
+* lt_dlsymlist <1>: Dlpreopening. (line 42)
+* lt_dlsymlist: Libltdl interface. (line 55)
+* lt_find_sym: Module loaders for libltdl.
+ (line 79)
+* LT_FUNC_DLSYM_USCORE: Autoconf macros. (line 24)
+* LT_INIT: LT_INIT. (line 21)
+* LT_LANG: LT_INIT. (line 155)
+* LT_LIB_DLLOAD: Autoconf macros. (line 35)
+* LT_LIB_M: Autoconf macros. (line 31)
+* lt_module: Module loaders for libltdl.
+ (line 41)
+* lt_module_close: Module loaders for libltdl.
+ (line 72)
+* lt_module_open: Module loaders for libltdl.
+ (line 61)
+* LT_OUTPUT: LT_INIT. (line 309)
+* LT_PATH_LD: Autoconf macros. (line 51)
+* LT_PATH_NM: Autoconf macros. (line 57)
+* LT_PATHSEP_CHAR: Libltdl interface. (line 36)
+* lt_preloaded_symbols: Dlpreopening. (line 47)
+* LT_PREREQ: LT_INIT. (line 13)
+* LT_SUPPORTED_TAG: Trace interface. (line 13)
+* LT_SYS_DLOPEN_DEPLIBS: Autoconf macros. (line 70)
+* LT_SYS_DLOPEN_SELF: Autoconf macros. (line 64)
+* LT_SYS_DLSEARCH_PATH: Autoconf macros. (line 75)
+* LT_SYS_MODULE_EXT: Autoconf macros. (line 79)
+* LT_SYS_MODULE_PATH: Autoconf macros. (line 85)
+* LT_SYS_SYMBOL_USCORE: Autoconf macros. (line 90)
+* lt_user_data: Module loaders for libltdl.
+ (line 48)
+* lt_user_dlloader: Module loaders for libltdl.
+ (line 53)
+* LT_WITH_LTDL: Distributing libltdl.
+ (line 41)
+* LTCC: libtool script contents.
+ (line 47)
+* LTCFLAGS: libtool script contents.
+ (line 48)
+* LTDL_CONVENIENCE: Distributing libltdl.
+ (line 301)
+* LTDL_INIT: Distributing libltdl.
+ (line 40)
+* LTDL_INSTALLABLE: Distributing libltdl.
+ (line 296)
+* LTDL_SET_PRELOADED_SYMBOLS: Dlpreopening. (line 85)
+* LTLIBOBJS: Autoconf and LTLIBOBJS.
+ (line 8)
+* LTLIBRARIES: Using Automake. (line 6)
+* ltmain.sh: Distributing. (line 19)
+* macro_revision: libtool script contents.
+ (line 322)
+* macro_version: libtool script contents.
+ (line 321)
+* Makefile: Makefile rules. (line 6)
+* Makefile.am: Makefile rules. (line 6)
+* Makefile.in: Makefile rules. (line 6)
+* MANIFEST_TOOL: LT_INIT. (line 282)
+* max_cmd_len: libtool script contents.
+ (line 327)
+* mdemo-conf.test: Test descriptions. (line 161)
+* mdemo-dryrun.test: Test descriptions. (line 180)
+* mdemo-exec.test: Test descriptions. (line 161)
+* mdemo-inst.test: Test descriptions. (line 161)
+* mdemo-make.test: Test descriptions. (line 161)
+* mdemo-shared-exec.test: Test descriptions. (line 161)
+* mdemo-shared-inst.test: Test descriptions. (line 161)
+* mdemo-shared-make.test: Test descriptions. (line 161)
+* mdemo-shared-unst.test: Test descriptions. (line 161)
+* mdemo-shared.test: Test descriptions. (line 161)
+* mdemo-static-exec.test: Test descriptions. (line 161)
+* mdemo-static-inst.test: Test descriptions. (line 161)
+* mdemo-static-make.test: Test descriptions. (line 161)
+* mdemo-static-unst.test: Test descriptions. (line 161)
+* mdemo-static.test: Test descriptions. (line 161)
+* mdemo-unst.test: Test descriptions. (line 161)
+* mdemo2-conf.test: Test descriptions. (line 185)
+* mdemo2-exec.test: Test descriptions. (line 185)
+* mdemo2-make.test: Test descriptions. (line 185)
+* mode, clean: Clean mode. (line 6)
+* mode, compile: Compile mode. (line 6)
+* mode, execute: Execute mode. (line 6)
+* mode, finish: Finish mode. (line 6)
+* mode, install: Install mode. (line 6)
+* mode, link: Link mode. (line 6)
+* mode, uninstall: Uninstall mode. (line 6)
+* modules, dynamic <1>: Dlopened modules. (line 6)
+* modules, dynamic: Using libltdl. (line 6)
+* motivation for writing libtool: Motivation. (line 6)
+* MSYS: Native MinGW File Name Conversion.
+ (line 6)
+* names of dynamic modules: Finding the dlname. (line 6)
+* need_lib_prefix: libtool script contents.
+ (line 331)
+* need_locks: libtool script contents.
+ (line 344)
+* need_version: libtool script contents.
+ (line 338)
+* NM <1>: LT_INIT. (line 259)
+* NM: libtool script contents.
+ (line 52)
+* nm_file_list_spec: libtool script contents.
+ (line 348)
+* no_builtin_flag: libtool script contents.
+ (line 351)
+* no_undefined_flag: libtool script contents.
+ (line 355)
+* nomode.test: Test descriptions. (line 202)
+* none: Porting inter-library dependencies.
+ (line 38)
+* objdir: libtool script contents.
+ (line 360)
+* OBJDUMP: LT_INIT. (line 274)
+* object files, compiling: Creating object files.
+ (line 6)
+* object files, library: Creating object files.
+ (line 28)
+* objectlist.test: Test descriptions. (line 205)
+* objext: libtool script contents.
+ (line 363)
+* old_archive_cmds: libtool script contents.
+ (line 90)
+* old_archive_from_expsyms_cmds: libtool script contents.
+ (line 103)
+* old_archive_from_new_cmds: libtool script contents.
+ (line 97)
+* old_postinstall_cmds: libtool script contents.
+ (line 370)
+* old_postuninstall_cmds: libtool script contents.
+ (line 375)
+* old_striplib: libtool script contents.
+ (line 415)
+* opaque data types: Library tips. (line 28)
+* options, libtool command: Invoking libtool. (line 6)
+* options, libtoolize command: Invoking libtoolize. (line 6)
+* other implementations, flaws in: Postmortem. (line 6)
+* partial linking: Link mode. (line 207)
+* pass_all: Porting inter-library dependencies.
+ (line 32)
+* path conversion: File name conversion.
+ (line 6)
+* Path Conversion - Cygwin to Windows: Cygwin/Windows File Name Conversion.
+ (line 6)
+* Path Conversion - Failure: File Name Conversion Failure.
+ (line 6)
+* Path Conversion - MinGW: Native MinGW File Name Conversion.
+ (line 6)
+* Path Conversion - Unix to Windows: Unix/Windows File Name Conversion.
+ (line 6)
+* pdemo-conf.test: Test descriptions. (line 211)
+* pdemo-exec.test: Test descriptions. (line 211)
+* pdemo-inst.test: Test descriptions. (line 211)
+* pdemo-make.test: Test descriptions. (line 211)
+* PIC (position-independent code): Creating object files.
+ (line 23)
+* pic_flag: libtool script contents.
+ (line 366)
+* pitfalls using C++: C++ libraries. (line 6)
+* pitfalls with dlopen: Dlopen issues. (line 6)
+* portable C headers: C header files. (line 6)
+* position-independent code: Creating object files.
+ (line 23)
+* postinstall_cmds: libtool script contents.
+ (line 369)
+* postinstallation: Installing libraries.
+ (line 54)
+* postlink_cmds: libtool script contents.
+ (line 379)
+* postuninstall_cmds: libtool script contents.
+ (line 374)
+* problem reports: Reporting bugs. (line 6)
+* problems, blaming somebody else for: Troubleshooting. (line 6)
+* problems, solving: Troubleshooting. (line 6)
+* program wrapper executables: Wrapper executables. (line 6)
+* program wrapper scripts: Linking executables. (line 71)
+* quote.test: Test descriptions. (line 220)
+* ranlib: Linking libraries. (line 12)
+* RANLIB <1>: LT_INIT. (line 262)
+* RANLIB: libtool script contents.
+ (line 73)
+* reload_cmds: libtool script contents.
+ (line 388)
+* reload_flag: libtool script contents.
+ (line 389)
+* renaming interface functions: Library tips. (line 21)
+* reporting bugs: Reporting bugs. (line 6)
+* reusability of library systems: Postmortem. (line 6)
+* runpath_var: libtool script contents.
+ (line 393)
+* saving time: Static-only libraries.
+ (line 6)
+* security problems with buggy linkers: Linking executables. (line 16)
+* sh.test: Test descriptions. (line 223)
+* shared libraries, not using: Static-only libraries.
+ (line 6)
+* shared library versions: Versioning. (line 6)
+* shl_load <1>: Dlopened modules. (line 6)
+* shl_load: Using libltdl. (line 6)
+* shlibpath_overrides_runpath: libtool script contents.
+ (line 397)
+* shlibpath_var: libtool script contents.
+ (line 406)
+* solving problems: Troubleshooting. (line 6)
+* soname_spec: libtool script contents.
+ (line 410)
+* specifications for libtool: Motivation. (line 20)
+* standalone binaries: Static libraries. (line 64)
+* static linking: Static libraries. (line 6)
+* strip: Installing libraries.
+ (line 6)
+* striplib: libtool script contents.
+ (line 414)
+* stripping libraries: Installing libraries.
+ (line 44)
+* su: Installing libraries.
+ (line 9)
+* suffix.test: Test descriptions. (line 227)
+* sys_lib_dlsearch_path_spec: libtool script contents.
+ (line 421)
+* sys_lib_search_path_spec: libtool script contents.
+ (line 426)
+* tag names: Tags. (line 6)
+* tagdemo-conf.test: Test descriptions. (line 245)
+* tagdemo-exec.test: Test descriptions. (line 245)
+* tagdemo-make.test: Test descriptions. (line 245)
+* tagdemo-shared-exec.test: Test descriptions. (line 245)
+* tagdemo-shared-make.test: Test descriptions. (line 245)
+* tagdemo-shared.test: Test descriptions. (line 245)
+* tagdemo-static-exec.test: Test descriptions. (line 245)
+* tagdemo-static-make.test: Test descriptions. (line 245)
+* tagdemo-static.test: Test descriptions. (line 245)
+* tagdemo-undef-exec.test: Test descriptions. (line 245)
+* tagdemo-undef-make.test: Test descriptions. (line 245)
+* tagdemo-undef.test: Test descriptions. (line 245)
+* test suite: Libtool test suite. (line 6)
+* test_compile: Porting inter-library dependencies.
+ (line 26)
+* tests, failed: When tests fail. (line 6)
+* thread_safe_flag_spec: libtool script contents.
+ (line 435)
+* time, saving: Static-only libraries.
+ (line 6)
+* to_host_file_cmd: libtool script contents.
+ (line 439)
+* to_tool_file_cmd: libtool script contents.
+ (line 450)
+* trace interface: Trace interface. (line 6)
+* tricky design issues: Issues. (line 6)
+* trouble with C++: C++ libraries. (line 6)
+* trouble with dlopen: Dlopen issues. (line 6)
+* troubleshooting: Troubleshooting. (line 6)
+* undefined symbols, allowing: Link mode. (line 14)
+* uninstall mode: Uninstall mode. (line 6)
+* unknown: Porting inter-library dependencies.
+ (line 43)
+* unresolved symbols, allowing: Link mode. (line 14)
+* using shared libraries, not: Static-only libraries.
+ (line 6)
+* version_type: libtool script contents.
+ (line 458)
+* versioning, formal: Libtool versioning. (line 6)
+* want_nocaseglob: libtool script contents.
+ (line 463)
+* whole_archive_flag_spec: libtool script contents.
+ (line 469)
+* Windows DLLs: Windows DLLs. (line 6)
+* wl: libtool script contents.
+ (line 472)
+* wrapper executables for uninstalled programs: Wrapper executables.
+ (line 6)
+* wrapper scripts for programs: Linking executables. (line 71)
+
+