summaryrefslogtreecommitdiff
path: root/gtk+-mingw/share/info
diff options
context:
space:
mode:
authorLeo Tenenbaum <pommicket@gmail.com>2018-08-20 21:12:06 -0400
committerLeo Tenenbaum <pommicket@gmail.com>2018-08-20 21:12:06 -0400
commit63e87c2d0c9d263f14c77b68f85c67d46ece82a9 (patch)
tree6260365cbf7d24f37d27669e8538227fcb72e243 /gtk+-mingw/share/info
parenta4460f6d9453bbd7e584937686449cef3e19f052 (diff)
Removed gtk+ docsHEADmaster
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, 0 insertions, 27213 deletions
diff --git a/gtk+-mingw/share/info/autosprintf.info b/gtk+-mingw/share/info/autosprintf.info
deleted file mode 100644
index 37af0bd..0000000
--- a/gtk+-mingw/share/info/autosprintf.info
+++ /dev/null
@@ -1,134 +0,0 @@
-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
deleted file mode 100644
index e240bf0..0000000
--- a/gtk+-mingw/share/info/dir
+++ /dev/null
@@ -1,23 +0,0 @@
-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
deleted file mode 100644
index abd1869..0000000
--- a/gtk+-mingw/share/info/gettext.info
+++ /dev/null
@@ -1,18374 +0,0 @@
-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
deleted file mode 100644
index 402f760..0000000
--- a/gtk+-mingw/share/info/libffi.info
+++ /dev/null
@@ -1,617 +0,0 @@
-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
deleted file mode 100644
index 9a1263a..0000000
--- a/gtk+-mingw/share/info/libtool.info
+++ /dev/null
@@ -1,140 +0,0 @@
-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
deleted file mode 100644
index 6d16648..0000000
--- a/gtk+-mingw/share/info/libtool.info-1
+++ /dev/null
@@ -1,6698 +0,0 @@
-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
deleted file mode 100644
index 607fef5..0000000
--- a/gtk+-mingw/share/info/libtool.info-2
+++ /dev/null
@@ -1,1227 +0,0 @@
-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)
-
-