home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 August / PCWorld_1999-08_cd.bin / doc / HOWTO / Software-Release-Practice-HOWTO < prev    next >
Text File  |  1999-06-18  |  16KB  |  529 lines

  1.   Software Release Practice HOWTO
  2.   Eric S. Raymond <esr@thyrsus.com>
  3.   1.2, 18 June 1999
  4.  
  5.   This HOWTO describes good release practices for Linux open-source pro¡
  6.   jects.  By following these practices, you will make it as easy as pos¡
  7.   sible for users to build your code and use it, and for other develop¡
  8.   ers to understand your code and cooperate with you to improve it.
  9.   This document is a must-read for novice developers.  Experienced
  10.   developers should review it when they are about to release a new pro¡
  11.   ject.  It will be revised periodically to reflect the evolution of
  12.   good-practice standards.
  13.   ______________________________________________________________________
  14.  
  15.   Table of Contents
  16.  
  17.  
  18.   1. Introduction
  19.  
  20.      1.1 Why this document?
  21.      1.2 New versions of this document
  22.  
  23.   2. Good project- and archive- naming practice
  24.  
  25.      2.1 Use GNU-style names with a stem and major.minor.patch numbering.
  26.      2.2 But respect local conventions where appropriate
  27.      2.3 Try hard to choose a name prefix that is unique and easy to type
  28.  
  29.   3. Good development practice
  30.  
  31.      3.1 Write either pure ANSI C or a portable scripting language
  32.      3.2 Follow good C portability practices
  33.      3.3 Use autoconf/automake/autoheader
  34.      3.4 Sanity-check your code before release
  35.  
  36.   4. Good distribution-making practice
  37.  
  38.      4.1 Make sure tarballs always unpack into a single new directory
  39.      4.2 Have a README
  40.      4.3 Respect and follow standard file naming practices
  41.  
  42.   5. Good communication practice
  43.  
  44.      5.1 Announce to c.o.l.a
  45.      5.2 Announce to a relevant topic newsgroup
  46.      5.3 Have a website
  47.      5.4 Host project mailing lists
  48.      5.5 Release to major archives
  49.      5.6 Provide RPMs
  50.  
  51.  
  52.   ______________________________________________________________________
  53.  
  54.   1.  Introduction
  55.  
  56.  
  57.   1.1.  Why this document?
  58.  
  59.   There is a large body of good-practice traditions for open-source code
  60.   that helps other people port, use, and cooperate with developing it.
  61.   Some of these conventions are traditional in the Unix world and
  62.   predate Linux; others have developed recently in response to
  63.   particular new tools and technologies such as the World Wide Web.
  64.  
  65.   This document will help you learn good practice.  It is organized into
  66.   topic sections, each containing a series of checklist items.  Think of
  67.   these as a pre-flight checklist for your distribution.
  68.  
  69.  
  70.   1.2.  New versions of this document
  71.  
  72.   This document will be posted monthly to the newsgroups
  73.   comp.os.linux.answers . The document is archived on a number of Linux
  74.   FTP sites, including metalab.unc.edu in pub/Linux/docs/HOWTO.
  75.  
  76.   You can also view the latest version of this HOWTO on the World Wide
  77.   Web via the URL  <http://metalab.unc.edu/LDP/HOWTO/Software-Release-
  78.   Practice.html>.
  79.  
  80.   Feel free to mail any questions or comments about this HOWTO to Eric
  81.   S. Raymond, esr@snark.thyrsus.com <mailto:esr@snark.thyrsus.com>.
  82.  
  83.  
  84.   2.  Good project- and archive- naming practice
  85.  
  86.   As the load on maintainers of archives like Metalab, the PSA site and
  87.   CPAN increases, there is an increasing trend for submissions to be
  88.   processed partly or wholly by programs (rather than entirely by a
  89.   human).
  90.  
  91.   This makes it more important for project and archive-file names to fit
  92.   regular patterns that computer programs can parse and understand.
  93.  
  94.  
  95.   2.1.  Use GNU-style names with a stem and major.minor.patch numbering.
  96.  
  97.   It's helpful to everybody if your archive files all have GNU-like
  98.   names -- all-lower-case alphanumeric stem prefix, followed by a dash,
  99.   followed by a version number, extension, and other suffixes.
  100.  
  101.   Let's suppose you have a project you call `foobar' at version 1,
  102.   release 2, level 3.  If it's got just one archive part (presumably the
  103.   sources), here's what its names should look
  104.  
  105.  
  106.      foobar-1.2.3.tar.gz
  107.         The source archive
  108.  
  109.  
  110.      foobar.lsm
  111.         The LSM file (assuming you're submitting to Metalab).
  112.  
  113.  
  114.   Please don't use these:
  115.  
  116.  
  117.      foobar123.tar.gz
  118.         This looks to many programs like an archive for a project
  119.         called`foobar123' with no version number.
  120.  
  121.  
  122.      foobar1.2.3.tar.gz
  123.         This looks to many programs like an archive for a project called
  124.         `foobar1' at version 2.3.
  125.  
  126.  
  127.      foobar-v1.2.3.tar.gz
  128.         Many programs think this goes with a project called `foobar-v1'.
  129.  
  130.  
  131.      foo_bar-1.2.3.tar.gz
  132.         The underscore is hard for people to speak, type, and remember
  133.      FooBar-1.2.3.tar.gz
  134.         Unless you like looking like a marketing weenie.  This is also
  135.         hard for people to speak, type, and remember.
  136.  
  137.   If you have to differentiate between source and binary archives, or
  138.   between different kinds of binary, or express some kind of build
  139.   option in the file name, please treat that as a file extension to go
  140.   after the version number. That is, please do this:
  141.  
  142.  
  143.      foobar-1.2.3.src.tar.gz
  144.         sources
  145.  
  146.  
  147.      foobar-1.2.3.bin.tar.gz
  148.         binaries, type not specified
  149.  
  150.  
  151.      foobar-1.2.3.bin.ELF.tar.gz
  152.         ELF binaries
  153.  
  154.  
  155.      foobar-1.2.3.bin.ELF.static.tar.gz
  156.         ELF binaries statically linked
  157.  
  158.  
  159.      foobar-1.2.3.bin.SPARC.tar.gz
  160.         SPARC binaries
  161.  
  162.   Please don't use names like `foobar-ELF-1.2.3.tar.gz', because
  163.   programs have a hard time telling type infixes (like `-ELF') from the
  164.   stem.
  165.  
  166.   A good general form of name has these parts in order:
  167.  
  168.  
  169.   1. project prefix
  170.  
  171.   2. dash
  172.  
  173.   3. version number
  174.  
  175.   4. dot
  176.  
  177.   5. "src" or "bin" (optional)
  178.  
  179.   6. dot or dash (dot preferred)
  180.  
  181.   7. binary type and options (optional)
  182.  
  183.   8. archiving and compression extensions
  184.  
  185.  
  186.   2.2.  But respect local conventions where appropriate
  187.  
  188.   Some projects and communities have well-defined conventions for names
  189.   and version numbers that aren't necessarily compatible with the above
  190.   advice.  For instance, Apache modules are generally named like
  191.   mod_foo, and have both their own version number and the version of
  192.   Apache with which they work.  Likewise, Perl modules have version
  193.   numbers that can be treated as floating point numbers (e.g., you might
  194.   see 1.303 rather than 1.3.3), and the distributions are generally
  195.   named Foo-Bar-1.303.tar.gz for version 1.303 of module Foo::Bar.
  196.  
  197.   Look for and respect the conventions of specialized communities and
  198.   developers; for general use, follow the above guidelines.
  199.   2.3.  Try hard to choose a name prefix that is unique and easy to type
  200.  
  201.   The stem prefix should be common to all a project's files, and it
  202.   should be easy to read, type, and remember.  So please don't use
  203.   underscores.  And don't capitalize or BiCapitalize without extremely
  204.   good reason -- it messes up the natural human-eyeball search order and
  205.   looks like some marketing weenie trying to be clever.
  206.  
  207.   It confuses people when two different projects have the same stem
  208.   name.  So try to check for collisions before your first release.  A
  209.   good place to check is the index file of Metalab
  210.   <http://metalab.unc.edu/pub/Linux>.
  211.  
  212.  
  213.   3.  Good development practice
  214.  
  215.   Most of these are concerned with ensuring portability, not only across
  216.   Linuxes but to other Unixes as well.  Being portable to other Unixes
  217.   is not just a worthy form of professionalism and hackerly politeness,
  218.   it's valuable insurance against future changes in Linux itself.
  219.  
  220.   Finally, other people will try to build your code on non-Linux
  221.   systems; portability minimizes the number of annoying perplexed email
  222.   messages you will get.
  223.  
  224.  
  225.   3.1.  Write either pure ANSI C or a portable scripting language
  226.  
  227.   For portability and stability, you should write either in ANSI C or a
  228.   scripting language that is guaranteed portable because it has just one
  229.   cross-platform implementation.
  230.  
  231.   Scripting languages that qualify include Python, Perl, Tcl, and Emacs
  232.   Lisp.  Plain old shell does not qualify; there are too many different
  233.   implementations with subtle idiosyncracies, and the shell environment
  234.   is subject to disruption by user customizations such as shell aliases.
  235.  
  236.   Java holds promise as a portable language, but the Linux-available
  237.   implementations are still scratchy and poorly integrated with Linux.
  238.   Java is still a bleeding-edge choice, though one likely to become more
  239.   popular as it matures.
  240.  
  241.  
  242.   3.2.  Follow good C portability practices
  243.  
  244.   If you are writing C, do feel free to use the full ANSI features --
  245.   including function prototypes, which will help you spot cross-module
  246.   inconsistancies.  The old-style K&R compilers are history.
  247.  
  248.   On the other hand, do not assume that GCC-specific features such as
  249.   the `-pipe' option or nested functions are available.  These will come
  250.   around and bite you the second somebody ports to a non-Linux, non-GCC
  251.   system.
  252.  
  253.  
  254.   3.3.  Use autoconf/automake/autoheader
  255.  
  256.   If you're writing C, use autoconf/automake/autoheader to handle
  257.   portability issues, do system-configuration probes, and tailor your
  258.   makefiles.  People building from sources today expect to be able to
  259.   type "configure; make" and get a clean build -- and rightly so.
  260.  
  261.  
  262.  
  263.  
  264.  
  265.   3.4.  Sanity-check your code before release
  266.  
  267.   If you're writing C, test-compile with -Wall and clean up the errors
  268.   at least once before each release.  This catches a surprising number
  269.   of errors.  For real thoroughness, compile with -pedantic as well.
  270.  
  271.   If you're writing Perl, check your code with perl -c (and maybe -T, if
  272.   applicable).  Use perl -w and 'use strict' religiously.  (See the Perl
  273.   documentation for discussion.)
  274.  
  275.  
  276.   4.  Good distribution-making practice
  277.  
  278.   These guidelines describe how your distribution should look when
  279.   someone downloads, retrieves and unpacks it.
  280.  
  281.  
  282.   4.1.  Make sure tarballs always unpack into a single new directory
  283.  
  284.   The single most annoying mistake newbie developers make is to build
  285.   tarballs that unpack the files and directories in the distribution
  286.   into the current directory, potentially stepping on files already
  287.   located there.  Never do this!
  288.  
  289.   Instead, make sure your archive files all have a common directory part
  290.   named after the project, so they will unpack into a single top-level
  291.   directory directly beneath the current one.
  292.  
  293.   Here's a makefile trick that, assuming your distribution directory is
  294.   named `foobar' and SRC contains a list of your distribution files,
  295.   accomplishes this.  It requires GNU tar 1.13
  296.  
  297.  
  298.   VERS=1.0
  299.   foobar-$(VERS).tar.gz:
  300.           tar --name-prefix='foobar-$(VERS)/' -czf foobar-$(VERS).tar.gz $(SRC)
  301.  
  302.  
  303.  
  304.   If you have an older tar program, do something like this:
  305.  
  306.  
  307.   foobar-$(VERS).tar.gz:
  308.           @ls $(SRC) | sed s:^:foobar-$(VERS)/: >MANIFEST
  309.           @(cd ..; ln -s foobar foobar-$(VERS))
  310.           (cd ..; tar -czvf foobar/foobar-$(VERS).tar.gz `cat foobar/MANIFEST`)
  311.           @(cd ..; rm foobar-$(VERS))
  312.  
  313.  
  314.  
  315.  
  316.   4.2.  Have a README
  317.  
  318.   Have a file called README or READ.ME that is a roadmap of your source
  319.   distribution.  By ancient convention, this is the first file intrepid
  320.   explorers will read after unpacking the source.
  321.  
  322.   Good things to have in the README include:
  323.  
  324.  
  325.   ╖  A brief description of the project.
  326.  
  327.   ╖  A pointer to the project website (if it has one)
  328.  
  329.   ╖  Notes on the developer's build environment and potential
  330.      portability problems.
  331.   ╖  A roadmap describing important files and subdirectories.
  332.  
  333.   ╖  Either build/installation instructions or a pointer to a file
  334.      containing same (usually INSTALL).
  335.  
  336.   ╖  Either a maintainers/credits list or a pointer to a file containing
  337.      same (usually CREDITS).
  338.  
  339.   ╖  Either recent project news or a pointer to a file containing same
  340.      (usually NEWS).
  341.  
  342.  
  343.   4.3.  Respect and follow standard file naming practices
  344.  
  345.   Before even looking at the README, your intrepid explorer will have
  346.   scanned the filenames in the top-level directory of your unpacked
  347.   distribution.  Those names can themselves convey information.  By
  348.   adhering to certain standard naming practices, you can give the
  349.   explorer valuable clues about what to look in next.
  350.  
  351.   Here are some standard top-level file names and what they mean.  Not
  352.   every distribution needs all of these.
  353.  
  354.  
  355.      README or READ.ME
  356.         the roadmap file, to be read first
  357.  
  358.  
  359.      INSTALL
  360.         configuration, build, and installation instructions
  361.  
  362.  
  363.      CREDITS
  364.         list of project contributers
  365.  
  366.  
  367.      NEWS
  368.         recent project news
  369.  
  370.  
  371.      HISTORY
  372.         project history
  373.  
  374.  
  375.      COPYING
  376.         project license terms (GNU convention)
  377.  
  378.  
  379.      LICENSE
  380.         project license terms
  381.  
  382.  
  383.      MANIFEST
  384.         list of files in the distribution
  385.  
  386.  
  387.      FAQ
  388.         plain-text Frequently-Asked-Questions document for the project
  389.  
  390.  
  391.      TAGS
  392.         generated tag file for use by Emacs or vi
  393.  
  394.   Note the overall convention that filenames with all-caps names are
  395.   human-readable metainformation about the package, rather than build
  396.   components.
  397.   5.  Good communication practice
  398.  
  399.   Your software won't do the world much good if nobody but you knows it
  400.   exists.  Also, developing a visible presence for the project on the
  401.   Internet will assist you in recruiting users and co-developers.  Here
  402.   are the standard ways to do that.
  403.  
  404.  
  405.   5.1.  Announce to c.o.l.a
  406.  
  407.   Announce new releases to comp.os.linux.announce
  408.   <news:comp.os.linux.announce>.  Besides being widely read itself, this
  409.   group is a major feeder for web-based what's-new sites like Freshmeat
  410.   <http://www.freshmeat.net>.
  411.  
  412.  
  413.   5.2.  Announce to a relevant topic newsgroup
  414.  
  415.   Find USENET topics group directly relevant to your application, and
  416.   announce there as well.  Post only where the function of the code is
  417.   relevant, and exercise restraint.
  418.  
  419.   If (for example) you are releasing a program written in Perl that
  420.   queries IMAP servers, you should certainly post to comp.mail.imap.
  421.   But you should probably not post to comp.lang.perl unless the program
  422.   is also an instructive example of cutting-edge Perl techniques.
  423.  
  424.   Your announcement should include the URL of a project website.
  425.  
  426.  
  427.   5.3.  Have a website
  428.  
  429.   If you intend try to build any substantial user or developer community
  430.   around your project, it should have a website.  Standard things to
  431.   have on the website include:
  432.  
  433.   ╖  The project charter (why it exists, who the audience is, etc).
  434.  
  435.   ╖  Download links for the project sources.
  436.  
  437.   ╖  Instructions on how to join the project mailing list(s).
  438.  
  439.   ╖  A FAQ (Frequently Asked Questions) list.
  440.  
  441.   ╖  HTMLized versions of the project documentation
  442.  
  443.   ╖  Links to related and/or competing projects.
  444.  
  445.   Some project sites even have URLs for anonymous access to the master
  446.   source tree.
  447.  
  448.  
  449.   5.4.  Host project mailing lists
  450.  
  451.   It's standard practice to have a private development list through
  452.   which project collaborators can communicate and exchange patches.  You
  453.   may also want to have an announcements list for people who want to be
  454.   kept informed of the project's process
  455.  
  456.  
  457.   5.5.  Release to major archives
  458.  
  459.   For the last several years, the Metalab archive
  460.   <http://www.metalab.unc.edu/pub/Linux/> has been the most important
  461.   interchange location for Linux software.
  462.  
  463.   Other important locations include:
  464.  
  465.  
  466.   ╖  the Python Software Activity <http://www.python.org> site (for
  467.      software written in Python).
  468.  
  469.   ╖  the CPAN <http://language.perl.com/CPAN>, the Comprehensive Perl
  470.      Archive Network, (for software written in Perl).
  471.  
  472.  
  473.   5.6.  Provide RPMs
  474.  
  475.   The de-facto standard format for installable binary packages is that
  476.   used by the Red Hat Package manager, RPM.  It's featured in the most
  477.   popular Linux distribution, and supported by effectively all other
  478.   Linux distributions (except Debian a Slackware).
  479.  
  480.   Accordingly, it's a good idea for your project site to provide
  481.   installable RPMs as well as source tarballs.
  482.  
  483.  
  484.  
  485.  
  486.  
  487.  
  488.  
  489.  
  490.  
  491.  
  492.  
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.