diff options
Diffstat (limited to 'gtk+-mingw/share/info')
-rw-r--r-- | gtk+-mingw/share/info/autosprintf.info | 134 | ||||
-rw-r--r-- | gtk+-mingw/share/info/dir | 23 | ||||
-rw-r--r-- | gtk+-mingw/share/info/gettext.info | 18374 | ||||
-rw-r--r-- | gtk+-mingw/share/info/libffi.info | 617 | ||||
-rw-r--r-- | gtk+-mingw/share/info/libtool.info | 140 | ||||
-rw-r--r-- | gtk+-mingw/share/info/libtool.info-1 | 6698 | ||||
-rw-r--r-- | gtk+-mingw/share/info/libtool.info-2 | 1227 |
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ç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ç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ç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) - - |