.in with source files expect source code format for distdefs.
[autodist.git] / apps / autodist / doc / autodist.texi
1 \input texinfo   @c -*-texinfo-*-
2 @c %**start of header
3 @setfilename autodist.info
4 @settitle autodist
5 @setchapternewpage off
6 @c %**end of header
7
8 @include version.texi
9
10 @copying
11
12 This manual is for SILC Autodist (version @value{VERSION},
13 @value{UPDATED}), a program which is used to manage and create source
14 distributions.
15
16 Copyright @copyright{} 2004 - 2005 Pekka Riikonen, SILC Project
17
18 @quotation
19 Permission is granted to copy, distribute and/or modify this document
20 under the terms of the @acronym{GNU} Free Documentation License,
21 Version 1.2 or any later version published by the Free Software
22 Foundation; with no Invariant Sections, with the Front-Cover texts
23 being ``A @acronym{GNU} Manual,'' and with the Back-Cover Texts as in
24 (a) below.  A copy of the license is included in the section entitled
25 ``@acronym{GNU} Free Documentation License.''
26
27 (a) The FSF's Back-Cover Text is: ``You have freedom to copy and
28 modify this @acronym{GNU} Manual, like @acronym{GNU} software.  Copies
29 published by the Free Software Foundation raise funds for
30 @acronym{GNU} development.''
31 @end quotation
32 @end copying
33
34 @dircategory Software development
35 @direntry
36 * autodist: (autodist).         Managing and creating source distributions.
37 @end direntry
38
39 @dircategory Individual utilities
40 @direntry
41 * makedist: (autodist)Invoking makedist.          Creating distribution
42 @end direntry
43
44 @titlepage
45 @title SILC Autodist
46 @subtitle For version @value{VERSION}, @value{UPDATED}
47 @author Pekka Riikonen
48 @page
49 @vskip 0pt plus 1filll
50 @insertcopying
51 @end titlepage
52
53 @ifnottex
54 @node Top
55 @comment  node-name,  next,  previous,  up
56 @top SILC Autodist
57
58 @insertcopying
59
60 @menu
61 * Introduction::                Purpose of Autodist
62 * Integrating Autodist::        Integrating Autodist into your project
63 * Invoking Autodist::           Running Autodist
64 * Examples::                    Examples using Autodist
65
66 @detailmenu
67  --- The Detailed Node Listing ---
68
69 Introduction
70
71 * Motivation::                  Reasons for using Autodist
72
73 Integrating Autodist
74
75 * Creating distdir::            Creating distributions directory
76 * autodist.conf::               Configuring Autodist
77 * Creating new distribution::   Adding new distribution
78 * Distribution file format::    Detailed document for distfile format
79 * configure.ad files::          configure script for creating configure.ac
80 * Makefile.ad files::           Makefile.ad for creating Makefile.am
81 * Other .ad files::             Other files with .ad suffix
82 * Distdefines::                 Using distdefs in files
83
84 Invoking Autodist
85
86 * Preparing source tree::       Preparing source tree with Autodist
87 * Creating distribution::       Creating distribution with Autodist
88
89 Examples
90
91 * Single distribution tree::    Single distribution example
92 * Multiple distribution tree::  Multiple distributions example
93
94 @end detailmenu
95 @end menu
96
97 @end ifnottex
98
99
100 @node Introduction
101 @chapter Introduction
102
103 The Autodist is a source distribution management system that allows
104 powerful mechanisms to define what is included in and excluded from a
105 distribution, and what license the distribution is released under.  It is
106 also used to create the actual distribution source packages.  Autodist
107 allows distribution management in file, directory and file content level.
108 Different distributions may include different portions of files, for
109 example, excluding certain features from certain distributions.  It is
110 always guaranteed that anything not defined for the distribution, is
111 removed automatically (files, file content, directories), thus ensuring
112 that nothing is accidentally included in the distribution.
113
114 The Autodist creates 'Makefile.am' files from 'Makefile.ad' files and
115 'configure.ac' file from one or more 'configure.ad' files.  Any other file
116 ending with '.ad' suffix will also be processed.  The processed file will
117 have the '.ad' suffix removed (@pxref{Preparing source tree, , , , }).
118 Autodist also creates and packages the distribution using common GNU
119 distribution creation process, specificly `make dist'.  Autodist, however,
120 controls this process and during packaging phase the Autodist processes
121 all files in the distribution (other than '*.ad' files, which has already
122 been processed earlier by Autodist).  The resulted package is a processed
123 source distribution package, processed according to the rules specified
124 in the distribution file(s) (@pxref{Creating distribution, , , , }).
125
126 Any file in the source tree may use distdefs (distribution defines (@pxref{Distdefines, , , , })) which are defined in the distributions.  When distribution
127 is packaged only the files, directories and file content that is either
128 outside of any distdef, or inside the defined distdefs will be included
129 in the distribution.  Any other file, directory or content in the file
130 will be removed.  It is guaranteed, if a file, a directory or a piece of
131 file content is not inside a defined distdef it will not be delivered to
132 the distribution.
133
134 Any file, 'Makefile.am', 'configure.ac', or source file processed with
135 Autodist is always compliant with the tools needed to process them.  All
136 files can also be processed with the corresponding tools even before
137 processing them with Autodist.  This makes it possible, for example, to
138 compile sources before they have been processed, and undefined lines
139 are removed.  The distdefs are respected in source files by the
140 preprocessor.
141
142 Autodist is not a binary packaging system.  It is specificly used to
143 create source distributions.  A binary packaging system, however can be
144 hooked to the distribution creation process, if needed.
145
146 @menu
147 * Motivation::                  Reasons for using Autodist
148 @end menu
149
150
151 @node Motivation
152 @section Reasons for using Autodist
153
154 Autodist is closely related to the Autoconf and Automake tools, and
155 complements the features Autoconf and Automake provides.  It is especially
156 targeted into circumstances where multiple distributions are created from
157 one source tree.  The Autoconf and Automake environment is mainly designed
158 for one distribution (one application) per one source tree situations.
159 Autodist provides mechanisms to create all kinds of distributions that can
160 be created from one source tree.  To be able to use Autodist, the Autoconf
161 and Automake must be installed into the system (@pxref{Integrating Autodist, , , , }).
162 Autoconf version must be at least 2.52g.
163
164 Small software projects usually do very well with Autoconf and Automake
165 and their distribution management features.  Often these projects do not
166 need Autodist, though they can benefit from it.  However, if your software
167 project is large, you need to create multiple distributions from one source
168 tree, you have complex licensing terms for different distributions, you
169 have different target users or customers that may require different
170 feature set or licenses in different distributions, you have need to
171 continue concurrent development in the main source tree and still be able
172 to create stable distributions, and/or you have need to control file
173 content in different distributions (to avoid distributing code or features
174 that aren't supposed to be distributed, or to avoid leaking information
175 to your competitors on what new features you are working on), then Autodist
176 is a tool you may find usefull.
177
178 The motivation behind Autodist stems from need to be able to create
179 multiple distributions from one large source tree in a precise and
180 controllable manner, and guarantee that anything that is not part of the
181 distribution is removed from the distribution.  The Autoconf and Automake
182 provides mere basic control what is included in and excluded from
183 distributions and how the distributions are created.  They also do not
184 provide mechanism to define different licensing conditions for different
185 distributions, or changing the license automatically for different user
186 or customer purposes.  Many large software projects, companies and
187 corporations have commonly been using Autoconf and Automake tools, but
188 have had the need to create their own ad-hoc mechanisms to control
189 distribution creation.  The Autodist attempts to provide a tool that any
190 size software project can effectively use to manage their distributions.
191
192 Without a tool like Autodist, large software projects usually has to be
193 split into separate source trees, which may not always be possible because
194 they may share large portions of common code (which may further make
195 concurrent development of the applications hard), or multiple Autoconf and
196 Automake environments (multiple configure scripts) needs to be created
197 in one source tree.  In this case the source tree usually gets very
198 complicated and controlling what is compiled and what is included in
199 distributions becomes harder, especially when different parts code is shared
200 between applications and libraries.
201
202
203 @node Integrating Autodist
204 @chapter Integrating Autodist
205
206 Integrating Autodist into existing software project can be a very simple
207 task or a fairly complicated task.  It depends on the size and complexity
208 of the software project.  Generally speaking, integrating Autodist into
209 software project is fairly straightforward process:
210
211 1. The distributions directory and 'default' distribution are created
212
213 2. The 'configure.ad' is created
214
215 3. If needed, 'Makefile.ad' file(s) are created
216
217 After this the Autodist can already be used to prepare the source tree
218 for configuration and compilation (@pxref{Preparing source tree, , , , }).
219 Adding a new distribution would then allow the actual distribution
220 packaging also.
221
222 If the software project has had own ad-hoc distribution system already in
223 place, it may take some work to move from that system into the Autodist.
224 If there are multiple applications and distributions created from the
225 source tree, the distributions and distribution defines for them need to
226 be created.  While this may be unthankful job, it only needs to be done
227 once.
228
229 Integrating Autodist into a new software project is a very simple task as
230 renaming 'configure.ac' and possibly 'Makefile.am' files are not required,
231 as they may not exist yet.
232
233
234 @menu
235 * Creating distdir::            Creating distributions directory
236 * autodist.conf::               Configuring Autodist
237 * Creating new distribution::   Adding new distribution
238 * Distribution file format::    Detailed document for distfile format
239 * configure.ad files::          configure script for creating configure.ac
240 * Makefile.ad files::           Makefile.ad for creating Makefile.am
241 * Other .ad files::             Other files with .ad suffix
242 * Distdefines::                 Using distdefs in files
243 @end menu
244
245
246 @node Creating distdir
247 @section Creating distributions directory
248
249 The distributions directory is 'distdir', which is expected to be
250 located in the root of the source tree.  This directory will hold all
251 the distribution files, and the Autodist configuration file 'autodist.conf' (@pxref{autodist.conf, , , , }).
252 If this directory does not exist it can be created with the Autodist.
253
254 @example
255   autodist -i
256 @end example
257
258 This will create the 'distdir' and copy the default 'autodist.conf'
259 configuration file and the 'default' distribution into the directory.
260 The 'default' distribution will be used by default by the Autodist
261 unless other distribution is specified.
262
263 After this the Autodist has effectively been integrated into the
264 software project.  However, usually after this, one would create new
265 distributions, the 'configure.ad' and possibly 'Makefile.ad' file(s).
266 Without 'configure.ad' file a distribution package cannot be created.
267 However, even without 'configure.ad' file the source tree can be
268 prepared for configuration and compilation (@pxref{Preparing source tree, , , , }).
269
270 @menu
271 * autodist.conf::               Configuring Autodist
272 @end menu
273
274
275 @node autodist.conf
276 @section Configuring Autodist
277
278 After the Autodist has been integrated into the software by creating
279 the 'distdir', the 'autodist.conf' configuration file was added to the
280 'distdir' also.  Usually software projects will want to modify some of
281 the 'autodist.conf' options, mainly specifying the distdef prefix.
282
283 The 'autodist.conf' is a text file.  The following options are available
284 in 'autodist.conf':
285
286
287 @example
288 DISTPREFIX=""
289 @end example
290
291 By default the distdef prefix is '_DIST_'.  To add own software package
292 specific prefix the 'DISTPREFIX' can be defined.
293
294 Example:
295 @example
296 DISTPREFIX="SILC"
297 @end example
298
299 Will set the distdef prefix as 'SILC_DIST_'.
300
301
302 @example
303 DISTDEFS="distdefs.h"
304 @end example
305
306 The 'DISTDEFS' option specifies the file name of the distdef header file
307 which Autodist will create.  The software project should '#include' the
308 header file in order for the preprocessor to respect the distdef
309 conditionals (@pxref{Distdefines, , , , }).  By default the file name
310 is 'distdefs.h' and is created at the root of source tree.  Other location
311 may be specified if needed.
312
313 Example:
314 @example
315 DISTDEFS="include/distdefs.h"
316 @end example
317
318
319 @example
320 ACLOCAL="aclocal"
321 @end example
322
323 The 'ACLOCAL' specifies the location of the 'aclocal' tool.  If Autodist
324 should not run 'aclocal' this option may be removed or set to empty value.
325 User need to then run it manually.
326
327
328 @example
329 AUTOHEADER="autoheader"
330 @end example
331
332 The 'AUTOHEADER' specifies the location of the 'autoheader' tool.  If
333 Autodist should not run 'autoheader' this option may be removed or set
334 to empty value.  User need to then run it manually.
335
336 @example
337 AUTOCONF="autoconf"
338 @end example
339
340 The 'AUTOCONF' specifies the location of the 'autoconf' tool.  If
341 Autodist should not run 'autoconf' this option may be removed or set
342 to empty value.  User need to then run it manually.
343
344
345 @example
346 AUTOMAKE="automake -a -c"
347 @end example
348
349 The 'AUTOMAKE' specifies the location of the 'automake' tool.  If
350 Autodist should not run 'automake' this option may be removed or set
351 to empty value.  User need to then run it manually.  By default, the
352 '-a'  and '-c' options are given to 'automake' to add any missing required
353 files.
354
355
356 @example
357 LIBTOOLIZE="libtoolize --automake -c"
358 @end example
359
360 The 'LIBTOOLIZE' specifies the location of the 'libtoolize' tool.
361 This option should be removed or ste to empty value if 'libtool' is not
362 used in the source tree.
363
364
365 @example
366 MAKE=make
367 @end example
368
369 The 'MAKE' specifies the location of the 'make' program.  This option must
370 be set to valid value in order to create distributions.
371
372
373 @menu
374 * Creating new distribution::   Adding new distribution
375 @end menu
376
377
378 @node Creating new distribution
379 @section Creating new distribution
380
381 After the Autodist has been integrated into the software project by
382 creating the 'distdir' and 'default' distribution, the source tree
383 can be prepared for configuration and compilation (@pxref{Preparing source tree, , , , }).  However, the 'default' distribution should be used only as
384 a development distribution.  Usually it is used to prepare the raw source
385 tree (such as a tree just checkout
386 from CVS) for configuration and compilation.  By default, the 'default'
387 distribution cannot be packaged.  However, if the software project is
388 small (one distribution), it may be convenient to edit the 'default'
389 distribution to be as the distribution that is packaged from the source
390 tree.  In software project where multiple distributions are created using
391 the 'default' only as a development distribution is recommended.  The
392 real distributions should be defined as separate distributions.
393
394 Creating a new distribution is a simple process.  Each distribution
395 is placed in the 'distdir' and the file name of the distribution file is
396 used to reference to it.  By default, the distribution name is the
397 file name of the distribution file.  The actual distribution file is
398 a simple text file with various directives that define the distribution.
399
400 If the 'default' distribution is used as a development distribution it
401 might be desired to inherit some or all of the created distributions in
402 it, so that development becomes possible with the 'default' distribution.
403 Adding 'inherit' directive into the 'distdir/default' will inherit the
404 specified distribution.
405
406
407 @menu
408 * Distribution file format::    Detailed document for distfile format
409 @end menu
410
411
412 @node Distribution file format
413 @section Distribution file format in detail
414
415 The distribution file, or distfile from now on, defines your distribution,
416 distribution defines, options, included and excluded files and
417 directories, license, and additional processing.  Each distribution is
418 defined in a separate file and the distributions are referenced by
419 their file name.
420
421 The distfile is a text file that contains various directives that define
422 the actual distribution.  Lines starting with '#' are considered comments
423 and are ignored.
424
425
426 @section Directive: name <name>
427
428 The 'name' directive defines the name of the distribution.  It is optional
429 directive, and if omitted the distribution name will be the name of the
430 distfile.  The 'PACKAGE_NAME' define delivered by Autoconf will contain
431 this name string.
432
433 Example:
434 @example
435 name FOO Application
436 @end example
437
438 Will set your distribution name as 'Foo Application'.
439
440
441 @section Directive: package <package>
442
443 The 'package' directive defines the name of the distribution package.  It is
444 optional directive, and if omitted the distribution package name will
445 be the name of the distribution, if defined, or if omitted, then the name
446 of the distfile.  If this directive is omitted then normal GNU convention
447 is used to decide the package name, derived from the distribution name.
448 The 'PACKAGE_TARNAME' define delivered by Autoconf will contain this
449 package name string.
450
451 Example:
452 @example
453 package foo-client
454 @end example
455
456 Will create distribution packages named, for example, as
457 'foo-client-1.0.tar.gz'.
458
459
460 @section Directive: bug-report <email address>
461
462 The 'bug-report' directive can be used to define the email address where
463 the bug-reports for the distribution should be sent.  The directive is
464 optional.  The 'PACKAGE_BUGREPORT' define delivered by Autoconf will
465 contain this bug report string.
466
467
468 @section Directive: license <filename>
469
470 The 'license' directive can be used to define the license file for the
471 distribution.  This directive is optional.  The license file will be
472 copied into the distribution in the name 'COPYING'.  If the 'COPYING'
473 file already exist it will be replaced.
474
475 Example:
476 @example
477 license license/GPL
478 @end example
479
480 Will include the file 'license/GPL' into the distribution in the file
481 name 'COPYING'.
482
483
484 @section Directive: license-header <current-license> <new-license>
485
486 The 'license-header' can be used to re-license your files into a new
487 license.  This directive is optional.  There may be zero or more
488 'license-header' directives in distribution.  The 'license-header'
489 directive will compare the license header that usually appear at the
490 start of a file to the <current-license>.  If it matches it will
491 be replaced with the <new-license>.  The license header in the file
492 will be replaced and the file will have effectively been re-licensed.
493
494 Example:
495 @example
496 license-header license/BSD-header license/GPL-header
497 @end example
498
499 Will replace all appearances of the license header in 'license/BSD-header'
500 file to the license header in 'license/GPL-header' in any file in the
501 distribution.  Note that, the header change will be performed when
502 the distribution is packaged (@pxref{Creating distribution, , , , }).
503
504 With 'license-header' directive you may initially set your files in the
505 source tree into what ever license you prefer.  However, if you need to
506 re-license parts of the source tree in certain distributions the
507 'license-header' will achieve this automatically.  For example, suppose
508 one wants to create two different versions of a library distribution, with
509 different feature sets, in two different licenses.
510
511 There are several limitations in the current implementation of Autodist
512 with the 'license-header' directive:
513
514 First limitation is that the header files must have equal amount of lines.
515 If the new header file has fewer lines that the current header file, all
516 of the lines from the current header will not be replaced.  If the new header
517 has fewer lines, empty lines must be added to it.  If the new header file
518 has more lines than the current header file, the extra lines will not appear
519 in the replaced header.  Basic rule is to always make sure the header 
520 files have equal amount of lines in them.
521
522 Second limitation is in indentation of the header files.  It is suggested,
523 though not mandatory, that the header files have the same indentation as
524 is commonly used in the source tree; if the license header text in a file
525 starts at the second character instead of at the start of the line, then
526 the header file should start the license text at the second character also.
527 If same indentation is not used the appearance of the replaced header
528 may not be perfect.  While this is a cosmetic issue, one still to remember.
529
530 Third limitation is that the distribution cannot be partially re-licensed.  
531 If the 'license-header' directive is used then all files that have the 
532 specified header will be replaced with the new header.  There are 
533 currently two ways to not re-license a file;  use different license header 
534 in the file than one specified in 'license-header', or specify the file or 
535 directory in 'noprocess' directive.  Using 'noprocess' is not possible if 
536 the file needs to be otherwise processed for the distribution.  Future 
537 versions of Autodist may provide a mechanism to re-license only part of 
538 the distribution.
539
540 Example current header:
541 @example
542 --- Start example
543   This program is free software; you can redistribute it and/or modify
544   it under the terms of the GNU General Public License as published by
545   the Free Software Foundation; version 2 of the License.
546
547   This program is distributed in the hope that it will be useful,
548   but WITHOUT ANY WARRANTY; without even the implied warranty of
549   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
550   GNU General Public License for more details.
551 --- end example
552 @end example
553
554 Example new header:
555 @example
556 --- Start example
557   All rights reserved.
558
559   Redistribution and use in source and binary forms, with or without
560   modification, are permitted provided that the conditions listed in the
561   COPYING file are met.
562
563
564
565 --- end example
566 @end example
567
568 In this example, if the text in the current header file is found in any
569 file in the distribution it will be replaced with the new header file.
570 Notice that, both header files has same amount of lines (8 lines).
571
572 Note that, the current header must match exactly the header used in
573 files.  Otherwise the replacement will not be complete.
574
575
576 @section Directive: inherit <distfile>
577
578 The Autodist provides inheritance of distributions.  The 'inherit'
579 directive is used to define the distribution which will be inherited
580 into the distribution.  The <distfile> specifies the name of the
581 inherited distribution.  If the distribution cannot be inherited Autodist
582 will give an error.
583
584 The 'inherit' will inherit the following information from the 
585 distribution: distdefs, undefines, includes, excludes and noprocesses.  
586 Other information will not be inherited.  If the inherited distribution 
587 inherits other distributions, they will also be inherited automatically.  
588 User should be careful when inheriting distributions as it may be possible 
589 to create an infinite recursion.  The Autodist would allow for this and 
590 not detect this error.  Zero or more 'inherit' directives may be set for 
591 distribution.
592
593 Example:
594 @example
595 inherit common
596 inherit client
597 inherit toolkit
598 @end example
599
600 Will inherit distributions 'common', 'client' and 'toolkit' into this
601 distribution.  All distdefs, undefines, includes, excludes and noprocesses
602 from these distributions are now also part this distribution.
603
604 The distribution that is being prepared or packaged take precedence when 
605 defining distdefs that were specificly undefined in the inherited 
606 distribution.  This means that if the inherited distribution specificly 
607 undefines a distdefs but the inheriting distribution (one being prepared 
608 or packaged) specificly defines it, the distdef will be defined.  
609 Similarly, if the inherited distribution defines a distdef but the 
610 inheriting distribution undefines it, the distdef will be undefined.  
611 Note that, this precedence works only in the top distribution (the one 
612 being prepared or packaged).  If the inherited distribution inherits other 
613 distributions, all distdefs (defined and specificly undefined) will be 
614 inherited as is.  This means that if one inherited distribution defines a 
615 distdef that other inherited distribution distdef undefines, it will be 
616 undefined.  However, the top distribution can then override them if 
617 needed.
618
619
620 @section Directive: define <symbol>
621
622 The 'define' directive is used to define the distdef symbols for the
623 distribution.  This directive is optional, however, all distributions
624 should define at least one distdef so that the distribution may be
625 controlled with the distdef conditionals in files in the source tree (@pxref{Distdefines, , , , }).  By default, the distdef prefix is '_DIST_'.  Many
626 software projects will want to set their own prefix for the distdefs
627 for consistency.  The prefix may be defined in the 'autodist.conf' file
628 (@pxref{autodist.conf, , , , }).
629
630 Example:
631 @example
632 define _DIST_FOO
633 define _DIST_FEATURE_X
634 define _DIST_LIBRARY_Y
635 @end example
636
637 Will define the following distdefs for the distribution: '_DIST_FOO',
638 '_DIST_FEATURE_X' and '_DIST_LIBRARY_Y'.  These distdefs may then be
639 used in the source tree and source code to control what is included in
640 or excluded from this distribution.
641
642
643 @section Directive: undef <symbol>
644
645 The 'undef' directive may be used to explicitly undefine a distdef.
646 When inheriting distributions it may be desired to be able undefine
647 certain distdefs.  This directive is optional.
648
649 Example:
650 @example
651 undef _DIST_FEATURE_Y
652 @end example
653
654 Will undefine '_DIST_FEATURE_Y' distdef.  This distdef will not be part
655 of this distribution anymore, even if it is defined in some inherited
656 distribution.
657
658
659 @section Directive: option <option> [...]
660
661 The 'option' directive is used to define various options for the
662 distribution.  The options can change the behavior of the distribution.
663 This directive is optional.  One or more options may be defined in one
664 'option' directive.  Zero or more 'option' directives may be set for
665 distribution.  The following options are available.
666
667 @example
668 template
669 @end example
670
671 When set, the distribution is a template distribution.  Templates are 
672 special distributions which cannot be prepared or packaged with Autodist. 
673 Templates can only be inherited.  Usually, templates are used to define a 
674 common template distribution for other distributions.  Templates may set 
675 distdefs, undefines, includes, excludes and noprocesses.  A large software 
676 project could have several distributions that share a common base.  In 
677 this case defining the common base as a template distribution and then 
678 inheriting that distribution makes it easier to manage the distfiles.
679
680 @example
681 no-dist
682 @end example
683
684 Distributions with the 'no-dist' option are similar to templates, except
685 that they can be prepared with Autodist, but they cannot be packaged.
686 These are usually used as a common development distribution, such as the
687 'default' distribution created with 'autodist -i'.
688
689 @example
690 no-inherit
691 @end example
692
693 If this option is set to normal distributions or distributions with
694 'no-dist' option, the distribution cannot be inherited.  For template
695 this option has no effect.  If distribution with this option is inherited
696 the Autodist will give an error.
697
698
699 @section Directive: include <source> [<destination>]
700
701 The 'include' directive can be used to include files or directories into
702 the distribution.  Sometimes it may be desired to specify included
703 files and directories in distribution instead of Makefile.am and
704 EXTRA_DIST, especially if there are many distributions that need to
705 include specific files and directories.  While it would be possible
706 to define them in Makefile.ad and use distdef conditionals to define
707 which will be included in which distribution, if there are many different
708 distributions it may pollute the Makefile.ad unnecessarily.
709
710 This directive is optional.  The <source> may be a single file, a  single
711 directory or a regular expression which will match several files and/or
712 directories.  The <destination> is optional.  If it is omitted then
713 the <source> will be copied into the same location in the distribution.
714 If the <destination> is provided the <source> will be copied into the
715 specified location.
716
717 Example:
718 @example
719 include apps/foobar/README README
720 include lib/libfoo
721 include lib/libfoobar lib/foobarlib
722 include doc/foo*
723 include scripts/foobar.sh foo.sh
724 @end example
725
726 Will include the file 'apps/foobar/README' into the top distribution
727 directory in the name 'README', the directory 'lib/libfoo' into same
728 location in distribution, the directory 'lib/libfoobar' into
729 'lib/foobarlib' changing the name of the directory into 'foobarlib',
730 the files and directories that match 'doc/foo*' into the same locations
731 in distribution, and finally the 'scripts/foobar.sh' into the top
732 distribution directory changing the name of the file into 'foo.sh'.
733
734 Note that, the 'include' directives will be processed by the Autodist
735 only when the distribution is packaged (@pxref{Creating distribution, , , , }).  When preparing the source
736 tree for configuration and compilation (@pxref{Preparing source tree, , , , })
737 the 'include' directives are ignored.  This is same behavior as with
738 Makefile.am's EXTRA_DIST.
739
740 If the included file or directory does not exist the Autodist will
741 give an error and stop the distribution creation.  If the destination
742 file exist, it will be replaced with the included file.  If the
743 destination directory already exists, the contents of the source
744 directory will be copied into the directory.  Note that, the directory
745 will not be copied into the directory; if the <destination> is specified,
746 also the name of the <source> file or directory must be specified,
747 otherwise the 'include' will change the name into the one specified.
748
749 Example:
750 @example
751 include lib/libfoo lib
752 @end example
753
754 In this example the 'lib/libfoo' will be included as 'lib'.  If the 'lib'
755 already exists, this effectively copies the contents of the 'lib/libfoo'
756 into 'lib'.  In order to include the directory with same name, the
757 name must be specified.
758
759 Example:
760 @example
761 include lib/libfoo lib/libfoo
762 include lib/foobar new_lib/foobar
763 @end example
764
765 This will include the 'lib/libfoo' into 'lib/libfoo' in distribution,
766 and 'lib/foobar' into 'new_lib/foobar' in distribution.
767
768
769 @section Directive: exclude <filename> [...]
770
771 The 'exclude' directive can be used to exclude files and directories from
772 the distribution.  This directive is optional.  This directive is
773 processed before processing the 'include' directive.  The <filename>
774 can be a single file, a single directory or a regular expression that
775 will match several files and/or directories.
776
777 Example:
778 @example
779 exclude README
780 exclude doc/client*
781 @end example
782
783 This will exclude the file 'README' and anything that match 'doc/client*'.
784
785
786 @section Directive: noprocess <filename> [...]
787
788 The 'noprocess' directive can be used to tell Autodist specificly not to
789 process a file.  The Autodist will not process the file during
790 preparation or during distribution packaging.  This directive is optional.
791 One or more file can be specified in the 'noprocess' directive.  Zero or
792 more 'noprocess' directives can be used in distribution.  The <filename>
793 can be a single file or a regular expression that will match several files.
794 Note that, in current Autodist version 'noprocess' cannot be used to
795 specify directories.
796
797 Example:
798 @example
799 noprocess autodist.texi
800 noprocess apps/foo/*
801 @end example
802
803 Autodist will not process 'autodist.texi' file, and any file that match
804 'apps/foo/*'.  Note that, any subdirectory under 'apps/foo/' will not
805 match, and will be processed.
806
807 Also note that, 'noprocess' directive cannot be used to disallow 
808 processing of any file with '.ad' suffix.
809
810
811 @section Directive: pre-hook <filename> [...]
812
813 The 'pre-hook' directive can be used define additional scripts that
814 will be run before the source tree is prepared.  This directive is
815 optional.  One or more scripts may be defined in one 'pre-hook' directive.
816 Zero or more 'pre-hook' directives may be set for distribution.  The
817 'pre-hook' hook will be run immediately after invoking Autodist to start
818 preparing the source tree for configuration and compilation (@pxref{Preparing source tree, , , , }).
819
820 The scripts will get three (3) command line arguments when Autodist
821 executes the script: distribution name, distribution version and package
822 name of distribution.  The script may use these arguments if it needs them.
823
824
825 @section Directive: post-hook <filename> [...]
826
827 The 'post-hook' directive can be used define additional scripts that
828 will be run after the source tree is prepared.  This directive is
829 optional.  One or more scripts may be defined in one 'post-hook' directive.
830 Zero or more 'post-hook' directives may be set for distribution.  The
831 'post-hook' hook will be run immediately after the Autodist has finished
832 preparing the source three for configuration and compilation (@pxref{Preparing source tree, , , , }).  The Autodist will exit after it has run the
833 'post-hook' scripts.
834
835 The scripts will get three (3) command line arguments when Autodist
836 executes the script: distribution name, distribution version and package
837 name of distribution.  The script may use these arguments if it needs them.
838
839
840 @section Directive: pre-process-dist-hook <filename> [...]
841
842 The 'pre-process-dist-hook' directive can be used define additional
843 scripts that will be run when Autodist has started distribution creation.
844 This directive is optional.  One or more scripts may be defined in one
845 'pre-process-dist-hook' directive.  Zero or more 'pre-process-dist-hook'
846 directives may be set for distribution.  The 'pre-process-dist-hook' hook
847 will be run immediately after the Autodist has created the distribution
848 directory but has not yet started any distribution processing.
849
850 The scripts will get four (4) command line arguments when Autodist
851 executes the script: distribution name, distribution version, package
852 name of distribution and destination distribution directory name.  The
853 script may use these arguments if it needs them.
854
855
856 @section Directive: post-process-dist-hook <filename> [...]
857
858 The 'post-process-dist-hook' directive can be used define additional
859 scripts that will be run when Autodist has finished distribution
860 processing.  This directive is optional.  One or more scripts may be
861 defined in one 'post-process-dist-hook' directive.  Zero or more
862 'post-process-dist-hook' directives may be set for distribution.  The
863 'post-process-dist-hook' hook will be run immediately after the Autodist
864 has finished processing the destination distribution directory but has not
865 yet created the distribution package.
866
867 The scripts will get four (4) command line arguments when Autodist
868 executes the script: distribution name, distribution version, package
869 name of distribution and destination distribution directory name.  The
870 script may use these arguments if it needs them.
871
872
873 @section Directive: pre-dist-hook <filename> [...]
874
875 The 'pre-dist-hook' directive can be used define additional scripts that
876 will be run when Autodist has started distribution creation.  This directive
877 is optional.  One or more scripts may be defined in one 'pre-dist-hook'
878 directive.  Zero or more 'pre-dist-hook' directives may be set for
879 distribution.  The 'pre-dist-hook' hook will be run immediately after
880 the Autodist has started distribution creation, but has not yet created
881 the distribution directory.  This hook is run before 'pre-process-dist-hook'.
882
883 The scripts will get four (4) command line arguments when Autodist
884 executes the script: distribution name, distribution version, package
885 name of distribution and destination distribution directory name.  The
886 script may use these arguments if it needs them.
887
888
889 @section Directive: post-dist-hook <filename> [...]
890
891 The 'post-dist-hook' directive can be used define additional scripts that
892 will be run when Autodist has finished distribution creation.  This
893 directive is optional.  One or more scripts may be defined in one
894 'post-dist-hook' directive.  Zero or more 'post-dist-hook' directives may
895 be set for distribution.  The 'post-dist-hook' hook will be run
896 immediately after the Autodist has finished creating the distribution
897 package.  This is the last hook Autodist runs.
898
899 The scripts will get four (4) command line arguments when Autodist
900 executes the script: distribution name, distribution version, package
901 name of distribution and destination distribution directory name.  The
902 script may use these arguments if it needs them.
903
904
905 @section Running hooks
906
907 The Autodist runs the hooks in the following order:
908
909 Preparing source tree for configuration and compilation:
910
911 @example
912 <...Autodist started...>
913 pre-hook
914 <...preparation...>
915 post-hook
916 <...Autodist exits...>
917 @end example
918
919 Creating distribution:
920
921 @example
922 <...Autodist started...>
923 pre-dist-hook
924 <...distribution directory created...>
925 pre-process-dist-hook
926 <...processing all files, processing excludes and includes...>
927 post-process-dist-hook
928 <...creating distribution package...>
929 post-dist-hook
930 <...Autodist exits...>
931 @end example
932
933 When creating distribution the 'pre-hook' and 'post-hook' are not run.
934
935
936 @section Example distfile
937
938 The following is a simple distfile example.  The example assumes that the
939 distdefs prefix is 'SILC'.
940
941 @example
942 # SILC Client distribution
943 name SILC Client
944 package silc-client
945 bug-report silc-client-bugs@@silcnet.org
946 inherit common
947 inherit platform-unix
948 inherit platform-win32
949 define SILC_DIST_CLIENT
950 define SILC_DIST_CLIENTLIB
951 define SILC_DIST_IRSSI
952 undef SILC_DIST_MPI
953 exclude doc/draft*
954 pre-hook scripts/client-pre-run
955 post-process-dist-hook scripts/client-post-process
956 post-dist-hook scripts/client-post-dist-bin
957 @end example
958
959 @menu
960 * configure.ad files::          configure script for creating configure.ac
961 @end menu
962
963
964 @node configure.ad files
965 @section configure.ad files
966
967 Autodist creates 'configure.ac' file from the 'configure.ad' file.  The
968 'configure.ad' file is a rather normal 'configure.ac' except that it accepts
969 also Autodist macros.  Autodist also supports configure script fragments,
970 also named as 'configure.ad'.  Any 'configure.ad' file in the source tree
971 can be incorporated into the the top 'configure.ad' file.  Sometimes it may
972 be useful to split a large configure script into smaller fragments.
973 Especially in multi distribution system where certain libraries or features
974 can be excluded from certain distributions it may be useful to handle
975 their configuration from a configure fragment.  If the library is
976 excluded then also its configuration can be excluded.
977
978 If the software project already has a 'configure.ac' or 'configure.in'
979 file, the 'configure.ad' can be created by simply renaming the current
980 file to 'configure.ad'.  In this case the current configure script
981 must be edited to support Autodist.  This is done by replacing the
982 'AC_INIT' to 'AD_INIT'.  After specifying the 'AD_INIT' as the first
983 macro in the 'configure.ad', the Autodist support has been fully
984 integrated into the software project.
985
986 If your software project is going to use configure fragments, then
987 also Autodist macro 'AD_INCLUDE_CONFIGURE' must be used.  Autodist will
988 automatically combine the fragments with the top 'configure.ac' script.
989 To exclude a 'configure.ad' fragment from a distribution use the distdef
990 conditionals inside the 'configure.ad' fragment file.  If the distdef is
991 not defined the fragment will be excluded automatically.
992
993 The following macros are available in current Autodist version.
994
995 @defmac AD_INIT
996
997 The 'AD_INIT' macro is used in place of Autoconf macro 'AC_INIT'.  The
998 'AD_INIT' must be the first macro in the 'configure.ad', just like the
999 'AC_INIT' macro in 'configure.ac'.  The AD_INIT macro is used to deliver
1000 the distribution names, distribution version, package name and bug-report
1001 email address to the 'configure.ac' file that Autodist will create.
1002 The 'AC_INIT' macro must not be used in 'configure.ad' file.
1003
1004 This macro is mandatory and Autodist will exit with error if it is not
1005 specified in 'configure.ad'.  This macro has no arguments.
1006 @end defmac
1007
1008
1009 @defmac AD_INCLUDE_CONFIGURE
1010
1011 This macro is used to tell Autodist that it should include any other
1012 'configure.ad' fragment that is found from the source tree into the
1013 top 'configure.ad' file.  Note that, the 'configure.ad' fragments will
1014 be incorporated at the location where this macro is used in the
1015 'configure.ad'.  Usually this macro is placed just before the Autoconf
1016 macro 'AC_OUTPUT'.  This macro has no arguments.
1017
1018 Note that, the 'configure.ad' fragments are not real full featured
1019 configure scripts.  They must not use 'AD_INIT', 'AD_INCLUDE_CONFIGURE',
1020 'AC_INIT' or any other initialization macros.
1021
1022 @end defmac
1023
1024 @menu
1025 * Makefile.ad files::           Makefile.ad for creating Makefile.am
1026 @end menu
1027
1028
1029 @node Makefile.ad files
1030 @section Makefile.ad files
1031
1032 Autodist creates 'Makefile.am' files from 'Makefile.ad' files.  A software
1033 project do not need to use 'Makefile.ad' files if there is no need to
1034 use distdef conditionals inside makefiles.  Usually a multi distribution
1035 software project, however will need to define certain things to different
1036 distributions.  In these cases 'Makefile.ad' file needs to be created.
1037
1038 Even though it would be possible to use distdef conditionals also inside
1039 'Makefile.am' files, Autodist does not process 'Makefile.am' files when
1040 preparing the source tree for configuration and compilation (@pxref{Preparing source tree, , , , }).  Thus, the prepared environment would not be
1041 identical to the created distribution package (when the 'Makefile.am'
1042 will be processed), and configuration and compilation would be inconsistent.
1043 Basic rule is, if you need distdefs (@pxref{Distdefines, , , , }) inside
1044 makefiles, put them inside 'Makefile.ad' file.
1045
1046
1047 @menu
1048 * Other .ad files::             Other files with .ad suffix
1049 @end menu
1050
1051
1052 @node Other .ad files
1053 @section Other .ad files
1054
1055 Any file in the source tree can have the '.ad' suffix appended.  Autodist
1056 will process any file that has the suffix when the source tree is
1057 prepared for configuration and compilation (@pxref{Preparing source tree, , , , }).  If the files have distdef conditionals the Autodist will process them.
1058 The files will have the '.ad' suffix removed.
1059
1060 Basic rule is, if you need to process some file when preparing the
1061 source tree for configuration and compilation, add '.ad' suffix to it.
1062 Distdefs (@pxref{Distdefines, , , , }) can be used in any file in source
1063 tree but without '.ad' suffix Autodist will not process those files during
1064 preparation.  They will be processed when creating the distribution package.
1065 If you need processed files during configuration or compilation then they
1066 need to have '.ad' suffix.
1067
1068 Note that, the distdef format used in these files must be the non-source
1069 format, even if the file is source file.  This is because the distdefs
1070 are processed during source tree preparation, and the source file will
1071 have all distdefs removed when it is compiled.
1072
1073 @menu
1074 * Distdefines::                 Using distdefs in files
1075 @end menu
1076
1077
1078 @node Distdefines
1079 @section Using distribution defines (distdefs)
1080
1081 Distribution defines, or distdefs from now on, are used to define inside
1082 a file what will be included in the distribution.  Distribution may define
1083 many different distdefs, for example, based on feature sets, platforms, or
1084 for other similar reasons.  If distdef is not defined for the distribution
1085 but is used in a file, anything inside the distdef in that file will be
1086 removed when the distribution is packaged (@pxref{Creating distribution, , , , }).  This guarantees that only the files, directories and file content
1087 (such as source code) that is supposed to be delivered with the distribution
1088 are delivered.  Delivering files or code accidentally in the distribution
1089 cannot happen.
1090
1091 All other files, except files ending with '.ad' suffix are processed for
1092 distdefs only when the distribution is packaged.  Files ending with '.ad'
1093 suffix are processed for distdefs when preparing the source tree for
1094 configuration and compilation (@pxref{Preparing source tree, , , , }).
1095
1096 By default the distdefs are named '_DIST_XXX', where 'XXX' is the name of
1097 distdef.  However, many projects will want to define their own prefix
1098 for distdefs in the 'autodist.conf' configuration file (@pxref{autodist.conf, , , , }).
1099 In the following examples a prefix 'SILC' is used, hence the prefix for
1100 the distdefs are 'SILC_DIST_'.
1101
1102 The basic format for the distdefs are as follows:
1103
1104 @example
1105 #ifdef SILC_DIST_DEFINE
1106 #endif SILC_DIST_DEFINE
1107
1108 #ifndef SILC_DIST_DEFINE
1109 #endif SILC_DIST_DEFINE
1110
1111 #ifdef SILC_DIST_DEFINE
1112 #else !SILC_DIST_DEFINE
1113 #endif SILC_DIST_DEFINE
1114
1115 #ifndef SILC_DIST_DEFINE
1116 #else SILC_DIST_DEFINE
1117 #endif SILC_DIST_DEFINE
1118 @end example
1119
1120 This format should be used only in non-source files, as for example C and
1121 C++ compilers will not like this format inside a file.  In source files
1122 a compiler friendly format, defined below, should be used.
1123
1124 @example
1125 #ifdef SILC_DIST_DEFINE
1126 #endif /* SILC_DIST_DEFINE */
1127
1128 #ifndef SILC_DIST_DEFINE
1129 #endif /* SILC_DIST_DEFINE */
1130
1131 #ifdef SILC_DIST_DEFINE
1132 #else /* !SILC_DIST_DEFINE */
1133 #endif /* SILC_DIST_DEFINE */
1134
1135 #ifndef SILC_DIST_DEFINE
1136 #else /* SILC_DIST_DEFINE */
1137 #endif /* SILC_DIST_DEFINE */
1138 @end example
1139
1140 Note that, only the format defined above is supported.  Other more complex
1141 use of the preprocessor directives such as using '&&' and '||' in the
1142 '#ifdef' or '#ifndef' are not supported, and neither is '#elif'.  Also
1143 note, that the name of the distdef in '#else' and '#endif' directives in
1144 non-source format and in source format inside C comments (/* */), and the
1145 use of '!' character in the '#else' branch of '#ifdef'" are mandatory.
1146 Also note, that the distdef conditionals must be placed at the start of
1147 the line, they must not be indented.
1148
1149 The following example shows the use of non-source format:
1150
1151 @example
1152 SUBDIRS =                        \
1153 #ifdef SILC_DIST_SERVER
1154        server                    \
1155        server-foobar             \
1156 #endif SILC_DIST_SERVER
1157 #ifndef SILC_DIST_CLIENT
1158        tests                     \
1159 #endif SILC_DIST_CLIENT
1160 #ifdef SILC_DIST_TOOLKIT
1161        toolkit                   \
1162        toolkit-docs              \
1163 #else !SILC_DIST_TOOLKIT
1164        doc                       \
1165        lib                       \
1166 #ifdef SILC_DIST_CLIENT
1167        client                    \
1168 #endif SILC_DIST_CLIENT
1169 #endif SILC_DIST_TOOLKIT
1170 @end example
1171
1172 Say, in this example, your distribution has the SILC_DIST_CLIENT and
1173 SILC_DIST_SERVER defined, but not the SILC_DIST_TOOLKIT, the end result
1174 would be:
1175
1176 @example
1177 SUBDIRS =                        \
1178        server                    \
1179        server-foobar             \
1180        doc                       \
1181        lib                       \
1182        client                    \
1183 @end example
1184
1185 The lines defined specificly for the SILC_DIST_TOOLKIT, which in our
1186 example was not defined, were removed.  Also lines that specificly
1187 expected certain distdefs not to be defined ('#ifndef') were removed.
1188 (Note the last remaining '\' in example above would be removed by the
1189 Autodist automatically to avoid errors with Automake.)
1190
1191 The following example shows the use of source code format:
1192
1193 @example
1194   initialize_lib();
1195 #ifdef SILC_DIST_MPI
1196   init_mpi();
1197   mpi = mpi_alloc();
1198 #else /* !SILC_DIST_MPI */
1199   init_gmp();
1200 #endif /* SILC_DIST_MPI */
1201
1202 #ifndef SILC_DIST_FOOBAR
1203   foobar_replacement();
1204   foobar_hack_init();
1205   foobar_init();
1206 #else /* SILC_DIST_FOOBAR */
1207   real_foobar();
1208 #endif /* SILC_DIST_FOOBAR */
1209 @end example
1210
1211 Say, you have both SILC_DIST_MPI and SILC_DIST_FOOBAR defined, the end result
1212 would be:
1213
1214 @example
1215   initialize_lib();
1216   init_mpi();
1217   mpi = mpi_alloc();
1218
1219   real_foobar();
1220 @end example
1221
1222 Even before processing the source files with Autodist, the preprocessor
1223 will respect the preprocessor directives if the code use '#include' to
1224 include the distdef header file created by the Autodist (see
1225 'autodist.conf' (@pxref{autodist.conf, , , , })).  When the distribution
1226 is packaged (@pxref{Creating distribution, , , , }) the Autodist will
1227 process the files, and will remove any line not defined to be included.
1228 The preprocessor directives will also be removed.
1229
1230 Because the software project includes the header file with '#include' the
1231 distdef header file needs to be present in the distribution, unless it is
1232 placed inside some other '#ifdef' conditional.  If the distribution is
1233 prepared but not compiled (it is packaged after preparation without
1234 compilation) then including the distdef header in the source is not
1235 necessary.  Including it then in the distribution is not necessary either.
1236
1237 The software project should not use the same name space that distdef
1238 conditionals use for other than distribution usage.  The Autodist will
1239 process any line that uses the formats above and has the specified prefix
1240 (eg. 'SILC_DIST_') in those lines.  Using same prefix for other purposes
1241 will produce unexpected results and invalid distributions.
1242
1243 The following suffixes will be considered as source files by the Autodist:
1244
1245 @example
1246     .c
1247     .C
1248     .cc
1249     .cp
1250     .cpp
1251     .CPP
1252     .cxx
1253     .CXX
1254     .c++
1255     .m
1256     .h
1257     .H
1258     .hh
1259 @end example
1260
1261 Also, any file that has '.in' suffix with any of the above source file 
1262 suffixes, the format inside the file must follow the source code format.  
1263 Using distdefs in any other file must follow the non-source format.
1264
1265 Example:
1266 @example
1267     .c.in
1268     .h.in
1269 @end example
1270
1271 In this example, in both of the files the source code format is used.
1272
1273
1274 @node Invoking Autodist
1275 @chapter Invoking Autodist
1276
1277 The Autodist has two basic functions:
1278
1279     1. Preparing source tree for configuration and compilation (@pxref{Preparing source tree, , , , })
1280
1281     2. Creating distribution packages (@pxref{Creating distribution, , , , })
1282
1283 The 'autodist' accepts the following options:
1284
1285 @table @samp
1286
1287 @item -h
1288 @itemx --help
1289 Prints the help for the Autodist and exits.
1290
1291 @item -V
1292 @itemx --version
1293 Prints version number and exits.
1294
1295 @item -v
1296 @itemx --verbose
1297 Verbosely report processing.
1298
1299 @item -d
1300 @itemx --distdir <dir>
1301 Search distributions from <dir> instead of default 'distdir'.
1302
1303 @item -s
1304 @itemx --distdefs [<dist>]
1305 Prints distribution defines of <dist> and exits.
1306
1307 @item -i
1308 @itemx --init
1309 Initializes Autodist environment.  Creates the default distribution
1310 directory 'distdir', 'autodist.conf' configuration file and the
1311 default distribution 'default', then exits.
1312
1313 @item -m
1314 @itemx --makedist
1315 Creates and packages distribution
1316
1317 @itemx --gzip
1318 Create package compressed with gzip (default)
1319
1320 @itemx --bzip2
1321 Create also package compressed with bzip2
1322
1323 @itemx --compress
1324 Create also package compressed with compress
1325
1326 @itemx --zip
1327 Create also package compressed with zip
1328
1329
1330 @end table
1331
1332 @menu
1333 * Preparing source tree::       Preparing source tree with Autodist
1334 * Creating distribution::       Creating distribution with Autodist
1335 @end menu
1336
1337
1338 @node Preparing source tree
1339 @section Preparing source tree for configuration and compilation
1340
1341 Before distribution can be created from the source tree, the source tree
1342 must be prepared for configuration and compilation.  If your project is
1343 not using Autodist, then you would do this by running perhaps 'aclocal',
1344 'autoconf', 'autoheader' and 'automake' tools manually, or you would run an
1345 'autogen.sh' script that prepares your raw source tree.  With Autodist
1346 this process is performed by Autodist, and running these tools manually
1347 or using 'autogen.sh' script is not necessary.
1348
1349 By default the 'autodist.conf' (@pxref{autodist.conf, , , , }) has defined
1350 the tools that will be run by the Autodist when preparing the source tree.
1351 These are 'aclocal', 'autoheader', 'autoconf', 'automake' and
1352 'libtoolize'.  If you do not wish that Autodist runs some or any of these
1353 tools automatically, do not set them in the 'autodist.conf'.  You would
1354 then need to run them manually. However, this is not recommended.  If you
1355 need to run additional preparation scripts you may set your scripts either
1356 in the 'pre-hook' and/or 'post-hook' where you can run what ever
1357 additional processing you may need to prepare your source tree.
1358
1359 By default the Autodist creates a 'default' distribution when you
1360 initialize your project by running 'autodist -i'.  The 'default'
1361 distribution should be used when you are developing in your source
1362 tree.  By default, the 'default' distribution cannot be packaged,
1363 however, if your project creates only one distribution you may find
1364 it more convenient to define your distribution inside the 'default'
1365 distribution and allow it to be packaged also.  If your source tree
1366 will create multiple distributions, the 'default' should be used only
1367 as development distribution.  You would use it when you, for example,
1368 checkout your source tree from CVS and prepare it for configuration
1369 and compilation.  To prepare your source tree with the 'default'
1370 distribution run Autodist without any arguments.
1371
1372 @example
1373   autodist
1374 @end example
1375
1376 The Autodist will prepare your source tree.  After that you may run
1377 './configure' and continue to compile with 'make'.
1378
1379 If you do not wish to use the 'default' distribution, or you wish
1380 to do the development in a tree specificly prepared for some specific
1381 distribution, or you are preparing to create a new distribution package,
1382 you will need to run the Autodist with the distribution you wish to
1383 prepare.
1384
1385 @example
1386   autodist example-distribution 1.0.3
1387 @end example
1388
1389 This prepares your source tree for 'example-distribution' of version
1390 '1.0.3'.  After that you may run './configure' and continue to compile
1391 with 'make'.  If the version is omitted the version will be '0.0'.
1392 The 'PACKAGE_VERSION' define delivered by Autoconf will contain this
1393 version.
1394
1395 Note that, running Autodist for preparation merely prepares your source
1396 tree for the distribution, it does not create an actual distribution
1397 package.  When preparing source tree for configuration and compilation
1398 the Autodist will process any file that ends with '.ad' suffix.  It will
1399 process all 'configure.ad' and 'Makefile.ad' files for that distribution.
1400 When you run './configure' your tree will be configured for that
1401 distribution, and when you compile with 'make' it will compile for that
1402 distribution.
1403
1404 However, the source files, or any other file (except files ending with
1405 '.ad' suffix) are not processed by the Autodist.  When compiling
1406 your sources the preprocessor, however, will respect your distdef
1407 conditionals inside your source files if you '#include' the distdef header
1408 file.  This way, even the compiled binaries will be compiled for that
1409 distribution, even though the source files has not yet been processed
1410 by the Autodist.  Rest of the files in the distribution will be processed
1411 when you create the actual distribution package.  It is guaranteed that
1412 the distribution you have prepared will behave in your source tree exactly
1413 the same way as if it was already packaged with Autodist (providing that
1414 you remember to include the distdef header file in your code).
1415
1416 When preparing the source tree Autodist will create a file 'autodist.dist'
1417 which will contain information on the prepared distribution.  When
1418 Creating the distribution that file will be read by the Autodist
1419 automatically.  That file should not be removed or the distribution
1420 cannot be packaged.
1421
1422 @menu
1423 * Creating distribution::       Creating distribution with Autodist
1424 @end menu
1425
1426
1427 @node Creating distribution
1428 @section Creating distribution package(s)
1429
1430 Before creating a new distribution package, you will need to prepare
1431 the source tree for the distribution you want to create.  After preparing
1432 your source tree you will be ready to create a new distribution.  The
1433 Autodist package provides a simple helper script 'makedist' that may
1434 be used to create the distribution.  However, if you wish, you may
1435 run the Autodist yourself, as the 'makedist' will call Autodist anyway.
1436
1437 To create a new distribution for the distribution you have prepared for,
1438 run first './configure' and then 'makedist'.
1439
1440 @example
1441   makedist
1442 @end example
1443
1444 This will run the Autodist and create a new distribution package that
1445 is archived with 'tar' and compressed with 'gzip'.  If you wish to
1446 create packages also compressed with 'bzip2', 'compress' and/or 'zip'
1447 you may give one or all of the following options:
1448
1449 @example
1450   makedist --bzip2 --compress --zip
1451 @end example
1452
1453 This example would create, in addition of 'tar.gz' package, also a
1454 'tar.bz2', 'tar.Z' and '.zip' packages.  Current version of Autodist does
1455 not support archiving with 'shar'.
1456
1457 If you wish to run additional processing for your distributions when they 
1458 are being packaged you may set 'pre-process-dist-hook', 
1459 'post-process-dist-hook, 'pre-dist-hook' and/or 'post-dist-hook' in your 
1460 distribution file.  Also note that any hooks provided by Automake in 
1461 Makefiles will be run in normal manner.
1462
1463
1464 @node Examples
1465 @chapter Examples
1466
1467 @menu
1468 * Single distribution tree::    Single distribution example
1469 * Multiple distribution tree::  Multiple distributions example
1470 @end menu
1471
1472 @node Single distribution tree
1473 @section Single distribution tree example, start to finish
1474
1475 Lets suppose you have a simple source tree with one application,
1476 called 'foozbar' you wish to release.  While you would probably suffice
1477 using Autoconf and Automake features you may still use Autodist.
1478
1479 First, you create the default 'distdir' into your software package:
1480
1481 @example
1482   autodist -i
1483 @end example
1484
1485 Then, you create the 'configure.ad' file from your existing 'configure.ac'
1486 or 'configure.in' file.  If you don't have configure script written yet,
1487 please refer to the Autoconf manual.  In the 'configure.ad' you add as
1488 first macro in the file:
1489
1490 @example
1491   AD_INIT
1492 @end example
1493
1494 Then, you create distribution file for your application:
1495
1496 @example
1497 # Foozbar distribution
1498 name Foozbar
1499 package foozbar
1500 bug-report foozbar-bugs@@foo.z.bar
1501 define _DIST_FOOZBAR
1502 @end example
1503
1504 This distribution file go into 'distdir/foozbar'.
1505
1506 And there you go.  You have succesfully integrated Autodist into your
1507 source tree.  If you need to do development and you wish to use the
1508 'default' distribution for that, you should inherit the new 'foozbar'
1509 distribution in it.  Add the following line in 'distdir/default':
1510
1511 @example
1512   inherit foozbar
1513 @end example
1514
1515 After that, you can prepare the source tree for configuration and
1516 compilation by giving:
1517
1518 @example
1519   autodist
1520 @end example
1521
1522 After this command you can give './configure' and 'make'.
1523
1524 If you want to do development directly in a tree prepared for the
1525 'foozbar' distribution, or you are ready to start creating a new
1526 distribution package, you give:
1527
1528 @example
1529   autodist foozbar 1.0
1530 @end example
1531
1532 After this command you can give './configure' and 'make'.
1533
1534 To create the distribution package, you will give:
1535
1536 @example
1537   makedist
1538 @end example
1539
1540 The end result will be a 'foozbar-1.0.tar.gz' package.
1541
1542
1543 @node Multiple distribution tree
1544 @section Multiple distribution tree example, start to finish
1545
1546 Lets suppose you have a source tree from which you create multiple
1547 distributions, say three.  If you really have a such source tree you
1548 must have by now noticed the difficulty of maintaining such a source tree
1549 and problems with controlling the distributions.  Maybe you have sufficed
1550 with Autoconf and Automake, or perhaps you have created your own scripts
1551 that carry out the kludges.  No more, for Autodist is here.
1552
1553 First, you integrate Autodist into your tree by creating the distributions
1554 directory 'distdir':
1555
1556 @example
1557   autodist -i
1558 @end example
1559
1560 Then, you create the 'configure.ad' file from your existing 'configure.ac'
1561 or 'configure.in' file.  If you don't have configure script written yet,
1562 please refer to the Autoconf manual.  In the 'configure.ad' you add as
1563 first macro in the file:
1564
1565 @example
1566   AD_INIT
1567 @end example
1568
1569 You then continue with creating the distribution files for your three
1570 distributions.  Let's name them 'foozbar', 'libfoozbar' and 'nomad'.
1571 We will also create a common template that all distributions inherit.
1572
1573 @example
1574 # Foozbar distribution
1575 name Foozbar
1576 package foozbar
1577 bug-report foozbar-bugs@@foo.z.bar
1578 inherit common
1579 define _DIST_FOOZBAR
1580 @end example
1581
1582 @example
1583 # libfoozbar distribution
1584 name libfoozbar
1585 bug-report libfoozbar-bugs@@foo.z.bar
1586 inherit common
1587 define _DIST_LIBFOOZBAR
1588 @end example
1589
1590 @example
1591 # Nomad distribution
1592 name Nomad
1593 package nomad-the-server
1594 bug-report nomad-bugs@@foo.z.bar
1595 inherit common
1596 include doc/nomad
1597 define _DIST_NOMAD
1598 define _DIST_NOMAD_LIB
1599 undef _DIST_CRYPTO
1600 @end example
1601
1602 @example
1603 # Common template
1604 option template
1605 define _DIST_DOC
1606 define _DIST_LIB
1607 define _DIST_MATH
1608 define _DIST_CRYPTO
1609 define _DIST_UNIX
1610 define _DIST_MACOSX
1611 define _DIST_WIN32
1612 @end example
1613
1614 You put the distribution files in the 'distdir' directory.  In addition
1615 you will be doing development in the source tree using the 'default'
1616 distribution, you will add the new distributions to the 'distdir/default':
1617
1618 @example
1619 inherit foozbar
1620 inherit libfoozbar
1621 inherit nomad
1622 @end example
1623
1624 To prepare the source tree for configuration and compilation you would
1625 simply give:
1626
1627 @example
1628 autodist
1629 @end example
1630
1631 This will prepare your source tree for configuration and compilation.  Since
1632 the 'default' distribution inherits all distributions your development
1633 source tree will have all of them included.  If you do not want to do this
1634 then don't inherit them in the 'default', but run the autodist specificly
1635 for the distributions, for example:
1636
1637 @example
1638 autodist foozbar
1639 @end example
1640
1641 Since all the distributions inherit the 'common' distribution they get
1642 all the distdefs that the 'common' defines.  In this example various distdefs
1643 has been defined.  You would use them in your code and in your makefiles
1644 to control various things.  For example, let's say the 'common' distdefs
1645 control what directories distributions have.  An example 'Makefile.ad'
1646 file:
1647
1648 @example
1649 SUBDIRS =                       \
1650 #ifdef _DIST_LIB
1651        lib                      \
1652 #endif _DIST_LIB
1653 #ifdef _DIST_DOC
1654        doc                      \
1655 #endif _DIST_DOC
1656 @end example
1657
1658 Perhaps the 'Makefile.ad' in 'lib' subdirectory could define something
1659 like this:
1660
1661 @example
1662 SUBDIRS =                       \
1663         util                    \
1664 #ifdef _DIST_MATH
1665         mathlib                 \
1666 #endif _DIST_MATH
1667 #ifdef _DIST_CRYPTO
1668         cryptolib               \
1669 #endif _DIST_CRYPTO
1670 #ifdef _DIST_NOMAD_LIB
1671         nomadlib                \
1672 #endif _DIST_NOMAD_LIB
1673 #ifdef _DIST_LIBFOOZBAR
1674         foozbarlib               \
1675 #endif _DIST_LIBFOOZBAR
1676 @end example
1677
1678 Since the 'nomad' distribution undefined the '_DIST_CRYPTO' distdef it
1679 would not have the 'cryptolib' in its distribution.  Clearly Nomad
1680 don't need it.  In addition of using the distdefs just in the makefiles
1681 you may want to use them in the source code as well:
1682
1683 @example
1684      ...some code...
1685
1686 #ifdef _DIST_MATH
1687   /* Initialize math library */
1688   math_init();
1689 #endif /* _DIST_MATH */
1690
1691      ...some code...
1692 @end example
1693
1694 After an intensive development period you're ready to create new releases.
1695 Let's say you're going to release all distributions:
1696
1697 First you release Foozbar 0.5.1:
1698
1699 @example
1700 autodist foozbar 0.5.1
1701 makedist --bzip2
1702 @end example
1703
1704 The end result is two files: 'foozbar-0.5.1.tar.gz' and
1705 'foozbar-0.5.1.tar.bz2'.
1706
1707 Then you continue with libfoozbar and Nomad:
1708
1709 @example
1710 autodist libfoozbar 1.0.5
1711 makedist
1712
1713 autodist nomad 2.0
1714 makedist
1715 @end example
1716
1717 The end results are: 'libfoozbar-1.0.5.tar.gz' and 'nomad-2.0.tar.gz'.
1718
1719 @page
1720 @contents
1721 @bye