Software Release Practice HOWTO

Eric Steven Raymond

   [1]Thyrsus Enterprises
   
       esr@thyrsus.com
   
   This is version 3.0
   
   Copyright � 2000 by Eric S. Raymond
   
   $Date: 2000/08/21 18:29:23 $
   Revision History
   Revision 3.0 12 August 2000 Revised by: esr
   First DocBook version. Advice on SourceForge and a major section on
   documentation practice added.
   
   This HOWTO describes good release practices for Linux open-source
   projects. By following these practices, you will make it as easy as
   possible for users to build your code and use it, and for other
   developers to understand your code and cooperate with you to improve
   it.
   
   This document is a must-read for novice developers. Experienced
   developers should review it when they are about to release a new
   project. It will be revised periodically to reflect the evolution of
   good-practice standards.
     _________________________________________________________________
   
   Table of Contents
   1. [2]Introduction
          
        1.1. [3]Why this document?
        1.2. [4]New versions of this document
                
   2. [5]Good project- and archive- naming practice
          
        2.1. [6]Use GNU-style names with a stem and major.minor.patch
                numbering.
                
        2.2. [7]But respect local conventions where appropriate
        2.3. [8]Try hard to choose a name prefix that is unique and easy
                to type
                
   3. [9]Good licensing and copyright practice: the theory
          
        3.1. [10]Open source and copyrights
        3.2. [11]What qualifies as open source
                
   4. [12]Good licensing and copyright practice: the practice
          
        4.1. [13]Make yourself or the FSF the copyright holder
        4.2. [14]Use a license conformant to the Open Source Definition
        4.3. [15]Don't write your own license if you can possibly avoid
                it.
                
   5. [16]Good development practice
          
        5.1. [17]Write either pure ANSI C or a portable scripting
                language
                
        5.2. [18]Follow good C portability practices
        5.3. [19]Use autoconf/automake/autoheader
        5.4. [20]Sanity-check your code before release
        5.5. [21]Sanity-check your documentation and READMEs before
                release
                
   6. [22]Good distribution-making practice
          
        6.1. [23]Make sure tarballs always unpack into a single new
                directory
                
        6.2. [24]Have a README
        6.3. [25]Respect and follow standard file naming practices
        6.4. [26]Design for Upgradability
        6.5. [27]Provide RPMs
                
   7. [28]Good documentation practice
          
        7.1. [29]Good practice in the present
        7.2. [30]Good practice for the future
                
   8. [31]Good communication practice
          
        8.1. [32]Announce to c.o.l.a and Freshmeat
        8.2. [33]Announce to a relevant topic newsgroup
        8.3. [34]Have a website
        8.4. [35]Host project mailing lists
        8.5. [36]Release to major archives
                
   9. [37]Good project-management practice
     _________________________________________________________________
   
1. Introduction

1.1. Why this document?

   There is a large body of good-practice traditions for open-source code
   that helps other people port, use, and cooperate with developing it.
   Some of these conventions are traditional in the Unix world and
   predate Linux; others have developed recently in response to
   particular new tools and technologies such as the World Wide Web.
   
   This document will help you learn good practice. It is organized into
   topic sections, each containing a series of checklist items. Think of
   these as a pre-flight checklist for your software distribution.
     _________________________________________________________________
   
1.2. New versions of this document

   This document will be posted monthly to the newsgroups
   [38]comp.os.linux.answers. You can also view the latest version of
   this HOWTO on the World Wide Web via the URL
   [39]http://www.linuxdoc.org/LDP/HOWTO/Software-Release-Practice.html.
   
   Feel free to mail any questions or comments about this HOWTO to Eric
   S. Raymond, <[40]esr@snark.thyrsus.com>.
     _________________________________________________________________
   
2. Good project- and archive- naming practice

   As the load on maintainers of archives like Metalab, the PSA site and
   CPAN increases, there is an increasing trend for submissions to be
   processed partly or wholly by programs (rather than entirely by a
   human).
   
   This makes it more important for project and archive-file names to fit
   regular patterns that computer programs can parse and understand.
     _________________________________________________________________
   
