There are modules of various kinds in Gnulib. For a complete list of the modules, see in MODULES.html.
When a function is not implemented by a system, the Gnulib module provides an implementation under the same name. Examples are the ‘snprintf’ and ‘readlink’ modules.
Similarly, when a function is not correctly implemented by a system, Gnulib provides a replacement. For functions, we use the pattern
#if !HAVE_WORKING_FOO # define foo rpl_foo #endif
and implement the
foo function under the name
renaming is needed to avoid conflicts at compile time (in case the system
header files declare
foo) and at link/run time (because the code
making use of
foo could end up residing in a shared library, and
the executable program using this library could be defining
For header files, such as
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 ‘.in’ inserted before the ‘.h’ extension, so that on
systems which do provide a correct
header file the system’s one is used.
The modules in this category are supported in C++ mode as well. This means, while the autoconfiguration uses the C compiler, the resulting header files and function substitutes can be used with a matching C++ compiler as well.
These are sometimes POSIX functions with GNU extensions also found in glibc—examples: ‘getopt’, ‘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.
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 native Windows
requires a different API than the classical POSIX
Examples are an error reporting function, a module that allows output of numbers with K/M/G suffixes, or cryptographic facilities.
Examples are data structures like ‘list’, or abstract output stream
classes that work around the fact that an application cannot implement an
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.
Examples are the ‘iconv’ module, which interfaces to the
iconv facility, regardless whether it is contained in libc or in
libiconv. Or the ‘readline’ module, which
interfaces to the GNU readline library.
An example is the ‘maintainer-makefile’ module, which provides extra Makefile tags for maintaining a package.