Penguin
Diff: HowToSoftwareReleasePracticeHOWTO
EditPageHistoryDiffInfoLikePages

Differences between current version and predecessor to the previous major change of HowToSoftwareReleasePracticeHOWTO.

Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History

Newer page: version 3 Last edited on Monday, October 25, 2004 5:08:26 am by AristotlePagaltzis
Older page: version 2 Last edited on Friday, June 7, 2002 1:07:37 am by perry Revert
@@ -1,1381 +1 @@
-Software Release Practice HOWTO  
-!!!Software Release Practice HOWTO  
-!Eric Steven Raymond Thyrsus Enterprises  
-  
- esr@thyrsus.com  
-  
-  
-  
-  
-Copyright (c) 2000 by Eric S. Raymond  
-  
-  
-__Revision History__Revision 3.42002-01-04Revised by: esrMore about good patching practice.Revision 3.32001-08-16Revised by: esrNew section about how to send good patches.Revision 3.22001-07-11Revised by: esrNote about not relying on proprietary components.Revision 3.12001-02-22Revised by: esrLDP Styleguide fixes.Revision 3.02000-08-12Revised by: esrFirst !DocBook version. Advice on !SourceForge and a major section  
-on documentation practice added.  
-  
-  
-  
-  
-  
-This HOWTO describes good release practices for Linux and other  
-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. Introduction: ; 1.1. Why this document?; 1.2. New versions of this document; 2. Good patching practice: ; 2.1. Do send patches, don't send whole archives or files; 2.2. Send patches against the current version of the code.; 2.3. Don't include patches for generated files.; 2.4. Don't send patch bands that just tweak RCS or SCCS $-symbols.; 2.5. Do use -c or -u format, don't use the default (-e) format; 2.6. Do include documentation with your patch; 2.7. Do include an explanation with your patch; 2.8. Do include useful comments in your code; 3. Good project- and archive- naming practice: ; 3.1. Use GNU-style names with a stem and major.minor.patch numbering.; 3.2. But respect local conventions where appropriate; 3.3. Try hard to choose a name prefix that is unique and easy to type; 4. Good licensing and copyright practice: the theory: ; 4.1. Open source and copyrights; 4.2. What qualifies as open source; 5. Good licensing and copyright practice: the practice: ; 5.1. Make yourself or the FSF the copyright holder; 5.2. Use a license conformant to the Open Source Definition; 5.3. Don't write your own license if you can possibly avoid it.; 6. Good development practice: ; 6.1. Write either pure ANSI C or a portable scripting language; 6.2. Don't rely on proprietary code; 6.3. Follow good C portability practices; 6.4. Use autoconf/automake/autoheader; 6.5. Sanity-check your code before release; 6.6. Sanity-check your documentation and READMEs before release; 7. Good distribution-making practice: ; 7.1. Make sure tarballs always unpack into a single new directory; 7.2. Have a README; 7.3. Respect and follow standard file naming practices; 7.4. Design for Upgradability; 7.5. Provide RPMs; 8. Good documentation practice: ; 8.1. Good practice in the present; 8.2. Good practice for the future; 9. Good communication practice: ; 9.1. Announce to c.o.l.a and Freshmeat; 9.2. Announce to a relevant topic newsgroup; 9.3. Have a website; 9.4. Host project mailing lists; 9.5. Release to major archives; 10. 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 patch or software  
-distribution.  
-  
-----  
-!!1.2. New versions of this document  
-  
-This document will be posted monthly to the newsgroups comp.os.linux.answers. You  
-can also view the latest version of this HOWTO on the World Wide Web  
-via the URL 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, `esr@snark.thyrsus.comb.  
-  
-----  
-!!!2. Good patching practice  
-  
-Most people get involved in open-source software by writing patches  
-for other peoples' software before releasing projects of their own.  
-Suppose you've written a set of source-code changes for someone else's  
-baseline code. Now put yourself in that person's shoes. How is he  
-to judge whether to include the patch?  
-  
-  
-  
-The truth is that it is very difficult to judge the quality of code.  
-So developers tend to evaluate patches by the quality of the submission.  
-They look for clues in the submitter's style and communications behavior  
-instead - indications that the person has been in their shoes and  
-understands what it's like to have to evaluate and merge an incoming patch.  
-  
-  
-  
-This is actually a pretty reliable proxy for code quality. In many  
-years of dealing with patches from many hundreds of strangers, I have only  
-seldom seen a patch that was thoughtfully presented and respectful of my  
-time but technically bogus. On the other hand, experience teaches me that  
-patches which look careless or are packaged in a lazy and inconsiderate way  
-are very likely to actually ''be'' bogus.  
-  
-  
-  
-Here are some tips on how to get your patch accepted:  
-  
-----  
-!!2.1. Do send patches, don't send whole archives or files  
-  
-If your change includes a new file that doesn't exist in the code,  
-then of course you have to send the whole file. But if you're modifying  
-an already-existing file, don't send the whole file. Send a diff instead;  
-specifically, send the output of the  
-diff(1)  
-command run to compare the baseline distributed version against your  
-modified version.  
-  
-  
-  
-The diff command and its dual,  
-patch(1)  
-(which automatically applies a diff to a baseline file)  
-are the most basic tools of open-source development. Diffs are better  
-than whole files because the developer you're sending a patch to may  
-have changed the baseline version since you got your copy. By sending  
-him a diff you save him the effort of separating your changes from his;  
-you show respect for his time.  
-  
-----  
-!!2.2. Send patches against the current version of the code.  
-  
-It is both counterproductive and rude to send a maintainer  
-patches against the code as it existed several releases ago, and expect  
-him to do all the work of determining which changes duplicate things he  
-have since done, versus which things are actually novel in your patch.  
-  
-  
-  
-As a patch submitter, it is ''your'' responsibility  
-to track the state of the source and send the maintainer a minimal patch  
-that expresses what you want done to the main-line codebase. That means  
-sending a patch against the current version.  
-  
-----  
-!!2.3. Don't include patches for generated files.  
-  
-Before you send your patch, walk through it and delete any  
-patch bands for files in it that are going to be automatically regenerated  
-once he applies the patch and remakes. The classic examples of this  
-error are C files generated by Bison  
-or Flex.  
-  
-  
-  
-These days the most common mistake of this kind is sending a diff  
-with a huge band that is nothing but changebars between your  
-__configure__ script and his. This file is generated by  
-__autoconf__.  
-  
-  
-  
-This is inconsiderate. It means your recipient is put to the trouble  
-of separating the real content of the patch from a lot of bulky noise.  
-It's a minor error, not as important as some of the things we'll get  
-to further on - but it will count against you.  
-  
-----  
-!!2.4. Don't send patch bands that just tweak RCS or SCCS $-symbols.  
-  
-Some people put special tokens in their source files that are  
-expanded by the version-control system when the file is checked in:  
-the $Id: Software-Release-Practice-HOWTO.sgml,v 1.15 2002/02/04 19:24:34 esr Exp $ construct used by RCS and CVS, for example.  
-  
-  
-  
-If you're using a local version-control system yourself, your changes  
-may alter these tokens. This isn't really harmful, because when your  
-recipient checks his code back in after applying your patch they'll get  
-re-expanded based on ''his'' version-control status. But  
-those extra patch bands are noise. They're distracting. It's more  
-considerate not to send them.  
-  
-  
-  
-This is another minor error. You'll be forgiven for it if you  
-get the big things right. But you want to avoid it anyway.  
-  
-----  
-!!2.5. Do use -c or -u format, don't use the default (-e) format  
-  
-The default (-e) format of  
-diff(1)  
-is very brittle. It doesn't include any context, so the patch tool  
-can't cope if any lines have been inserted or deleted in the baseline  
-code since you took the copy you modified.  
-  
-  
-  
-Getting an -e diff is annoying, and suggests that the sender is  
-either an extreme newbie, careless, or clueless. Most such patches  
-get tossed out without a second thought.  
-  
-----  
-!!2.6. Do include documentation with your patch  
-  
-This is very important. If your patch makes a user-visible addition  
-or change to the software's features, ''include changes to the  
-appropriate man pages and other documentation files in your patch''.  
-Do ''not'' assume that the recipient will be happy to  
-document your code for you, or else to have undocumented features lurking  
-in the code.  
-  
-  
-  
-Documenting your changes well demonstrates some good things. First,  
-it's considerate to the person you are trying to persuade. Second, it  
-shows that you understand the ramifications of your change well enough  
-to explain it to somebody who can't see the code. Third, it demonstrates  
-that you care about the people who will ultimately use the software.  
-  
-  
-  
-Good documentation is usually the most visible sign of what separates  
-a solid contribution from a quick and dirty hack. If you take the time  
-and care necessary to produce it, you'll find you're already 85% of the  
-way to having your patch accepted with most developers.  
-  
-----  
-!!2.7. Do include an explanation with your patch  
-  
-Your patch should include cover notes explaining why you think the  
-patch is necessary or useful. This is explanation directed not to the  
-users of the software but to the maintainer to whom you are sending the  
-patch.  
-  
-  
-  
-The note can be short - in fact, some of the most effective  
-cover notes I've ever seen just said "See the documentation updates in this  
-patch". But it should show the right attitude.  
-  
-  
-  
-The right attitude is helpful, respectful of the maintainer's time,  
-quietly confident but unassuming. It's good to display understanding of  
-the code you're patching. It's good to show that you can identify with the  
-maintainer's problems. It's also good to be up front about any risks you  
-perceive in applying the patch. Here are some examples of the sorts of  
-explanatory comments that I like to see in cover notes:  
-  
-  
-  
-"I've seen two problems with this code, X and Y. I fixed problem X, but I  
-didn't try addressing problem Y because I don't think I understand  
-the part of the code that I believe is involved."  
-  
-  
-  
-"Fixed a core dump that can happen when one of the foo inputs is too long.  
-While I was at it, I went looking for similar overflows elsewhere. I  
-found a possible one in blarg.c, near line 666. Are you sure the sender  
-can't generate more than 80 characters per transmission?"  
-  
-  
-  
-"Have you considered using the Foonly algorithm for this problem? There  
-is a good implementation at `http://www.somesite.com/~jsmith/foonly.htmlb."  
-  
-  
-  
-"This patch solves the immediate problem, but I realize it complicates the  
-memory allocation in an unpleasant way. Works for me, but you should  
-probably test it under heavy load before shipping. "  
-  
-  
-  
-"This may be featurititis, but I'm sending it anyway. Maybe you'll know a  
-cleaner way to implement the feature."  
-  
-----  
-!!2.8. Do include useful comments in your code  
-  
-Usually as a maintainer, I will want to have strong confidence that I  
-understand your changes before merging them in. This isn't an invariable  
-rule; if you have a track record of good work, with me I may just run a  
-casual eyeball over the changes before checking them in semi-automatically.  
-But everything you can do to help me understand your code and decrease my  
-uncertainty increases your chances that I will accept your patch.  
-  
-  
-  
-Good comments in your code help me understand it. Bad comments  
-don't.  
-  
-  
-  
-Here's an example of a bad comment:  
-  
-  
-/* norman newbie fixed this 13 Aug 2001 */  
-  
-This conveys no information. It's nothing but a muddy territorial  
-bootprint you're planting in the middle of my code. If I take your patch  
-(which you've made less likely) I'll almost certainly strip out this  
-comment. If you want a credit, include a patch band for the project  
-NEWS or HISTORY file. I'll  
-probably take that.  
-  
-  
-  
-Here's an example of a good comment:  
-  
-  
-/*  
-* This conditional needs to be guarded so that crunch_data()  
-* never gets passed a NULL pointer. `norman_newbie@foosite.comb  
-*/  
-  
-This comment shows that you understand not only my code but the  
-kind of information that I need to have confidence in your changes.  
-This kind of comment ''gives'' me confidence in your  
-changes.  
-  
-----  
-!!!3. 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.  
-  
-----  
-!!3.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:  
-  
-  
-  
-  
-  
-  
-***#  
-  
-project prefix  
-  
-  
-***#  
-***#  
-  
-dash  
-  
-  
-***#  
-***#  
-  
-version number  
-  
-  
-***#  
-***#  
-  
-dot  
-  
-  
-***#  
-***#  
-  
-"src" or "bin" (optional)  
-  
-  
-***#  
-***#  
-  
-dot or dash (dot preferred)  
-  
-  
-***#  
-***#  
-  
-binary type and options (optional)  
-  
-  
-***#  
-***#  
-  
-archiving and compression extensions  
-  
-  
-***#----  
-!!3.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 in this document in late 1999.)  
-  
-  
-  
-Look for and respect the conventions of specialized  
-communities and developers; for general use, follow the above  
-guidelines.  
-  
-----  
-!!3.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 index file of Metalab  
-and the appindex at Freshmeat. Another good place  
-to check is !SourceForge;  
-do a name search there.  
-  
-----  
-!!!4. 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.  
-  
-----  
-!!4.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.  
-  
-----  
-!!4.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 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:  
-  
-  
-  
-  
-  
-  
-***#  
-  
-An unlimited right to copy be granted.  
-  
-  
-***#  
-***#  
-  
-An unlimited right to use be granted.  
-  
-  
-***#  
-***#  
-  
-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.  
-  
-----  
-!!!5. Good licensing and copyright practice: the practice  
-  
-Here's how to translate the theory above into practice:  
-  
-----  
-!!5.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.  
-  
-----  
-!!5.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 Open Source Initiative.  
-  
-----  
-!!5.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 (early 2002) 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.  
-  
-----  
-!!!6. 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.  
-  
-----  
-!!6.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.  
-  
-----  
-!!6.2. Don't rely on proprietary code  
-  
-Don't rely on proprietary languages, libraries, or other code.  
-In the open-source community this is considered rude. Open-source  
-developers don't trust what they can't see the source code of.  
-  
-----  
-!!6.3. 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 K8R 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.  
-  
-----  
-!!6.4. 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.  
-  
-----  
-!!6.5. 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.  
-  
-  
-  
-For Python projects, the  
-!PyChecker  
-program can be a useful check. It's not out of beta yet, but nevertheless  
-often catches nontrivial errors.  
-  
-  
-  
-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.)  
-  
-----  
-!!6.6. 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 your code is sloppy and careless too.  
-  
-----  
-!!!7. Good distribution-making practice  
-  
-These guidelines describe how your distribution should look when  
-someone downloads, retrieves and unpacks it.  
-  
-----  
-!!7.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)/: bMANIFEST  
-@(cd ..; ln -s foobar foobar-$(VERS))  
-(cd ..; tar -czvf foobar/foobar-$(VERS).tar.gz `cat foobar/MANIFEST`)  
-@(cd ..; rm foobar-$(VERS))----  
-!!7.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:  
-  
-  
-  
-  
-  
-  
-***#  
-  
-A brief description of the project.  
-  
-  
-***#  
-***#  
-  
-A pointer to the project website (if it has  
-one)  
-  
-  
-***#  
-***#  
-  
-Notes on the developer's build environment and  
-potential portability problems.  
-  
-  
-***#  
-***#  
-  
-A roadmap describing important files and subdirectories.  
-  
-  
-***#  
-***#  
-  
-Either build/installation instructions or a pointer to a file  
-containing same (usually INSTALL).  
-  
-  
-***#  
-***#  
-  
-Either a maintainers/credits list or a pointer to a  
-file containing same (usually  
-CREDITS).  
-  
-  
-***#  
-***#  
-  
-Either recent project news or a pointer to a file  
-containing same (usually NEWS).  
-  
-  
-***#----  
-!!7.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 (TAGS is an exception to the first, but not to the second).  
-  
-  
-  
-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).  
-  
-----  
-!!7.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.  
-  
-----  
-!!7.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.  
-  
-----  
-!!!8. 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:  
-  
-  
-  
-  
-  
-  
-***#  
-  
-''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.  
-  
-  
-***#  
-***#  
-  
-''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.  
-  
-----  
-!!8.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.  
-man(1)  
-command provides a pager and a 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 only weak and normally unused  
-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 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 !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.  
-  
-----  
-!!8.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.  
-  
-----  
-!!!9. 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.  
-  
-----  
-!!9.1. Announce to c.o.l.a and Freshmeat  
-  
-Announce new releases to comp.os.linux.announce. Besides being widely read itself,  
-this group is a major feeder for web-based what's-new sites like  
-Freshmeat.  
-  
-----  
-!!9.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.  
-  
-----  
-!!9.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.  
-  
-----  
-!!9.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.  
-  
-----  
-!!9.5. Release to major archives  
-  
-For the last several years, the Metalab archive has  
-been the most important interchange location for Linux software.  
-  
-  
-  
-Since it was launched in fall 1999,  
-!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 Python Software Activity  
-site (for software written in Python).  
-  
-  
-****  
-****  
-  
-the CPAN, the  
-Comprehensive Perl Archive Network, (for software written in Perl).  
-  
-  
-****----  
-!!!10. 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 The Cathedral and  
-the Bazaar.  
-  
-  
-  
-For discussion of motivational psychology, community customs,  
-and conflict resolution, see Homesteading  
-the Noosphere.  
-  
-  
-  
-For discussion of economics and appropriate business models, see  
-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 someday)
+Describe [HowToSoftwareReleasePracticeHOWTO] here.