2.1. Use GNU-style names with a stem and major.minor.patch numbering.

   It's helpful to everybody if your archive files all have GNU-like
   names -- all-lower-case alphanumeric stem prefix, followed by a dash,
   followed by a version number, extension, and other suffixes.
   
   Let's suppose you have a project you call `foobar' at version 1,
   release 2, level 3. If it's got just one archive part (presumably the
   sources), here's what its names should look:
   
   foobar-1.2.3.tar.gz
          The source archive
          
   foobar.lsm
          The LSM file (assuming you're submitting to Metalab).
          
   Please don't use these:
   
   foobar123.tar.gz
          This looks to many programs like an archive for a project
          called`foobar123' with no version number.
          
   foobar1.2.3.tar.gz
          This looks to many programs like an archive for a project
          called `foobar1' at version 2.3.
          
   foobar-v1.2.3.tar.gz
          Many programs think this goes with a project called
          `foobar-v1'.
          
   foo_bar-1.2.3.tar.gz
          The underscore is hard for people to speak, type, and remember.
          
   FooBar-1.2.3.tar.gz
          Unless you like looking like a marketing weenie. This is also
          hard for people to speak, type, and remember.
          
   If you have to differentiate between source and binary archives, or
   between different kinds of binary, or express some kind of build
   option in the file name, please treat that as a file extension to go
   after the version number. That is, please do this:
   
   foobar-1.2.3.src.tar.gz
          sources
          
   foobar-1.2.3.bin.tar.gz
          binaries, type not specified
          
   foobar-1.2.3.bin.ELF.tar.gz
          ELF binaries
          
   foobar-1.2.3.bin.ELF.static.tar.gz
          ELF binaries statically linked
          
   foobar-1.2.3.bin.SPARC.tar.gz
          SPARC binaries
          
   Please don't use names like `foobar-ELF-1.2.3.tar.gz', because
   programs have a hard time telling type infixes (like `-ELF') from the
   stem.
   
   A good general form of name has these parts in order:
   
    1. project prefix
    2. dash
    3. version number
    4. dot
    5. "src" or "bin" (optional)
    6. dot or dash (dot preferred)
    7. binary type and options (optional)
    8. archiving and compression extensions
     _________________________________________________________________
   
2.2. But respect local conventions where appropriate

   Some projects and communities have well-defined conventions for names
   and version numbers that aren't necessarily compatible with the above
   advice. For instance, Apache modules are generally named like mod_foo,
   and have both their own version number and the version of Apache with
   which they work. Likewise, Perl modules have version numbers that can
   be treated as floating point numbers (e.g., you might see 1.303 rather
   than 1.3.3), and the distributions are generally named
   Foo-Bar-1.303.tar.gz for version 1.303 of module Foo::Bar. (Perl
   itself, on the other hand, switched to using the conventions described
   un this document in late 1999.)
   
   Look for and respect the conventions of specialized communities and
   developers; for general use, follow the above guidelines.
     _________________________________________________________________
   
2.3. Try hard to choose a name prefix that is unique and easy to type

   The stem prefix should be common to all a project's files, and it
   should be easy to read, type, and remember. So please don't use
   underscores. And don't capitalize or BiCapitalize without extremely
   good reason -- it messes up the natural human-eyeball search order and
   looks like some marketing weenie trying to be clever.
   
   It confuses people when two different projects have the same stem
   name. So try to check for collisions before your first release. Two
   good places to check are the [41]index file of Metalab and the
   appindex at [42]Freshmeat. Another good place to check is
   [43]SourceForge; do a name search there.
     _________________________________________________________________
   
3. Good licensing and copyright practice: the theory

   The license you choose defines the social contract you wish to set up
   among your co-developers and users. The copyright you put on the
   software will function mainly as a legal assertion of your right to
   set license terms on the software and derivative works of the
   software.
     _________________________________________________________________
   
3.1. Open source and copyrights

   Anything that is not public domain has a copyright, possibly more than
   one. Under the Berne Convention (which has been U.S. law since 1978),
   the copyright does not have to be explicit. That is, the authors of a
   work hold copyright even if there is no copyright notice.
   
   Who counts as an author can be very complicated, especially for
   software that has been worked on by many hands. This is why licenses
   are important. By setting out the terms under which material can be
   used, they grant rights to the users that protect them from arbitrary
   actions by the copyright holders.
   
   In proprietary software, the license terms are designed to protect the
   copyright. They're a way of granting a few rights to users while
   reserving as much legal territory is possible for the owner (the
   copyright holder). The copyright holder is very important, and the
   license logic so restrictive that the exact technicalities of the
   license terms are usually unimportant.
   
   In open-source software, the situation is usually the exact opposite;
   the copyright exists to protect the license. The only rights the
   copyright holder always keeps are to enforce the license. Otherwise,
   only a few rights are reserved and most choices pass to the user. In
   particular, the copyright holder cannot change the terms on a copy you
   already have. Therefore, in open-source software the copyright holder
   is almost irrelevant -- but the license terms are very important.
   
   Normally the copyright holder of a project is the current project
   leader or sponsoring organization. Transfer of the project to a new
   leader is often signaled by changing the copyright holder. However,
   this is not a hard and fast rule; many open-source projects have
   multiple copyright holders, and there is no instance on record of this
   leading to legal problems.
   
   Some projects choose to assign copyright to the Free Software
   Foundation, on the theory that it has an interest in defending open
   source and lawyers available to do it.
     _________________________________________________________________
   
3.2. What qualifies as open source

   For licensing purposes, we can distinguish several different kinds of
   rights that a license may convey. Rights to copy and redistribute,
   rights to use, rights to modify for personal use, and rights to
   redistribute modified copies. A license may restrict or attach
   conditions to any of these rights.
   
   The [44]Open Source Initiative is the result of a great deal of
   thought about what makes software ``open source'' or (in older
   terminology) ``free''. Its constraints on licensing require that:
   
    1. An unlimited right to copy be granted.
    2. An unlimited right to use be granted.
    3. An unlimited right to modify for personal use be granted.
       
   The guidelines prohibit restrictions on redistribution of modified
   binaries; this meets the needs of software distributors, who need to
   be able to ship working code without encumbrance. It allows authors to
   require that modified sources be redistributed as pristine sources
   plus patches, thus establishing the author's intentions and an ``audit
   trail'' of any changes by others.
   
   The OSD is the legal definition of the `OSI Certified Open Source'
   certification mark, and as good a definition of ``free software'' as
   anyone has ever come up with. All of the standard licenses (MIT, BSD,
   Artistic, and GPL/LGPL) meet it (though some, like GPL, have other
   restrictions which you should understand before choosing it).
   
   Note that licenses which allow noncommercial use only do not qualify
   as open-source licenses, even if they are decorated with ``GPL'' or
   some other standard license. They discriminate against particular
   occupations, persons, and groups. They make life too complicated for
   CD-ROM distributors and others trying to spread open-source software
   commercially.
     _________________________________________________________________
   
4. Good licensing and copyright practice: the practice

   Here's how to translate the theory above into practice:
     _________________________________________________________________
   
4.1. Make yourself or the FSF the copyright holder

   In some cases, if you have a sponsoring organization behind you with
   lawyers, you might wish to give copyright to that organization.
     _________________________________________________________________
   
4.2. Use a license conformant to the Open Source Definition

   The Open Source Definition is the community gold standard for
   licenses. The OSD is not a license itself; rather, it defines a
   minimum set of rights that a license must guarantee in order to be
   considered an open-source license. The OSD, and supporting materials,
   may be found at the web site of the [45]Open Source Initiative.
     _________________________________________________________________
   
4.3. Don't write your own license if you can possibly avoid it.

   The widely-known OSD-conformant licenses have well-established
   interpretive traditions. Developers (and, to the extent they care,
   users) know what they imply, and have a reasonable take on the risks
   and tradeoffs they involve. Therefore, use one of the standard
   licenses carried on the OSI site if at all possible.
   
   If you must write your own license, be sure to have it certified by
   OSI. This will avoid a lot of argument and overhead. Unless you've
   been through it, you have no idea how nasty a licensing flamewar can
   get; people become passionate because the licenses are regarded as
   almost-sacred covenants touching the core values of the open-source
   community.
   
   Furthermore, the presence of an established interpretive tradition may
   prove important if your license is ever tested in court. At time of
   writing (mid-2000) there is no case law either supporting or
   invalidating any open-source license. However, it is a legal doctrine
   (at least in the U.S., and probably in other common-law countries such
   as England and the rest of the British Commonwealth) that courts are
   supposed to interpret licenses and contracts according to the
   expectations and practices of the community in which they originated.
     _________________________________________________________________
   
5. Good development practice

   Most of these are concerned with ensuring portability, not only across
   Linuxes but to other Unixes as well. Being portable to other Unixes is
   not just a worthy form of professionalism and hackerly politeness,
   it's valuable insurance against future changes in Linux itself.
   
   Finally, other people will try to build your code on non-Linux
   systems; portability minimizes the number of annoying perplexed email
   messages you will get.
     _________________________________________________________________
   
5.1. Write either pure ANSI C or a portable scripting language

   For portability and stability, you should write either in ANSI C or a
   scripting language that is guaranteed portable because it has just one
   cross-platform implementation.
   
   Scripting languages that qualify include Python, Perl, Tcl, Emacs
   Lisp, and PHP. Plain old shell does not qualify; there are too many
   different implementations with subtle idiosyncracies, and the shell
   environment is subject to disruption by user customizations such as
   shell aliases.
   
   Java holds promise as a portable language, but the Linux-available
   implementations are still scratchy and poorly integrated with Linux.
   Java is still a bleeding-edge choice, though one likely to become more
   popular as it matures.
     _________________________________________________________________
   
5.2. Follow good C portability practices

   If you are writing C, do feel free to use the full ANSI features --
   including function prototypes, which will help you spot cross-module
   inconsistancies. The old-style K&R compilers are history.
   
   On the other hand, do not assume that GCC-specific features such as
   the `-pipe' option or nested functions are available. These will come
   around and bite you the second somebody ports to a non-Linux, non-GCC
   system.
     _________________________________________________________________
   
5.3. Use autoconf/automake/autoheader

   If you're writing C, use autoconf/automake/autoheader to handle
   portability issues, do system-configuration probes, and tailor your
   makefiles. People building from sources today expect to be able to
   type "configure; make" and get a clean build -- and rightly so.
     _________________________________________________________________
   
5.4. Sanity-check your code before release

   If you're writing C, test-compile with -Wall and clean up the errors
   at least once before each release. This catches a surprising number of
   errors. For real thoroughness, compile with -pedantic as well.
   
   If you're writing Perl, check your code with perl -c (and maybe -T, if
   applicable). Use perl -w and 'use strict' religiously. (See the Perl
   documentation for discussion.)
     _________________________________________________________________
   
5.5. Sanity-check your documentation and READMEs before release

   Run a spell-checker on them. If you look like you can't spell and
   don't care, people will assume you code is sloppy and careless too.
     _________________________________________________________________
   
6. Good distribution-making practice

   These guidelines describe how your distribution should look when
   someone downloads, retrieves and unpacks it.
     _________________________________________________________________
   
6.1. Make sure tarballs always unpack into a single new directory

   The single most annoying mistake newbie developers make is to build
   tarballs that unpack the files and directories in the distribution
   into the current directory, potentially stepping on files already
   located there. Never do this!
   
   Instead, make sure your archive files all have a common directory part
   named after the project, so they will unpack into a single top-level
   directory directly beneath the current one.
   
   Here's a makefile trick that, assuming your distribution directory is
   named `foobar' and SRC contains a list of your distribution files,
   accomplishes this.
foobar-$(VERS).tar.gz:
        @ls $(SRC) | sed s:^:foobar-$(VERS)/: >MANIFEST
        @(cd ..; ln -s foobar foobar-$(VERS))
        (cd ..; tar -czvf foobar/foobar-$(VERS).tar.gz `cat foobar/MANIFEST`)
        @(cd ..; rm foobar-$(VERS))
     _________________________________________________________________
   
6.2. Have a README

   Have a file called README or READ.ME that is a roadmap of your source
   distribution. By ancient convention, this is the first file intrepid
   explorers will read after unpacking the source.
   
   Good things to have in the README include:
   
    1. A brief description of the project.
    2. A pointer to the project website (if it has one)
    3. Notes on the developer's build environment and potential
       portability problems.
    4. A roadmap describing important files and subdirectories.
    5. Either build/installation instructions or a pointer to a file
       containing same (usually INSTALL).
    6. Either a maintainers/credits list or a pointer to a file
       containing same (usually CREDITS).
    7. Either recent project news or a pointer to a file containing same
       (usually NEWS).
     _________________________________________________________________
   
6.3. Respect and follow standard file naming practices

   Before even looking at the README, your intrepid explorer will have
   scanned the filenames in the top-level directory of your unpacked
   distribution. Those names can themselves convey information. By
   adhering to certain standard naming practices, you can give the
   explorer valuable clues about what to look in next.
   
   Here are some standard top-level file names and what they mean. Not
   every distribution needs all of these.
   
   README or READ.ME
          the roadmap file, to be read first
          
   INSTALL
          configuration, build, and installation instructions
          
   CREDITS
          list of project contributers
          
   NEWS
          recent project news
          
   HISTORY
          project history
          
   COPYING
          project license terms (GNU convention)
          
   LICENSE
          project license terms
          
   MANIFEST
          list of files in the distribution
          
   FAQ
          plain-text Frequently-Asked-Questions document for the project
          
   TAGS
          generated tag file for use by Emacs or vi
          
   Note the overall convention that filenames with all-caps names are
   human-readable metainformation about the package, rather than build
   components.
   
   Having a FAQ can save you a lot of grief. When a question about the
   project comes up often, put it in the FAQ; then direct users to read
   the FAQ before sending questions or bug reports. A well-nurtured FAQ
   can decrease the support burden on the project maintainers by an order
   of magnitude or more.
   
   Having a HISTORY or NEWS file with timestamps in it for each release
   is valuable. Among other things, it may help establish prior art if
   you are ever hit with a patent-infringement lawsuit (this hasn't
   happened to anyone yet, but best to be prepared).
     _________________________________________________________________
   
6.4. Design for Upgradability

   Your software will change over time as you put out new releases. Some
   of these changes will not be backward-compatible. Accordingly, you
   should give serious thought to designing your installation layouts so
   that multiple installed versions of your code can coexist on the same
   system. This is especially important for libraries -- you can't count
   on all your client programs to upgrade in lockstep with your API
   changes.
   
   The Emacs, Python, and Qt projects have a good convention for handling
   this; version-numbered directories. Here's how an installed Qt library
   hierarchy looks (${ver} is the version number):
/usr/lib/qt
/usr/lib/qt-${ver}
/usr/lib/qt-${ver}/bin          # Where you find moc
/usr/lib/qt-${ver}/lib          # Where you find .so
/usr/lib/qt-${ver}/include      # Where you find header files

   With this organization, you can have multiple versions coexisting.
   Client programs have to specify the library version they want, but
   that's a small price to pay for not having the interfaces break on
   them.
     _________________________________________________________________
   
6.5. Provide RPMs

   The de-facto standard format for installable binary packages is that
   used by the Red Hat Package manager, RPM. It's featured in the most
   popular Linux distribution, and supported by effectively all other
   Linux distributions (except Debian and Slackware; and Debian can
   install from RPMs).
   
   Accordingly, it's a good idea for your project site to provide
   installable RPMs as well as source tarballs.
   
   It's also a good idea for you to include in your source tarball the
   RPM spec file, with a production that makes RPMs from it in your
   Makefile. The spec file should have the extension `.spec'; that's how
   the rpm -t option finds it in a tarball.
   
   For extra style points, generate your spec file with a shellscript
   that automatically plugs in the correct version number by analyzing
   the Makefile or a version.h.
   
   Note: if you supply source RPMs, use BuildRoot to make the program be
   built in /tmp or /var/tmp. If you don't, during the course of running
   the make install part of your build, the install will install the
   files in the real final places. This will happen even if there are
   file collisions, and even if you didn't want to install the package at
   all. When you're done, the files will have been installed and your
   system's RPM database will not know about it. Such badly behaved SRPMs
   are a minefield and should be eschewed.
     _________________________________________________________________
   
7. Good documentation practice

   The most important good documentation practice is to actually write
   some! Too many programmers omit this. But here are two good reasons to
   do it:
   
    1. Your documentation can be your design document. The best time to
       write it is before you type a single line of code, while you're
       thinking out what you want to do. You'll find that the process of
       describing the way you want your program to work in natural
       language focuses your mind on the high-level questions about what
       it should do and how it should work. This may save you a lot of
       effort later.
    2. Your documentation is an advertisement for the quality of your
       code. Many people take poor, scanty, or illiterate documentation
       for a program as a sign that the programmer is sloppy or careless
       of potential users' needs. Good documentation, on the other hand,
       conveys a message of intelligence and professionalism. If your
       program has to compete with other programs, better make sure your
       documentation is at least as good as theirs lest potential users
       write you off without a second look.
       
   This HOWTO wouldn't be the place for a course on technical writing
   even if that were practical. So we'll focus here on the formats and
   tools available for composing and rendering documentation.
   
   Though Unix and the open-source community have a long tradition of
   hosting powerful document-formatting tools, the plethora of different
   formats has meant that documentation has tended to be fragmented and
   difficult for users to browse or index in a coherent way. We'll
   summarize the uses, strengths, and weaknesses of the common
   documentation formats. Then we'll make some recommendations for good
   practice.
     _________________________________________________________________
   
7.1. Good practice in the present

   Here are the documentation markup formats now in widespread use among
   open-source developers. When we speak of "presentation" markup, we
   mean markup that controls the document's appearance explicitly (such
   as a font change). When we speak of "structural" markup, we mean
   markup that describes the logical structure of the document (like a
   section break or emphasis tag.) And when we speak of "indexing", we
   mean the process of extracting from a collection of documents a
   searchable collection of topic pointers that users can employ to
   reliably find material of interest across the entire collection.
   
   man pages
          The most most common format, inherited from Unix, a primitive
          form of presentation markup. The man(1) command provides a
          pager and stone-age search facility. No support for images or
          hyperlinks or indexing. Renders to Postscript for printing
          fairly well. Doesn't render to HTML at all well (essentially as
          flat text). Tools are preinstalled on all Linux systems.
          
          Man page format is not bad for command summaries or short
          reference documents intended to jog the memory of an
          experienced user. It starts to creak under the strain for
          programs with complex interfaces and many options, and
          collapses entirely if you need to maintain a set of documents
          with rich cross-references (the markup has no support for
          hyperlinks).
          
   HTML
          Increasingly common since the Web exploded in 1993-1994. Markup
          is partly structural, mostly presentation. Browseable through
          any web browser. Good support for images and hyperlinks.
          Limited built-in facilities for indexing, but good indexing and
          search-engine technologies exist and are widely deployed.
          Renders to Postscript for printing pretty well. HTML tools are
          now universally available.
          
          HTML is very flexible and suitable for many kinds of
          documentation. Actually, it's too flexible; it shares with man
          page format the problem that it's hard to index automatically
          because a lot of the markup describes presentation rather than
          document structure.
          
   Texinfo
          Texinfo is the documentation format used by the Free Software
          Foundation. It's a set of macros on top of the powerful TeX
          formatting engine. Mostly structural, partly presentation.
          Browseable through Emacs or a standalone info program. Good
          support for hyperlinks, none for images. Good indexing for both
          print and on-line forms; when you install a Texinfo document, a
          pointer to it is automatically added to a browsable "dir"
          document listing all the Texinfo documents on your system.
          Renders to excellent Postscript and useable HTML. Texinfo tools
          are preinstalled on most Linux systems, and available at the
          [46]Free Software Foundation website.
          
          Texinfo is a good design, quite usable for typesetting books as
          well as small on-line documents, but like HTML it's a sort of
          amphibian -- the markup is part structural, part presentation,
          and the presentation part creates problems for rendering.
          
   DocBook
          DocBook is a large, elaborate markup format based on SGML (more
          recent versions on XML). Unlike the other formats described
          here it is entirely structural with no presentation markup.
          Excellent support for images and hyperlinks. Good support for
          indexing. Renders well to HTML, acceptably to Postscript for
          printing (quality is improving as the tools evolve). Tools and
          documentation are available at the [47]DocBook website.
          
          DocBook is excellent for large, complex documents; it was
          designed specifically to support technical manuals and
          rendering them in multiple output formats. Its drawbacks are
          complexity, a not entirely mature (though rapidly improving)
          toolset, and introductory-level documentation that is scanty
          and (too often) highly obfuscated.
     _________________________________________________________________
   
7.2. Good practice for the future

   In July of 2000 representatives from several important open-source
   project groups (including GNOME, KDE, the Free Software Foundation,
   the Linux Documentation Project, and the Open Source Initiative) held
   a summit conference in Monterey, California. The goal was to try and
   settle on common practices and common documentation interchange
   formats, so that a much richer and more unified body of documentation
   can evolve.
   
   Concretely, the goal everyone has in view is to support a kind of
   documentation package which, when installed on a system, is
   immediately integrated into a rich system-wide index of documents in
   such a way that they can all be browsed through a uniform interface
   and searched as a unit. From the steps GNOME and KDE have already
   taken in this direction, it was already understood that this would
   require a structural rather than presentation markup standard.
   
   The meeting endorsed a trend which has been clear for a while; key
   open-source projects are moving or have already moved to DocBook as a
   master format for their documentation.
   
   The participants also settled on using the `Dublin core' metadata
   format (an international standard developed by librarians concerned
   with the indexing of digital material) to support document indexing;
   details of that are still being worked out, and will probably result
   in some additions to the DocBook markup to support embedding Dublin
   Core metadata in DocBook documents.
   
   The direction is clear; more use of Docbook, with auxiliary standards
   that support automatically indexing Docbook documents based on their
   index tags and Dublin core metadata. There are pieces still missing
   from this picture, but they will be filled in. The older
   presentation-based markups' days are numbered. (This HOWTO was moved
   to DocBook in August 2000.)
   
   Thus, people starting new open-source projects will be ahead of the
   curve, and probably saving themselves a nasty conversion process
   later, if they go with DocBook as a master format from the beginning.
     _________________________________________________________________
   
8. Good communication practice

   Your software and documentation won't do the world much good if nobody
   but you knows it exists. Also, developing a visible presence for the
   project on the Internet will assist you in recruiting users and
   co-developers. Here are the standard ways to do that.
     _________________________________________________________________
   
8.1. Announce to c.o.l.a and Freshmeat

   Announce new releases to [48]comp.os.linux.announce. Besides being
   widely read itself, this group is a major feeder for web-based
   what's-new sites like [49]Freshmeat.
     _________________________________________________________________
   
8.2. Announce to a relevant topic newsgroup

   Find USENET topics group directly relevant to your application, and
   announce there as well. Post only where the function of the code is
   relevant, and exercise restraint.
   
   If (for example) you are releasing a program written in Perl that
   queries IMAP servers, you should certainly post to comp.mail.imap. But
   you should probably not post to comp.lang.perl unless the program is
   also an instructive example of cutting-edge Perl techniques.
   
   Your announcement should include the URL of a project website.
     _________________________________________________________________
   
8.3. Have a website

   If you intend try to build any substantial user or developer community
   around your project, it should have a website. Standard things to have
   on the website include:
   
     * The project charter (why it exists, who the audience is, etc).
     * Download links for the project sources.
     * Instructions on how to join the project mailing list(s).
     * A FAQ (Frequently Asked Questions) list.
     * HTMLized versions of the project documentation
     * Links to related and/or competing projects.
       
   Some project sites even have URLs for anonymous access to the master
   source tree.
     _________________________________________________________________
   
8.4. Host project mailing lists

   It's standard practice to have a private development list through
   which project collaborators can communicate and exchange patches. You
   may also want to have an announcements list for people who want to be
   kept informed of the project's process.
   
   If you are running a project named `foo'. your developer list might be
   foo-dev or foo-friends; your announcement list might be foo-announce.
     _________________________________________________________________
   
8.5. Release to major archives

   For the last several years, the [50]Metalab archive has been the most
   important interchange location for Linux software.
   
   Since it was launched in fall 1999, [51]SourceForge has exploded in
   popularity. It is not just an archive and distribution site, though
   you can use it that way. It is an entire free project-hosting service
   that tries to offer a complete set of tools for open-source
   development groups -- web and archive space, mailing lists,
   bug-tracking, chat forums, CVS repositories, and other services.
   
   Other important locations include:
   
     * the [52]Python Software Activity site (for software written in
       Python).
     * the [53]CPAN, the Comprehensive Perl Archive Network, (for
       software written in Perl).
     _________________________________________________________________
   
9. Good project-management practice

   Managing a project well when all the participants are volunteers
   presents some unique challenges. This is too large a topic to cover in
   a HOWTO. Fortunately, there are some useful white papers available
   that will help you understand the major issues.
   
   For discussion of basic development organization and the
   release-early-release-often `bazaar mode', see [54]The Cathedral and
   the Bazaar.
   
   For discussion of motivational psychology, community customs, and
   conflict resolution, see [55]Homesteading the Noosphere.
   
   For discussion of economics and appropriate business models, see
   [56]The Magic Cauldron.
   
   These papers are not the last word on open-source development. But
   they were the first serious analyses to be written, and have yet to be
   superseded (though the author hopes they will be somesday).

References

   1. http://www.tuxedo.org/~esr/
   2. Software-Release-Practice-HOWTO.html#AEN30
   3. Software-Release-Practice-HOWTO.html#AEN32
   4. Software-Release-Practice-HOWTO.html#AEN36
   5. Software-Release-Practice-HOWTO.html#AEN43
   6. Software-Release-Practice-HOWTO.html#AEN47
   7. Software-Release-Practice-HOWTO.html#AEN127
   8. Software-Release-Practice-HOWTO.html#AEN131
   9. Software-Release-Practice-HOWTO.html#AEN138
  10. Software-Release-Practice-HOWTO.html#AEN141
  11. Software-Release-Practice-HOWTO.html#AEN149
  12. Software-Release-Practice-HOWTO.html#AEN169
  13. Software-Release-Practice-HOWTO.html#AEN172
  14. Software-Release-Practice-HOWTO.html#AEN175
  15. Software-Release-Practice-HOWTO.html#AEN179
  16. Software-Release-Practice-HOWTO.html#AEN184
  17. Software-Release-Practice-HOWTO.html#AEN189
  18. Software-Release-Practice-HOWTO.html#AEN195
  19. Software-Release-Practice-HOWTO.html#AEN200
  20. Software-Release-Practice-HOWTO.html#AEN203
  21. Software-Release-Practice-HOWTO.html#AEN207
  22. Software-Release-Practice-HOWTO.html#AEN210
  23. Software-Release-Practice-HOWTO.html#AEN213
  24. Software-Release-Practice-HOWTO.html#AEN221
  25. Software-Release-Practice-HOWTO.html#AEN245
  26. Software-Release-Practice-HOWTO.html#AEN293
  27. Software-Release-Practice-HOWTO.html#AEN299
  28. Software-Release-Practice-HOWTO.html#AEN306
  29. Software-Release-Practice-HOWTO.html#AEN318
  30. Software-Release-Practice-HOWTO.html#AEN347
  31. Software-Release-Practice-HOWTO.html#AEN355
  32. Software-Release-Practice-HOWTO.html#AEN358
  33. Software-Release-Practice-HOWTO.html#AEN363
  34. Software-Release-Practice-HOWTO.html#AEN369
  35. Software-Release-Practice-HOWTO.html#AEN386
  36. Software-Release-Practice-HOWTO.html#AEN390
  37. Software-Release-Practice-HOWTO.html#AEN404
  38. news:comp.os.linux.answers
  39. http://www.linuxdoc.org/LDP/HOWTO/Software-Release-Practice.html
  40. mailto:esr@snark.thyrsus.com
  41. http://metalab.unc.edu/pub/Linux
  42. http://www.freshmeat.net/
  43. http://www.sourceforge.net/
  44. http://www.opensource.org/
  45. http://www.opensource.org/
  46. http://www.gnu.org/
  47. http://www.docbook.org/
  48. news:comp.os.linux.announce
  49. http://www.freshmeat.net/
  50. http://www.metalab.unc.edu/pub/Linux/
  51. http://www.sourceforge.net/
  52. http://www.python.org/
  53. http://language.perl.com/CPAN
  54. http://www.tuxedo.org/~esr/writings/cathedral-bazaar/
  55. http://www.tuxedo.org/~esr/writings/homesteading/
  56. http://www.tuxedo.org/~esr/writings/magic-cauldron/