git-version-gen: correct the advice in a comment
[gnulib.git] / doc / gnulib-tool.texi
1 @node Invoking gnulib-tool
2 @chapter Invoking gnulib-tool
3
4 @c Copyright (C) 2005-2011 Free Software Foundation, Inc.
5
6 @c Permission is granted to copy, distribute and/or modify this document
7 @c under the terms of the GNU Free Documentation License, Version 1.3 or
8 @c any later version published by the Free Software Foundation; with no
9 @c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
10 @c Texts.  A copy of the license is included in the ``GNU Free
11 @c Documentation License'' file as part of this distribution.
12
13 @pindex gnulib-tool
14 @cindex invoking @command{gnulib-tool}
15
16 The @command{gnulib-tool} command is the recommended way to import
17 Gnulib modules.  It is possible to borrow Gnulib modules in a package
18 without using @command{gnulib-tool}, relying only on the
19 meta-information stored in the @file{modules/*} files, but with a
20 growing number of modules this becomes tedious.  @command{gnulib-tool}
21 simplifies the management of source files, @file{Makefile.am}s and
22 @file{configure.ac} in packages incorporating Gnulib modules.
23
24 @file{gnulib-tool} is not installed in a standard directory that is
25 contained in the @code{PATH} variable.  It needs to be run directly in
26 the directory that contains the Gnulib source code.  You can do this
27 either by specifying the absolute filename of @file{gnulib-tool}, or
28 you can also use a symbolic link from a place inside your @code{PATH}
29 to the @file{gnulib-tool} file of your preferred and most up-to-date
30 Gnulib checkout, like this:
31 @smallexample
32 $ ln -s $HOME/gnu/src/gnulib.git/gnulib-tool $HOME/bin/gnulib-tool
33 @end smallexample
34
35 Run @samp{gnulib-tool --help} for information.  To get familiar with
36 @command{gnulib-tool} without affecting your sources, you can also try
37 some commands with the option @samp{--dry-run}; then
38 @code{gnulib-tool} will only report which actions it would perform in
39 a real run without changing anything.
40
41 @menu
42 * Which modules?::              Determining the needed set of Gnulib modules
43 * Initial import::              First import of Gnulib modules.
44 * Modified imports::            Changing the import specification.
45 * Simple update::               Tracking Gnulib development.
46 * Source changes::              Impact of Gnulib on your source files.
47 * gettextize and autopoint::    Caveat: @code{gettextize} and @code{autopoint} users!
48 * Localization::                Handling Gnulib's own message translations.
49 * VCS Issues::                  Integration with Version Control Systems.
50 * Unit tests::                  Bundling the unit tests of the Gnulib modules.
51 * Conditional dependencies::    Avoiding unnecessary checks and compilations.
52 @end menu
53
54
55 @node Which modules?
56 @section Finding modules
57 @cindex Finding modules
58
59 There are three ways of finding the names of Gnulib modules that you can use
60 in your package:
61
62 @itemize
63 @item
64 You have the complete module list, sorted according to categories, in
65 @url{http://www.gnu.org/software/gnulib/MODULES.html}.
66
67 @item
68 If you are looking for a particular POSIX header or function replacement,
69 look in the chapters @ref{Header File Substitutes} and
70 @ref{Function Substitutes}.  For headers and functions that are provided by
71 Glibc but not standardized by POSIX, look in the chapters
72 @ref{Glibc Header File Substitutes} and @ref{Glibc Function Substitutes}.
73
74 @item
75 If you have already found the source file in Gnulib and are looking for the
76 module that contains this source file, you can use the command
77 @samp{gnulib-tool --find @var{filename}}.
78 @end itemize
79
80
81 @node Initial import
82 @section Initial import
83 @cindex initial import
84
85 Gnulib assumes that your project uses Autoconf.  When using Gnulib, you
86 will need to have Autoconf and Automake among your build tools.  Note that
87 while the use of Automake in your project's top level directory is an
88 easy way to fulfil the Makefile conventions of the GNU coding standards,
89 Gnulib does not require it.  But when you use Gnulib, Automake will be
90 used at least in a subdirectory of your project.
91
92 Invoking @samp{gnulib-tool --import} will copy source files, create a
93 @file{Makefile.am} to build them, generate a file @file{gnulib-comp.m4} with
94 Autoconf M4 macro declarations used by @file{configure.ac}, and generate
95 a file @file{gnulib-cache.m4} containing the cached specification of how
96 Gnulib is used.
97
98 Our example will be a library that uses Autoconf, Automake and
99 Libtool.  It calls @code{strdup}, and you wish to use gnulib to make
100 the package portable to C89 and C99 (which don't have @code{strdup}).
101
102 @example
103 ~/src/libfoo$ gnulib-tool --import strdup
104 Module list with included dependencies:
105   absolute-header
106   extensions
107   strdup
108   string
109 File list:
110   lib/dummy.c
111   lib/strdup.c
112   lib/string.in.h
113   m4/absolute-header.m4
114   m4/extensions.m4
115   m4/gnulib-common.m4
116   m4/strdup.m4
117   m4/string_h.m4
118 Creating directory ./lib
119 Creating directory ./m4
120 Copying file lib/dummy.c
121 Copying file lib/strdup.c
122 Copying file lib/string.in.h
123 Copying file m4/absolute-header.m4
124 Copying file m4/extensions.m4
125 Copying file m4/gnulib-common.m4
126 Copying file m4/gnulib-tool.m4
127 Copying file m4/strdup.m4
128 Copying file m4/string_h.m4
129 Creating lib/Makefile.am
130 Creating m4/gnulib-cache.m4
131 Creating m4/gnulib-comp.m4
132 Finished.
133
134 You may need to add #include directives for the following .h files.
135   #include <string.h>
136
137 Don't forget to
138   - add "lib/Makefile" to AC_CONFIG_FILES in ./configure.ac,
139   - mention "lib" in SUBDIRS in Makefile.am,
140   - mention "-I m4" in ACLOCAL_AMFLAGS in Makefile.am,
141   - invoke gl_EARLY in ./configure.ac, right after AC_PROG_CC,
142   - invoke gl_INIT in ./configure.ac.
143 ~/src/libfoo$
144 @end example
145
146 By default, the source code is copied into @file{lib/} and the M4
147 macros in @file{m4/}.  You can override these paths by using
148 @code{--source-base=DIRECTORY} and @code{--m4-base=DIRECTORY}.  Some
149 modules also provide other files necessary for building.  These files
150 are copied into the directory specified by @samp{AC_CONFIG_AUX_DIR} in
151 @file{configure.ac} or by the @code{--aux-dir=DIRECTORY} option.  If
152 neither is specified, the current directory is assumed.
153
154 @code{gnulib-tool} can make symbolic links instead of copying the
155 source files.  The option to specify for this is @samp{--symlink}, or
156 @samp{-s} for short.  This can be useful to save a few kilobytes of disk
157 space.  But it is likely to introduce bugs when @code{gnulib} is updated;
158 it is more reliable to use @samp{gnulib-tool --update} (see below)
159 to update to newer versions of @code{gnulib}.  Furthermore it requires
160 extra effort to create self-contained tarballs, and it may disturb some
161 mechanism the maintainer applies to the sources.  For these reasons,
162 this option is generally discouraged.
163
164 @code{gnulib-tool} will overwrite any pre-existing files, in
165 particular @file{Makefile.am}.  It is also possible to separate the
166 generated @file{Makefile.am} content (for building the gnulib library)
167 into a separate file, say @file{gnulib.mk}, that can be included by your
168 handwritten @file{Makefile.am}, but this is a more advanced use of
169 @code{gnulib-tool}.
170
171 Consequently, it is a good idea to choose directories that are not
172 already used by your projects, to separate gnulib imported files from
173 your own files.  This approach is also useful if you want to avoid
174 conflicts between other tools (e.g., @code{gettextize} that also copy
175 M4 files into your package.  Simon Josefsson successfully uses a source
176 base of @file{gl/}, and a M4 base of @file{gl/m4/}, in several
177 packages.
178
179 After the @samp{--import} option on the command line comes the list of
180 Gnulib modules that you want to incorporate in your package.  The names
181 of the modules coincide with the filenames in Gnulib's @file{modules/}
182 directory.
183
184 Some Gnulib modules depend on other Gnulib modules.  @code{gnulib-tool}
185 will automatically add the needed modules as well; you need not list
186 them explicitly.  @code{gnulib-tool} will also memorize which dependent
187 modules it has added, so that when someday a dependency is dropped, the
188 implicitly added module is dropped as well (unless you have explicitly
189 requested that module).
190
191 If you want to cut a dependency, i.e., not add a module although one of
192 your requested modules depends on it, you may use the option
193 @samp{--avoid=@var{module}} to do so.  Multiple uses of this option are
194 possible.  Of course, you will then need to implement the same interface
195 as the removed module.
196
197 A few manual steps are required to finish the initial import.
198 @code{gnulib-tool} printed a summary of these steps.
199
200 First, you must ensure Autoconf can find the macro definitions in
201 @file{gnulib-comp.m4}.  Use the @code{ACLOCAL_AMFLAGS} specifier in
202 your top-level @file{Makefile.am} file, as in:
203
204 @example
205 ACLOCAL_AMFLAGS = -I m4
206 @end example
207
208 You are now ready to call the M4 macros in @code{gnulib-comp.m4} from
209 @file{configure.ac}.  The macro @code{gl_EARLY} must be called as soon
210 as possible after verifying that the C compiler is working.
211 Typically, this is immediately after @code{AC_PROG_CC}, as in:
212
213 @example
214 ...
215 AC_PROG_CC
216 gl_EARLY
217 ...
218 @end example
219
220 The core part of the gnulib checks are done by the macro
221 @code{gl_INIT}.  Place it further down in the file, typically where
222 you normally check for header files or functions.  It must come after
223 other checks which may affect the compiler invocation, such as
224 @code{AC_MINIX}.  For example:
225
226 @example
227 ...
228 # For gnulib.
229 gl_INIT
230 ...
231 @end example
232
233 @code{gl_INIT} will in turn call the macros related with the
234 gnulib functions, be it specific gnulib macros, like @code{gl_FUNC_ALLOCA}
235 or autoconf or automake macros like @code{AC_FUNC_ALLOCA} or
236 @code{AM_FUNC_GETLINE}.  So there is no need to call those macros yourself
237 when you use the corresponding gnulib modules.
238
239 You must also make sure that the gnulib library is built.  Add the
240 @code{Makefile} in the gnulib source base directory to
241 @code{AC_CONFIG_FILES}, as in:
242
243 @example
244 AC_CONFIG_FILES(... lib/Makefile ...)
245 @end example
246
247 You must also make sure that @code{make} will recurse into the gnulib
248 directory.  To achieve this, add the gnulib source base directory to a
249 @code{SUBDIRS} Makefile.am statement, as in:
250
251 @example
252 SUBDIRS = lib
253 @end example
254
255 or if you, more likely, already have a few entries in @code{SUBDIRS},
256 you can add something like:
257
258 @example
259 SUBDIRS += lib
260 @end example
261
262 Finally, you have to add compiler and linker flags in the appropriate
263 source directories, so that you can make use of the gnulib library.
264 Since some modules (@samp{getopt}, for example) may copy files into
265 the build directory, @file{top_builddir/lib} is needed as well
266 as @file{top_srcdir/lib}.  For example:
267
268 @example
269 ...
270 AM_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib
271 ...
272 LDADD = lib/libgnu.a
273 ...
274 @end example
275
276 Don't forget to @code{#include} the various header files.  In this
277 example, you would need to make sure that @samp{#include <string.h>}
278 is evaluated when compiling all source code files, that want to make
279 use of @code{strdup}.
280
281 In the usual case where Autoconf is creating a @file{config.h} file,
282 you should include @file{config.h} first, before any other include
283 file.  That way, for example, if @file{config.h} defines
284 @samp{restrict} to be the empty string on a pre-C99 host, or a macro
285 like @samp{_FILE_OFFSET_BITS} that affects the layout of data
286 structures, the definition is consistent for all include files.
287 Also, on some platforms macros like @samp{_FILE_OFFSET_BITS} and
288 @samp{_GNU_SOURCE} may be ineffective, or may have only a limited
289 effect, if defined after the first system header file is included.
290
291 Finally, note that you cannot use @code{AC_LIBOBJ} or
292 @code{AC_REPLACE_FUNCS} in your @file{configure.ac} and expect the
293 resulting object files to be automatically added to @file{lib/libgnu.a}.
294 This is because your @code{AC_LIBOBJ} and @code{AC_REPLACE_FUNCS} invocations
295 from @file{configure.ac} augment a variable @code{@@LIBOBJS@@} (and/or
296 @code{@@LTLIBOBJS@@} if using Libtool), whereas @file{lib/libgnu.a}
297 is built from the contents of a different variable, usually
298 @code{@@gl_LIBOBJS@@} (or @code{@@gl_LTLIBOBJS@@} if using Libtool).
299
300
301 @node Modified imports
302 @section Modified imports
303
304 You can at any moment decide to use Gnulib differently than the last time.
305
306 There are two ways to change how Gnulib is used.  Which one you'll use,
307 depends on where you keep track of options and module names that you pass
308 to @code{gnulib-tool}.
309
310 @itemize @bullet
311 @item
312 If you store the options and module names in a file under your own
313 control, such as @file{autogen.sh}, @file{bootstrap},
314 @file{bootstrap.conf}, or similar, simply invoke @command{gnulib-tool}
315 again, with modified options and more or fewer module names.
316
317 @item
318 @code{gnulib-tool} remembers which modules were used last time.  If you
319 want to rely on @code{gnulib-tool}'s own memory of the last used
320 options and module names, you can use the commands
321 @command{gnulib-tool --add-import} and
322 @command{gnulib-tool --remove-import}.
323
324 So, if you only want to use more Gnulib modules, simply invoke
325 @command{gnulib-tool --add-import @var{new-modules}}.  The list of
326 modules that you pass after @samp{--add-import} is @emph{added} to the
327 previous list of modules.
328
329 Similarly, if you want to use fewer Gnulib modules, simply invoke
330 @command{gnulib-tool --remove-import @var{unneeded-modules}}.  The list
331 of modules that you pass after @samp{--remove-import} is @emph{removed}
332 from the previous list of modules.  Note that if a module is then still
333 needed as dependency of other modules, it will be used nevertheless.
334 If you want to @emph{really} not use a module any more, regardless of
335 whether other modules may need it, you need to use the @samp{--avoid}
336 option.
337
338 For other changes, such as different choices of @samp{--lib},
339 @samp{--source-base} or @samp{--aux-dir}, the normal way is to
340 modify manually the file @file{gnulib-cache.m4} in the M4 macros
341 directory, then launch @samp{gnulib-tool --add-import}.
342
343 The only change for which this doesn't work is a change of the
344 @samp{--m4-base} directory.  Because, when you pass a different value of
345 @samp{--m4-base}, @code{gnulib-tool} will not find the previous
346 @file{gnulib-cache.m4} file any more.  A possible solution is to
347 manually copy the @file{gnulib-cache.m4} into the new M4 macro directory.
348
349 In the @file{gnulib-cache.m4} file, the macros have the following meaning:
350 @table @code
351 @item gl_MODULES
352 The argument is a space separated list of the requested modules, not including
353 dependencies.
354
355 @item gl_AVOID
356 The argument is a space separated list of modules that should not be used,
357 even if they occur as dependencies.  Corresponds to the @samp{--avoid}
358 command line argument.
359
360 @item gl_SOURCE_BASE
361 The argument is the relative file name of the directory containing the gnulib
362 source files (mostly *.c and *.h files).  Corresponds to the
363 @samp{--source-base} command line argument.
364
365 @item gl_M4_BASE
366 The argument is the relative file name of the directory containing the gnulib
367 M4 macros (*.m4 files).  Corresponds to the @samp{--m4-base} command line
368 argument.
369
370 @item gl_TESTS_BASE
371 The argument is the relative file name of the directory containing the gnulib
372 unit test files.  Corresponds to the @samp{--tests-base} command line argument.
373
374 @item gl_LIB
375 The argument is the name of the library to be created.  Corresponds to the
376 @samp{--lib} command line argument.
377
378 @item gl_LGPL
379 The presence of this macro without arguments corresponds to the @samp{--lgpl}
380 command line argument.  The presence of this macro with an argument (whose
381 value must be 2 or 3) corresponds to the @samp{--lgpl=@var{arg}} command line
382 argument.
383
384 @item gl_LIBTOOL
385 The presence of this macro corresponds to the @samp{--libtool} command line
386 argument and to the absence of the @samp{--no-libtool} command line argument.
387 It takes no arguments.
388
389 @item gl_MACRO_PREFIX
390 The argument is the prefix to use for macros in the @file{gnulib-comp.m4}
391 file.  Corresponds to the @samp{--macro-prefix} command line argument.
392 @end table
393
394 @end itemize
395
396 @node Simple update
397 @section Simple update
398
399 When you want to update to a more recent version of Gnulib, without
400 changing the list of modules or other parameters, a simple call
401 does it:
402
403 @smallexample
404 $ gnulib-tool --add-import
405 @end smallexample
406
407 @noindent
408 This will create, update or remove files, as needed.
409
410 Note: From time to time, changes are made in Gnulib that are not backward
411 compatible.  When updating to a more recent Gnulib, you should consult
412 Gnulib's @file{NEWS} file to check whether the incompatible changes affect
413 your project.
414
415
416 @node Source changes
417 @section Changing your sources for use with Gnulib
418
419 Gnulib contains some header file overrides.  This means that when building
420 on systems with deficient header files in @file{/usr/include/}, it may create
421 files named @file{string.h}, @file{stdlib.h}, @file{stdint.h} or similar in
422 the build directory.  In the other source directories of your package you
423 will usually pass @samp{-I} options to the compiler, so that these Gnulib
424 substitutes are visible and take precedence over the files in
425 @file{/usr/include/}.
426
427 These Gnulib substitute header files rely on @file{<config.h>} being
428 already included.  Furthermore @file{<config.h>} must be the first include
429 in every compilation unit.  This means that to @emph{all your source files}
430 and likely also to @emph{all your tests source files} you need to add an
431 @samp{#include <config.h>} at the top.  Which source files are affected?
432 Exactly those whose compilation includes a @samp{-I} option that refers to
433 the Gnulib library directory.
434
435 This is annoying, but inevitable: On many systems, @file{<config.h>} is
436 used to set system dependent flags (such as @code{_GNU_SOURCE} on GNU systems),
437 and these flags have no effect after any system header file has been included.
438
439
440 @node gettextize and autopoint
441 @section Caveat: @code{gettextize} and @code{autopoint} users
442
443 @cindex gettextize, caveat
444 @cindex autopoint, caveat
445 The programs @code{gettextize} and @code{autopoint}, part of
446 GNU @code{gettext}, import or update the internationalization infrastructure.
447 Some of this infrastructure, namely ca.@: 20 autoconf macro files and the
448 @file{config.rpath} file, is also contained in Gnulib and may be imported
449 by @code{gnulib-tool}.  The use of @code{gettextize} or @code{autopoint}
450 will therefore overwrite some of the files that @code{gnulib-tool} has
451 imported, and vice versa.
452
453 Avoiding to use @code{gettextize} (manually, as package maintainer) or
454 @code{autopoint} (as part of a script like @code{autoreconf} or
455 @code{autogen.sh}) is not the solution: These programs also import the
456 infrastructure in the @file{po/} and optionally in the @file{intl/} directory.
457
458 The copies of the conflicting files in Gnulib are more up-to-date than
459 the copies brought in by @code{gettextize} and @code{autopoint}.  When a
460 new @code{gettext} release is made, the copies of the files in Gnulib will
461 be updated immediately.
462
463 The solution is therefore:
464
465 @enumerate
466 @item
467 When you run @code{gettextize}, always use the @code{gettextize} from the
468 matching GNU gettext release.  For the most recent Gnulib checkout, this is
469 the newest release found on @url{http://ftp.gnu.org/gnu/gettext/}.  For an
470 older Gnulib snapshot, it is the release that was the most recent release
471 at the time the Gnulib snapshot was taken.  Then, after @code{gettextize},
472 invoke @code{gnulib-tool}.
473
474 @item
475 When a script of yours run @code{autopoint}, invoke @code{gnulib-tool}
476 afterwards.
477
478 @item
479 If you get an error message like
480 @code{*** error: gettext infrastructure mismatch:
481 using a Makefile.in.in from gettext version ...
482 but the autoconf macros are from gettext version ...},
483 it means that a new GNU gettext release was made, and its autoconf macros
484 were integrated into Gnulib and now mismatch the @file{po/} infrastructure.
485 In this case, fetch and install the new GNU gettext release and run
486 @code{gettextize} followed by @code{gnulib-tool}.
487
488 @item
489 When you invoke @code{autoreconf} after @code{gnulib-tool}, make sure to
490 not invoke @code{autopoint} a second time, by setting the @code{AUTOPOINT}
491 environment variable, like this:
492 @smallexample
493 $ env AUTOPOINT=true autoreconf --install
494 @end smallexample
495 @end enumerate
496
497
498 @node Localization
499 @section Handling Gnulib's own message translations
500
501 Gnulib provides some functions that emit translatable messages using GNU
502 @code{gettext}.  The @samp{gnulib} domain at the
503 @url{http://translationproject.org/, Translation Project} collects
504 translations of these messages, which you should incorporate into your
505 own programs.
506
507 There are two basic ways to achieve this.  The first, and older, method
508 is to list all the source files you use from Gnulib in your own
509 @file{po/POTFILES.in} file.  This will cause all the relevant
510 translatable strings to be included in your POT file.  When you send
511 this POT file to the Translation Project, translators will normally fill
512 in the translations of the Gnulib strings from their ``translation
513 memory'', and send you back updated PO files.
514
515 However, this process is error-prone: you might forget to list some
516 source files, or the translator might not be using a translation memory
517 and provide a different translation than another translator, or the
518 translation might not be kept in sync between Gnulib and your package.
519 It is also slow and causes substantial extra work, because a human
520 translator must be in the loop for each language and you will need to
521 incorporate their work on request.
522
523 For these reasons, a new method was designed and is now recommended.  If
524 you pass the @code{--po-base=@var{directory}} and @code{--po-domain=@var{domain}}
525 options to @code{gnulib-tool}, then @code{gnulib-tool} will create a
526 separate directory with its own @file{POTFILES.in}, and fetch current
527 translations directly from the Translation Project (using
528 @command{rsync} or @command{wget}, whichever is available).
529 The POT file in this directory will be called
530 @file{@var{domain}-gnulib.pot}, depending on the @var{domain} you gave to the
531 @code{--po-domain} option (typically the same as the package name).
532 This causes these translations to reside in a separate message domain,
533 so that they do not clash either with the translations for the main part
534 of your package nor with those of other packages on the system that use
535 possibly different versions of Gnulib.
536 When you use these options, the functions in Gnulib are built
537 in such a way that they will always use this domain regardless of the
538 default domain set by @code{textdomain}.
539
540 In order to use this method, you must -- in each program that might use
541 Gnulib code -- add an extra line to the part of the program that
542 initializes locale-dependent behavior.  Where you would normally write
543 something like:
544
545 @example
546 @group
547   setlocale (LC_ALL, "");
548   bindtextdomain (PACKAGE, LOCALEDIR);
549   textdomain (PACKAGE);
550 @end group
551 @end example
552
553 @noindent
554 you should add an additional @code{bindtextdomain} call to inform
555 gettext of where the MO files for the extra message domain may be found:
556
557 @example
558 @group
559   bindtextdomain (PACKAGE "-gnulib", LOCALEDIR);
560 @end group
561 @end example
562
563 (This example assumes that the @var{domain} that you specified
564 to @code{gnulib-tool} is the same as the value of the @code{PACKAGE}
565 preprocessor macro.)
566
567 Since you do not change the @code{textdomain} call, the default message
568 domain for your program remains the same and your own use of @code{gettext}
569 functions will not be affected.
570
571
572 @node VCS Issues
573 @section Issues with Version Control Systems
574
575 If a project stores its source files in a version control system (VCS),
576 such as CVS, Subversion, or Git, one needs to decide which files to commit.
577
578 In principle, all files created by @code{gnulib-tool}, except
579 @file{gnulib-cache.m4}, can be treated like generated source files,
580 like for example a @file{parser.c} file generated from
581 @file{parser.y}.  Alternatively, they can be considered source files
582 and updated manually.
583
584 Here are the three different approaches in common use.  Each has its
585 place, and you should use whichever best suits your particular project
586 and development methods.
587
588 @enumerate
589 @item
590 In projects which commit all source files, whether generated or not,
591 into their VCS, the @code{gnulib-tool} generated files should all be
592 committed.  In this case, you should pass the option
593 @samp{--no-vc-files} to @code{gnulib-tool}, which avoids alteration of
594 VCS-related files such as @file{.cvsignore}.
595
596 Gnulib also contains files generated by @command{make} (and removed by
597 @code{make clean}), using information determined by
598 @command{configure}.  For a Gnulib source file of the form
599 @file{lib/foo.in.h}, the corresponding @file{lib/foo.h} is such a
600 @command{make}-generated file.  These should @emph{not} be checked
601 into the VCS, but instead added to @file{.cvsignore} or equivalent.
602
603 @item
604 In projects which customarily omit from their VCS all files that are
605 generated from other source files, none of these files and directories
606 are added into the VCS.  As described in @ref{Modified imports}, there
607 are two ways to keep track of options and module names that are passed
608 to @code{gnulib-tool}.  The command for restoring the omitted files
609 depends on it:
610
611 @itemize @bullet
612 @item
613 If they are stored in a file other than @code{gnulib-cache.m4}, such as
614 @file{autogen.sh}, @file{bootstrap}, @file{bootstrap.conf}, or similar,
615 the restoration command is the entire @code{gnulib-tool ... --import ...}
616 invocation with all options and module names.
617
618 @item
619 If the project relies on @code{gnulib-tool}'s memory of the last used
620 options and module names, then the file @file{gnulib-cache.m4} in the M4
621 macros directory must be added to the VCS, and the restoration command
622 is:
623
624 @smallexample
625 $ gnulib-tool --update
626 @end smallexample
627
628 The @samp{--update} option operates much like the @samp{--add-import}
629 option, but it does not offer the possibility to change the way Gnulib is
630 used.  Also it does not report in the ChangeLogs the files that it had to
631 add because they were missing.
632
633 @end itemize
634
635 Gnulib includes the file @file{build-aux/bootstrap} to aid a developer
636 in using this setup.  Furthermore, in projects that use git for
637 version control, it is possible to use a git submodule containing the
638 precise commit of the gnulib repository, so that each developer
639 running @file{bootstrap} will get the same version of all
640 gnulib-provided files.  The location of the submodule can be chosen to
641 fit the package's needs; here's how to initially create the submodule
642 in the directory @file{.gnulib}:
643
644 @smallexample
645 $ dir=.gnulib
646 $ git submodule add -- git://git.sv.gnu.org/gnulib.git $dir
647 $ git config alias.syncsub "submodule foreach git pull origin master"
648 @end smallexample
649
650 @noindent
651 Thereafter, @file{bootstrap} can run this command to update the
652 submodule to the recorded checkout level:
653
654 @smallexample
655 git submodule update --init $dir
656 @end smallexample
657
658 @noindent
659 and a developer can use this sequence to update to a newer version of
660 gnulib:
661
662 @smallexample
663 $ git syncsub
664 $ git add $dir
665 $ ./bootstrap
666 @end smallexample
667
668 @item
669 Some projects take a ``middle road'': they do commit Gnulib source
670 files as in the first approach, but they do not commit other derived
671 files, such as a @code{Makefile.in} generated by Automake.  This
672 increases the size and complexity of the repository, but can help
673 occasional contributors by not requiring them to have a full Gnulib
674 checkout to do a build, and all developers by ensuring that all
675 developers are working with the same version of Gnulib in the
676 repository.  It also supports multiple Gnulib instances within a
677 project.  It remains important not to commit the
678 @command{make}-generated files, as described above.
679
680 @end enumerate
681
682
683 @node Unit tests
684 @section Bundling the unit tests of the Gnulib modules
685
686 You can bundle the unit tests of the Gnulib modules together with your
687 package, through the @samp{--with-tests} option.  Together with
688 @samp{--with-tests}, you also specify the directory for these tests
689 through the @samp{--tests-base} option.  Of course, you need to add this
690 directory to the @code{SUBDIRS} variable in the @code{Makefile.am} of
691 the parent directory.
692
693 The advantage of having the unit tests bundled is that when your program
694 has a problem on a particular platform, running the unit tests may help
695 determine quickly if the problem is on Gnulib's side or on your package's
696 side.  Also, it helps verifying Gnulib's portability, of course.
697
698 The unit tests will be compiled and run when the user runs @samp{make check}.
699 When the user runs only @samp{make}, the unit tests will not be compiled.
700
701 In the @code{SUBDIRS} variable, it is useful to put the Gnulib tests directory
702 after the directory containing the other tests, not before:
703
704 @smallexample
705 SUBDIRS = gnulib-lib src man tests gnulib-tests
706 @end smallexample
707
708 @noindent
709 This will ensure that on platforms where there are test failures in either
710 directory, users will see and report the failures from the tests of your
711 program.
712
713 Note: In packages which use more than one invocation of @code{gnulib-tool}
714 in the scope of the same @code{configure.ac}, you cannot use
715 @samp{--with-tests}.  You will have to use a separate @code{configure.ac}
716 in this case.
717
718
719 @node Conditional dependencies
720 @section Avoiding unnecessary checks and compilations
721
722 @cindex conditional dependencies
723 In some cases, a module is needed by another module only on specific
724 platforms.  But when a module is present, its autoconf checks are always
725 executed, and its @code{Makefile.am} additions are always enabled.  So
726 it can happen that some autoconf checks are executed and some source files
727 are compiled, although no other module needs them on this particular
728 platform, just @emph{in case} some other module would need them.
729
730 The option @samp{--conditional-dependencies} enables an optimization of
731 configure checks and @code{Makefile.am} snippets that avoids this.  With
732 this option, whether a module is considered ``present'' is no longer decided
733 when @code{gnulib-tool} is invoked, but later, when @code{configure} is run.
734 This applies to modules that were added as dependencies while
735 @code{gnulib-tool} was run; modules that were passed on the command line
736 explicitly are always ``present''.
737
738 For example, the @code{timegm} module needs, on platforms
739 where the system's @code{timegm} function is missing or buggy, a replacement
740 that is based on a function @code{mktime_internal}.  The module
741 @code{mktime-internal} that provides this function provides it on all
742 platforms.  So, by default, the file @file{mktime-internal.c} will be
743 compiled on all platforms --- even on glibc and BSD systems which have a
744 working @code{timegm} function.  When the option
745 @samp{--conditional-dependencies} is given, on the other hand, and if
746 @code{mktime-internal} was not explicitly required on the command line,
747 the file @file{mktime-internal.c} will only be compiled on the platforms
748 where the @code{timegm} needs them.
749
750 Conditional dependencies are specified in the module description by putting
751 the condition on the same line as the dependent module, enclosed in brackets.
752 The condition is a boolean shell expression that can assume that the
753 @code{configure.ac} snippet from the module description has already been
754 executed.  In the example above, the dependency from @code{timegm} to
755 @code{mktime-internal} is written like this:
756
757 @smallexample
758 Depends-on:
759 ...
760 mktime-internal [test $HAVE_TIMEGM = 0 || test $REPLACE_TIMEGM = 1]
761 ...
762 @end smallexample
763
764 Note: The option @samp{--conditional-dependencies} cannot be used together
765 with the option @samp{--with-tests}.  It also cannot be used when a package
766 uses @code{gnulib-tool} for several subdirectories, with different values
767 of @samp{--source-base}, in the scope of a single @code{configure.ac} file.