bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

an introduction to gnulib


From: Bruno Haible
Subject: an introduction to gnulib
Date: Mon, 23 Oct 2006 14:17:21 +0200
User-agent: KMail/1.9.1

Hi,

I hope this fulfills the need of an introduction to gnulib.

2006-10-22  Bruno Haible  <address@hidden>

        * doc/gnulib-intro.texi: New file.
        * doc/gnulib.texi: Include it.

diff -r -c3 --new-file --exclude=CVS gnulib-20061020/doc/gnulib-intro.texi 
gnulib-20061020-modified/doc/gnulib-intro.texi
*** gnulib-20061020/doc/gnulib-intro.texi       1970-01-01 01:00:00.000000000 
+0100
--- gnulib-20061020-modified/doc/gnulib-intro.texi      2006-10-22 
13:01:58.000000000 +0200
***************
*** 0 ****
--- 1,251 ----
+ @node Library vs. Reusable Code
+ @section Library vs. Reusable Code
+ 
+ Classical libraries are installed as binary object code.  Gnulib is
+ different: It is used as a source code library.  Each package that uses
+ Gnulib thus ships with part of the Gnulib source code.  The used portion
+ of Gnulib is tailored to the package: A build tool, called
+ @code{gnulib-tool}, is provided that copies a tailored subset of Gnulib
+ into the package.
+ 
+ @node Portability and Application Code
+ @section Portability and Application Code
+ 
+ One of the goals of Gnulib is to make portable programming easy, on the
+ basis of the standards relevant for Unix.  The objective behind that is to
+ avoid a fragmentation of the user community into disjoint user communities
+ according to the operating system, and instead allow synergies between
+ users on different operating systems.
+ 
+ Another goal of Gnulib is to provide application code that can be shared
+ between several applications.  Some people wonder: "What? glibc doesn't
+ have a function to copy a file?"  Indeed, the scope of a system's libc is
+ to implement the relevant standards (ISO C99, POSIX:2001) and to provide
+ access functions to the kernel's system calls, and little more.
+ 
+ There is no clear borderline between both areas.
+ 
+ For example, Gnulib has a facility for generating the name of backup
+ files.  While this task is an applicative one -- no standard specifies an
+ API for it --, the na@"ive code has some portability problems because on
+ some platforms the length of file name components is limited to 30
+ characters or so.  Gnulib handles that.
+ 
+ Similarly, Gnulib has a facility for executing a command in a subprocess.
+ It is at the same time a portability enhancement (it works on Unix and
+ Windows, compared to the classical @code{fork()}/@code{exec()} which is
+ not portable to Windows), as well as an application aid: it takes care of
+ redirecting stdin and/or stdout if desired, and emits an error message if
+ the subprocess failed.
+ 
+ @node Modules
+ @section Modules
+ 
+ Gnulib is divided into modules.  Every module implements a single
+ facility.  Modules can depend on other modules. 
+ 
+ A module consists of a number of files and a module description.  The
+ files are copied by @code{gnulib-tool} into the package that will use it,
+ usually verbatim, without changes.  Source code files (.h, .c files)
+ reside in the @file{lib/} subdirectory.  Autoconf macro files reside in
+ the @file{m4/} subdirectory.  Build scripts reside in the
+ @file{build-aux/} subdirectory.
+ 
+ The module description contains the list of files -- @code{gnulib-tool}
+ copies these files.  It contains the module's dependencies --
+ @code{gnulib-tool} installs them as well.  It also contains the autoconf
+ macro invocation (usually a single line or nothing at all) --
+ @code{gnulib-tool} ensures this is invoked from the package's
+ @file{configure.ac} file.  And also a @file{Makefile.am} snippet --
+ @code{gnulib-tool} collects these into a @file{Makefile.am} for the
+ tailored Gnulib part.  The module description and include file
+ specification are for documentation purposes; they are combined into
+ @file{MODULES.html}.
+ 
+ The module system serves two purposes:
+ 
+ @enumerate
+ @item
+ It ensures consistency of the used autoconf macros and @file{Makefile.am}
+ rules with the source code.  For example, source code which uses the
+ @code{getopt_long} function -- this is a common way to implement parsing
+ of command line options in a way that complies with the GNU standards --
+ needs the source code (@file{lib/getopt.c} and others), the autoconf macro
+ which detects whether the system's libc already has this function (in
+ @file{m4/getopt.m4}), and a few @file{Makefile.am} lines that create the
+ substitute @file{getopt.h} if not.  These three pieces belong together.
+ They cannot be used without each other.  The module description and
+ @code{gnulib-tool} ensure that they are copied altogether into the
+ destination package.
+ 
+ @item
+ It allows for scalability.  It is well-known since the inception of the
+ MODULA-2 language around 1978 that dissection into modules with
+ dependencies allows for building large sets of code in a maintainable way.
+ The maintainability comes from the facts that:
+ 
+ @itemize @bullet
+ @item
+ Every module has a single purpose; you don't worry about other parts of
+ the program while creating, reading or modifying the code of a module.
+ 
+ @item
+ The code you have to read in order to understand a module is limited to
+ the source of the module and the .h files of the modules listed as
+ dependencies.  It is for this reason also that we recommend to put the
+ comments describing the functions exported by a module into its .h file.
+ @end itemize
+ 
+ In other words, the module is the elementary unit of code in Gnulib,
+ comparable to a class in object-oriented languages like Java or C#.
+ @end enumerate
+ 
+ The module system is the basis of @code{gnulib-tool}.  When
+ @code{gnulib-tool} copies a part of Gnulib into a package, it first
+ compiles a module list, starting with the requested modules and adding all
+ the dependencies, and then collects the files, @file{configure.ac}
+ snippets and @file{Makefile.am} snippets.
+ 
+ @node Various Kinds of Modules
+ @section Various Kinds of Modules
+ 
+ There are modules of various kinds in Gnulib.  For a complete list of the
+ modules, see in @file{MODULES.html}.
+ 
+ @subsection Support for ISO C or POSIX functions.
+ 
+ When a function is not implemented by a system, the Gnulib module provides
+ an implementation under the same name.  Examples are the @samp{snprintf}
+ and @samp{readlink} modules.
+ 
+ Similarly, when a function is not correctly implemented by a system,
+ Gnulib provides a replacement.  For functions, we use the pattern
+ 
+ @smallexample
+ #if !HAVE_WORKING_FOO
+ # define foo rpl_foo
+ #endif
+ @end smallexample
+ 
+ @noindent
+ and implement the @code{foo} function under the name @code{rpl_foo}.  This
+ renaming is needed to avoid conflicts at compile time (in case the system
+ header files declare @code{foo}) and at link/run time (because the code
+ making use of @code{foo} could end up residing in a shared library, and
+ the executable program using this library could be defining @code{foo}
+ itself).
+ 
+ For header files, such as @code{stdbool.h} or @code{stdint.h}, we provide
+ the substitute only if the system doesn't provide a correct one.  The
+ template of this replacement is distributed in a slightly different name,
+ with an added underscore, so that on systems which do provide a correct
+ header file the system's one is used.
+ 
+ @subsection Enhancements of ISO C or POSIX functions
+ 
+ These are sometimes POSIX functions with GNU extensions also found in
+ glibc -- examples: @samp{getopt}, @samp{fnmatch} --, and often new APIs
+ -- for example, for all functions that allocate memory in one way or the
+ other, we have variants which also include the error checking against the
+ out-of-memory condition.
+ 
+ @subsection Portable general use facilities
+ 
+ Examples are a module for copying a file -- the portability problems
+ relate to the copying of the file's modification time, access rights, and
+ extended attributes -- or a module for extracting the tail component of a
+ file name -- here the portability to Woe32 requires a different API than
+ the classical POSIX @code{basename} function.
+ 
+ @subsection Reusable application code
+ 
+ Examples are an error reporting function, a module that allows output of
+ numbers with K/M/G suffixes, or cryptographic facilities.
+ 
+ @subsection Object oriented classes
+ 
+ Examples are data structures like @samp{list}, or abstract output stream
+ classes that work around the fact that an application cannot implement an
+ stdio @code{FILE} with its logic.  Here, while staying in C, we use
+ implementation techniques like tables of function pointers, known from the
+ C++ language or from the Linux kernel.
+ 
+ @subsection Interfaces to external libraries
+ 
+ Examples are the @samp{iconv} module, which interfaces to the
+ @code{iconv()} facility, regardless whether it is contained in libc or in
+ an external @code{libiconv}.  Or the @samp{readline} module, which
+ interfaces to the GNU readline library.
+ 
+ @subsection Build / maintenance infrastructure
+ 
+ An example is the @samp{maintainer-makefile} module, which provides extra
+ Makefile tags for maintaining a package.
+ 
+ @node Collaborative Development
+ @section Collaborative Development
+ 
+ Gnulib is maintained collaboratively.  The mailing list is
+ @code{<bug-gnulib at gnu dot org>}.  Be warned that some people on the
+ list may be very active at some times and unresponsive at other times.
+ 
+ Every module has one or more maintainers.  While issues are discussed
+ collaboratively on the list, the maintainer of a module nevertheless has
+ a veto right regarding changes in his module.
+ 
+ All patches should be posted the list, regardless whether they are
+ proposed patches or whether they are committed immediately by the
+ maintainer of the particular module.  The purpose is not only to inform
+ the other users of the module, but mainly to allow peer review.  It is not
+ uncommon that several people contribute comments or spot bugs after a
+ patch was proposed.
+ 
+ Conversely, if you are using Gnulib, and a patch is posted that affects
+ one of the modules that your package uses, you have an interest in
+ proofreading the patch.
+ 
+ @node Copyright
+ @section Copyright
+ 
+ Most modules are under the GPL.  Some -- mostly modules which can
+ reasonably be used in libraries -- are under LGPL.  The source files
+ always say "GPL", but the real license specification is in the module
+ description file.
+ 
+ If you want to use some Gnulib modules under LGPL, you can do so by
+ passing the option --lgpl to @code{gnulib-tool}.  This will replace the
+ GPL header with an LGPL header while copying the source files to your
+ package.
+ 
+ Keep in mind that when you submit patches to files in Gnulib, you should
+ license them under a compatible license.  This means that sometimes the
+ contribution will have to be LGPL, if the original file is available
+ under LGPL.  You can find out about it by looking for a "License: LGPL"
+ information in the corresponding module description.
+ 
+ @node Steady Development
+ @section Steady Development
+ 
+ Gnulib modules are continually adapted, to match new practices, to be
+ consistent with newly added modules, or simply as a response to build
+ failure reports.  We don't make releases, but instead recommend to use the
+ newest version of Gnulib from the CVS, except in periods of major changes.
+ 
+ @node Openness
+ @section Openness
+ 
+ Gnulib is open in the sense that we gladly accept contributions if they
+ are generally useful, well engineered, and if the contributors have signed
+ the obligatory papers with the FSF.
+ 
+ The module system is open in the sense that a package using Gnulib can
+ @enumerate
+ @item
+ locally patch or override files in Gnulib,
+ @item
+ locally add modules that are treated like Gnulib modules by
+ @code{gnulib-tool}.
+ @end enumerate
+ 
+ This is achieved by the @samp{--local-dir} option of @code{gnulib-tool}.
+ 
diff -r -c3 --new-file --exclude=CVS gnulib-20061020/doc/gnulib.texi 
gnulib-20061020-modified/doc/gnulib.texi
*** gnulib-20061020/doc/gnulib.texi     2006-10-22 04:41:05.000000000 +0200
--- gnulib-20061020-modified/doc/gnulib.texi    2006-10-22 12:44:03.000000000 
+0200
***************
*** 67,73 ****
  @node Introduction
  @chapter Introduction
  
! Getting started:
  
  @itemize
  @item Gnulib is hosted at Savannah:
--- 67,77 ----
  @node Introduction
  @chapter Introduction
  
! Gnulib is a source code library. It provides basic functionalities to
! programs and libraries.  Currently (as of October 2006) more than 30
! packages make use of Gnulib.
! 
! Resources:
  
  @itemize
  @item Gnulib is hosted at Savannah:
***************
*** 77,82 ****
--- 81,99 ----
        @url{http://www.gnu.org/software/gnulib/}.
  @end itemize
  
+ @menu
+ * Library vs. Reusable Code::
+ * Portability and Application Code::
+ * Modules::
+ * Various Kinds of Modules::
+ * Collaborative Development::
+ * Copyright::
+ * Steady Development::
+ * Openness::
+ @end menu
+ 
+ @include gnulib-intro.texi
+ 
  
  @include gnulib-tool.texi
  




reply via email to

[Prev in Thread] Current Thread [Next in Thread]