Prev: System Portability, Up: Writing C 5.6 Portability between CPUs ============================ Even GNU systems will differ because of differences among CPU types--for example, difference in byte ordering and alignment requirements. It is absolutely essential to handle these differences. However, don't make any effort to cater to the possibility that an `int' will be less than 32 bits. We don't support 16-bit machines in GNU. Similarly, don't make any effort to cater to the possibility that `long' will be smaller than predefined types like `size_t'. For example, the following code is ok: printf ("size = %lu\n", (unsigned long) sizeof array); printf ("diff = %ld\n", (long) (pointer2 - pointer1)); 1989 Standard C requires this to work, and we know of only one counterexample: 64-bit programs on Microsoft Windows. We will leave it to those who want to port GNU programs to that environment to figure out how to do it. Predefined file-size types like `off_t' are an exception: they are longer than `long' on many platforms, so code like the above won't work with them. One way to print an `off_t' value portably is to print its digits yourself, one by one. Don't assume that the address of an `int' object is also the address of its least-significant byte. This is false on big-endian machines. Thus, don't make the following mistake: int c; ... while ((c = getchar ()) != EOF) write (file_descriptor, &c, 1); Instead, use `unsigned char' as follows. (The `unsigned' is for portability to unusual systems where `char' is signed and where there is integer overflow checking.) int c; while ((c = getchar ()) != EOF) { unsigned char u = c; write (file_descriptor, &u, 1); } It used to be ok to not worry about the difference between pointers and integers when passing arguments to functions. However, on most modern 64-bit machines pointers are wider than `int'. Conversely, integer types like `long long int' and `off_t' are wider than pointers on most modern 32-bit machines. Hence it's often better nowadays to use prototypes to define functions whose argument types are not trivial. In particular, if functions accept varying argument counts or types they should be declared using prototypes containing `...' and defined using `stdarg.h'. For an example of this, please see the Gnulib (http://www.gnu.org/software/gnulib/) error module, which declares and defines the following function: /* Print a message with `fprintf (stderr, FORMAT, ...)'; if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM). If STATUS is nonzero, terminate the program with `exit (STATUS)'. */ void error (int status, int errnum, const char *format, ...); A simple way to use the Gnulib error module is to obtain the two source files `error.c' and `error.h' from the Gnulib library source code repository at `http://git.savannah.gnu.org/gitweb/?p=gnulib.git'. Here's a sample use: #include "error.h" #include #include char *program_name = "myprogram"; FILE * xfopen (char const *name) { FILE *fp = fopen (name, "r"); if (! fp) error (1, errno, "cannot read %s", name); return fp; } Avoid casting pointers to integers if you can. Such casts greatly reduce portability, and in most programs they are easy to avoid. In the cases where casting pointers to integers is essential--such as, a Lisp interpreter which stores type information as well as an address in one word--you'll have to make explicit provisions to handle different word sizes. You will also need to make provision for systems in which the normal range of addresses you can get from `malloc' starts far away from zero.  File: standards.info, Node: System Functions, Next: Internationalization, Prev: CPU Portability, Up: Writing C 5.7 Calling System Functions ============================ C implementations differ substantially. Standard C reduces but does not eliminate the incompatibilities; meanwhile, many GNU packages still support pre-standard compilers because this is not hard to do. This chapter gives recommendations for how to use the more-or-less standard C library functions to avoid unnecessary loss of portability. * Don't use the return value of `sprintf'. It returns the number of characters written on some systems, but not on all systems. * Be aware that `vfprintf' is not always available. * `main' should be declared to return type `int'. It should terminate either by calling `exit' or by returning the integer status code; make sure it cannot ever return an undefined value. * Don't declare system functions explicitly. Almost any declaration for a system function is wrong on some system. To minimize conflicts, leave it to the system header files to declare system functions. If the headers don't declare a function, let it remain undeclared. While it may seem unclean to use a function without declaring it, in practice this works fine for most system library functions on the systems where this really happens; thus, the disadvantage is only theoretical. By contrast, actual declarations have frequently caused actual conflicts. * If you must declare a system function, don't specify the argument types. Use an old-style declaration, not a Standard C prototype. The more you specify about the function, the more likely a conflict. * In particular, don't unconditionally declare `malloc' or `realloc'. Most GNU programs use those functions just once, in functions conventionally named `xmalloc' and `xrealloc'. These functions call `malloc' and `realloc', respectively, and check the results. Because `xmalloc' and `xrealloc' are defined in your program, you can declare them in other files without any risk of type conflict. On most systems, `int' is the same length as a pointer; thus, the calls to `malloc' and `realloc' work fine. For the few exceptional systems (mostly 64-bit machines), you can use *conditionalized* declarations of `malloc' and `realloc'--or put these declarations in configuration files specific to those systems. * The string functions require special treatment. Some Unix systems have a header file `string.h'; others have `strings.h'. Neither file name is portable. There are two things you can do: use Autoconf to figure out which file to include, or don't include either file. * If you don't include either strings file, you can't get declarations for the string functions from the header file in the usual way. That causes less of a problem than you might think. The newer standard string functions should be avoided anyway because many systems still don't support them. The string functions you can use are these: strcpy strncpy strcat strncat strlen strcmp strncmp strchr strrchr The copy and concatenate functions work fine without a declaration as long as you don't use their values. Using their values without a declaration fails on systems where the width of a pointer differs from the width of `int', and perhaps in other cases. It is trivial to avoid using their values, so do that. The compare functions and `strlen' work fine without a declaration on most systems, possibly all the ones that GNU software runs on. You may find it necessary to declare them *conditionally* on a few systems. The search functions must be declared to return `char *'. Luckily, there is no variation in the data type they return. But there is variation in their names. Some systems give these functions the names `index' and `rindex'; other systems use the names `strchr' and `strrchr'. Some systems support both pairs of names, but neither pair works on all systems. You should pick a single pair of names and use it throughout your program. (Nowadays, it is better to choose `strchr' and `strrchr' for new programs, since those are the standard names.) Declare both of those names as functions returning `char *'. On systems which don't support those names, define them as macros in terms of the other pair. For example, here is what to put at the beginning of your file (or in a header) if you want to use the names `strchr' and `strrchr' throughout: #ifndef HAVE_STRCHR #define strchr index #endif #ifndef HAVE_STRRCHR #define strrchr rindex #endif char *strchr (); char *strrchr (); Here we assume that `HAVE_STRCHR' and `HAVE_STRRCHR' are macros defined in systems where the corresponding functions exist. One way to get them properly defined is to use Autoconf.  File: standards.info, Node: Internationalization, Next: Character Set, Prev: System Functions, Up: Writing C 5.8 Internationalization ======================== GNU has a library called GNU gettext that makes it easy to translate the messages in a program into various languages. You should use this library in every program. Use English for the messages as they appear in the program, and let gettext provide the way to translate them into other languages. Using GNU gettext involves putting a call to the `gettext' macro around each string that might need translation--like this: printf (gettext ("Processing file `%s'...")); This permits GNU gettext to replace the string `"Processing file `%s'..."' with a translated version. Once a program uses gettext, please make a point of writing calls to `gettext' when you add new strings that call for translation. Using GNU gettext in a package involves specifying a "text domain name" for the package. The text domain name is used to separate the translations for this package from the translations for other packages. Normally, the text domain name should be the same as the name of the package--for example, `coreutils' for the GNU core utilities. To enable gettext to work well, avoid writing code that makes assumptions about the structure of words or sentences. When you want the precise text of a sentence to vary depending on the data, use two or more alternative string constants each containing a complete sentences, rather than inserting conditionalized words or phrases into a single sentence framework. Here is an example of what not to do: printf ("%s is full", capacity > 5000000 ? "disk" : "floppy disk"); If you apply gettext to all strings, like this, printf (gettext ("%s is full"), capacity > 5000000 ? gettext ("disk") : gettext ("floppy disk")); the translator will hardly know that "disk" and "floppy disk" are meant to be substituted in the other string. Worse, in some languages (like French) the construction will not work: the translation of the word "full" depends on the gender of the first part of the sentence; it happens to be not the same for "disk" as for "floppy disk". Complete sentences can be translated without problems: printf (capacity > 5000000 ? gettext ("disk is full") : gettext ("floppy disk is full")); A similar problem appears at the level of sentence structure with this code: printf ("# Implicit rule search has%s been done.\n", f->tried_implicit ? "" : " not"); Adding `gettext' calls to this code cannot give correct results for all languages, because negation in some languages requires adding words at more than one place in the sentence. By contrast, adding `gettext' calls does the job straightforwardly if the code starts out like this: printf (f->tried_implicit ? "# Implicit rule search has been done.\n", : "# Implicit rule search has not been done.\n"); Another example is this one: printf ("%d file%s processed", nfiles, nfiles != 1 ? "s" : ""); The problem with this example is that it assumes that plurals are made by adding `s'. If you apply gettext to the format string, like this, printf (gettext ("%d file%s processed"), nfiles, nfiles != 1 ? "s" : ""); the message can use different words, but it will still be forced to use `s' for the plural. Here is a better way, with gettext being applied to the two strings independently: printf ((nfiles != 1 ? gettext ("%d files processed") : gettext ("%d file processed")), nfiles); But this still doesn't work for languages like Polish, which has three plural forms: one for nfiles == 1, one for nfiles == 2, 3, 4, 22, 23, 24, ... and one for the rest. The GNU `ngettext' function solves this problem: printf (ngettext ("%d files processed", "%d file processed", nfiles), nfiles);  File: standards.info, Node: Character Set, Next: Quote Characters, Prev: Internationalization, Up: Writing C 5.9 Character Set ================= Sticking to the ASCII character set (plain text, 7-bit characters) is preferred in GNU source code comments, text documents, and other contexts, unless there is good reason to do something else because of the application domain. For example, if source code deals with the French Revolutionary calendar, it is OK if its literal strings contain accented characters in month names like "Flore'al". Also, it is OK to use non-ASCII characters to represent proper names of contributors in change logs (*note Change Logs::). If you need to use non-ASCII characters, you should normally stick with one encoding, as one cannot in general mix encodings reliably.  File: standards.info, Node: Quote Characters, Next: Mmap, Prev: Character Set, Up: Writing C 5.10 Quote Characters ===================== In the C locale, GNU programs should stick to plain ASCII for quotation characters in messages to users: preferably 0x60 (``') for left quotes and 0x27 (`'') for right quotes. It is ok, but not required, to use locale-specific quotes in other locales. The Gnulib (http://www.gnu.org/software/gnulib/) `quote' and `quotearg' modules provide a reasonably straightforward way to support locale-specific quote characters, as well as taking care of other issues, such as quoting a filename that itself contains a quote character. See the Gnulib documentation for usage details. In any case, the documentation for your program should clearly specify how it does quoting, if different than the preferred method of ``' and `''. This is especially important if the output of your program is ever likely to be parsed by another program. Quotation characters are a difficult area in the computing world at this time: there are no true left or right quote characters in Latin1; the ``' character we use was standardized there as a grave accent. Moreover, Latin1 is still not universally usable. Unicode contains the unambiguous quote characters required, and its common encoding UTF-8 is upward compatible with Latin1. However, Unicode and UTF-8 are not universally well-supported, either. This may change over the next few years, and then we will revisit this.  File: standards.info, Node: Mmap, Prev: Quote Characters, Up: Writing C 5.11 Mmap ========= Don't assume that `mmap' either works on all files or fails for all files. It may work on some files and fail on others. The proper way to use `mmap' is to try it on the specific file for which you want to use it--and if `mmap' doesn't work, fall back on doing the job in another way using `read' and `write'. The reason this precaution is needed is that the GNU kernel (the HURD) provides a user-extensible file system, in which there can be many different kinds of "ordinary files." Many of them support `mmap', but some do not. It is important to make programs handle all these kinds of files.  File: standards.info, Node: Documentation, Next: Managing Releases, Prev: Writing C, Up: Top 6 Documenting Programs ********************** A GNU program should ideally come with full free documentation, adequate for both reference and tutorial purposes. If the package can be programmed or extended, the documentation should cover programming or extending it, as well as just using it. * Menu: * GNU Manuals:: Writing proper manuals. * Doc Strings and Manuals:: Compiling doc strings doesn't make a manual. * Manual Structure Details:: Specific structure conventions. * License for Manuals:: Writing the distribution terms for a manual. * Manual Credits:: Giving credit to documentation contributors. * Printed Manuals:: Mentioning the printed manual. * NEWS File:: NEWS files supplement manuals. * Change Logs:: Recording changes. * Man Pages:: Man pages are secondary. * Reading other Manuals:: How far you can go in learning from other manuals.  File: standards.info, Node: GNU Manuals, Next: Doc Strings and Manuals, Up: Documentation 6.1 GNU Manuals =============== The preferred document format for the GNU system is the Texinfo formatting language. Every GNU package should (ideally) have documentation in Texinfo both for reference and for learners. Texinfo makes it possible to produce a good quality formatted book, using TeX, and to generate an Info file. It is also possible to generate HTML output from Texinfo source. See the Texinfo manual, either the hardcopy, or the on-line version available through `info' or the Emacs Info subsystem (`C-h i'). Nowadays some other formats such as Docbook and Sgmltexi can be converted automatically into Texinfo. It is ok to produce the Texinfo documentation by conversion this way, as long as it gives good results. Make sure your manual is clear to a reader who knows nothing about the topic and reads it straight through. This means covering basic topics at the beginning, and advanced topics only later. This also means defining every specialized term when it is first used. Programmers tend to carry over the structure of the program as the structure for its documentation. But this structure is not necessarily good for explaining how to use the program; it may be irrelevant and confusing for a user. Instead, the right way to structure documentation is according to the concepts and questions that a user will have in mind when reading it. This principle applies at every level, from the lowest (ordering sentences in a paragraph) to the highest (ordering of chapter topics within the manual). Sometimes this structure of ideas matches the structure of the implementation of the software being documented--but often they are different. An important part of learning to write good documentation is to learn to notice when you have unthinkingly structured the documentation like the implementation, stop yourself, and look for better alternatives. For example, each program in the GNU system probably ought to be documented in one manual; but this does not mean each program should have its own manual. That would be following the structure of the implementation, rather than the structure that helps the user understand. Instead, each manual should cover a coherent _topic_. For example, instead of a manual for `diff' and a manual for `diff3', we have one manual for "comparison of files" which covers both of those programs, as well as `cmp'. By documenting these programs together, we can make the whole subject clearer. The manual which discusses a program should certainly document all of the program's command-line options and all of its commands. It should give examples of their use. But don't organize the manual as a list of features. Instead, organize it logically, by subtopics. Address the questions that a user will ask when thinking about the job that the program does. Don't just tell the reader what each feature can do--say what jobs it is good for, and show how to use it for those jobs. Explain what is recommended usage, and what kinds of usage users should avoid. In general, a GNU manual should serve both as tutorial and reference. It should be set up for convenient access to each topic through Info, and for reading straight through (appendixes aside). A GNU manual should give a good introduction to a beginner reading through from the start, and should also provide all the details that hackers want. The Bison manual is a good example of this--please take a look at it to see what we mean. That is not as hard as it first sounds. Arrange each chapter as a logical breakdown of its topic, but order the sections, and write their text, so that reading the chapter straight through makes sense. Do likewise when structuring the book into chapters, and when structuring a section into paragraphs. The watchword is, _at each point, address the most fundamental and important issue raised by the preceding text._ If necessary, add extra chapters at the beginning of the manual which are purely tutorial and cover the basics of the subject. These provide the framework for a beginner to understand the rest of the manual. The Bison manual provides a good example of how to do this. To serve as a reference, a manual should have an Index that list all the functions, variables, options, and important concepts that are part of the program. One combined Index should do for a short manual, but sometimes for a complex package it is better to use multiple indices. The Texinfo manual includes advice on preparing good index entries, see *Note Making Index Entries: (texinfo)Index Entries, and see *Note Defining the Entries of an Index: (texinfo)Indexing Commands. Don't use Unix man pages as a model for how to write GNU documentation; most of them are terse, badly structured, and give inadequate explanation of the underlying concepts. (There are, of course, some exceptions.) Also, Unix man pages use a particular format which is different from what we use in GNU manuals. Please include an email address in the manual for where to report bugs _in the text of the manual_. Please do not use the term "pathname" that is used in Unix documentation; use "file name" (two words) instead. We use the term "path" only for search paths, which are lists of directory names. Please do not use the term "illegal" to refer to erroneous input to a computer program. Please use "invalid" for this, and reserve the term "illegal" for activities prohibited by law. Please do not write `()' after a function name just to indicate it is a function. `foo ()' is not a function, it is a function call with no arguments.  File: standards.info, Node: Doc Strings and Manuals, Next: Manual Structure Details, Prev: GNU Manuals, Up: Documentation 6.2 Doc Strings and Manuals =========================== Some programming systems, such as Emacs, provide a documentation string for each function, command or variable. You may be tempted to write a reference manual by compiling the documentation strings and writing a little additional text to go around them--but you must not do it. That approach is a fundamental mistake. The text of well-written documentation strings will be entirely wrong for a manual. A documentation string needs to stand alone--when it appears on the screen, there will be no other text to introduce or explain it. Meanwhile, it can be rather informal in style. The text describing a function or variable in a manual must not stand alone; it appears in the context of a section or subsection. Other text at the beginning of the section should explain some of the concepts, and should often make some general points that apply to several functions or variables. The previous descriptions of functions and variables in the section will also have given information about the topic. A description written to stand alone would repeat some of that information; this redundancy looks bad. Meanwhile, the informality that is acceptable in a documentation string is totally unacceptable in a manual. The only good way to use documentation strings in writing a good manual is to use them as a source of information for writing good text.  File: standards.info, Node: Manual Structure Details, Next: License for Manuals, Prev: Doc Strings and Manuals, Up: Documentation 6.3 Manual Structure Details ============================ The title page of the manual should state the version of the programs or packages documented in the manual. The Top node of the manual should also contain this information. If the manual is changing more frequently than or independent of the program, also state a version number for the manual in both of these places. Each program documented in the manual should have a node named `PROGRAM Invocation' or `Invoking PROGRAM'. This node (together with its subnodes, if any) should describe the program's command line arguments and how to run it (the sort of information people would look for in a man page). Start with an `@example' containing a template for all the options and arguments that the program uses. Alternatively, put a menu item in some menu whose item name fits one of the above patterns. This identifies the node which that item points to as the node for this purpose, regardless of the node's actual name. The `--usage' feature of the Info reader looks for such a node or menu item in order to find the relevant text, so it is essential for every Texinfo file to have one. If one manual describes several programs, it should have such a node for each program described in the manual.  File: standards.info, Node: License for Manuals, Next: Manual Credits, Prev: Manual Structure Details, Up: Documentation 6.4 License for Manuals ======================= Please use the GNU Free Documentation License for all GNU manuals that are more than a few pages long. Likewise for a collection of short documents--you only need one copy of the GNU FDL for the whole collection. For a single short document, you can use a very permissive non-copyleft license, to avoid taking up space with a long license. See `http://www.gnu.org/copyleft/fdl-howto.html' for more explanation of how to employ the GFDL. Note that it is not obligatory to include a copy of the GNU GPL or GNU LGPL in a manual whose license is neither the GPL nor the LGPL. It can be a good idea to include the program's license in a large manual; in a short manual, whose size would be increased considerably by including the program's license, it is probably better not to include it.  File: standards.info, Node: Manual Credits, Next: Printed Manuals, Prev: License for Manuals, Up: Documentation 6.5 Manual Credits ================== Please credit the principal human writers of the manual as the authors, on the title page of the manual. If a company sponsored the work, thank the company in a suitable place in the manual, but do not cite the company as an author.  File: standards.info, Node: Printed Manuals, Next: NEWS File, Prev: Manual Credits, Up: Documentation 6.6 Printed Manuals =================== The FSF publishes some GNU manuals in printed form. To encourage sales of these manuals, the on-line versions of the manual should mention at the very start that the printed manual is available and should point at information for getting it--for instance, with a link to the page `http://www.gnu.org/order/order.html'. This should not be included in the printed manual, though, because there it is redundant. It is also useful to explain in the on-line forms of the manual how the user can print out the manual from the sources.  File: standards.info, Node: NEWS File, Next: Change Logs, Prev: Printed Manuals, Up: Documentation 6.7 The NEWS File ================= In addition to its manual, the package should have a file named `NEWS' which contains a list of user-visible changes worth mentioning. In each new release, add items to the front of the file and identify the version they pertain to. Don't discard old items; leave them in the file after the newer items. This way, a user upgrading from any previous version can see what is new. If the `NEWS' file gets very long, move some of the older items into a file named `ONEWS' and put a note at the end referring the user to that file.  File: standards.info, Node: Change Logs, Next: Man Pages, Prev: NEWS File, Up: Documentation 6.8 Change Logs =============== Keep a change log to describe all the changes made to program source files. The purpose of this is so that people investigating bugs in the future will know about the changes that might have introduced the bug. Often a new bug can be found by looking at what was recently changed. More importantly, change logs can help you eliminate conceptual inconsistencies between different parts of a program, by giving you a history of how the conflicting concepts arose and who they came from. * Menu: * Change Log Concepts:: * Style of Change Logs:: * Simple Changes:: * Conditional Changes:: * Indicating the Part Changed::  File: standards.info, Node: Change Log Concepts, Next: Style of Change Logs, Up: Change Logs 6.8.1 Change Log Concepts ------------------------- You can think of the change log as a conceptual "undo list" which explains how earlier versions were different from the current version. People can see the current version; they don't need the change log to tell them what is in it. What they want from a change log is a clear explanation of how the earlier version differed. The change log file is normally called `ChangeLog' and covers an entire directory. Each directory can have its own change log, or a directory can use the change log of its parent directory--it's up to you. Another alternative is to record change log information with a version control system such as RCS or CVS. This can be converted automatically to a `ChangeLog' file using `rcs2log'; in Emacs, the command `C-x v a' (`vc-update-change-log') does the job. There's no need to describe the full purpose of the changes or how they work together. However, sometimes it is useful to write one line to describe the overall purpose of a change or a batch of changes. If you think that a change calls for explanation, you're probably right. Please do explain it--but please put the full explanation in comments in the code, where people will see it whenever they see the code. For example, "New function" is enough for the change log when you add a function, because there should be a comment before the function definition to explain what it does. In the past, we recommended not mentioning changes in non-software files (manuals, help files, etc.) in change logs. However, we've been advised that it is a good idea to include them, for the sake of copyright records. The easiest way to add an entry to `ChangeLog' is with the Emacs command `M-x add-change-log-entry'. An entry should have an asterisk, the name of the changed file, and then in parentheses the name of the changed functions, variables or whatever, followed by a colon. Then describe the changes you made to that function or variable.  File: standards.info, Node: Style of Change Logs, Next: Simple Changes, Prev: Change Log Concepts, Up: Change Logs 6.8.2 Style of Change Logs -------------------------- Here are some simple examples of change log entries, starting with the header line that says who made the change and when it was installed, followed by descriptions of specific changes. (These examples are drawn from Emacs and GCC.) 1998-08-17 Richard Stallman * register.el (insert-register): Return nil. (jump-to-register): Likewise. * sort.el (sort-subr): Return nil. * tex-mode.el (tex-bibtex-file, tex-file, tex-region): Restart the tex shell if process is gone or stopped. (tex-shell-running): New function. * expr.c (store_one_arg): Round size up for move_block_to_reg. (expand_call): Round up when emitting USE insns. * stmt.c (assign_parms): Round size up for move_block_from_reg. It's important to name the changed function or variable in full. Don't abbreviate function or variable names, and don't combine them. Subsequent maintainers will often search for a function name to find all the change log entries that pertain to it; if you abbreviate the name, they won't find it when they search. For example, some people are tempted to abbreviate groups of function names by writing `* register.el ({insert,jump-to}-register)'; this is not a good idea, since searching for `jump-to-register' or `insert-register' would not find that entry. Separate unrelated change log entries with blank lines. When two entries represent parts of the same change, so that they work together, then don't put blank lines between them. Then you can omit the file name and the asterisk when successive entries are in the same file. Break long lists of function names by closing continued lines with `)', rather than `,', and opening the continuation with `(' as in this example: * keyboard.c (menu_bar_items, tool_bar_items) (Fexecute_extended_command): Deal with `keymap' property. When you install someone else's changes, put the contributor's name in the change log entry rather than in the text of the entry. In other words, write this: 2002-07-14 John Doe * sewing.c: Make it sew. rather than this: 2002-07-14 Usual Maintainer * sewing.c: Make it sew. Patch by jdoe@gnu.org. As for the date, that should be the date you applied the change.  File: standards.info, Node: Simple Changes, Next: Conditional Changes, Prev: Style of Change Logs, Up: Change Logs 6.8.3 Simple Changes -------------------- Certain simple kinds of changes don't need much detail in the change log. When you change the calling sequence of a function in a simple fashion, and you change all the callers of the function to use the new calling sequence, there is no need to make individual entries for all the callers that you changed. Just write in the entry for the function being called, "All callers changed"--like this: * keyboard.c (Fcommand_execute): New arg SPECIAL. All callers changed. When you change just comments or doc strings, it is enough to write an entry for the file, without mentioning the functions. Just "Doc fixes" is enough for the change log. There's no technical need to make change log entries for documentation files. This is because documentation is not susceptible to bugs that are hard to fix. Documentation does not consist of parts that must interact in a precisely engineered fashion. To correct an error, you need not know the history of the erroneous passage; it is enough to compare what the documentation says with the way the program actually works. However, you should keep change logs for documentation files when the project gets copyright assignments from its contributors, so as to make the records of authorship more accurate.  File: standards.info, Node: Conditional Changes, Next: Indicating the Part Changed, Prev: Simple Changes, Up: Change Logs 6.8.4 Conditional Changes ------------------------- C programs often contain compile-time `#if' conditionals. Many changes are conditional; sometimes you add a new definition which is entirely contained in a conditional. It is very useful to indicate in the change log the conditions for which the change applies. Our convention for indicating conditional changes is to use square brackets around the name of the condition. Here is a simple example, describing a change which is conditional but does not have a function or entity name associated with it: * xterm.c [SOLARIS2]: Include string.h. Here is an entry describing a new definition which is entirely conditional. This new definition for the macro `FRAME_WINDOW_P' is used only when `HAVE_X_WINDOWS' is defined: * frame.h [HAVE_X_WINDOWS] (FRAME_WINDOW_P): Macro defined. Here is an entry for a change within the function `init_display', whose definition as a whole is unconditional, but the changes themselves are contained in a `#ifdef HAVE_LIBNCURSES' conditional: * dispnew.c (init_display) [HAVE_LIBNCURSES]: If X, call tgetent. Here is an entry for a change that takes affect only when a certain macro is _not_ defined: (gethostname) [!HAVE_SOCKETS]: Replace with winsock version.  File: standards.info, Node: Indicating the Part Changed, Prev: Conditional Changes, Up: Change Logs 6.8.5 Indicating the Part Changed --------------------------------- Indicate the part of a function which changed by using angle brackets enclosing an indication of what the changed part does. Here is an entry for a change in the part of the function `sh-while-getopts' that deals with `sh' commands: * progmodes/sh-script.el (sh-while-getopts) : Handle case that user-specified option string is empty.  File: standards.info, Node: Man Pages, Next: Reading other Manuals, Prev: Change Logs, Up: Documentation 6.9 Man Pages ============= In the GNU project, man pages are secondary. It is not necessary or expected for every GNU program to have a man page, but some of them do. It's your choice whether to include a man page in your program. When you make this decision, consider that supporting a man page requires continual effort each time the program is changed. The time you spend on the man page is time taken away from more useful work. For a simple program which changes little, updating the man page may be a small job. Then there is little reason not to include a man page, if you have one. For a large program that changes a great deal, updating a man page may be a substantial burden. If a user offers to donate a man page, you may find this gift costly to accept. It may be better to refuse the man page unless the same person agrees to take full responsibility for maintaining it--so that you can wash your hands of it entirely. If this volunteer later ceases to do the job, then don't feel obliged to pick it up yourself; it may be better to withdraw the man page from the distribution until someone else agrees to update it. When a program changes only a little, you may feel that the discrepancies are small enough that the man page remains useful without updating. If so, put a prominent note near the beginning of the man page explaining that you don't maintain it and that the Texinfo manual is more authoritative. The note should say how to access the Texinfo documentation. Be sure that man pages include a copyright statement and free license. The simple all-permissive license is appropriate for simple man pages (*note License Notices for Other Files: (maintain)License Notices for Other Files.). For long man pages, with enough explanation and documentation that they can be considered true manuals, use the GFDL (*note License for Manuals::). Finally, the GNU help2man program (`http://www.gnu.org/software/help2man/') is one way to automate generation of a man page, in this case from `--help' output. This is sufficient in many cases.  File: standards.info, Node: Reading other Manuals, Prev: Man Pages, Up: Documentation 6.10 Reading other Manuals ========================== There may be non-free books or documentation files that describe the program you are documenting. It is ok to use these documents for reference, just as the author of a new algebra textbook can read other books on algebra. A large portion of any non-fiction book consists of facts, in this case facts about how a certain program works, and these facts are necessarily the same for everyone who writes about the subject. But be careful not to copy your outline structure, wording, tables or examples from preexisting non-free documentation. Copying from free documentation may be ok; please check with the FSF about the individual case.  File: standards.info, Node: Managing Releases, Next: References, Prev: Documentation, Up: Top 7 The Release Process ********************* Making a release is more than just bundling up your source files in a tar file and putting it up for FTP. You should set up your software so that it can be configured to run on a variety of systems. Your Makefile should conform to the GNU standards described below, and your directory layout should also conform to the standards discussed below. Doing so makes it easy to include your package into the larger framework of all GNU software. * Menu: * Configuration:: How configuration of GNU packages should work. * Makefile Conventions:: Makefile conventions. * Releases:: Making releases  File: standards.info, Node: Configuration, Next: Makefile Conventions, Up: Managing Releases 7.1 How Configuration Should Work ================================= Each GNU distribution should come with a shell script named `configure'. This script is given arguments which describe the kind of machine and system you want to compile the program for. The `configure' script must record the configuration options so that they affect compilation. The description here is the specification of the interface for the `configure' script in GNU packages. Many packages implement it using GNU Autoconf (*note Introduction: (autoconf)Top.) and/or GNU Automake (*note Introduction: (automake)Top.), but you do not have to use these tools. You can implement it any way you like; for instance, by making `configure' be a wrapper around a completely different configuration system. Another way for the `configure' script to operate is to make a link from a standard name such as `config.h' to the proper configuration file for the chosen system. If you use this technique, the distribution should _not_ contain a file named `config.h'. This is so that people won't be able to build the program without configuring it first. Another thing that `configure' can do is to edit the Makefile. If you do this, the distribution should _not_ contain a file named `Makefile'. Instead, it should include a file `Makefile.in' which contains the input used for editing. Once again, this is so that people won't be able to build the program without configuring it first. If `configure' does write the `Makefile', then `Makefile' should have a target named `Makefile' which causes `configure' to be rerun, setting up the same configuration that was set up last time. The files that `configure' reads should be listed as dependencies of `Makefile'. All the files which are output from the `configure' script should have comments at the beginning explaining that they were generated automatically using `configure'. This is so that users won't think of trying to edit them by hand. The `configure' script should write a file named `config.status' which describes which configuration options were specified when the program was last configured. This file should be a shell script which, if run, will recreate the same configuration. The `configure' script should accept an option of the form `--srcdir=DIRNAME' to specify the directory where sources are found (if it is not the current directory). This makes it possible to build the program in a separate directory, so that the actual source directory is not modified. If the user does not specify `--srcdir', then `configure' should check both `.' and `..' to see if it can find the sources. If it finds the sources in one of these places, it should use them from there. Otherwise, it should report that it cannot find the sources, and should exit with nonzero status. Usually the easy way to support `--srcdir' is by editing a definition of `VPATH' into the Makefile. Some rules may need to refer explicitly to the specified source directory. To make this possible, `configure' can add to the Makefile a variable named `srcdir' whose value is precisely the specified directory. In addition, the `configure' script should take options corresponding to most of the standard directory variables (*note Directory Variables::). Here is the list: --prefix --exec-prefix --bindir --sbindir --libexecdir --sysconfdir --sharedstatedir --localstatedir --libdir --includedir --oldincludedir --datarootdir --datadir --infodir --localedir --mandir --docdir --htmldir --dvidir --pdfdir --psdir The `configure' script should also take an argument which specifies the type of system to build the program for. This argument should look like this: CPU-COMPANY-SYSTEM For example, an Athlon-based GNU/Linux system might be `i686-pc-linux-gnu'. The `configure' script needs to be able to decode all plausible alternatives for how to describe a machine. Thus, `athlon-pc-gnu/linux' would be a valid alias. There is a shell script called `config.sub' (http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD) that you can use as a subroutine to validate system types and canonicalize aliases. The `configure' script should also take the option `--build=BUILDTYPE', which should be equivalent to a plain BUILDTYPE argument. For example, `configure --build=i686-pc-linux-gnu' is equivalent to `configure i686-pc-linux-gnu'. When the build type is not specified by an option or argument, the `configure' script should normally guess it using the shell script `config.guess' (http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD). Other options are permitted to specify in more detail the software or hardware present on the machine, to include or exclude optional parts of the package, or to adjust the name of some tools or arguments to them: `--enable-FEATURE[=PARAMETER]' Configure the package to build and install an optional user-level facility called FEATURE. This allows users to choose which optional features to include. Giving an optional PARAMETER of `no' should omit FEATURE, if it is built by default. No `--enable' option should *ever* cause one feature to replace another. No `--enable' option should ever substitute one useful behavior for another useful behavior. The only proper use for `--enable' is for questions of whether to build part of the program or exclude it. `--with-PACKAGE' The package PACKAGE will be installed, so configure this package to work with PACKAGE. Possible values of PACKAGE include `gnu-as' (or `gas'), `gnu-ld', `gnu-libc', `gdb', `x', and `x-toolkit'. Do not use a `--with' option to specify the file name to use to find certain files. That is outside the scope of what `--with' options are for. `VARIABLE=VALUE' Set the value of the variable VARIABLE to VALUE. This is used to override the default values of commands or arguments in the build process. For example, the user could issue `configure CFLAGS=-g CXXFLAGS=-g' to build with debugging information and without the default optimization. Specifying variables as arguments to `configure', like this: ./configure CC=gcc is preferable to setting them in environment variables: CC=gcc ./configure as it helps to recreate the same configuration later with `config.status'. However, both methods should be supported. All `configure' scripts should accept all of the "detail" options and the variable settings, whether or not they make any difference to the particular package at hand. In particular, they should accept any option that starts with `--with-' or `--enable-'. This is so users will be able to configure an entire GNU source tree at once with a single set of options. You will note that the categories `--with-' and `--enable-' are narrow: they *do not* provide a place for any sort of option you might think of. That is deliberate. We want to limit the possible configuration options in GNU software. We do not want GNU programs to have idiosyncratic configuration options. Packages that perform part of the compilation process may support cross-compilation. In such a case, the host and target machines for the program may be different. The `configure' script should normally treat the specified type of system as both the host and the target, thus producing a program which works for the same type of machine that it runs on. To compile a program to run on a host type that differs from the build type, use the configure option `--host=HOSTTYPE', where HOSTTYPE uses the same syntax as BUILDTYPE. The host type normally defaults to the build type. To configure a cross-compiler, cross-assembler, or what have you, you should specify a target different from the host, using the configure option `--target=TARGETTYPE'. The syntax for TARGETTYPE is the same as for the host type. So the command would look like this: ./configure --host=HOSTTYPE --target=TARGETTYPE The target type normally defaults to the host type. Programs for which cross-operation is not meaningful need not accept the `--target' option, because configuring an entire operating system for cross-operation is not a meaningful operation. Some programs have ways of configuring themselves automatically. If your program is set up to do this, your `configure' script can simply ignore most of its arguments.  File: standards.info, Node: Makefile Conventions, Next: Releases, Prev: Configuration, Up: Managing Releases 7.2 Makefile Conventions ======================== This node describes conventions for writing the Makefiles for GNU programs. Using Automake will help you write a Makefile that follows these conventions. * Menu: * Makefile Basics:: General conventions for Makefiles. * Utilities in Makefiles:: Utilities to be used in Makefiles. * Command Variables:: Variables for specifying commands. * DESTDIR:: Supporting staged installs. * Directory Variables:: Variables for installation directories. * Standard Targets:: Standard targets for users. * Install Command Categories:: Three categories of commands in the `install' rule: normal, pre-install and post-install.  File: standards.info, Node: Makefile Basics, Next: Utilities in Makefiles, Up: Makefile Conventions 7.2.1 General Conventions for Makefiles --------------------------------------- Every Makefile should contain this line: SHELL = /bin/sh to avoid trouble on systems where the `SHELL' variable might be inherited from the environment. (This is never a problem with GNU `make'.) Different `make' programs have incompatible suffix lists and implicit rules, and this sometimes creates confusion or misbehavior. So it is a good idea to set the suffix list explicitly using only the suffixes you need in the particular Makefile, like this: .SUFFIXES: .SUFFIXES: .c .o The first line clears out the suffix list, the second introduces all suffixes which may be subject to implicit rules in this Makefile. Don't assume that `.' is in the path for command execution. When you need to run programs that are a part of your package during the make, please make sure that it uses `./' if the program is built as part of the make or `$(srcdir)/' if the file is an unchanging part of the source code. Without one of these prefixes, the current search path is used. The distinction between `./' (the "build directory") and `$(srcdir)/' (the "source directory") is important because users can build in a separate directory using the `--srcdir' option to `configure'. A rule of the form: foo.1 : foo.man sedscript sed -e sedscript foo.man > foo.1 will fail when the build directory is not the source directory, because `foo.man' and `sedscript' are in the source directory. When using GNU `make', relying on `VPATH' to find the source file will work in the case where there is a single dependency file, since the `make' automatic variable `$<' will represent the source file wherever it is. (Many versions of `make' set `$<' only in implicit rules.) A Makefile target like foo.o : bar.c $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o should instead be written as foo.o : bar.c $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@ in order to allow `VPATH' to work correctly. When the target has multiple dependencies, using an explicit `$(srcdir)' is the easiest way to make the rule work well. For example, the target above for `foo.1' is best written as: foo.1 : foo.man sedscript sed -e $(srcdir)/sedscript $(srcdir)/foo.man > $@ GNU distributions usually contain some files which are not source files--for example, Info files, and the output from Autoconf, Automake, Bison or Flex. Since these files normally appear in the source directory, they should always appear in the source directory, not in the build directory. So Makefile rules to update them should put the updated files in the source directory. However, if a file does not appear in the distribution, then the Makefile should not put it in the source directory, because building a program in ordinary circumstances should not modify the source directory in any way. Try to make the build and installation targets, at least (and all their subtargets) work correctly with a parallel `make'.  File: standards.info, Node: Utilities in Makefiles, Next: Command Variables, Prev: Makefile Basics, Up: Makefile Conventions 7.2.2 Utilities in Makefiles ---------------------------- Write the Makefile commands (and any shell scripts, such as `configure') to run in `sh', not in `csh'. Don't use any special features of `ksh' or `bash'. The `configure' script and the Makefile rules for building and installation should not use any utilities directly except these: cat cmp cp diff echo egrep expr false grep install-info ln ls mkdir mv pwd rm rmdir sed sleep sort tar test touch true The compression program `gzip' can be used in the `dist' rule. Stick to the generally supported options for these programs. For example, don't use `mkdir -p', convenient as it may be, because most systems don't support it. It is a good idea to avoid creating symbolic links in makefiles, since a few systems don't support them. The Makefile rules for building and installation can also use compilers and related programs, but should do so via `make' variables so that the user can substitute alternatives. Here are some of the programs we mean: ar bison cc flex install ld ldconfig lex make makeinfo ranlib texi2dvi yacc Use the following `make' variables to run those programs: $(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LDCONFIG) $(LEX) $(MAKE) $(MAKEINFO) $(RANLIB) $(TEXI2DVI) $(YACC) When you use `ranlib' or `ldconfig', you should make sure nothing bad happens if the system does not have the program in question. Arrange to ignore an error from that command, and print a message before the command to tell the user that failure of this command does not mean a problem. (The Autoconf `AC_PROG_RANLIB' macro can help with this.) If you use symbolic links, you should implement a fallback for systems that don't have symbolic links. Additional utilities that can be used via Make variables are: chgrp chmod chown mknod It is ok to use other utilities in Makefile portions (or scripts) intended only for particular systems where you know those utilities exist.  File: standards.info, Node: Command Variables, Next: DESTDIR, Prev: Utilities in Makefiles, Up: Makefile Conventions 7.2.3 Variables for Specifying Commands --------------------------------------- Makefiles should provide variables for overriding certain commands, options, and so on. In particular, you should run most utility programs via variables. Thus, if you use Bison, have a variable named `BISON' whose default value is set with `BISON = bison', and refer to it with `$(BISON)' whenever you need to use Bison. File management utilities such as `ln', `rm', `mv', and so on, need not be referred to through variables in this way, since users don't need to replace them with other programs. Each program-name variable should come with an options variable that is used to supply options to the program. Append `FLAGS' to the program-name variable name to get the options variable name--for example, `BISONFLAGS'. (The names `CFLAGS' for the C compiler, `YFLAGS' for yacc, and `LFLAGS' for lex, are exceptions to this rule, but we keep them because they are standard.) Use `CPPFLAGS' in any compilation command that runs the preprocessor, and use `LDFLAGS' in any compilation command that does linking as well as in any direct use of `ld'. If there are C compiler options that _must_ be used for proper compilation of certain files, do not include them in `CFLAGS'. Users expect to be able to specify `CFLAGS' freely themselves. Instead, arrange to pass the necessary options to the C compiler independently of `CFLAGS', by writing them explicitly in the compilation commands or by defining an implicit rule, like this: CFLAGS = -g ALL_CFLAGS = -I. $(CFLAGS) .c.o: $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $< Do include the `-g' option in `CFLAGS', because that is not _required_ for proper compilation. You can consider it a default that is only recommended. If the package is set up so that it is compiled with GCC by default, then you might as well include `-O' in the default value of `CFLAGS' as well. Put `CFLAGS' last in the compilation command, after other variables containing compiler options, so the user can use `CFLAGS' to override the others. `CFLAGS' should be used in every invocation of the C compiler, both those which do compilation and those which do linking. Every Makefile should define the variable `INSTALL', which is the basic command for installing a file into the system. Every Makefile should also define the variables `INSTALL_PROGRAM' and `INSTALL_DATA'. (The default for `INSTALL_PROGRAM' should be `$(INSTALL)'; the default for `INSTALL_DATA' should be `${INSTALL} -m 644'.) Then it should use those variables as the commands for actual installation, for executables and non-executables respectively. Minimal use of these variables is as follows: $(INSTALL_PROGRAM) foo $(bindir)/foo $(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a However, it is preferable to support a `DESTDIR' prefix on the target files, as explained in the next section. Always use a file name, not a directory name, as the second argument of the installation commands. Use a separate command for each file to be installed.  File: standards.info, Node: DESTDIR, Next: Directory Variables, Prev: Command Variables, Up: Makefile Conventions 7.2.4 `DESTDIR': support for staged installs -------------------------------------------- `DESTDIR' is a variable prepended to each installed target file, like this: $(INSTALL_PROGRAM) foo $(DESTDIR)$(bindir)/foo $(INSTALL_DATA) libfoo.a $(DESTDIR)$(libdir)/libfoo.a The `DESTDIR' variable is specified by the user on the `make' command line. For example: make DESTDIR=/tmp/stage install `DESTDIR' should be supported only in the `install*' and `uninstall*' targets, as those are the only targets where it is useful. If your installation step would normally install `/usr/local/bin/foo' and `/usr/local/lib/libfoo.a', then an installation invoked as in the example above would install `/tmp/stage/usr/local/bin/foo' and `/tmp/stage/usr/local/lib/libfoo.a' instead. Prepending the variable `DESTDIR' to each target in this way provides for "staged installs", where the installed files are not placed directly into their expected location but are instead copied into a temporary location (`DESTDIR'). However, installed files maintain their relative directory structure and any embedded file names will not be modified. You should not set the value of `DESTDIR' in your `Makefile' at all; then the files are installed into their expected locations by default. Also, specifying `DESTDIR' should not change the operation of the software in any way, so its value should not be included in any file contents. `DESTDIR' support is commonly used in package creation. It is also helpful to users who want to understand what a given package will install where, and to allow users who don't normally have permissions to install into protected areas to build and install before gaining those permissions. Finally, it can be useful with tools such as `stow', where code is installed in one place but made to appear to be installed somewhere else using symbolic links or special mount operations. So, we strongly recommend GNU packages support `DESTDIR', though it is not an absolute requirement.  File: standards.info, Node: Directory Variables, Next: Standard Targets, Prev: DESTDIR, Up: Makefile Conventions 7.2.5 Variables for Installation Directories -------------------------------------------- Installation directories should always be named by variables, so it is easy to install in a nonstandard place. The standard names for these variables and the values they should have in GNU packages are described below. They are based on a standard file system layout; variants of it are used in GNU/Linux and other modern operating systems. Installers are expected to override these values when calling `make' (e.g., `make prefix=/usr install' or `configure' (e.g., `configure --prefix=/usr'). GNU packages should not try to guess which value should be appropriate for these variables on the system they are being installed onto: use the default settings specified here so that all GNU packages behave identically, allowing the installer to achieve any desired layout. These first two variables set the root for the installation. All the other installation directories should be subdirectories of one of these two, and nothing should be directly installed into these two directories. `prefix' A prefix used in constructing the default values of the variables listed below. The default value of `prefix' should be `/usr/local'. When building the complete GNU system, the prefix will be empty and `/usr' will be a symbolic link to `/'. (If you are using Autoconf, write it as `@prefix@'.) Running `make install' with a different value of `prefix' from the one used to build the program should _not_ recompile the program. `exec_prefix' A prefix used in constructing the default values of some of the variables listed below. The default value of `exec_prefix' should be `$(prefix)'. (If you are using Autoconf, write it as `@exec_prefix@'.) Generally, `$(exec_prefix)' is used for directories that contain machine-specific files (such as executables and subroutine libraries), while `$(prefix)' is used directly for other directories. Running `make install' with a different value of `exec_prefix' from the one used to build the program should _not_ recompile the program. Executable programs are installed in one of the following directories. `bindir' The directory for installing executable programs that users can run. This should normally be `/usr/local/bin', but write it as `$(exec_prefix)/bin'. (If you are using Autoconf, write it as `@bindir@'.) `sbindir' The directory for installing executable programs that can be run from the shell, but are only generally useful to system administrators. This should normally be `/usr/local/sbin', but write it as `$(exec_prefix)/sbin'. (If you are using Autoconf, write it as `@sbindir@'.) `libexecdir' The directory for installing executable programs to be run by other programs rather than by users. This directory should normally be `/usr/local/libexec', but write it as `$(exec_prefix)/libexec'. (If you are using Autoconf, write it as `@libexecdir@'.) The definition of `libexecdir' is the same for all packages, so you should install your data in a subdirectory thereof. Most packages install their data under `$(libexecdir)/PACKAGE-NAME/', possibly within additional subdirectories thereof, such as `$(libexecdir)/PACKAGE-NAME/MACHINE/VERSION'. Data files used by the program during its execution are divided into categories in two ways. * Some files are normally modified by programs; others are never normally modified (though users may edit some of these). * Some files are architecture-independent and can be shared by all machines at a site; some are architecture-dependent and can be shared only by machines of the same kind and operating system; others may never be shared between two machines. This makes for six different possibilities. However, we want to discourage the use of architecture-dependent files, aside from object files and libr