| \input texinfo @c -*-texinfo-*- | |
| @c %**start of header | |
| @setfilename standards.info | |
| @settitle GNU Coding Standards | |
| @c This date is automagically updated when you save this file: | |
| @set lastupdate July 5, 2025 | |
| @c %**end of header | |
| @dircategory GNU organization | |
| @direntry | |
| * Standards: (standards). GNU coding standards. | |
| @end direntry | |
| @c @setchapternewpage odd | |
| @setchapternewpage off | |
| @c Put everything in one index (arbitrarily chosen to be the concept index). | |
| @syncodeindex fn cp | |
| @syncodeindex ky cp | |
| @syncodeindex pg cp | |
| @syncodeindex vr cp | |
| @c This is used by a cross ref in make-stds.texi | |
| @set CODESTD 1 | |
| @copying | |
| The GNU coding standards, last updated @value{lastupdate}. | |
| Copyright @copyright{} 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, | |
| 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, | |
| 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Free | |
| Software Foundation, Inc. | |
| Permission is granted to copy, distribute and/or modify this document | |
| under the terms of the GNU Free Documentation License, Version 1.3 or | |
| any later version published by the Free Software Foundation; with no | |
| Invariant Sections, no Front-Cover Texts, and no Back-Cover | |
| Texts. A copy of the license is included in the section entitled | |
| ``GNU Free Documentation License''. | |
| @end copying | |
| @titlepage | |
| @title GNU Coding Standards | |
| @author Richard Stallman, et al. | |
| @author last updated @value{lastupdate} | |
| @page | |
| @vskip 0pt plus 1filll | |
| @insertcopying | |
| @end titlepage | |
| @contents | |
| @ifnottex | |
| @node Top | |
| @top GNU Coding Standards | |
| @insertcopying | |
| @end ifnottex | |
| @menu | |
| * Preface:: About the GNU Coding Standards. | |
| * Legal Issues:: Keeping free software free. | |
| * Design Advice:: General program design. | |
| * Program Behavior:: Program behavior for all programs | |
| * Writing C:: Making the best use of C. | |
| * Documentation:: Documenting programs. | |
| * Managing Releases:: The release process. | |
| * References:: Mentioning nonfree software or documentation. | |
| * GNU Free Documentation License:: Copying and sharing this manual. | |
| * Index:: | |
| @end menu | |
| @node Preface | |
| @chapter About the GNU Coding Standards | |
| The GNU Coding Standards were written by Richard Stallman and other GNU | |
| Project volunteers. Their purpose is to make the GNU system clean, | |
| consistent, and easy to install. This document can also be read as a | |
| guide to writing portable, robust and reliable programs. It focuses on | |
| programs written in C, but many of the rules and principles are useful | |
| even if you write in another programming language. The rules often | |
| state reasons for writing in a certain way. | |
| @cindex where to obtain @code{standards.texi} | |
| @cindex downloading this manual | |
| If you did not obtain this file directly from the GNU project and | |
| recently, please check for a newer version. You can get the GNU | |
| Coding Standards from the GNU web server in many | |
| different formats, including the Texinfo source, PDF, HTML, plain | |
| text, and more, at: @uref{https://www.gnu.org/prep/standards/}. | |
| If you are maintaining an official GNU package, in addition to this | |
| document, please read and follow the GNU maintainer information | |
| (@pxref{Top, , Contents, maintain, Information for Maintainers of GNU | |
| Software}). | |
| @cindex @code{gnustandards-commit@@gnu.org} mailing list | |
| If you want to receive diffs for every change to these GNU documents, | |
| join the mailing list @code{gnustandards-commit@@gnu.org}, via the web | |
| interface at | |
| @url{https://lists.gnu.org/mailman/listinfo/gnustandards-commit}. | |
| Archives are also available there. | |
| @cindex @code{bug-standards@@gnu.org} email address | |
| @cindex Savannah repository for gnustandards | |
| @cindex gnustandards project repository | |
| Please send corrections or suggestions for this document to | |
| @email{bug-standards@@gnu.org}. If you make a suggestion, please | |
| include a suggested new wording for it, to help us consider the | |
| suggestion efficiently. We prefer a context diff to the Texinfo | |
| source, but if that's difficult for you, you can make a context diff | |
| for some other version of this document, or propose it in any way that | |
| makes it clear. The source repository for this document can be found | |
| at @url{https://savannah.gnu.org/projects/gnustandards}. | |
| These standards cover the minimum of what is important when writing a | |
| GNU package. Likely, the need for additional standards will come up. | |
| Sometimes, you might suggest that such standards be added to this | |
| document. If you think your standards would be generally useful, please | |
| do suggest them. | |
| You should also set standards for your package on many questions not | |
| addressed or not firmly specified here. The most important point is to | |
| be self-consistent---try to stick to the conventions you pick, and try | |
| to document them as much as possible. That way, your program will be | |
| more maintainable by others. | |
| The GNU Hello program serves as an example of how to follow the GNU | |
| coding standards for a trivial program. | |
| @uref{https://www.gnu.org/software/hello/hello.html}. | |
| This release of the GNU Coding Standards was last updated | |
| @value{lastupdate}. | |
| @node Legal Issues | |
| @chapter Keeping Free Software Free | |
| @cindex legal aspects | |
| This chapter discusses how you can make sure that GNU software | |
| avoids legal difficulties, and other related issues. | |
| @menu | |
| * Reading Nonfree Code:: Referring to proprietary programs. | |
| * Contributions:: Accepting contributions. | |
| * Trademarks:: How we deal with trademark issues. | |
| * Terms to Avoid:: Be careful of certain words! | |
| @end menu | |
| @node Reading Nonfree Code | |
| @section Referring to Proprietary Programs | |
| @cindex proprietary programs | |
| @cindex avoiding proprietary code | |
| Don't in any circumstances refer to Unix source code for or during | |
| your work on GNU! (Or to any other proprietary programs.) | |
| If you have a vague recollection of the internals of a Unix program, | |
| this does not absolutely mean you can't write an imitation of it, but | |
| do try to organize the imitation internally along different lines, | |
| because this is likely to make the details of the Unix version | |
| irrelevant and dissimilar to your results. | |
| For example, Unix utilities were generally optimized to minimize | |
| memory use; if you go for speed instead, your program will be very | |
| different. You could keep the entire input file in memory and scan it | |
| there instead of using stdio. Use a smarter algorithm discovered more | |
| recently than the Unix program. Eliminate use of temporary files. Do | |
| it in one pass instead of two (we did this in the assembler). | |
| Or, on the contrary, emphasize simplicity instead of speed. For some | |
| applications, the speed of today's computers makes simpler algorithms | |
| adequate. | |
| Or go for generality. For example, Unix programs often have static | |
| tables or fixed-size strings, which make for arbitrary limits; use | |
| dynamic allocation instead. Make sure your program handles NULs and | |
| other funny characters in the input files. Add a programming language | |
| for extensibility and write part of the program in that language. | |
| Or turn some parts of the program into independently usable libraries. | |
| Or use a simple garbage collector instead of tracking precisely when | |
| to free memory, or use a new GNU facility such as obstacks. | |
| @node Contributions | |
| @section Accepting Contributions | |
| @cindex legal papers | |
| @cindex accepting contributions | |
| If the program you are working on is copyrighted by the Free Software | |
| Foundation, then when someone else sends you a piece of code to add to | |
| the program, we need legal papers to use it---just as we asked you to | |
| sign papers initially. @emph{Each} person who makes a nontrivial | |
| contribution to a program must sign some sort of legal papers in order | |
| for us to have clear title to the program; the main author alone is not | |
| enough. | |
| So, before adding in any contributions from other people, please tell | |
| us, so we can arrange to get the papers. Then wait until we tell you | |
| that we have received the signed papers, before you actually use the | |
| contribution. | |
| This applies both before you release the program and afterward. If | |
| you receive diffs to fix a bug, and they make significant changes, we | |
| need legal papers for that change. | |
| This also applies to comments and documentation files. For copyright | |
| law, comments and code are just text. Copyright applies to all kinds of | |
| text, so we need legal papers for all kinds. | |
| We know it is frustrating to ask for legal papers; it's frustrating for | |
| us as well. But if you don't wait, you are going out on a limb---for | |
| example, what if the contributor's employer won't sign a disclaimer? | |
| You might have to take that code out again! | |
| You don't need papers for changes of a few lines here or there, since | |
| they are not significant for copyright purposes. Also, you don't need | |
| papers if all you get from the suggestion is some ideas, not actual code | |
| which you use. For example, if someone sent you one implementation, but | |
| you write a different implementation of the same idea, you don't need to | |
| get papers. | |
| The very worst thing is if you forget to tell us about the other | |
| contributor. We could be very embarrassed in court some day as a | |
| result. | |
| We have more detailed advice for maintainers of GNU packages. If you | |
| have reached the stage of maintaining a GNU program (whether released | |
| or not), please take a look: @pxref{Legal Matters,,, maintain, | |
| Information for GNU Maintainers}. | |
| @node Trademarks | |
| @section Trademarks | |
| @cindex trademarks | |
| Please do not include any trademark acknowledgments in GNU software | |
| packages or documentation. | |
| Trademark acknowledgments are the statements that such-and-such is a | |
| trademark of so-and-so. The GNU Project has no objection to the basic | |
| idea of trademarks, but these acknowledgments feel like kowtowing, | |
| and there is no legal requirement for them, so we don't use them. | |
| What is legally required, as regards other people's trademarks, is to | |
| avoid using them in ways which a reader might reasonably understand as | |
| naming or labeling our own programs or activities. For example, since | |
| ``Objective C'' is (or at least was) a trademark, we made sure to say | |
| that we provide a ``compiler for the Objective C language'' rather | |
| than an ``Objective C compiler''. The latter would have been meant as | |
| a shorter way of saying the former, but it does not explicitly state | |
| the relationship, so it could be misinterpreted as using ``Objective | |
| C'' as a label for the compiler rather than for the language. | |
| Please don't use ``win'' as an abbreviation for Microsoft Windows in | |
| GNU software or documentation. In hacker terminology, calling | |
| something a ``win'' is a form of praise. You're free to praise | |
| Microsoft Windows on your own if you want, but please don't do so in | |
| GNU packages. Please write ``Windows'' in full, or abbreviate it to | |
| ``w.'' @xref{System Portability}. | |
| @node Terms to Avoid | |
| @section Terms to Avoid | |
| Be careful---never use the word ``steward'' to refer to any person | |
| involved with developing any free software! An EU directive, the CRA, | |
| gives that word a specific legal meaning which imposes requirements | |
| that are painful or even impossible. | |
| @node Design Advice | |
| @chapter General Program Design | |
| @cindex program design | |
| This chapter discusses some of the issues you should take into | |
| account when designing your program. | |
| @c Standard or ANSI C | |
| @c | |
| @c In 1989 the American National Standards Institute (ANSI) standardized | |
| @c C as standard X3.159-1989. In December of that year the | |
| @c International Standards Organization ISO adopted the ANSI C standard | |
| @c making minor changes. In 1990 ANSI then re-adopted ISO standard | |
| @c C. This version of C is known as either ANSI C or Standard C. | |
| @c A major revision of the C Standard appeared in 1999. | |
| @menu | |
| * Source Language:: Which languages to use. | |
| * Compatibility:: Compatibility with other implementations. | |
| * Using Extensions:: Using non-standard features. | |
| * Standard C:: Using standard C features. | |
| * Conditional Compilation:: Compiling code only if a conditional is true. | |
| @end menu | |
| @node Source Language | |
| @section Which Languages to Use | |
| @cindex programming languages | |
| When you want to use a language that gets compiled and runs at high | |
| speed, the best language to use is C@. C++ is ok too, but please don't | |
| make heavy use of templates. So is Java, if you compile it. | |
| When highest efficiency is not required, other languages commonly used | |
| in the free software community, such as Lisp, Scheme, Python, Ruby, and | |
| Java, are OK too. Scheme, as implemented by GNU@tie{}Guile, plays a | |
| particular role in the GNU System: it is the preferred language to | |
| extend programs written in C/C++, and also a fine language for a wide | |
| range of applications. The more GNU components use Guile and Scheme, | |
| the more users are able to extend and combine them (@pxref{The Emacs | |
| Thesis,,, guile, GNU Guile Reference Manual}). | |
| Many programs are designed to be extensible: they include an interpreter | |
| for a language that is higher level than C@. Often much of the program | |
| is written in that language, too. The Emacs editor pioneered this | |
| technique. | |
| @cindex Guile | |
| @cindex GNOME and Guile | |
| The standard extensibility interpreter for GNU software is Guile | |
| (@uref{https://www.gnu.org/@/software/@/guile/}), which implements the | |
| language Scheme (an especially clean and simple dialect of Lisp). | |
| Guile also includes bindings for GTK+/GNOME, making it practical to | |
| write modern GUI functionality within Guile. We don't reject programs | |
| written in other ``scripting languages'' such as Perl and Python, but | |
| using Guile is the path that will lead to overall consistency of the | |
| GNU system. | |
| @node Compatibility | |
| @section Compatibility with Other Implementations | |
| @cindex compatibility with C and POSIX standards | |
| @cindex C compatibility | |
| @cindex POSIX compatibility | |
| With occasional exceptions, utility programs and libraries for GNU | |
| should be upward compatible with those in Berkeley Unix, and upward | |
| compatible with Standard C if Standard C specifies their | |
| behavior, and upward compatible with POSIX if POSIX specifies | |
| their behavior. | |
| When these standards conflict, it is useful to offer compatibility | |
| modes for each of them. | |
| @cindex options for compatibility | |
| Standard C and POSIX prohibit many kinds of extensions. Feel | |
| free to make the extensions anyway, and include a @samp{--ansi}, | |
| @samp{--posix}, or @samp{--compatible} option to turn them off. | |
| However, if the extension has a significant chance of breaking any real | |
| programs or scripts, then it is not really upward compatible. So you | |
| should try to redesign its interface to make it upward compatible. | |
| @cindex @code{POSIXLY_CORRECT}, environment variable | |
| Many GNU programs suppress extensions that conflict with POSIX if the | |
| environment variable @code{POSIXLY_CORRECT} is defined (even if it is | |
| defined with a null value). Please make your program recognize this | |
| variable if appropriate. | |
| When a feature is used only by users (not by programs or command | |
| files), and it is done poorly in Unix, feel free to replace it | |
| completely with something totally different and better. (For example, | |
| @code{vi} is replaced with Emacs.) But it is nice to offer a compatible | |
| feature as well. (There is a free @code{vi} clone, so we offer it.) | |
| Additional useful features are welcome regardless of whether | |
| there is any precedent for them. | |
| @node Using Extensions | |
| @section Using Non-standard Features | |
| @cindex non-standard extensions | |
| Many GNU facilities that already exist support a number of convenient | |
| extensions over the comparable Unix facilities. Whether to use these | |
| extensions in implementing your program is a difficult question. | |
| On the one hand, using the extensions can make a cleaner program. | |
| On the other hand, people will not be able to build the program | |
| unless the other GNU tools are available. This might cause the | |
| program to work on fewer kinds of machines. | |
| With some extensions, it might be easy to provide both alternatives. | |
| For example, you can define functions with a ``keyword'' @code{INLINE} | |
| and define that as a macro to expand into either @code{inline} or | |
| nothing, depending on the compiler. | |
| In general, perhaps it is best not to use the extensions if you can | |
| straightforwardly do without them, but to use the extensions if they | |
| are a big improvement. | |
| An exception to this rule are the large, established programs (such as | |
| Emacs) which run on a great variety of systems. Using GNU extensions in | |
| such programs would make many users unhappy, so we don't do that. | |
| Another exception is for programs that are used as part of compilation: | |
| anything that must be compiled with other compilers in order to | |
| bootstrap the GNU compilation facilities. If these require the GNU | |
| compiler, then no one can compile them without having them installed | |
| already. That would be extremely troublesome in certain cases. | |
| @node Standard C | |
| @section Standard C | |
| @cindex ANSI C standard | |
| ISO C99 is widespread enough now that it is ok to use its | |
| features in programs. There is one exception: do not ever use the | |
| ``trigraph'' misfeature introduced by C89 and not removed until C23. | |
| Not all features of recent Standard C are fully supported on all | |
| platforms. If you aim to support compilation by compilers other than | |
| GCC, you should generally not require newer Standard C features in | |
| your programs, or else use them conditionally on whether the compiler | |
| supports them. The same goes for GNU C extensions such as variable | |
| length arrays. | |
| If your program is only meant to compile with GCC, then you can use | |
| these features if GCC supports them. Don't use features that GCC does | |
| not support, except conditionally as a way to use equivalent features | |
| to those that are used when compiling with GCC. | |
| @cindex function prototypes | |
| Before C89, functions needed to be written in the K&R style, like | |
| this: | |
| @example | |
| int | |
| foo (x, y) | |
| int x, y; | |
| @dots{} | |
| @end example | |
| @noindent | |
| with a separate declaration to specify the argument prototype: | |
| @example | |
| int foo (int, int); | |
| @end example | |
| Until the 2020s, that was the way to get the most portability to | |
| different compilers. But not any more. | |
| Nowadays, it is rare to find a C compiler which fails to support the | |
| prototype style of function definition. It is more common to run into | |
| a compiler that has dropped support for the old K&R style. Thus, to | |
| maximize portability, write function definitions in the Standard C | |
| style. | |
| You generally need a declaration for the function in addition to its | |
| definition, usually in a header file, to get the benefit of prototypes | |
| in all the files where the function is called. | |
| @node Conditional Compilation | |
| @section Conditional Compilation | |
| When supporting configuration options already known when building your | |
| program we prefer using @code{if (... )} over conditional compilation, | |
| as in the former case the compiler is able to perform more extensive | |
| checking of all possible code paths. | |
| For example, please write | |
| @smallexample | |
| if (HAS_FOO) | |
| ... | |
| else | |
| ... | |
| @end smallexample | |
| @noindent | |
| instead of: | |
| @smallexample | |
| #ifdef HAS_FOO | |
| ... | |
| #else | |
| ... | |
| #endif | |
| @end smallexample | |
| A modern compiler such as GCC will generate exactly the same code in | |
| both cases, and we have been using similar techniques with good success | |
| in several projects. Of course, the former method assumes that | |
| @code{HAS_FOO} is defined as either 0 or 1. | |
| While this is not a silver bullet solving all portability problems, | |
| and is not always appropriate, following this policy would have saved | |
| GCC developers many hours, or even days, per year. | |
| In the case of function-like macros like @code{REVERSIBLE_CC_MODE} in | |
| GCC which cannot be simply used in @code{if (...)} statements, there is | |
| an easy workaround. Simply introduce another macro | |
| @code{HAS_REVERSIBLE_CC_MODE} as in the following example: | |
| @smallexample | |
| #ifdef REVERSIBLE_CC_MODE | |
| #define HAS_REVERSIBLE_CC_MODE 1 | |
| #else | |
| #define HAS_REVERSIBLE_CC_MODE 0 | |
| #endif | |
| @end smallexample | |
| @node Program Behavior | |
| @chapter Program Behavior for All Programs | |
| This chapter describes conventions for writing robust | |
| software. It also describes general standards for error messages, the | |
| command line interface, and how libraries should behave. | |
| @menu | |
| * Non-GNU Standards:: We consider standards such as POSIX; | |
| we don't "obey" them. | |
| * Semantics:: Writing robust programs. | |
| * Libraries:: Library behavior. | |
| * Errors:: Formatting error messages. | |
| * User Interfaces:: Standards about interfaces generally. | |
| * Finding Program Files:: How to find the program's executable | |
| and other files that go with it. | |
| * Graphical Interfaces:: Standards for graphical interfaces. | |
| * Command-Line Interfaces:: Standards for command line interfaces. | |
| * Dynamic Plug-In Interfaces:: Standards for dynamic plug-in interfaces. | |
| * Option Table:: Table of long options. | |
| * OID Allocations:: Table of OID slots for GNU. | |
| * Memory Usage:: When and how to care about memory needs. | |
| * File Usage:: Which files to use, and where. | |
| @end menu | |
| @node Non-GNU Standards | |
| @section Non-GNU Standards | |
| The GNU Project regards standards published by other organizations as | |
| suggestions, not orders. We consider those standards, but we do not | |
| ``obey'' them. In developing a GNU program, you should implement | |
| an outside standard's specifications when that makes the GNU system | |
| better overall in an objective sense. When it doesn't, you shouldn't. | |
| In most cases, following published standards is convenient for | |
| users---it means that their programs or scripts will work more | |
| portably. For instance, GCC implements nearly all the features of | |
| Standard C as specified by that standard. C program developers would | |
| be unhappy if it did not. And GNU utilities mostly follow | |
| specifications of POSIX; shell script writers and users would be | |
| unhappy if our programs were incompatible. | |
| But we do not follow either of these specifications rigidly, and there | |
| are specific points on which we decided not to follow them, so as to | |
| make the GNU system better for users. | |
| For instance, Standard C says that nearly all extensions to C are | |
| prohibited. How silly! GCC implements many extensions, some of which | |
| were later adopted as part of the standard. If you want these | |
| constructs to give an error message as ``required'' by the standard, | |
| you must specify @samp{--pedantic}, which was implemented only so that | |
| we can say ``GCC is a 100% implementation of the standard'', not | |
| because there is any reason to actually use it. | |
| POSIX specifies that @samp{df} and @samp{du} must output sizes by | |
| default in units of 512 bytes. What users want is units of 1k, so | |
| that is what we do by default. If you want the ridiculous behavior | |
| ``required'' by POSIX, you must set the environment variable | |
| @samp{POSIXLY_CORRECT} (which was originally going to be named | |
| @samp{POSIX_ME_HARDER}). | |
| GNU utilities also depart from the letter of the POSIX specification | |
| when they support long-named command-line options, and intermixing | |
| of options with ordinary arguments. This minor incompatibility with | |
| POSIX is never a problem in practice, and it is very useful. | |
| In particular, don't reject a new feature, or remove an old one, | |
| merely because a standard says it is ``forbidden'' or ``deprecated''. | |
| @node Semantics | |
| @section Writing Robust Programs | |
| @cindex arbitrary limits on data | |
| Avoid arbitrary limits on the length or number of @emph{any} data | |
| structure, including file names, lines, files, and symbols, by allocating | |
| all data structures dynamically. In most Unix utilities, ``long lines | |
| are silently truncated''. This is not acceptable in a GNU utility. | |
| @cindex @code{NUL} characters | |
| @findex libiconv | |
| Utilities reading files should not drop NUL characters, or any other | |
| nonprinting characters. Programs should work properly with multibyte | |
| character encodings, such as UTF-8. You can use libiconv to deal with | |
| a range of encodings. | |
| @cindex error messages | |
| Check every system call for an error return, unless you know you wish | |
| to ignore errors. Include the system error text (from | |
| @code{strerror}, or equivalent) in @emph{every} error message | |
| resulting from a failing system call, as well as the name of the file | |
| if any and the name of the utility. Just ``cannot open foo.c'' or | |
| ``stat failed'' is not sufficient. | |
| @cindex @code{malloc} return value | |
| @cindex memory allocation failure | |
| Check every call to @code{malloc} or @code{realloc} to see if it | |
| returned @code{NULL}. Check @code{realloc} even if you are making the | |
| block smaller; in a system that rounds block sizes to a power of 2, | |
| @code{realloc} may get a different block if you ask for less space. | |
| You must expect @code{free} to alter the contents of the block that was | |
| freed. Anything you want to fetch from the block, you must fetch before | |
| calling @code{free}. | |
| If @code{malloc} fails in a noninteractive program, make that a fatal | |
| error. In an interactive program (one that reads commands from the | |
| user), it is better to abort the command and return to the command | |
| reader loop. This allows the user to kill other processes to free up | |
| virtual memory, and then try the command again. | |
| @cindex command-line arguments, decoding | |
| Use @code{getopt_long} to decode arguments, unless the argument syntax | |
| makes this unreasonable. | |
| When static storage is to be written in during program execution, use | |
| explicit C code to initialize it. This way, restarting the program | |
| (without reloading it), or part of it, will reinitialize those | |
| variables. Reserve C initialized declarations for data that will not | |
| be changed. | |
| @c ADR: why? | |
| Try to avoid low-level interfaces to obscure Unix data structures (such | |
| as file directories, utmp, or the layout of kernel memory), since these | |
| are less likely to work compatibly. If you need to find all the files | |
| in a directory, use @code{readdir} or some other high-level interface. | |
| These are supported compatibly by GNU. | |
| @cindex signal handling | |
| The preferred signal handling facilities are the BSD variant of | |
| @code{signal}, and the POSIX @code{sigaction} function; the | |
| alternative USG @code{signal} interface is an inferior design. | |
| Nowadays, using the POSIX signal functions may be the easiest way | |
| to make a program portable. If you use @code{signal}, then on GNU/Linux | |
| systems running GNU libc version 1, you should include | |
| @file{bsd/signal.h} instead of @file{signal.h}, so as to get BSD | |
| behavior. It is up to you whether to support systems where | |
| @code{signal} has only the USG behavior, or give up on them. | |
| @cindex impossible conditions | |
| In error checks that detect ``impossible'' conditions, just abort. | |
| There is usually no point in printing any message. These checks | |
| indicate the existence of bugs. Whoever wants to fix the bugs will have | |
| to read the source code and run a debugger. So explain the problem with | |
| comments in the source. The relevant data will be in variables, which | |
| are easy to examine with the debugger, so there is no point moving them | |
| elsewhere. | |
| Do not use a count of errors as the exit status for a program. | |
| @emph{That does not work}, because exit status values are limited to 8 | |
| bits (0 through 255). A single run of the program might have 256 | |
| errors; if you try to return 256 as the exit status, the parent process | |
| will see 0 as the status, and it will appear that the program succeeded. | |
| @cindex temporary files | |
| @cindex @code{TMPDIR} environment variable | |
| If you make temporary files, check the @code{TMPDIR} environment | |
| variable; if that variable is defined, use the specified directory | |
| instead of @file{/tmp}. | |
| In addition, be aware that there is a possible security problem when | |
| creating temporary files in world-writable directories. In C, you can | |
| avoid this problem by creating temporary files in this manner: | |
| @example | |
| fd = open (filename, O_WRONLY | O_CREAT | O_EXCL, 0600); | |
| @end example | |
| @noindent | |
| or by using the @code{mkstemps} function from Gnulib | |
| (@pxref{mkstemps,,, gnulib, Gnulib}). | |
| In bash, use @code{set -C} (long name @code{noclobber}) to avoid this | |
| problem. In addition, the @code{mktemp} utility is a more general | |
| solution for creating temporary files from shell scripts | |
| (@pxref{mktemp invocation,,, coreutils, GNU Coreutils}). | |
| @node Libraries | |
| @section Library Behavior | |
| @cindex libraries | |
| Try to make library functions reentrant. If they need to do dynamic | |
| storage allocation, at least try to avoid any nonreentrancy aside from | |
| that of @code{malloc} itself. | |
| Here are certain name conventions for libraries, to avoid name | |
| conflicts. | |
| Choose a name prefix for the library, more than two characters long. | |
| All external function and variable names should start with this | |
| prefix. In addition, there should only be one of these in any given | |
| library member. This usually means putting each one in a separate | |
| source file. | |
| An exception can be made when two external symbols are always used | |
| together, so that no reasonable program could use one without the | |
| other; then they can both go in the same file. | |
| External symbols that are not documented entry points for the user | |
| should have names beginning with @samp{_}. The @samp{_} should be | |
| followed by the chosen name prefix for the library, to prevent | |
| collisions with other libraries. These can go in the same files with | |
| user entry points if you like. | |
| Static functions and variables can be used as you like and need not | |
| fit any naming convention. | |
| @node Errors | |
| @section Formatting Error Messages | |
| @cindex formatting error messages | |
| @cindex error messages, formatting | |
| Error messages from compilers should look like this: | |
| @example | |
| @var{sourcefile}:@var{lineno}: @var{message} | |
| @end example | |
| @noindent | |
| If you want to mention the column number, use one of these formats: | |
| @example | |
| @var{sourcefile}:@var{lineno}:@var{column}: @var{message} | |
| @var{sourcefile}:@var{lineno}.@var{column}: @var{message} | |
| @end example | |
| @noindent | |
| Line numbers should start from 1 at the beginning of the file, and | |
| column numbers should start from 1 at the beginning of the line. | |
| (Both of these conventions are chosen for compatibility.) Calculate | |
| column numbers assuming that space and all ASCII printing characters | |
| have equal width, and assuming tab stops every 8 columns. For | |
| non-ASCII characters, Unicode character widths should be used when in | |
| a UTF-8 locale; GNU libc and GNU gnulib provide suitable | |
| @code{wcwidth} functions. | |
| The error message can also give both the starting and ending positions | |
| of the erroneous text. There are several formats so that you can | |
| avoid redundant information such as a duplicate line number. | |
| Here are the possible formats: | |
| @example | |
| @var{sourcefile}:@var{line1}.@var{column1}-@var{line2}.@var{column2}: @var{message} | |
| @var{sourcefile}:@var{line1}.@var{column1}-@var{column2}: @var{message} | |
| @var{sourcefile}:@var{line1}-@var{line2}: @var{message} | |
| @end example | |
| @noindent | |
| When an error is spread over several files, you can use this format: | |
| @example | |
| @var{file1}:@var{line1}.@var{column1}-@var{file2}:@var{line2}.@var{column2}: @var{message} | |
| @end example | |
| Error messages from other noninteractive programs should look like this: | |
| @example | |
| @var{program}:@var{sourcefile}:@var{lineno}: @var{message} | |
| @end example | |
| @noindent | |
| when there is an appropriate source file, or like this: | |
| @example | |
| @var{program}: @var{message} | |
| @end example | |
| @noindent | |
| when there is no relevant source file. | |
| If you want to mention the column number, use this format: | |
| @example | |
| @var{program}:@var{sourcefile}:@var{lineno}:@var{column}: @var{message} | |
| @end example | |
| In an interactive program (one that is reading commands from a | |
| terminal), it is better not to include the program name in an error | |
| message. The place to indicate which program is running is in the | |
| prompt or with the screen layout. (When the same program runs with | |
| input from a source other than a terminal, it is not interactive and | |
| would do best to print error messages using the noninteractive style.) | |
| The string @var{message} should not begin with a capital letter when | |
| it follows a program name and/or file name, because that isn't the | |
| beginning of a sentence. (The sentence conceptually starts at the | |
| beginning of the line.) Also, it should not end with a period. | |
| Error messages from interactive programs, and other messages such as | |
| usage messages, should start with a capital letter. But they should not | |
| end with a period. | |
| @node User Interfaces | |
| @section Standards for Interfaces Generally | |
| @cindex program name and its behavior | |
| @cindex behavior, dependent on program's name | |
| Please don't make the behavior of a utility depend on the name used to | |
| invoke it. It is useful sometimes to make a link to a utility with a | |
| different name, and that should not change what it does. Thus, if you | |
| make @file{foo} a link to @file{ls}, the program should behave the | |
| same regardless of which of those names is used to invoke it. | |
| Instead, use a run time option or a compilation switch or both to | |
| select among the alternate behaviors. You can also build two versions | |
| of the program, with different default behaviors, and install them | |
| under two different names. | |
| @cindex output device and program's behavior | |
| Likewise, please don't make the behavior of a command-line program | |
| depend on the type of output device it gets as standard output or | |
| standard input. Device independence is an important principle of the | |
| system's design; do not compromise it merely to save someone from | |
| typing an option now and then. (Variation in error message syntax | |
| when using a terminal is ok, because that is a side issue that people | |
| do not depend on.) | |
| If you think one behavior is most useful when the output is to a | |
| terminal, and another is most useful when the output is a file or a | |
| pipe, then it is usually best to make the default behavior the one | |
| that is useful with output to a terminal, and have an option for the | |
| other behavior. You can also build two different versions of the | |
| program with different names. | |
| There is an exception for programs whose output in certain cases is | |
| binary data. Sending such output to a terminal is useless and can | |
| cause trouble. If such a program normally sends its output to stdout, | |
| it should detect, in these cases, when the output is a terminal and | |
| give an error message instead. The @code{-f} option should override | |
| this exception, thus permitting the output to go to the terminal. | |
| Compatibility requires certain programs to depend on the type of output | |
| device. It would be disastrous if @code{ls} or @code{sh} did not do so | |
| in the way all users expect. In some of these cases, we supplement the | |
| program with a preferred alternate version that does not depend on the | |
| output device type. For example, we provide a @code{dir} program much | |
| like @code{ls} except that its default output format is always | |
| multi-column format. | |
| @node Finding Program Files | |
| @section Finding the Program's Executable and Associated Files | |
| A program may need to find the executable file it was started with, so | |
| as to relaunch the same program. It may need to find associated | |
| files, either source files or files constructed by building, that | |
| it uses at run time. | |
| The way to find them starts with looking at @code{argv[0]}. | |
| If that string contains a slash, it is by convention the file name of | |
| the executable and its directory part is the directory that contained | |
| the executable. This is the case when the program was not found | |
| through @env{PATH}, which normally means it was built but not | |
| installed, and run from the build directory. The program can use the | |
| @code{argv[0]} file name to relaunch itself, and can look in its | |
| directory part for associated files. If that file name is not | |
| absolute, then it is relative to the working directory in which the | |
| program started. | |
| If @code{argv[0]} does not contain a slash, it is a command name whose | |
| executable was found via @env{PATH}. The program should search for | |
| that name in the directories in @env{PATH}, interpreting @file{.} as | |
| the working directory that was current when the program started. | |
| If this procedure finds the executable, we call the directory it was | |
| found in the @dfn{invocation directory}. The program should check | |
| for the presence in that directory of the associated files it needs. | |
| If the program's executable is normally built in a subdirectory of the | |
| main build directory, and the main build directory contains associated | |
| files (perhaps including subdirectories), the program should look at | |
| the parent of the invocation directory, checking for the associated | |
| files and subdirectories the main build directory should contain. | |
| If the invocation directory doesn't contain what's needed, but the | |
| executable file name is a symbolic link, the program should try using | |
| the link target's containing directory as the invocation directory. | |
| If this procedure doesn't come up with an invocation directory that is | |
| valid---normally the case for an installed program that was found via | |
| @env{PATH}---the program should look for the associated files in the | |
| directories where the program's makefile installs them. | |
| @xref{Directory Variables}. | |
| Providing valid information in @code{argv[0]} is a convention, not | |
| guaranteed. Well-behaved programs that launch other programs, such as | |
| shells, follow the convention; your code should follow it too, when | |
| launching other programs. But it is always possible to launch the | |
| program and give a nonsensical value in @code{argv[0]}. | |
| Therefore, any program that needs to know the location of its | |
| executable, or that of of other associated files, should offer the | |
| user environment variables to specify those locations explicitly. | |
| @strong{Don't give special privilege, such as with the @code{setuid} | |
| bit, to programs that will search heuristically for associated files | |
| or for their own executables when invoked that way.} Limit that | |
| privilege to programs that find associated files in hard-coded | |
| installed locations such as under @file{/usr} and @file{/etc}. | |
| @c ??? Is even that safe, in a setuid program? | |
| @xref{Bourne Shell Variables,,, bash, Bash Reference Manual}, | |
| for more information about @env{PATH}. | |
| @node Graphical Interfaces | |
| @section Standards for Graphical Interfaces | |
| @cindex graphical user interface | |
| @cindex interface styles | |
| @cindex user interface styles | |
| @cindex GTK+ | |
| @cindex GNUstep | |
| When you write a program that provides a graphical user interface, | |
| please make it work with the X Window System, using the GTK+ toolkit | |
| or the GNUstep toolkit, unless the functionality specifically requires | |
| some alternative (for example, ``displaying jpeg images while in | |
| console mode''). | |
| In addition, please provide a command-line interface to control the | |
| functionality. (In many cases, the graphical user interface can be a | |
| separate program which invokes the command-line program.) This is | |
| so that the same jobs can be done from scripts. | |
| @cindex CORBA | |
| @cindex GNOME | |
| @cindex D-bus | |
| @cindex keyboard interface | |
| @cindex library interface | |
| Please also consider providing a D-bus interface for use from other | |
| running programs, such as within GNOME@. (GNOME used to use CORBA | |
| for this, but that is being phased out.) In addition, consider | |
| providing a library interface (for use from C), and perhaps a | |
| keyboard-driven console interface (for use by users from console | |
| mode). Once you are doing the work to provide the functionality and | |
| the graphical interface, these won't be much extra work. | |
| Please make your program interoperate with access technology such as | |
| screen readers (see | |
| @url{https://www.gnu.org/accessibility/accessibility.html}). This should | |
| be automatic if you use GTK+. | |
| @node Command-Line Interfaces | |
| @section Standards for Command Line Interfaces | |
| @cindex command-line interface | |
| @findex getopt | |
| It is a good idea to follow the POSIX guidelines for the | |
| command-line options of a program. The easiest way to do this is to use | |
| @code{getopt} to parse them. Note that the GNU version of @code{getopt} | |
| will normally permit options anywhere among the arguments unless the | |
| special argument @samp{--} is used. This is not what POSIX | |
| specifies; it is a GNU extension. | |
| @cindex long-named options | |
| Please define long-named options that are equivalent to the | |
| single-letter Unix-style options. We hope to make GNU more user | |
| friendly this way. This is easy to do with the GNU function | |
| @code{getopt_long}. | |
| One of the advantages of long-named options is that they can be | |
| consistent from program to program. For example, users should be able | |
| to expect the ``verbose'' option of any GNU program which has one, to be | |
| spelled precisely @samp{--verbose}. To achieve this uniformity, look at | |
| the table of common long-option names when you choose the option names | |
| for your program (@pxref{Option Table}). | |
| It is usually a good idea for file names given as ordinary arguments to | |
| be input files only; any output files would be specified using options | |
| (preferably @samp{-o} or @samp{--output}). Even if you allow an output | |
| file name as an ordinary argument for compatibility, try to provide an | |
| option as another way to specify it. This will lead to more consistency | |
| among GNU utilities, and fewer idiosyncrasies for users to remember. | |
| @cindex standard command-line options | |
| @cindex options, standard command-line | |
| @cindex CGI programs, standard options for | |
| @cindex PATH_INFO, specifying standard options as | |
| All programs should support two standard options: @samp{--version} | |
| and @samp{--help}. CGI programs should accept these as command-line | |
| options, and also if given as the @env{PATH_INFO}; for instance, | |
| visiting @indicateurl{http://example.org/p.cgi/--help} in a browser should | |
| output the same information as invoking @samp{p.cgi --help} from the | |
| command line. | |
| @menu | |
| * --version:: The standard output for @option{--version}. | |
| * --help:: The standard output for @option{--help}. | |
| @end menu | |
| @node --version | |
| @subsection @option{--version} | |
| @cindex @samp{--version} output | |
| The standard @code{--version} option should direct the program to | |
| print information about its name, version, origin and legal status, | |
| all on standard output, and then exit successfully. Other options and | |
| arguments should be ignored once this is seen, and the program should | |
| not perform its normal function. | |
| @cindex canonical name of a program | |
| @cindex program's canonical name | |
| The first line is meant to be easy for a program to parse; the version | |
| number proper starts after the last space. In addition, it contains | |
| the canonical name for this program, in this format: | |
| @example | |
| GNU Emacs 19.30 | |
| @end example | |
| @noindent | |
| The program's name should be a constant string; @emph{don't} compute it | |
| from @code{argv[0]}. The idea is to state the standard or canonical | |
| name for the program, not its file name. There are other ways to find | |
| out the precise file name where a command is found in @code{PATH}. | |
| If the program is a subsidiary part of a larger package, mention the | |
| package name in parentheses, like this: | |
| @example | |
| emacsserver (GNU Emacs) 19.30 | |
| @end example | |
| @noindent | |
| If the package has a version number which is different from this | |
| program's version number, you can mention the package version number | |
| just before the close-parenthesis. | |
| If you @emph{need} to mention the version numbers of libraries which | |
| are distributed separately from the package which contains this program, | |
| you can do so by printing an additional line of version info for each | |
| library you want to mention. Use the same format for these lines as for | |
| the first line. | |
| Please do not mention all of the libraries that the program uses ``just | |
| for completeness''---that would produce a lot of unhelpful clutter. | |
| Please mention library version numbers only if you find in practice that | |
| they are very important to you in debugging. | |
| The following line, after the version number line or lines, should be a | |
| copyright notice. If more than one copyright notice is called for, put | |
| each on a separate line. | |
| Next should follow a line stating the license, preferably using one of | |
| the abbreviations below, and a brief statement that the program is free | |
| software, and that users are free to copy and change it. Also mention | |
| that there is no warranty, to the extent permitted by law. See | |
| recommended wording below. | |
| It is ok to finish the output with a list of the major authors of the | |
| program, as a way of giving credit. | |
| Here's an example of output that follows these rules: | |
| @smallexample | |
| GNU hello 2.3 | |
| Copyright (C) 2007 Free Software Foundation, Inc. | |
| License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> | |
| This is free software: you are free to change and redistribute it. | |
| There is NO WARRANTY, to the extent permitted by law. | |
| @end smallexample | |
| You should adapt this to your program, of course, filling in the proper | |
| year, copyright holder, name of program, and the references to | |
| distribution terms, and changing the rest of the wording as necessary. | |
| This copyright notice only needs to mention the most recent year in | |
| which changes were made---there's no need to list the years for previous | |
| versions' changes. You don't have to mention the name of the program in | |
| these notices, if that is inconvenient, since it appeared in the first | |
| line. (The rules are different for copyright notices in source files; | |
| @pxref{Copyright Notices,,,maintain,Information for GNU Maintainers}.) | |
| Translations of the above lines must preserve the validity of the | |
| copyright notices (@pxref{Internationalization}). If the translation's | |
| character set supports it, the @samp{(C)} should be replaced with the | |
| copyright symbol, as follows: | |
| @ifinfo | |
| (the official copyright symbol, which is the letter C in a circle); | |
| @end ifinfo | |
| @ifnotinfo | |
| @copyright{} | |
| @end ifnotinfo | |
| Write the word ``Copyright'' exactly like that, in English. Do not | |
| translate it into another language. International treaties recognize | |
| the English word ``Copyright''; translations into other languages do not | |
| have legal significance. | |
| Finally, here is the table of our suggested license abbreviations. | |
| Any abbreviation can be followed by @samp{v@var{version}[+]}, meaning | |
| that particular version, or later versions with the @samp{+}, as shown | |
| above. In the case of a GNU license, @emph{always} indicate the permitted | |
| versions in this way. | |
| In the case of exceptions for extra permissions with the GPL, we use | |
| @samp{/} for a separator; the version number can follow the license | |
| abbreviation as usual, as in the examples below. | |
| @table @asis | |
| @item GPL | |
| GNU General Public License, @url{https://www.gnu.org/@/licenses/@/gpl.html}. | |
| @item LGPL | |
| GNU Lesser General Public License, @url{https://www.gnu.org/@/licenses/@/lgpl.html}. | |
| @item GPL/Ada | |
| GNU GPL with the exception for Ada. | |
| @item Apache | |
| The Apache Software Foundation license, | |
| @url{https://directory.fsf.org/@/wiki/@/License:Apache2.0}. | |
| @item Artistic | |
| The Artistic license used for Perl, | |
| @url{https://directory.fsf.org/@/wiki/@/License:ArtisticLicense2.0}. | |
| @item Expat | |
| The Expat license, @url{https://directory.fsf.org/@/wiki/@/License:Expat}. | |
| @item MPL | |
| The Mozilla Public License, @url{https://directory.fsf.org/@/wiki/@/License:MPLv2.0}. | |
| @item OBSD | |
| The original (4-clause) BSD license, incompatible with the GNU GPL,@* | |
| @url{https://directory.fsf.org/@/wiki/@/License:BSD_4Clause}. | |
| @item PHP | |
| The license used for PHP, @url{https://directory.fsf.org/@/wiki/@/License:PHPv3.01}. | |
| @item public domain | |
| The non-license that is being in the public domain,@* | |
| @url{https://www.gnu.org/@/licenses/@/license-list.html#PublicDomain}. | |
| @item Python | |
| The license for Python, | |
| @url{https://directory.fsf.org/@/wiki/@/License:Python2.0.1}. | |
| @item RBSD | |
| The revised (3-clause) BSD, compatible with the GNU GPL,@* | |
| @url{https://directory.fsf.org/@/wiki/@/License:BSD_3Clause}. | |
| @item X11 | |
| The simple non-copyleft license used for most versions of the X Window | |
| System, @url{https://directory.fsf.org/@/wiki/@/License:X11}. | |
| @item Zlib | |
| The license for Zlib, @url{https://directory.fsf.org/@/wiki/@/License:Zlib}. | |
| @end table | |
| More information about these licenses and many more are on the GNU | |
| licensing web pages, | |
| @url{https://www.gnu.org/@/licenses/@/license-list.html}. | |
| @node --help | |
| @subsection @option{--help} | |
| @cindex @samp{--help} output | |
| The standard @code{--help} option should output brief documentation | |
| for how to invoke the program, on standard output, then exit | |
| successfully. Other options and arguments should be ignored once this | |
| is seen, and the program should not perform its normal function. | |
| @cindex address for bug reports | |
| @cindex bug reports | |
| Near the end of the @samp{--help} option's output, please place lines | |
| giving the email address for bug reports, the package's home page | |
| (normally @indicateurl{https://www.gnu.org/software/@var{pkg}}), and the | |
| general page for help using GNU programs. The format should be like this: | |
| @example | |
| Report bugs to: @var{mailing-address} | |
| @var{pkg} home page: <https://www.gnu.org/software/@var{pkg}/> | |
| General help using GNU software: <https://www.gnu.org/gethelp/> | |
| @end example | |
| It is ok to mention other appropriate mailing lists and web pages. | |
| @node Dynamic Plug-In Interfaces | |
| @section Standards for Dynamic Plug-in Interfaces | |
| @cindex plug-ins | |
| @cindex dynamic plug-ins | |
| Another aspect of keeping free programs free is encouraging | |
| development of free plug-ins, and discouraging development of | |
| proprietary plug-ins. Many GNU programs will not have anything like | |
| plug-ins at all, but those that do should follow these | |
| practices. | |
| First, the general plug-in architecture design should closely tie the | |
| plug-in to the original code, such that the plug-in and the base | |
| program are parts of one extended program. For GCC, for example, | |
| plug-ins receive and modify GCC's internal data structures, and so | |
| clearly form an extended program with the base GCC. | |
| @vindex plugin_is_GPL_compatible | |
| Second, you should require plug-in developers to affirm that their | |
| plug-ins are released under an appropriate license. This should be | |
| enforced with a simple programmatic check. For GCC, again for | |
| example, a plug-in must define the global symbol | |
| @code{plugin_is_GPL_compatible}, thus asserting that the plug-in is | |
| released under a GPL-compatible license (@pxref{Plugins,, Plugins, | |
| gccint, GCC Internals}). | |
| By adding this check to your program you are not creating a new legal | |
| requirement. The GPL itself requires plug-ins to be free software, | |
| licensed compatibly. As long as you have followed the first rule above | |
| to keep plug-ins closely tied to your original program, the GPL and AGPL | |
| already require those plug-ins to be released under a compatible | |
| license. The symbol definition in the plug-in---or whatever equivalent | |
| works best in your program---makes it harder for anyone who might | |
| distribute proprietary plug-ins to legally defend themselves. If a case | |
| about this got to court, we can point to that symbol as evidence that | |
| the plug-in developer understood that the license had this requirement. | |
| @node Option Table | |
| @section Table of Long Options | |
| @cindex long option names | |
| @cindex table of long options | |
| Here is a table of long options used by GNU programs. It is surely | |
| incomplete, but we aim to list all the options that a new program might | |
| want to be compatible with. If you use names not already in the table, | |
| please send @email{bug-standards@@gnu.org} a list of them, with their | |
| meanings, so we can update the table. | |
| @c Please leave newlines between items in this table; it's much easier | |
| @c to update when it isn't completely squashed together and unreadable. | |
| @c When there is more than one short option for a long option name, put | |
| @c a semicolon between the lists of the programs that use them, not a | |
| @c period. --friedman | |
| @table @samp | |
| @item after-date | |
| @samp{-N} in @code{tar}. | |
| @item all | |
| @samp{-a} in @code{du}, @code{ls}, @code{nm}, @code{stty}, @code{uname}, | |
| and @code{unexpand}. | |
| @item all-text | |
| @samp{-a} in @code{diff}. | |
| @item almost-all | |
| @samp{-A} in @code{ls}. | |
| @item append | |
| @samp{-a} in @code{etags}, @code{tee}, @code{time}; | |
| @samp{-r} in @code{tar}. | |
| @item archive | |
| @samp{-a} in @code{cp}. | |
| @item archive-name | |
| @samp{-n} in @code{shar}. | |
| @item arglength | |
| @samp{-l} in @code{m4}. | |
| @item ascii | |
| @samp{-a} in @code{diff}. | |
| @item assign | |
| @samp{-v} in @code{gawk}. | |
| @item assume-new | |
| @samp{-W} in @code{make}. | |
| @item assume-old | |
| @samp{-o} in @code{make}. | |
| @item auto-check | |
| @samp{-a} in @code{recode}. | |
| @item auto-pager | |
| @samp{-a} in @code{wdiff}. | |
| @item auto-reference | |
| @samp{-A} in @code{ptx}. | |
| @item avoid-wraps | |
| @samp{-n} in @code{wdiff}. | |
| @item background | |
| For server programs, run in the background. | |
| @item backward-search | |
| @samp{-B} in @code{ctags}. | |
| @item basename | |
| @samp{-f} in @code{shar}. | |
| @item batch | |
| Used in GDB. | |
| @item baud | |
| Used in GDB. | |
| @item before | |
| @samp{-b} in @code{tac}. | |
| @item binary | |
| @samp{-b} in @code{cpio} and @code{diff}. | |
| @item bits-per-code | |
| @samp{-b} in @code{shar}. | |
| @item block-size | |
| Used in @code{cpio} and @code{tar}. | |
| @item blocks | |
| @samp{-b} in @code{head} and @code{tail}. | |
| @item break-file | |
| @samp{-b} in @code{ptx}. | |
| @item brief | |
| Used in various programs to make output shorter. | |
| @item bytes | |
| @samp{-c} in @code{head}, @code{split}, and @code{tail}. | |
| @item c@t{++} | |
| @samp{-C} in @code{etags}. | |
| @item catenate | |
| @samp{-A} in @code{tar}. | |
| @item cd | |
| Used in various programs to specify the directory to use. | |
| @item changes | |
| @samp{-c} in @code{chgrp} and @code{chown}. | |
| @item classify | |
| @samp{-F} in @code{ls}. | |
| @item colons | |
| @samp{-c} in @code{recode}. | |
| @item command | |
| @samp{-c} in @code{su}; | |
| @samp{-x} in GDB. | |
| @item compare | |
| @samp{-d} in @code{tar}. | |
| @item compat | |
| Used in @code{gawk}. | |
| @item compress | |
| @samp{-Z} in @code{tar} and @code{shar}. | |
| @item concatenate | |
| @samp{-A} in @code{tar}. | |
| @item confirmation | |
| @samp{-w} in @code{tar}. | |
| @item context | |
| Used in @code{diff}. | |
| @item copyleft | |
| @samp{-W copyleft} in @code{gawk}. | |
| @item copyright | |
| @samp{-C} in @code{ptx}, @code{recode}, and @code{wdiff}; | |
| @samp{-W copyright} in @code{gawk}. | |
| @item core | |
| Used in GDB. | |
| @item count | |
| @samp{-q} in @code{who}. | |
| @item count-links | |
| @samp{-l} in @code{du}. | |
| @item create | |
| Used in @code{tar} and @code{cpio}. | |
| @item cut-mark | |
| @samp{-c} in @code{shar}. | |
| @item cxref | |
| @samp{-x} in @code{ctags}. | |
| @item date | |
| @samp{-d} in @code{touch}. | |
| @item debug | |
| @samp{-d} in @code{make} and @code{m4}; | |
| @samp{-t} in Bison. | |
| @item define | |
| @samp{-D} in @code{m4}. | |
| @item defines | |
| @samp{-d} in Bison and @code{ctags}. | |
| @item delete | |
| @samp{-D} in @code{tar}. | |
| @item dereference | |
| @samp{-L} in @code{chgrp}, @code{chown}, @code{cpio}, @code{du}, | |
| @code{ls}, and @code{tar}. | |
| @item dereference-args | |
| @samp{-D} in @code{du}. | |
| @item device | |
| Specify an I/O device (special file name). | |
| @item diacritics | |
| @samp{-d} in @code{recode}. | |
| @item dictionary-order | |
| @samp{-d} in @code{look}. | |
| @item diff | |
| @samp{-d} in @code{tar}. | |
| @item digits | |
| @samp{-n} in @code{csplit}. | |
| @item directory | |
| Specify the directory to use, in various programs. In @code{ls}, it | |
| means to show directories themselves rather than their contents. In | |
| @code{rm} and @code{ln}, it means to not treat links to directories | |
| specially. | |
| @item discard-all | |
| @samp{-x} in @code{strip}. | |
| @item discard-locals | |
| @samp{-X} in @code{strip}. | |
| @item dry-run | |
| @samp{-n} in @code{make}. | |
| @item ed | |
| @samp{-e} in @code{diff}. | |
| @item elide-empty-files | |
| @samp{-z} in @code{csplit}. | |
| @item end-delete | |
| @samp{-x} in @code{wdiff}. | |
| @item end-insert | |
| @samp{-z} in @code{wdiff}. | |
| @item entire-new-file | |
| @samp{-N} in @code{diff}. | |
| @item environment-overrides | |
| @samp{-e} in @code{make}. | |
| @item eof | |
| @samp{-e} in @code{xargs}. | |
| @item epoch | |
| Used in GDB. | |
| @item error-limit | |
| Used in @code{makeinfo}. | |
| @item error-output | |
| @samp{-o} in @code{m4}. | |
| @item escape | |
| @samp{-b} in @code{ls}. | |
| @item exclude-from | |
| @samp{-X} in @code{tar}. | |
| @item exec | |
| Used in GDB. | |
| @item exit | |
| @samp{-x} in @code{xargs}. | |
| @item exit-0 | |
| @samp{-e} in @code{unshar}. | |
| @item expand-tabs | |
| @samp{-t} in @code{diff}. | |
| @item expression | |
| @samp{-e} in @code{sed}. | |
| @item extern-only | |
| @samp{-g} in @code{nm}. | |
| @item extract | |
| @samp{-i} in @code{cpio}; | |
| @samp{-x} in @code{tar}. | |
| @item faces | |
| @samp{-f} in @code{finger}. | |
| @item fast | |
| @samp{-f} in @code{su}. | |
| @item fatal-warnings | |
| @samp{-E} in @code{m4}. | |
| @item file | |
| @samp{-f} in @code{gawk}, @code{info}, @code{make}, @code{mt}, | |
| @code{sed}, and @code{tar}. | |
| @item field-separator | |
| @samp{-F} in @code{gawk}. | |
| @item file-prefix | |
| @samp{-b} in Bison. | |
| @item file-type | |
| @samp{-F} in @code{ls}. | |
| @item files-from | |
| @samp{-T} in @code{tar}. | |
| @item fill-column | |
| Used in @code{makeinfo}. | |
| @item flag-truncation | |
| @samp{-F} in @code{ptx}. | |
| @item fixed-output-files | |
| @samp{-y} in Bison. | |
| @item follow | |
| @samp{-f} in @code{tail}. | |
| @item footnote-style | |
| Used in @code{makeinfo}. | |
| @item force | |
| @samp{-f} in @code{cp}, @code{ln}, @code{mv}, and @code{rm}. | |
| @item force-prefix | |
| @samp{-F} in @code{shar}. | |
| @item foreground | |
| For server programs, run in the foreground; | |
| in other words, don't do anything special to run the server | |
| in the background. | |
| @item format | |
| Used in @code{ls}, @code{time}, and @code{ptx}. | |
| @item freeze-state | |
| @samp{-F} in @code{m4}. | |
| @item fullname | |
| Used in GDB. | |
| @item gap-size | |
| @samp{-g} in @code{ptx}. | |
| @item get | |
| @samp{-x} in @code{tar}. | |
| @item graphic | |
| @samp{-i} in @code{ul}. | |
| @item graphics | |
| @samp{-g} in @code{recode}. | |
| @item group | |
| @samp{-g} in @code{install}. | |
| @item gzip | |
| @samp{-z} in @code{tar} and @code{shar}. | |
| @item hashsize | |
| @samp{-H} in @code{m4}. | |
| @item header | |
| @samp{-h} in @code{objdump} and @code{recode} | |
| @item heading | |
| @samp{-H} in @code{who}. | |
| @item help | |
| Used to ask for brief usage information. | |
| @item here-delimiter | |
| @samp{-d} in @code{shar}. | |
| @item hide-control-chars | |
| @samp{-q} in @code{ls}. | |
| @item html | |
| In @code{makeinfo}, output HTML. | |
| @item idle | |
| @samp{-u} in @code{who}. | |
| @item ifdef | |
| @samp{-D} in @code{diff}. | |
| @item ignore | |
| @samp{-I} in @code{ls}; | |
| @samp{-x} in @code{recode}. | |
| @item ignore-all-space | |
| @samp{-w} in @code{diff}. | |
| @item ignore-backups | |
| @samp{-B} in @code{ls}. | |
| @item ignore-blank-lines | |
| @samp{-B} in @code{diff}. | |
| @item ignore-case | |
| @samp{-f} in @code{look} and @code{ptx}; | |
| @samp{-i} in @code{diff} and @code{wdiff}. | |
| @item ignore-errors | |
| @samp{-i} in @code{make}. | |
| @item ignore-file | |
| @samp{-i} in @code{ptx}. | |
| @item ignore-indentation | |
| @samp{-I} in @code{etags}. | |
| @item ignore-init-file | |
| @samp{-f} in Oleo. | |
| @item ignore-interrupts | |
| @samp{-i} in @code{tee}. | |
| @item ignore-matching-lines | |
| @samp{-I} in @code{diff}. | |
| @item ignore-space-change | |
| @samp{-b} in @code{diff}. | |
| @item ignore-zeros | |
| @samp{-i} in @code{tar}. | |
| @item include | |
| @samp{-i} in @code{etags}; | |
| @samp{-I} in @code{m4}. | |
| @item include-dir | |
| @samp{-I} in @code{make}. | |
| @item incremental | |
| @samp{-G} in @code{tar}. | |
| @item info | |
| @samp{-i}, @samp{-l}, and @samp{-m} in Finger. | |
| @item init-file | |
| In some programs, specify the name of the file to read as the user's | |
| init file. | |
| @item initial | |
| @samp{-i} in @code{expand}. | |
| @item initial-tab | |
| @samp{-T} in @code{diff}. | |
| @item inode | |
| @samp{-i} in @code{ls}. | |
| @item interactive | |
| @samp{-i} in @code{cp}, @code{ln}, @code{mv}, @code{rm}; | |
| @samp{-e} in @code{m4}; | |
| @samp{-p} in @code{xargs}; | |
| @samp{-w} in @code{tar}. | |
| @item intermix-type | |
| @samp{-p} in @code{shar}. | |
| @item iso-8601 | |
| Used in @code{date} | |
| @item jobs | |
| @samp{-j} in @code{make}. | |
| @item just-print | |
| @samp{-n} in @code{make}. | |
| @item keep-going | |
| @samp{-k} in @code{make}. | |
| @item keep-files | |
| @samp{-k} in @code{csplit}. | |
| @item kilobytes | |
| @samp{-k} in @code{du} and @code{ls}. | |
| @item language | |
| @samp{-l} in @code{etags}. | |
| @item less-mode | |
| @samp{-l} in @code{wdiff}. | |
| @item level-for-gzip | |
| @samp{-g} in @code{shar}. | |
| @item line-bytes | |
| @samp{-C} in @code{split}. | |
| @item lines | |
| Used in @code{split}, @code{head}, and @code{tail}. | |
| @item link | |
| @samp{-l} in @code{cpio}. | |
| @item lint | |
| @itemx lint-old | |
| Used in @code{gawk}. | |
| @item list | |
| @samp{-t} in @code{cpio}; | |
| @samp{-l} in @code{recode}. | |
| @item list | |
| @samp{-t} in @code{tar}. | |
| @item literal | |
| @samp{-N} in @code{ls}. | |
| @item load-average | |
| @samp{-l} in @code{make}. | |
| @item login | |
| Used in @code{su}. | |
| @item machine | |
| Used in @code{uname}. | |
| @item macro-name | |
| @samp{-M} in @code{ptx}. | |
| @item mail | |
| @samp{-m} in @code{hello} and @code{uname}. | |
| @item make-directories | |
| @samp{-d} in @code{cpio}. | |
| @item makefile | |
| @samp{-f} in @code{make}. | |
| @item mapped | |
| Used in GDB. | |
| @item max-args | |
| @samp{-n} in @code{xargs}. | |
| @item max-chars | |
| @samp{-n} in @code{xargs}. | |
| @item max-lines | |
| @samp{-l} in @code{xargs}. | |
| @item max-load | |
| @samp{-l} in @code{make}. | |
| @item max-procs | |
| @samp{-P} in @code{xargs}. | |
| @item mesg | |
| @samp{-T} in @code{who}. | |
| @item message | |
| @samp{-T} in @code{who}. | |
| @item minimal | |
| @samp{-d} in @code{diff}. | |
| @item mixed-uuencode | |
| @samp{-M} in @code{shar}. | |
| @item mode | |
| @samp{-m} in @code{install}, @code{mkdir}, and @code{mkfifo}. | |
| @item modification-time | |
| @samp{-m} in @code{tar}. | |
| @item multi-volume | |
| @samp{-M} in @code{tar}. | |
| @item name-prefix | |
| @samp{-a} in Bison. | |
| @item nesting-limit | |
| @samp{-L} in @code{m4}. | |
| @item net-headers | |
| @samp{-a} in @code{shar}. | |
| @item new-file | |
| @samp{-W} in @code{make}. | |
| @item no-builtin-rules | |
| @samp{-r} in @code{make}. | |
| @item no-character-count | |
| @samp{-w} in @code{shar}. | |
| @item no-check-existing | |
| @samp{-x} in @code{shar}. | |
| @item no-common | |
| @samp{-3} in @code{wdiff}. | |
| @item no-create | |
| @samp{-c} in @code{touch}. | |
| @item no-defines | |
| @samp{-D} in @code{etags}. | |
| @item no-deleted | |
| @samp{-1} in @code{wdiff}. | |
| @item no-dereference | |
| @samp{-d} in @code{cp}. | |
| @item no-inserted | |
| @samp{-2} in @code{wdiff}. | |
| @item no-keep-going | |
| @samp{-S} in @code{make}. | |
| @item no-lines | |
| @samp{-l} in Bison. | |
| @item no-piping | |
| @samp{-P} in @code{shar}. | |
| @item no-prof | |
| @samp{-e} in @code{gprof}. | |
| @item no-regex | |
| @samp{-R} in @code{etags}. | |
| @item no-sort | |
| @samp{-p} in @code{nm}. | |
| @item no-splash | |
| Don't print a startup splash screen. | |
| @item no-split | |
| Used in @code{makeinfo}. | |
| @item no-static | |
| @samp{-a} in @code{gprof}. | |
| @item no-time | |
| @samp{-E} in @code{gprof}. | |
| @item no-timestamp | |
| @samp{-m} in @code{shar}. | |
| @item no-validate | |
| Used in @code{makeinfo}. | |
| @item no-wait | |
| Used in @code{emacsclient}. | |
| @item no-warn | |
| Used in various programs to inhibit warnings. | |
| @item node | |
| @samp{-n} in @code{info}. | |
| @item nodename | |
| @samp{-n} in @code{uname}. | |
| @item nonmatching | |
| @samp{-f} in @code{cpio}. | |
| @item nstuff | |
| @samp{-n} in @code{objdump}. | |
| @item null | |
| @samp{-0} in @code{xargs}. | |
| @item number | |
| @samp{-n} in @code{cat}. | |
| @item number-nonblank | |
| @samp{-b} in @code{cat}. | |
| @item numeric-sort | |
| @samp{-n} in @code{nm}. | |
| @item numeric-uid-gid | |
| @samp{-n} in @code{cpio} and @code{ls}. | |
| @item nx | |
| Used in GDB. | |
| @item old-file | |
| @samp{-o} in @code{make}. | |
| @item one-file-system | |
| @samp{-x} in @code{cp} and @code{du}. | |
| @item only-file | |
| @samp{-o} in @code{ptx}. | |
| @item only-prof | |
| @samp{-f} in @code{gprof}. | |
| @item only-time | |
| @samp{-F} in @code{gprof}. | |
| @item options | |
| @samp{-o} in @code{getopt}, @code{fdlist}, @code{fdmount}, | |
| @code{fdmountd}, and @code{fdumount}. | |
| @item output | |
| In various programs, specify the output file name. | |
| @item output-prefix | |
| @samp{-o} in @code{shar}. | |
| @item override | |
| @samp{-o} in @code{rm}. | |
| @item overwrite | |
| @samp{-c} in @code{unshar}. | |
| @item owner | |
| @samp{-o} in @code{install}. | |
| @item paginate | |
| @samp{-l} in @code{diff}. | |
| @item paragraph-indent | |
| Used in @code{makeinfo}. | |
| @item parents | |
| @samp{-p} in @code{mkdir} and @code{rmdir}. | |
| @item pass-all | |
| @samp{-p} in @code{ul}. | |
| @item pass-through | |
| @samp{-p} in @code{cpio}. | |
| @item port | |
| @samp{-P} in @code{finger}. | |
| @item portability | |
| @samp{-c} in @code{cpio}. | |
| @item posix | |
| Used in @code{gawk}. | |
| @item prefix-builtins | |
| @samp{-P} in @code{m4}. | |
| @item prefix | |
| @samp{-f} in @code{csplit}. | |
| @item preserve | |
| Used in @code{tar} and @code{cp}. | |
| @item preserve-environment | |
| @samp{-p} in @code{su}. | |
| @item preserve-modification-time | |
| @samp{-m} in @code{cpio}. | |
| @item preserve-order | |
| @samp{-s} in @code{tar}. | |
| @item preserve-permissions | |
| @samp{-p} in @code{tar}. | |
| @item print | |
| @samp{-l} in @code{diff}. | |
| @item print-chars | |
| @samp{-L} in @code{cmp}. | |
| @item print-data-base | |
| @samp{-p} in @code{make}. | |
| @item print-directory | |
| @samp{-w} in @code{make}. | |
| @item print-file-name | |
| @samp{-o} in @code{nm}. | |
| @item print-symdefs | |
| @samp{-s} in @code{nm}. | |
| @item printer | |
| @samp{-p} in @code{wdiff}. | |
| @item prompt | |
| @samp{-p} in @code{ed}. | |
| @item proxy | |
| Specify an HTTP proxy. | |
| @item query-user | |
| @samp{-X} in @code{shar}. | |
| @item question | |
| @samp{-q} in @code{make}. | |
| @item quiet | |
| Used in many programs to inhibit the usual output. Every | |
| program accepting @samp{--quiet} should accept @samp{--silent} as a | |
| synonym. | |
| @item quiet-unshar | |
| @samp{-Q} in @code{shar} | |
| @item quote-name | |
| @samp{-Q} in @code{ls}. | |
| @item rcs | |
| @samp{-n} in @code{diff}. | |
| @item re-interval | |
| Used in @code{gawk}. | |
| @item read-full-blocks | |
| @samp{-B} in @code{tar}. | |
| @item readnow | |
| Used in GDB. | |
| @item recon | |
| @samp{-n} in @code{make}. | |
| @item record-number | |
| @samp{-R} in @code{tar}. | |
| @item recursive | |
| Used in @code{chgrp}, @code{chown}, @code{cp}, @code{ls}, @code{diff}, | |
| and @code{rm}. | |
| @item reference | |
| @samp{-r} in @code{touch}. | |
| @item references | |
| @samp{-r} in @code{ptx}. | |
| @item regex | |
| @samp{-r} in @code{tac} and @code{etags}. | |
| @item release | |
| @samp{-r} in @code{uname}. | |
| @item reload-state | |
| @samp{-R} in @code{m4}. | |
| @item relocation | |
| @samp{-r} in @code{objdump}. | |
| @item rename | |
| @samp{-r} in @code{cpio}. | |
| @item replace | |
| @samp{-i} in @code{xargs}. | |
| @item report-identical-files | |
| @samp{-s} in @code{diff}. | |
| @item reset-access-time | |
| @samp{-a} in @code{cpio}. | |
| @item reverse | |
| @samp{-r} in @code{ls} and @code{nm}. | |
| @item reversed-ed | |
| @samp{-f} in @code{diff}. | |
| @item right-side-defs | |
| @samp{-R} in @code{ptx}. | |
| @item same-order | |
| @samp{-s} in @code{tar}. | |
| @item same-permissions | |
| @samp{-p} in @code{tar}. | |
| @item save | |
| @samp{-g} in @code{stty}. | |
| @item se | |
| Used in GDB. | |
| @item sentence-regexp | |
| @samp{-S} in @code{ptx}. | |
| @item separate-dirs | |
| @samp{-S} in @code{du}. | |
| @item separator | |
| @samp{-s} in @code{tac}. | |
| @item sequence | |
| Used by @code{recode} to choose files or pipes for sequencing passes. | |
| @item shell | |
| @samp{-s} in @code{su}. | |
| @item show-all | |
| @samp{-A} in @code{cat}. | |
| @item show-c-function | |
| @samp{-p} in @code{diff}. | |
| @item show-ends | |
| @samp{-E} in @code{cat}. | |
| @item show-function-line | |
| @samp{-F} in @code{diff}. | |
| @item show-tabs | |
| @samp{-T} in @code{cat}. | |
| @item silent | |
| Used in many programs to inhibit the usual output. | |
| Every program accepting | |
| @samp{--silent} should accept @samp{--quiet} as a synonym. | |
| @item size | |
| @samp{-s} in @code{ls}. | |
| @item socket | |
| Specify a file descriptor for a network server to use for its socket, | |
| instead of opening and binding a new socket. This provides a way to | |
| run, in a non-privileged process, a server that normally needs a | |
| reserved port number. | |
| @item sort | |
| Used in @code{ls}. | |
| @item source | |
| @samp{-W source} in @code{gawk}. | |
| @item sparse | |
| @samp{-S} in @code{tar}. | |
| @item speed-large-files | |
| @samp{-H} in @code{diff}. | |
| @item split-at | |
| @samp{-E} in @code{unshar}. | |
| @item split-size-limit | |
| @samp{-L} in @code{shar}. | |
| @item squeeze-blank | |
| @samp{-s} in @code{cat}. | |
| @item start-delete | |
| @samp{-w} in @code{wdiff}. | |
| @item start-insert | |
| @samp{-y} in @code{wdiff}. | |
| @item starting-file | |
| Used in @code{tar} and @code{diff} to specify which file within | |
| a directory to start processing with. | |
| @item statistics | |
| @samp{-s} in @code{wdiff}. | |
| @item stdin-file-list | |
| @samp{-S} in @code{shar}. | |
| @item stop | |
| @samp{-S} in @code{make}. | |
| @item strict | |
| @samp{-s} in @code{recode}. | |
| @item strip | |
| @samp{-s} in @code{install}. | |
| @item strip-all | |
| @samp{-s} in @code{strip}. | |
| @item strip-debug | |
| @samp{-S} in @code{strip}. | |
| @item submitter | |
| @samp{-s} in @code{shar}. | |
| @item suffix | |
| @samp{-S} in @code{cp}, @code{ln}, @code{mv}. | |
| @item suffix-format | |
| @samp{-b} in @code{csplit}. | |
| @item sum | |
| @samp{-s} in @code{gprof}. | |
| @item summarize | |
| @samp{-s} in @code{du}. | |
| @item symbolic | |
| @samp{-s} in @code{ln}. | |
| @item symbols | |
| Used in GDB and @code{objdump}. | |
| @item synclines | |
| @samp{-s} in @code{m4}. | |
| @item sysname | |
| @samp{-s} in @code{uname}. | |
| @item tabs | |
| @samp{-t} in @code{expand} and @code{unexpand}. | |
| @item tabsize | |
| @samp{-T} in @code{ls}. | |
| @item terminal | |
| @samp{-T} in @code{tput} and @code{ul}. | |
| @samp{-t} in @code{wdiff}. | |
| @item text | |
| @samp{-a} in @code{diff}. | |
| @item text-files | |
| @samp{-T} in @code{shar}. | |
| @item time | |
| Used in @code{ls} and @code{touch}. | |
| @item timeout | |
| Specify how long to wait before giving up on some operation. | |
| @item to-stdout | |
| @samp{-O} in @code{tar}. | |
| @item total | |
| @samp{-c} in @code{du}. | |
| @item touch | |
| @samp{-t} in @code{make}, @code{ranlib}, and @code{recode}. | |
| @item trace | |
| @samp{-t} in @code{m4}. | |
| @item traditional | |
| @samp{-t} in @code{hello}; | |
| @samp{-W traditional} in @code{gawk}; | |
| @samp{-G} in @code{ed}, @code{m4}, and @code{ptx}. | |
| @item tty | |
| Used in GDB. | |
| @item typedefs | |
| @samp{-t} in @code{ctags}. | |
| @item typedefs-and-c++ | |
| @samp{-T} in @code{ctags}. | |
| @item typeset-mode | |
| @samp{-t} in @code{ptx}. | |
| @item uncompress | |
| @samp{-z} in @code{tar}. | |
| @item unconditional | |
| @samp{-u} in @code{cpio}. | |
| @item undefine | |
| @samp{-U} in @code{m4}. | |
| @item undefined-only | |
| @samp{-u} in @code{nm}. | |
| @item update | |
| @samp{-u} in @code{cp}, @code{ctags}, @code{mv}, @code{tar}. | |
| @item usage | |
| Used in @code{gawk}; same as @samp{--help}. | |
| @item uuencode | |
| @samp{-B} in @code{shar}. | |
| @item vanilla-operation | |
| @samp{-V} in @code{shar}. | |
| @item verbose | |
| Print more information about progress. Many programs support this. | |
| @item verify | |
| @samp{-W} in @code{tar}. | |
| @item version | |
| Print the version number. | |
| @item version-control | |
| @samp{-V} in @code{cp}, @code{ln}, @code{mv}. | |
| @item vgrind | |
| @samp{-v} in @code{ctags}. | |
| @item volume | |
| @samp{-V} in @code{tar}. | |
| @item what-if | |
| @samp{-W} in @code{make}. | |
| @item whole-size-limit | |
| @samp{-l} in @code{shar}. | |
| @item width | |
| @samp{-w} in @code{ls} and @code{ptx}. | |
| @item word-regexp | |
| @samp{-W} in @code{ptx}. | |
| @item writable | |
| @samp{-T} in @code{who}. | |
| @item zeros | |
| @samp{-z} in @code{gprof}. | |
| @end table | |
| @node OID Allocations | |
| @section OID Allocations | |
| @cindex OID allocations for GNU | |
| @cindex SNMP | |
| @cindex LDAP | |
| @cindex X.509 | |
| The OID (object identifier) 1.3.6.1.4.1.11591 has been assigned to the | |
| GNU Project (thanks to Sergey Poznyakoff). These are used for SNMP, | |
| LDAP, X.509 certificates, and so on. The web site | |
| @url{https://www.alvestrand.no/objectid} has a (voluntary) listing of | |
| many OID assignments. | |
| If you need a new slot for your GNU package, write | |
| @email{maintainers@@gnu.org}. Here is a list of arcs currently | |
| assigned: | |
| @example | |
| @include gnu-oids.texi | |
| @end example | |
| @node Memory Usage | |
| @section Memory Usage | |
| @cindex memory usage | |
| If a program typically uses just a few meg of memory, don't bother making any | |
| effort to reduce memory usage. For example, if it is impractical for | |
| other reasons to operate on files more than a few meg long, it is | |
| reasonable to read entire input files into memory to operate on them. | |
| However, for programs such as @code{cat} or @code{tail}, that can | |
| usefully operate on very large files, it is important to avoid using a | |
| technique that would artificially limit the size of files it can handle. | |
| If a program works by lines and could be applied to arbitrary | |
| user-supplied input files, it should keep only a line in memory, because | |
| this is not very hard and users will want to be able to operate on input | |
| files that are bigger than will fit in memory all at once. | |
| If your program creates complicated data structures, just make them in | |
| memory and give a fatal error if @code{malloc} returns @code{NULL}. | |
| @pindex valgrind | |
| @cindex memory leak | |
| Memory analysis tools such as @command{valgrind} can be useful, but | |
| don't complicate a program merely to avoid their false alarms. For | |
| example, if memory is used until just before a process exits, don't | |
| free it simply to silence such a tool. | |
| @node File Usage | |
| @section File Usage | |
| @cindex file usage | |
| Programs should be prepared to operate when @file{/usr} and @file{/etc} | |
| are read-only file systems. Thus, if the program manages log files, | |
| lock files, backup files, score files, or any other files which are | |
| modified for internal purposes, these files should not be stored in | |
| @file{/usr} or @file{/etc}. | |
| There are two exceptions. @file{/etc} is used to store system | |
| configuration information; it is reasonable for a program to modify | |
| files in @file{/etc} when its job is to update the system configuration. | |
| Also, if the user explicitly asks to modify one file in a directory, it | |
| is reasonable for the program to store other files in the same | |
| directory. | |
| @node Writing C | |
| @chapter Making The Best Use of C | |
| This chapter provides advice on how best to use the C language | |
| when writing GNU software. | |
| @menu | |
| * Formatting:: Formatting your source code. | |
| * Comments:: Commenting your work. | |
| * Syntactic Conventions:: Clean use of C constructs. | |
| * Names:: Naming variables, functions, and files. | |
| * System Portability:: Portability among different operating systems. | |
| * CPU Portability:: Supporting the range of CPU types. | |
| * System Functions:: Portability and ``standard'' library functions. | |
| * Internationalization:: Techniques for internationalization. | |
| * Character Set:: Use ASCII by default. | |
| * Quote Characters:: Use "..." or '...' in the C locale. | |
| * Mmap:: How you can safely use @code{mmap}. | |
| @end menu | |
| @node Formatting | |
| @section Formatting Your Source Code | |
| @cindex formatting source code | |
| @cindex line length | |
| @cindex length of source lines | |
| Please keep the length of source lines to 79 characters or less, for | |
| maximum readability in the widest range of environments. | |
| @cindex open brace | |
| @cindex braces, in C source | |
| @cindex function definitions, formatting | |
| It is important to put the open-brace that starts the body of a C | |
| function in column one, so that they will start a defun. Several | |
| tools look for open-braces in column one to find the beginnings of C | |
| functions. These tools will not work on code not formatted that way. | |
| Avoid putting open-brace, open-parenthesis or open-bracket in column | |
| one when they are inside a function, so that they won't start a defun. | |
| The open-brace that starts a @code{struct} body can go in column one | |
| if you find it useful to treat that definition as a defun. | |
| It is also important for function definitions to start the name of the | |
| function in column one. This helps people to search for function | |
| definitions, and may also help certain tools recognize them. Thus, | |
| using Standard C syntax, the format is this: | |
| @example | |
| static char * | |
| concat (char *s1, char *s2) | |
| @{ | |
| @dots{} | |
| @} | |
| @end example | |
| If the arguments don't fit nicely on one line, | |
| split it like this: | |
| @example | |
| int | |
| lots_of_args (int an_integer, long a_long, short a_short, | |
| double a_double, float a_float) | |
| @dots{} | |
| @end example | |
| @cindex @code{struct} types, formatting | |
| @cindex @code{enum} types, formatting | |
| For @code{struct} and @code{enum} types, likewise put the braces in | |
| column one, unless the whole contents fits on one line: | |
| @example | |
| struct foo | |
| @{ | |
| int a, b; | |
| @} | |
| @exdent @r{or} | |
| struct foo @{ int a, b; @} | |
| @end example | |
| The rest of this section gives our recommendations for other aspects of | |
| C formatting style, which is also the default style of the @code{indent} | |
| program in version 1.2 and newer. It corresponds to the options | |
| @smallexample | |
| -nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2 | |
| -ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -psl -nsc -nsob | |
| @end smallexample | |
| We don't think of these recommendations as requirements, because it | |
| causes no problems for users if two different programs have different | |
| formatting styles. | |
| But whatever style you use, please use it consistently, since a mixture | |
| of styles within one program tends to look ugly. If you are | |
| contributing changes to an existing program, please follow the style of | |
| that program. | |
| For the body of the function, our recommended style looks like this: | |
| @example | |
| if (x < foo (y, z)) | |
| haha = bar[4] + 5; | |
| else | |
| @{ | |
| while (z) | |
| @{ | |
| haha += foo (z, z); | |
| z--; | |
| @} | |
| return ++x + bar (); | |
| @} | |
| @end example | |
| @cindex spaces before open-paren | |
| We find it easier to read a program when it has spaces before the | |
| open-parentheses and after the commas. Especially after the commas. | |
| When you split an expression into multiple lines, split it | |
| before an operator, not after one. Here is the right way: | |
| @cindex expressions, splitting | |
| @example | |
| if (foo_this_is_long && bar > win (x, y, z) | |
| && remaining_condition) | |
| @end example | |
| Try to avoid having two operators of different precedence at the same | |
| level of indentation. For example, don't write this: | |
| @example | |
| mode = (inmode[j] == VOIDmode | |
| || GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j]) | |
| ? outmode[j] : inmode[j]); | |
| @end example | |
| Instead, use extra parentheses so that the indentation shows the nesting: | |
| @example | |
| mode = ((inmode[j] == VOIDmode | |
| || (GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j]))) | |
| ? outmode[j] : inmode[j]); | |
| @end example | |
| Insert extra parentheses so that Emacs will indent the code properly. | |
| For example, the following indentation looks nice if you do it by hand, | |
| @example | |
| v = rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000 | |
| + rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000; | |
| @end example | |
| @noindent | |
| but Emacs would alter it. Adding a set of parentheses produces | |
| something that looks equally nice, and which Emacs will preserve: | |
| @example | |
| v = (rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000 | |
| + rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000); | |
| @end example | |
| Format do-while statements like this: | |
| @example | |
| do | |
| @{ | |
| a = foo (a); | |
| @} | |
| while (a > 0); | |
| @end example | |
| @cindex formfeed | |
| @cindex control-L | |
| Please use formfeed characters (control-L) to divide the program into | |
| pages at logical places (but not within a function). It does not matter | |
| just how long the pages are, since they do not have to fit on a printed | |
| page. The formfeeds should appear alone on lines by themselves. | |
| @node Comments | |
| @section Commenting Your Work | |
| @cindex commenting | |
| Every program should start with a comment saying briefly what it is for. | |
| Example: @samp{fmt - filter for simple filling of text}. This comment | |
| should be at the top of the source file containing the @samp{main} | |
| function of the program. | |
| Also, please write a brief comment at the start of each source file, | |
| with the file name and a line or two about the overall purpose of the | |
| file. | |
| Please write the comments in a GNU program in English, because English | |
| is the one language that nearly all programmers in all countries can | |
| read. If you do not write English well, please write comments in | |
| English as well as you can, then ask other people to help rewrite them. | |
| If you can't write comments in English, please find someone to work with | |
| you and translate your comments into English. | |
| Please put a comment on each function saying what the function does, | |
| what sorts of arguments it gets, and what the possible values of | |
| arguments mean and are used for. It is not necessary to duplicate in | |
| words the meaning of the C argument declarations, if a C type is being | |
| used in its customary fashion. If there is anything nonstandard about | |
| its use (such as an argument of type @code{char *} which is really the | |
| address of the second character of a string, not the first), or any | |
| possible values that would not work the way one would expect (such as, | |
| that strings containing newlines are not guaranteed to work), be sure | |
| to say so. | |
| Also explain the significance of the return value, if there is one. | |
| Please put two spaces after the end of a sentence in your comments, so | |
| that the Emacs sentence commands will work. Also, please write | |
| complete sentences and capitalize the first word. If a lower-case | |
| identifier comes at the beginning of a sentence, don't capitalize it! | |
| Changing the spelling makes it a different identifier. If you don't | |
| like starting a sentence with a lower case letter, write the sentence | |
| differently (e.g., ``The identifier lower-case is @dots{}''). | |
| The comment on a function is much clearer if you use the argument | |
| names to speak about the argument values. The variable name itself | |
| should be lower case, but write it in upper case when you are speaking | |
| about the value rather than the variable itself. Thus, ``the inode | |
| number NODE_NUM'' rather than ``an inode''. | |
| There is usually no purpose in restating the name of the function in | |
| the comment before it, because readers can see that for themselves. | |
| There might be an exception when the comment is so long that the function | |
| itself would be off the bottom of the screen. | |
| There should be a comment on each static variable as well, like this: | |
| @example | |
| /* Nonzero means truncate lines in the display; | |
| zero means continue them. */ | |
| int truncate_lines; | |
| @end example | |
| @cindex conditionals, comments for | |
| @cindex @code{#endif}, commenting | |
| Every @samp{#endif} should have a comment, except in the case of short | |
| conditionals (just a few lines) that are not nested. The comment should | |
| state the condition of the conditional that is ending, @emph{including | |
| its sense}. @samp{#else} should have a comment describing the condition | |
| @emph{and sense} of the code that follows. For example: | |
| @example | |
| @group | |
| #ifdef foo | |
| @dots{} | |
| #else /* not foo */ | |
| @dots{} | |
| #endif /* not foo */ | |
| @end group | |
| @group | |
| #ifdef foo | |
| @dots{} | |
| #endif /* foo */ | |
| @end group | |
| @end example | |
| @noindent | |
| but, by contrast, write the comments this way for a @samp{#ifndef}: | |
| @example | |
| @group | |
| #ifndef foo | |
| @dots{} | |
| #else /* foo */ | |
| @dots{} | |
| #endif /* foo */ | |
| @end group | |
| @group | |
| #ifndef foo | |
| @dots{} | |
| #endif /* not foo */ | |
| @end group | |
| @end example | |
| @node Syntactic Conventions | |
| @section Clean Use of C Constructs | |
| @cindex syntactic conventions | |
| @cindex implicit @code{int} | |
| @cindex function argument, declaring | |
| Please explicitly declare the types of all objects. For example, you | |
| should explicitly declare all arguments to functions, and you should | |
| declare functions to return @code{int} rather than omitting the | |
| @code{int}. | |
| @cindex compiler warnings | |
| @cindex @samp{-Wall} compiler option | |
| Some programmers like to use the GCC @samp{-Wall} option, and change the | |
| code whenever it issues a warning. If you want to do this, then do. | |
| Other programmers prefer not to use @samp{-Wall}, because it gives | |
| warnings for valid and legitimate code which they do not want to change. | |
| If you want to do this, then do. The compiler should be your servant, | |
| not your master. | |
| @pindex clang | |
| @pindex lint | |
| Don't make the program ugly just to placate static analysis tools such | |
| as @command{lint}, @command{clang}, and GCC with extra warnings | |
| options such as @option{-Wconversion} and @option{-Wundef}. These | |
| tools can help find bugs and unclear code, but they can also generate | |
| so many false alarms that it hurts readability to silence them with | |
| unnecessary casts, wrappers, and other complications. For example, | |
| please don't insert casts to @code{void} or calls to do-nothing | |
| functions merely to pacify a lint checker. | |
| Declarations of external functions and functions to appear later in the | |
| source file should all go in one place near the beginning of the file | |
| (somewhere before the first function definition in the file), or else | |
| should go in a header file. Don't put @code{extern} declarations inside | |
| functions. | |
| @cindex temporary variables | |
| It used to be common practice to use the same local variables (with | |
| names like @code{tem}) over and over for different values within one | |
| function. Instead of doing this, it is better to declare a separate local | |
| variable for each distinct purpose, and give it a name which is | |
| meaningful. This not only makes programs easier to understand, it also | |
| facilitates optimization by good compilers. You can also move the | |
| declaration of each local variable into the smallest scope that includes | |
| all its uses. This makes the program even cleaner. | |
| Don't use local variables or parameters that shadow global identifiers. | |
| GCC's @samp{-Wshadow} option can detect this problem. | |
| @cindex multiple variables in a line | |
| Don't declare multiple variables in one declaration that spans lines. | |
| Start a new declaration on each line, instead. For example, instead | |
| of this: | |
| @example | |
| @group | |
| int foo, | |
| bar; | |
| @end group | |
| @end example | |
| @noindent | |
| write either this: | |
| @example | |
| int foo, bar; | |
| @end example | |
| @noindent | |
| or this: | |
| @example | |
| int foo; | |
| int bar; | |
| @end example | |
| @noindent | |
| (If they are global variables, each should have a comment preceding it | |
| anyway.) | |
| When you have an @code{if}-@code{else} statement nested in another | |
| @code{if} statement, always put braces around the @code{if}-@code{else}. | |
| Thus, never write like this: | |
| @example | |
| if (foo) | |
| if (bar) | |
| win (); | |
| else | |
| lose (); | |
| @end example | |
| @noindent | |
| always like this: | |
| @example | |
| if (foo) | |
| @{ | |
| if (bar) | |
| win (); | |
| else | |
| lose (); | |
| @} | |
| @end example | |
| If you have an @code{if} statement nested inside of an @code{else} | |
| statement, either write @code{else if} on one line, like this, | |
| @example | |
| if (foo) | |
| @dots{} | |
| else if (bar) | |
| @dots{} | |
| @end example | |
| @noindent | |
| with its @code{then}-part indented like the preceding @code{then}-part, | |
| or write the nested @code{if} within braces like this: | |
| @example | |
| if (foo) | |
| @dots{} | |
| else | |
| @{ | |
| if (bar) | |
| @dots{} | |
| @} | |
| @end example | |
| Don't declare both a structure tag and variables or typedefs in the | |
| same declaration. Instead, declare the structure tag separately | |
| and then use it to declare the variables or typedefs. | |
| Try to avoid assignments inside @code{if}-conditions (assignments | |
| inside @code{while}-conditions are ok). For example, don't write | |
| this: | |
| @example | |
| if ((foo = (char *) malloc (sizeof *foo)) == NULL) | |
| fatal ("virtual memory exhausted"); | |
| @end example | |
| @noindent | |
| instead, write this: | |
| @example | |
| foo = (char *) malloc (sizeof *foo); | |
| if (foo == NULL) | |
| fatal ("virtual memory exhausted"); | |
| @end example | |
| @node Names | |
| @section Naming Variables, Functions, and Files | |
| @cindex names of variables, functions, and files | |
| The names of global variables and functions in a program serve as | |
| comments of a sort. So don't choose terse names---instead, look for | |
| names that give useful information about the meaning of the variable or | |
| function. In a GNU program, names should be English, like other | |
| comments. | |
| Local variable names can be shorter, because they are used only within | |
| one context, where (presumably) comments explain their purpose. | |
| Try to limit your use of abbreviations in symbol names. It is ok to | |
| make a few abbreviations, explain what they mean, and then use them | |
| frequently, but don't use lots of obscure abbreviations. | |
| Please use underscores to separate words in a name, so that the Emacs | |
| word commands can be useful within them. Stick to lower case; reserve | |
| upper case for macros and @code{enum} constants, and for name-prefixes | |
| that follow a uniform convention. | |
| For example, you should use names like @code{ignore_space_change_flag}; | |
| don't use names like @code{iCantReadThis}. | |
| Variables that indicate whether command-line options have been | |
| specified should be named after the meaning of the option, not after | |
| the option-letter. A comment should state both the exact meaning of | |
| the option and its letter. For example, | |
| @example | |
| @group | |
| /* Ignore changes in horizontal whitespace (-b). */ | |
| int ignore_space_change_flag; | |
| @end group | |
| @end example | |
| When you want to define names with constant integer values, use | |
| @code{enum} rather than @samp{#define}. GDB knows about enumeration | |
| constants. | |
| @cindex file-name limitations | |
| @pindex doschk | |
| You might want to make sure that none of the file names would conflict | |
| if the files were loaded onto an MS-DOS file system which shortens the | |
| names. You can use the program @code{doschk} to test for this. | |
| Some GNU programs were designed to limit themselves to file names of 14 | |
| characters or less, to avoid file name conflicts if they are read into | |
| older System V systems. Please preserve this feature in the existing | |
| GNU programs that have it, but there is no need to do this in new GNU | |
| programs. @code{doschk} also reports file names longer than 14 | |
| characters. | |
| @node System Portability | |
| @section Portability between System Types | |
| @cindex portability, between system types | |
| In the Unix world, ``portability'' refers to porting to different Unix | |
| versions. For a GNU program, this kind of portability is desirable, but | |
| not paramount. | |
| The primary purpose of GNU software is to run as part of the GNU | |
| operating system, compiled with GNU compilers, on various types of | |
| hardware. So the kinds of portability that are absolutely necessary | |
| are quite limited. It is important to support Linux-based GNU | |
| systems, since they are the form of GNU that people mainly use. | |
| Making a GNU program operate on operating systems other than the GNU | |
| system is not part of the core goal of developing a GNU package. You | |
| don't ever have to do that. However, users will ask you to do that, | |
| and cooperating with those requests is useful---as long as you don't | |
| let it dominate the project or impede the primary goal. | |
| It is good to support the other free or nearly free operating systems | |
| (for instance, *BSD). Supporting a variety of Unix-like systems is | |
| desirable, although not paramount. It is usually not too hard, so you | |
| may as well do it. But you don't have to consider it an obligation, | |
| if it does turn out to be hard. | |
| For the most part it is good to port the program to more platforms, | |
| but you should not let take up so much of your time that it hinders | |
| you from improving the program in more central ways. If it starts to | |
| do that, please tell users that you don't want to spend any more | |
| time on this---someone else must write that code, debug it, document | |
| it, etc., and then you can install it. | |
| You can reject porting patches for technical reasons too, as with any | |
| other patch that users submit. It is up to you. | |
| @pindex autoconf | |
| The easiest way to achieve portability to most Unix-like systems is to | |
| use Autoconf. It's unlikely that your program needs to know more | |
| information about the host platform than Autoconf can provide, simply | |
| because most of the programs that need such knowledge have already been | |
| written. | |
| Avoid using the format of semi-internal data bases (e.g., directories) | |
| when there is a higher-level alternative (@code{readdir}). | |
| @cindex non-POSIX systems, and portability | |
| As for systems that are not like Unix, such as MS-DOS, Windows, VMS, MVS, | |
| and older Macintosh systems, supporting them is often a lot of work. | |
| When that is the case, it is better to spend your time adding features | |
| that will be useful on GNU and GNU/Linux, rather than on supporting | |
| other incompatible systems. | |
| If you do support Windows, please do not abbreviate it as ``win''. | |
| @xref{Trademarks}. | |
| Usually we write the name ``Windows'' in full, but when brevity is | |
| very important (as in file names and some symbol names), we abbreviate | |
| it to ``w''. In GNU Emacs, for instance, we use @samp{w32} in file | |
| names of Windows-specific files, but the macro for Windows | |
| conditionals is called @code{WINDOWSNT}. In principle there could | |
| also be @samp{w64}. | |
| It is a good idea to define the ``feature test macro'' | |
| @code{_GNU_SOURCE} when compiling your C files. When you compile on GNU | |
| or GNU/Linux, this will enable the declarations of GNU library extension | |
| functions, and that will usually give you a compiler error message if | |
| you define the same function names in some other way in your program. | |
| (You don't have to actually @emph{use} these functions, if you prefer | |
| to make the program more portable to other systems.) | |
| But whether or not you use these GNU extensions, you should avoid | |
| using their names for any other meanings. Doing so would make it hard | |
| to move your code into other GNU programs. | |
| @node CPU Portability | |
| @section Portability between CPUs | |
| @cindex data types, and portability | |
| @cindex portability, and data types | |
| 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 | |
| @code{int} will be less than 32 bits. We don't support 16-bit machines | |
| in GNU. | |
| You need not cater to the possibility that @code{long} will be smaller | |
| than pointers and @code{size_t}. We know of one such platform: 64-bit | |
| programs on Microsoft Windows. If you care about making your package | |
| run on Windows using Mingw64, you would need to deal with 8-byte | |
| pointers and 4-byte @code{long}, which would break this code: | |
| @example | |
| printf ("size = %lu\n", (unsigned long) sizeof array); | |
| printf ("diff = %ld\n", (long) (pointer2 - pointer1)); | |
| @end example | |
| Whether to support Mingw64, and Windows in general, in your package is | |
| your choice. The GNU Project doesn't say you have any responsibility to | |
| do so. Our goal is to replace proprietary systems, including Windows, | |
| not to enhance them. If people pressure you to make your program run | |
| on Windows, and you are not interested, you can respond with, ``Switch | |
| to GNU/Linux --- your freedom depends on it.'' | |
| Predefined file-size types like @code{off_t} are an exception: they are | |
| longer than @code{long} on many platforms, so code like the above won't | |
| work with them. One way to print an @code{off_t} value portably is to | |
| print its digits yourself, one by one. | |
| Don't assume that the address of an @code{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: | |
| @example | |
| int c; | |
| @dots{} | |
| while ((c = getchar ()) != EOF) | |
| write (file_descriptor, &c, 1); | |
| @end example | |
| @noindent Instead, use @code{unsigned char} as follows. (The @code{unsigned} | |
| is for portability to unusual systems where @code{char} is signed and | |
| where there is integer overflow checking.) | |
| @example | |
| int c; | |
| while ((c = getchar ()) != EOF) | |
| @{ | |
| unsigned char u = c; | |
| write (file_descriptor, &u, 1); | |
| @} | |
| @end example | |
| @cindex casting pointers to integers | |
| 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 @code{malloc} starts far away | |
| from zero. | |
| @node System Functions | |
| @section Calling System Functions | |
| @cindex C library functions, and portability | |
| @cindex POSIX functions, and portability | |
| @cindex library functions, and portability | |
| @cindex portability, and library functions | |
| Historically, C implementations differed substantially, and many | |
| systems lacked a full implementation of ANSI/ISO C89. Nowadays, | |
| however, all practical systems have a C89-or-later compiler and GNU C | |
| supports almost all of C23 (with options to select older versions of | |
| the standard). Similarly, most systems implement POSIX.1-2008 | |
| libraries and tools, and many have POSIX.1-2017. | |
| Hence, there is little reason to support old C or non-POSIX systems, | |
| and you may want to take advantage of standard C and POSIX to write | |
| clearer, more portable, or faster code. You should use standard | |
| interfaces where possible; but if GNU extensions make your program | |
| more maintainable, powerful, or otherwise better, don't hesitate to | |
| use them. In any case, don't make your own declaration of system | |
| functions; that's a recipe for conflict. | |
| Despite the standards, nearly every library function has some sort of | |
| portability issue on some system or another. Here are some examples: | |
| @table @code | |
| @item open | |
| Names with trailing @code{/}'s are mishandled on many platforms. | |
| @item printf | |
| @code{long double} may be unimplemented; floating values Infinity and | |
| NaN are often mishandled; output for large precisions may be | |
| incorrect. | |
| @item readlink | |
| May return @code{int} instead of @code{ssize_t}. | |
| @item scanf | |
| On Windows, @code{errno} is not set on failure. | |
| @end table | |
| @cindex Gnulib | |
| @uref{https://www.gnu.org/software/gnulib/, Gnulib} is a big help in | |
| this regard. Gnulib provides implementations of standard interfaces | |
| on many of the systems that lack them, including portable | |
| implementations of enhanced GNU interfaces, thereby making their use | |
| portable, and of POSIX interfaces, some of which are missing | |
| even on up-to-date GNU systems. | |
| @findex xmalloc, in Gnulib | |
| @findex error messages, in Gnulib | |
| @findex data structures, in Gnulib | |
| Gnulib also provides many useful non-standard interfaces; for example, | |
| C implementations of standard data structures (hash tables, binary | |
| trees), error-checking wrappers for memory allocation | |
| functions (@code{xmalloc}, @code{xrealloc}), and output of error | |
| messages. | |
| Gnulib integrates with GNU Autoconf and Automake to remove much of the | |
| burden of writing portable code from the programmer: Gnulib makes your | |
| configure script automatically determine what features are missing and | |
| use the Gnulib code to supply the missing pieces. | |
| The Gnulib and Autoconf manuals have extensive sections on | |
| portability: @ref{Top,, Introduction, gnulib, Gnulib} and | |
| @pxref{Portable C and C++,,, autoconf, Autoconf}. Please consult them | |
| for many more details. | |
| @node Internationalization | |
| @section Internationalization | |
| @cindex internationalization | |
| @pindex gettext | |
| 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 @code{gettext} macro | |
| around each string that might need translation---like this: | |
| @example | |
| printf (gettext ("Processing file '%s'..."), file); | |
| @end example | |
| @noindent | |
| This permits GNU gettext to replace the string @code{"Processing file | |
| '%s'..."} with a translated version. | |
| Once a program uses gettext, please make a point of writing calls to | |
| @code{gettext} when you add new strings that call for translation. | |
| Using GNU gettext in a package involves specifying a @dfn{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, @samp{coreutils} for the GNU core utilities. | |
| @cindex message text, and internationalization | |
| 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: | |
| @smallexample | |
| printf ("%s is full", capacity > 5000000 ? "disk" : "floppy disk"); | |
| @end smallexample | |
| If you apply gettext to all strings, like this, | |
| @smallexample | |
| printf (gettext ("%s is full"), | |
| capacity > 5000000 ? gettext ("disk") : gettext ("floppy disk")); | |
| @end smallexample | |
| @noindent | |
| 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: | |
| @example | |
| printf (capacity > 5000000 ? gettext ("disk is full") | |
| : gettext ("floppy disk is full")); | |
| @end example | |
| A similar problem appears at the level of sentence structure with this | |
| code: | |
| @example | |
| printf ("# Implicit rule search has%s been done.\n", | |
| f->tried_implicit ? "" : " not"); | |
| @end example | |
| @noindent | |
| Adding @code{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 | |
| @code{gettext} calls does the job straightforwardly if the code starts | |
| out like this: | |
| @example | |
| printf (f->tried_implicit | |
| ? "# Implicit rule search has been done.\n", | |
| : "# Implicit rule search has not been done.\n"); | |
| @end example | |
| Another example is this one: | |
| @example | |
| printf ("%d file%s processed", nfiles, | |
| nfiles != 1 ? "s" : ""); | |
| @end example | |
| @noindent | |
| 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, | |
| @example | |
| printf (gettext ("%d file%s processed"), nfiles, | |
| nfiles != 1 ? "s" : ""); | |
| @end example | |
| @noindent | |
| 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: | |
| @example | |
| printf ((nfiles != 1 ? gettext ("%d files processed") | |
| : gettext ("%d file processed")), | |
| nfiles); | |
| @end example | |
| @noindent | |
| 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 @code{ngettext} function solves this problem: | |
| @example | |
| printf (ngettext ("%d files processed", "%d file processed", nfiles), | |
| nfiles); | |
| @end example | |
| @node Character Set | |
| @section Character Set | |
| @cindex character set | |
| @cindex encodings | |
| @cindex ASCII characters | |
| @cindex non-ASCII characters | |
| 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 ``Flor@'eal''. Also, it is OK | |
| (but not required) to use non-ASCII characters to represent proper | |
| names of contributors in change logs (@pxref{Change Logs}). | |
| If you need to use non-ASCII characters, you should normally stick | |
| with one encoding, certainly within a single file. UTF-8 is likely to | |
| be the best choice. | |
| @node Quote Characters | |
| @section Quote Characters | |
| @cindex quote characters | |
| @cindex locale-specific quote characters | |
| @cindex left quote | |
| @cindex right quote | |
| @cindex opening quote | |
| @cindex single quote | |
| @cindex double quote | |
| @cindex grave accent | |
| @set txicodequoteundirected | |
| @set txicodequotebacktick | |
| In the C locale, the output of GNU programs should stick to plain | |
| ASCII for quotation characters in messages to users: preferably 0x22 | |
| (@samp{"}) or 0x27 (@samp{'}) for both opening and closing quotes. | |
| Although GNU programs traditionally used 0x60 (@samp{`}) for opening | |
| and 0x27 (@samp{'}) for closing quotes, nowadays quotes @samp{`like | |
| this'} are typically rendered asymmetrically, so quoting @samp{"like | |
| this"} or @samp{'like this'} typically looks better. | |
| It is ok, but not required, for GNU programs to generate | |
| locale-specific quotes in non-C locales. For example: | |
| @example | |
| printf (gettext ("Processing file '%s'..."), file); | |
| @end example | |
| @noindent | |
| Here, a French translation might cause @code{gettext} to return the | |
| string @code{"Traitement de fichier | |
| @guilsinglleft{}@tie{}%s@tie{}@guilsinglright{}..."}, yielding quotes | |
| more appropriate for a French locale. | |
| Sometimes a program may need to use opening and closing quotes | |
| directly. By convention, @code{gettext} translates the string | |
| @samp{"`"} to the opening quote and the string @samp{"'"} to the | |
| closing quote, and a program can use these translations. Generally, | |
| though, it is better to translate quote characters in the context of | |
| longer strings. | |
| If the output of your program is ever likely to be parsed by another | |
| program, it is good to provide an option that makes this parsing | |
| reliable. For example, you could escape special characters using | |
| conventions from the C language or the Bourne shell. See for example | |
| the option @option{--quoting-style} of GNU @code{ls}. | |
| @clear txicodequoteundirected | |
| @clear txicodequotebacktick | |
| @node Mmap | |
| @section Mmap | |
| @findex mmap | |
| If you use @code{mmap} to read or write files, don't assume it 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 @code{mmap} is to try it on the specific file for | |
| which you want to use it---and if @code{mmap} doesn't work, fall back on | |
| doing the job in another way using @code{read} and @code{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 | |
| @code{mmap}, but some do not. It is important to make programs handle | |
| all these kinds of files. | |
| @node Documentation | |
| @chapter Documenting Programs | |
| @cindex documentation | |
| 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. | |
| @end menu | |
| @node GNU Manuals | |
| @section 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 @code{info} or the | |
| Emacs Info subsystem (@kbd{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. | |
| Remember that the audience for a GNU manual (and other GNU | |
| documentation) is global, and that it will be used for years, maybe | |
| decades. This means that the reader could have very different cultural | |
| reference points. Decades from now, all but old folks will have very | |
| different cultural reference points; many things that "everyone knows | |
| about" today may be mostly forgotten. | |
| For this reason, try to avoid writing in a way that depends on | |
| cultural reference points for proper understanding, or that refers to them in | |
| ways that would impede reading for someone that doesn't recognize them. | |
| Likewise, be conservative in your choice of words (aside from technical | |
| terms), linguistic constructs, and spelling: aim to make them | |
| intelligible to readers from ten years ago. In any contest for | |
| trendiness, GNU writing should not even qualify to enter. | |
| It is ok to refer once in a rare while to spatially or temporally | |
| localized reference points or facts, if it is directly pertinent or as | |
| an aside. Changing these few things (which in any case stand out) when | |
| they no longer make sense will not be a lot of work. | |
| By contrast, it is always proper to refer to concepts of GNU and the | |
| free software movement, when they are pertinent. These are a central | |
| part of our message, so we should take advantage of opportunities to | |
| mention them. They are fundamental moral positions, so they will | |
| rarely if ever change. | |
| 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 @emph{topic}. For example, | |
| instead of a manual for @code{diff} and a manual for @code{diff3}, we | |
| have one manual for ``comparison of files'' which covers both of those | |
| programs, as well as @code{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, @emph{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 lists 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 @ref{Index Entries, , Making Index Entries, texinfo, GNU | |
| Texinfo}, and see @ref{Indexing Commands, , Defining the Entries of an | |
| Index, texinfo, GNU Texinfo}. | |
| 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 @emph{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 @samp{()} after a function name just to indicate | |
| it is a function. @code{foo ()} is not a function, it is a function | |
| call with no arguments. | |
| Whenever possible, please stick to the active voice, avoiding the | |
| passive, and use the present tense, not the future tense. For | |
| instance, write ``The function @code{foo} returns a list containing | |
| @var{a} and @var{b}'' rather than ``A list containing @var{a} and | |
| @var{b} will be returned.'' One advantage of the active voice is it | |
| requires you to state the subject of the sentence; with the passive | |
| voice, you might omit the subject, which leads to vagueness. | |
| It is proper to use the future tense when grammar demands it, as in, | |
| ``If you type @kbd{x}, the computer will self-destruct in 10 | |
| seconds.'' | |
| @node Doc Strings and Manuals | |
| @section 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. | |
| @node Manual Structure Details | |
| @section Manual Structure Details | |
| @cindex manual structure | |
| 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 | |
| @samp{@var{program} Invocation} or @samp{Invoking @var{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 @samp{@@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 @samp{--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. | |
| @node License for Manuals | |
| @section License for Manuals | |
| @cindex 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 @uref{https://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. | |
| @node Manual Credits | |
| @section Manual Credits | |
| @cindex credits for manuals | |
| 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. | |
| @node Printed Manuals | |
| @section 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 | |
| @url{https://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. | |
| @node NEWS File | |
| @section The NEWS File | |
| @cindex @file{NEWS} file | |
| In addition to its manual, the package should have a file named | |
| @file{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 @file{NEWS} file gets very long, move some of the older items | |
| into a file named @file{ONEWS} and put a note at the end referring the | |
| user to that file. | |
| @node Change Logs | |
| @section Change Logs | |
| @cindex 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, who they came from, and | |
| why the conflicting changes were made. | |
| @cindex software forensics, and change logs | |
| Therefore, change logs should be detailed enough and accurate enough | |
| to provide the information commonly required for such @dfn{software | |
| forensics}. Specifically, change logs should make finding answers to | |
| the following questions easy: | |
| @itemize @bullet | |
| @item | |
| What changes affected a particular source file? | |
| @item | |
| Was a particular source file renamed or moved, and if so, as part of | |
| what change? | |
| @item | |
| What changes affected a given function or macro or definition of a | |
| data structure? | |
| @item | |
| Was a function (or a macro or the definition of a data structure) | |
| renamed or moved from another file, and if so, as part of which | |
| change? | |
| @item | |
| What changes deleted a function (or macro or data structure)? | |
| @item | |
| What was the rationale for a given change, and what were its main | |
| ideas? | |
| @item | |
| Is there any additional information regarding the change, and if so, | |
| where can it be found? | |
| @end itemize | |
| @cindex VCS | |
| @cindex version control system, for keeping change logs | |
| Historically, change logs were maintained on specially formatted | |
| files. Nowadays, projects commonly keep their source files under a | |
| @dfn{version control system} (VCS), such as Git, | |
| Subversion, or Mercurial. If the VCS repository is publicly | |
| accessible, and changes are committed to it separately (one commit for | |
| each logical changeset) and record the authors of each change, then | |
| the information recorded by the VCS can be used to produce | |
| the change logs out of VCS logs, and to answer the above | |
| questions by using the suitable VCS commands. (However, the | |
| VCS log messages still need to provide some supporting | |
| information, as described below.) Projects that maintain such | |
| VCS repositories can decide not to maintain separate change | |
| log files, and instead rely on the VCS to keep the change | |
| logs. | |
| If you decide not to maintain separate change log files, you should | |
| still consider providing them in the release tarballs, for the benefit | |
| of users who'd like to review the change logs without accessing the | |
| project's VCS repository. Scripts exist that can produce | |
| @file{ChangeLog} files from the VCS logs; for example, the | |
| @file{gitlog-to-changelog} script, which is part of Gnulib, can do | |
| that for Git repositories. In Emacs, the command @kbd{C-x v a} | |
| (@code{vc-update-change-log}) does the job of incrementally updating a | |
| @file{ChangeLog} file from the VCS logs. | |
| If separate change log files @emph{are} maintained, they are normally | |
| called @file{ChangeLog}, and each such file covers an entire | |
| directory. Each directory can have its own change log file, or a | |
| directory can use the change log of its parent directory---it's up to | |
| you. | |
| @menu | |
| * Change Log Concepts:: | |
| * Style of Change Logs:: | |
| * Simple Changes:: | |
| * Conditional Changes:: | |
| * Indicating the Part Changed:: | |
| @end menu | |
| @node Change Log Concepts | |
| @subsection Change Log Concepts and Conventions | |
| @cindex changeset, in a change log | |
| @cindex batch of changes, in a change log | |
| You can think of the change log as a conceptual ``undo list'' which | |
| states 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. Each @dfn{entry} in | |
| a change log describes either an individual change or the smallest | |
| batch of changes that belong together, also known as a @dfn{changeset}. | |
| @cindex title, change log entry | |
| @cindex header line, change log entry | |
| It is a good idea to start the change log entry with a @dfn{header | |
| line}: a single line that is a complete sentence which summarizes the | |
| changeset. If you keep the change log in a VCS, this | |
| should be a requirement, as VCS commands that show the | |
| change log in abbreviated form, such as @kbd{git log --oneline}, treat | |
| the header line specially. (In a @file{ChangeLog} file, the header | |
| line follows a line that says who was the author of the change and | |
| when it was installed.) | |
| @cindex description, change log entry | |
| Follow the change log entry's header line with a description of the | |
| overall change. This should be as long as needed to give a clear | |
| description. Pay special attention to aspects of the changeset not | |
| easily gleaned from the diffs or from the names of modified files and | |
| functions: the overall idea of the change and the need for it, and the | |
| relations, if any, between changes made to different files/functions. | |
| If the change or its reasons were discussed on some public forum, such | |
| as the project's issue tracker or mailing list, it is a good idea to | |
| summarize the main points of that discussion in the change's | |
| description, and include a pointer to that discussion or the issue ID | |
| for those who'd like to read it in full. | |
| The best place to explain how parts of the new code work with other code | |
| is in comments in the code, not in the change log. | |
| If you think that a change calls for explanation of @emph{why} the | |
| change was needed---that is, what problem the old code had such that | |
| it required this change---you're probably right. Please put the | |
| explanation in comments in the code, where people will see it whenever | |
| they see the code. An example of such an explanation is, ``This | |
| function used to be iterative, but that failed when MUMBLE was a | |
| tree.'' (Though such a simple reason would not need this kind of | |
| explanation.) | |
| The best place for other kinds of explanation of the change is in the | |
| change log entry. In particular, comments usually will not say why | |
| some code was deleted or moved to another place---that belongs to the | |
| description of the change which did that. | |
| Following the free-text description of the change, it is a good idea | |
| to give a list of names of the entities or definitions that you | |
| changed, according to the files they are in, and what was changed in | |
| each one. @xref{Style of Change Logs}. If a project uses a modern | |
| VCS to keep the change log information, as described in | |
| @ref{Change Logs}, explicitly listing the files and functions that | |
| were changed is not strictly necessary, and in some cases (like | |
| identical mechanical changes in many places) even tedious. It is up | |
| to you to decide whether to allow your project's developers to omit | |
| the list of changed files and functions from the log entries, and | |
| whether to allow such omissions under some specific conditions. | |
| However, while making this decision, please consider the following | |
| benefits of providing the list of changed entities with each change: | |
| @itemize @bullet | |
| @item | |
| Generation of useful @file{ChangeLog} files from VCS logs | |
| becomes more difficult if the change log entries don't list the | |
| modified functions/macros, because VCS commands cannot | |
| reliably reproduce their names from the commit information alone. For | |
| example, when there is a change in the header part of a function | |
| definition, the heading of the diff hunk as shown in the VCS log | |
| commands will name the wrong function as being modified (usually, the | |
| function defined before the one being modified), so using those diffs | |
| to glean the names of the modified functions will produce inaccurate | |
| results. You will need to use specialized scripts, such as gnulib's | |
| @file{vcs-to-changelog.py}, mentioned below, to solve these | |
| difficulties, and make sure it supports the source languages used by | |
| your project. | |
| @item | |
| While modern VCS commands, such as Git's @kbd{git log -L} | |
| and @kbd{git log -G}, provide powerful means for finding changes that | |
| affected a certain function or macro or data structure (and thus might | |
| make @file{ChangeLog} files unnecessary if you have the repository | |
| available), they can sometimes fail. For example, @kbd{git log -L} | |
| doesn't support syntax of some programming languages out of the box. | |
| Mentioning the modified functions/macros explicitly allows finding the | |
| related changes simply and reliably. | |
| @item | |
| Some VCS commands have difficulties or limitations when | |
| tracking changes across file moves or renames. Again, if the entities | |
| are mentioned explicitly, those difficulties can be overcome. | |
| @item | |
| Users that review changes using the generated @file{ChangeLog} files | |
| may not have the repository and the VCS commands available | |
| to them. Naming the modified entities alleviates that problem. | |
| @end itemize | |
| @noindent | |
| For these reasons, providing lists of modified files and functions | |
| with each change makes the change logs more useful, and we therefore | |
| recommend to include them whenever possible and practical. | |
| It is also possible to generate the lists naming the modified entities | |
| by running a script. One such script is @file{mklog.py} (written in | |
| Python 3); it is used by the @code{GCC} project. Gnulib provides | |
| another variant of such a script, called @file{vcs-to-changelog.py}, | |
| part of the @code{vcs-to-changelog} module. Note that these scripts | |
| currently support fewer programming languages than the manual commands | |
| provided by Emacs (@pxref{Style of Change Logs}). Therefore, the | |
| above mentioned method of generating the @code{ChangeLog} file from | |
| the VCS commit history, for instance via the | |
| @code{gitlog-to-changelog} script, usually gives better | |
| results---provided that the contributors stick to providing good | |
| commit messages. | |
| @node Style of Change Logs | |
| @subsection Style of Change Logs | |
| @cindex change logs, style | |
| 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.) Keep in mind that the line which shows the date of | |
| the change and the author's name and email address is needed only in a | |
| separate @file{ChangeLog} file, not when the change logs are kept in a | |
| VCS. | |
| @example | |
| 2019-08-29 Noam Postavsky <npostavs@@gmail.com> | |
| Handle completely undecoded input in term (Bug#29918) | |
| * lisp/term.el (term-emulate-terminal): Avoid errors if the whole | |
| decoded string is eight-bit characters. Don't attempt to save the | |
| string for next iteration in that case. | |
| * test/lisp/term-tests.el (term-decode-partial) | |
| (term-undecodable-input): New tests. | |
| 2019-06-15 Paul Eggert <eggert@@cs.ucla.edu> | |
| Port to platforms where tputs is in libtinfow | |
| * configure.ac (tputs_library): Also try tinfow, ncursesw (Bug#33977). | |
| 2019-02-08 Eli Zaretskii <eliz@@gnu.org> | |
| Improve documentation of 'date-to-time' and 'parse-time-string' | |
| * doc/lispref/os.texi (Time Parsing): Document | |
| 'parse-time-string', and refer to it for the description of | |
| the argument of 'date-to-time'. | |
| * lisp/calendar/time-date.el (date-to-time): Refer in the doc | |
| string to 'parse-time-string' for more information about the | |
| format of the DATE argument. (Bug#34303) | |
| @end example | |
| If you mention the names of the modified functions or variables, it's | |
| important to name them 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 @samp{* register.el (@{insert,jump-to@}-register)}; | |
| this is not a good idea, since searching for @code{jump-to-register} or | |
| @code{insert-register} would not find that entry. | |
| Separate unrelated change log entries with blank lines. Don't put | |
| blank lines between individual changes of an entry. You can omit the | |
| file name and the asterisk when successive individual changes are in | |
| the same file. | |
| Break long lists of function names by closing continued lines with | |
| @samp{)}, rather than @samp{,}, and opening the continuation with | |
| @samp{(}. This makes highlighting in Emacs work better. | |
| Here is an example: | |
| @example | |
| * src/keyboard.c (menu_bar_items, tool_bar_items) | |
| (Fexecute_extended_command): Deal with 'keymap' property. | |
| @end example | |
| The easiest way to add an entry to @file{ChangeLog} is with the Emacs | |
| command @kbd{M-x add-change-log-entry}, or its variant @kbd{C-x 4 a} | |
| (@code{add-change-log-entry-other-window}). This automatically | |
| collects the name of the changed file and the changed function or | |
| variable, and formats a change log entry according to the conventions | |
| described above, leaving it up to you to describe the changes you made | |
| to that function or variable. | |
| 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: | |
| @example | |
| 2002-07-14 John Doe <jdoe@@gnu.org> | |
| * sewing.c: Make it sew. | |
| @end example | |
| @noindent | |
| rather than this: | |
| @example | |
| 2002-07-14 Usual Maintainer <usual@@gnu.org> | |
| * sewing.c: Make it sew. Patch by jdoe@@gnu.org. | |
| @end example | |
| When committing someone else's changes into a VCS, use the | |
| VCS features to specify the author. For example, with Git, | |
| use @kbd{git commit --author=@var{author}}. | |
| As for the date, that should be the date you applied the change. | |
| (With a VCS, use the appropriate command-line switches, | |
| e.g., @kbd{git commit --date=@var{date}}.) | |
| Modern VCS have commands to apply changes sent via email | |
| (e.g., Git has @kbd{git am}); in that case the author of the changeset | |
| and the date it was made will be automatically gleaned from the email | |
| message and recorded in the repository. If the patches are prepared | |
| with suitable VCS commands, such as @kbd{git format-patch}, | |
| the email message body will also have the original author of the | |
| changeset, so resending or forwarding the message will not interfere | |
| with attributing the changes to their author. Thus, we recommend that | |
| you request your contributors to use commands such as @kbd{git | |
| format-patch} to prepare the patches. | |
| @node Simple Changes | |
| @subsection Simple Changes | |
| Certain simple kinds of changes don't need much detail in the change | |
| log. | |
| If the description of the change is short enough, it can serve as its | |
| own header line: | |
| @example | |
| 2019-08-29 Eli Zaretskii <eliz@@gnu.org> | |
| * lisp/simple.el (kill-do-not-save-duplicates): Doc fix. (Bug#36827) | |
| @end example | |
| 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: | |
| @example | |
| * keyboard.c (Fcommand_execute): New arg SPECIAL. | |
| All callers changed. | |
| @end example | |
| 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. | |
| When you make changes in many files that follow mechanically from one | |
| underlying change, it is enough to describe the underlying change. | |
| Here's an example of a change that affects all of the files in the | |
| repository: | |
| @example | |
| 2019-01-07 Paul Eggert <eggert@@cs.ucla.edu> | |
| Update copyright year to 2019 | |
| Run 'TZ=UTC0 admin/update-copyright $(git ls-files)'. | |
| @end example | |
| Test suite files are part of the software, so we recommend treating | |
| them as code for change-log purposes. | |
| There's no technical need to make change log entries for non-software | |
| files (manuals, help files, media files, etc.). This is because they | |
| are not susceptible to bugs that are hard to understand. To correct | |
| an error, you need not know the history of the erroneous passage; it | |
| is enough to compare what the file says with the actual facts. | |
| However, you should keep change logs for non-software files when the | |
| project gets copyright assignments from its contributors, so as to | |
| make the records of authorship more accurate. For that reason, we | |
| recommend to keep change logs for Texinfo sources of your project's | |
| manuals. | |
| @node Conditional Changes | |
| @subsection Conditional Changes | |
| @cindex conditional changes, and change logs | |
| @cindex change logs, conditional changes | |
| Source files can often contain code that is conditional to build-time | |
| or static conditions. For example, C programs can contain | |
| compile-time @code{#if} conditionals; programs implemented in | |
| interpreted languages can contain module imports of function | |
| definitions that are only performed for certain versions of the | |
| interpreter; and Automake @file{Makefile.am} files can contain | |
| variable definitions or target declarations that are only to be | |
| considered if a configure-time Automake conditional is true. | |
| Many changes are conditional as well: sometimes you add a new variable, | |
| or function, or even a new program or library, which is entirely | |
| dependent on a build-time condition. It is useful to indicate | |
| in the change log the conditions for which a change applies. | |
| Our convention for indicating conditional changes is to use | |
| @emph{square brackets around the name of the condition}. | |
| Conditional changes can happen in numerous scenarios and with many | |
| variations, so here are some examples to help clarify. This first | |
| example describes changes in C, Perl, and Python files which are | |
| conditional but do not have an associated function or entity name: | |
| @example | |
| * xterm.c [SOLARIS2]: Include <string.h>. | |
| * FilePath.pm [$^O eq 'VMS']: Import the VMS::Feature module. | |
| * framework.py [sys.version_info < (2, 6)]: Make "with" statement | |
| available by importing it from __future__, | |
| to support also python 2.5. | |
| @end example | |
| Our other examples will for simplicity be limited to C, as the minor | |
| changes necessary to adapt them to other languages should be | |
| self-evident. | |
| Next, here is an entry describing a new definition which is entirely | |
| conditional: the C macro @code{FRAME_WINDOW_P} is defined (and used) | |
| only when the macro @code{HAVE_X_WINDOWS} is defined: | |
| @example | |
| * frame.h [HAVE_X_WINDOWS] (FRAME_WINDOW_P): Macro defined. | |
| @end example | |
| Next, an entry for a change within the function @code{init_display}, | |
| whose definition as a whole is unconditional, but the changes | |
| themselves are contained in a @samp{#ifdef HAVE_LIBNCURSES} | |
| conditional: | |
| @example | |
| * dispnew.c (init_display) [HAVE_LIBNCURSES]: If X, call tgetent. | |
| @end example | |
| Finally, here is an entry for a change that takes effect only when | |
| a certain macro is @emph{not} defined: | |
| @example | |
| * host.c (gethostname) [!HAVE_SOCKETS]: Replace with winsock version. | |
| @end example | |
| @node Indicating the Part Changed | |
| @subsection 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 @code{sh-while-getopts} that | |
| deals with @code{sh} commands: | |
| @example | |
| * progmodes/sh-script.el (sh-while-getopts) <sh>: Handle case that | |
| user-specified option string is empty. | |
| @end example | |
| @node Man Pages | |
| @section Man Pages | |
| @cindex 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 stating 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 | |
| (@pxref{License Notices for Other Files,,,maintain,Information for GNU | |
| Maintainers}). | |
| For long man pages, with enough explanation and documentation that | |
| they can be considered true manuals, use the GFDL (@pxref{License for | |
| Manuals}). | |
| Finally, the GNU help2man program | |
| (@uref{https://www.gnu.org/software/help2man/}) is one way to automate | |
| generation of a man page, in this case from @option{--help} output. | |
| This is sufficient in many cases. | |
| @node Reading other Manuals | |
| @section Reading other Manuals | |
| There may be nonfree 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 nonfree | |
| documentation. Copying from free documentation may be ok; please check | |
| with the FSF about the individual case. | |
| @node Managing Releases | |
| @chapter The Release Process | |
| @cindex releasing | |
| 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 | |
| @end menu | |
| @node Configuration | |
| @section How Configuration Should Work | |
| @cindex program configuration | |
| @pindex configure | |
| Each GNU distribution should come with a shell script named | |
| @code{configure}. This script is given arguments which describe the | |
| kind of machine and system you want to compile the program for. | |
| The @code{configure} script must record the configuration options so | |
| that they affect compilation. | |
| The description here is the specification of the interface for the | |
| @code{configure} script in GNU packages. Many packages implement it | |
| using GNU Autoconf (@pxref{Top,, Introduction, autoconf, Autoconf}) | |
| and/or GNU Automake (@pxref{Top,, Introduction, automake, Automake}), | |
| but you do not have to use these tools. You can implement it any way | |
| you like; for instance, by making @code{configure} be a wrapper around | |
| a completely different configuration system. | |
| Another way for the @code{configure} script to operate is to make a | |
| link from a standard name such as @file{config.h} to the proper | |
| configuration file for the chosen system. If you use this technique, | |
| the distribution should @emph{not} contain a file named | |
| @file{config.h}. This is so that people won't be able to build the | |
| program without configuring it first. | |
| Another thing that @code{configure} can do is to edit the Makefile. If | |
| you do this, the distribution should @emph{not} contain a file named | |
| @file{Makefile}. Instead, it should include a file @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 @code{configure} does write the @file{Makefile}, then @file{Makefile} | |
| should have a target named @file{Makefile} which causes @code{configure} | |
| to be rerun, setting up the same configuration that was set up last | |
| time. The files that @code{configure} reads should be listed as | |
| dependencies of @file{Makefile}. | |
| All the files which are output from the @code{configure} script should | |
| have comments at the beginning stating that they were generated | |
| automatically using @code{configure}. This is so that users won't think | |
| of trying to edit them by hand. | |
| The @code{configure} script should write a file named @file{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 @code{configure} script should accept an option of the form | |
| @samp{--srcdir=@var{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 @samp{--srcdir}, then @code{configure} should | |
| check both @file{.} and @file{..} 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 @samp{--srcdir} is by editing a | |
| definition of @code{VPATH} into the Makefile. Some rules may need to | |
| refer explicitly to the specified source directory. To make this | |
| possible, @code{configure} can add to the Makefile a variable named | |
| @code{srcdir} whose value is precisely the specified directory. | |
| In addition, the @samp{configure} script should take options | |
| corresponding to most of the standard directory variables | |
| (@pxref{Directory Variables}). Here is the list: | |
| @example | |
| --prefix --exec-prefix --bindir --sbindir --libexecdir --sysconfdir | |
| --sharedstatedir --localstatedir --runstatedir | |
| --libdir --includedir --oldincludedir | |
| --datarootdir --datadir --infodir --localedir --mandir --docdir | |
| --htmldir --pdfdir --psdir | |
| @end example | |
| The @code{configure} script should also take an argument which specifies the | |
| type of system to build the program for. This argument should look like | |
| this: | |
| @example | |
| @var{cpu}-@var{company}-@var{system} | |
| @end example | |
| For example, an Athlon-based GNU/Linux system might be | |
| @samp{i686-pc-linux-gnu}. | |
| The @code{configure} script needs to be able to decode all plausible | |
| alternatives for how to describe a machine. Thus, | |
| @samp{athlon-pc-gnu/linux} would be a valid alias. There is a shell | |
| script called | |
| @uref{https://git.savannah.gnu.org/cgit/config.git/plain/config.sub, | |
| @file{config.sub}} that you can use as a subroutine to validate system | |
| types and canonicalize aliases. | |
| The @code{configure} script should also take the option | |
| @option{--build=@var{buildtype}}, which should be equivalent to a | |
| plain @var{buildtype} argument. For example, @samp{configure | |
| --build=i686-pc-linux-gnu} is equivalent to @samp{configure | |
| i686-pc-linux-gnu}. When the build type is not specified by an option | |
| or argument, the @code{configure} script should normally guess it using | |
| the shell script | |
| @uref{https://git.savannah.gnu.org/cgit/config.git/plain/config.guess, | |
| @file{config.guess}}. | |
| @cindex optional features, configure-time | |
| 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: | |
| @table @samp | |
| @item --enable-@var{feature}@r{[}=@var{parameter}@r{]} | |
| Configure the package to build and install an optional user-level | |
| facility called @var{feature}. This allows users to choose which | |
| optional features to include. Giving an optional @var{parameter} of | |
| @samp{no} should omit @var{feature}, if it is built by default. | |
| No @samp{--enable} option should @strong{ever} cause one feature to | |
| replace another. No @samp{--enable} option should ever substitute one | |
| useful behavior for another useful behavior. The only proper use for | |
| @samp{--enable} is for questions of whether to build part of the program | |
| or exclude it. | |
| @item --with-@var{package} | |
| @c @r{[}=@var{parameter}@r{]} | |
| The package @var{package} will be installed, so configure this package | |
| to work with @var{package}. | |
| @c Giving an optional @var{parameter} of | |
| @c @samp{no} should omit @var{package}, if it is used by default. | |
| Possible values of @var{package} include | |
| @samp{gnu-as} (or @samp{gas}), @samp{gnu-ld}, @samp{gnu-libc}, | |
| @samp{gdb}, | |
| @samp{x}, | |
| and | |
| @samp{x-toolkit}. | |
| Do not use a @samp{--with} option to specify the file name to use to | |
| find certain files. That is outside the scope of what @samp{--with} | |
| options are for. | |
| @item @var{variable}=@var{value} | |
| Set the value of the variable @var{variable} to @var{value}. This is | |
| used to override the default values of commands or arguments in the | |
| build process. For example, the user could issue @samp{configure | |
| CFLAGS=-g CXXFLAGS=-g} to build with debugging information and without | |
| the default optimization. | |
| Specifying variables as arguments to @code{configure}, like this: | |
| @example | |
| ./configure CC=gcc | |
| @end example | |
| is preferable to setting them in environment variables: | |
| @example | |
| CC=gcc ./configure | |
| @end example | |
| as it helps to recreate the same configuration later with | |
| @file{config.status}. However, both methods should be supported. | |
| @end table | |
| All @code{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 @samp{--with-} or | |
| @samp{--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 @samp{--with-} and @samp{--enable-} | |
| are narrow: they @strong{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 @code{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 @option{--host=@var{hosttype}}, where | |
| @var{hosttype} uses the same syntax as @var{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 @samp{--target=@var{targettype}}. The syntax for | |
| @var{targettype} is the same as for the host type. So the command would | |
| look like this: | |
| @example | |
| ./configure --host=@var{hosttype} --target=@var{targettype} | |
| @end example | |
| The target type normally defaults to the host type. | |
| Programs for which cross-operation is not meaningful need not accept the | |
| @samp{--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 @code{configure} script can simply | |
| ignore most of its arguments. | |
| @comment The makefile standards are in a separate file that is also | |
| @comment included by make.texinfo. Done by roland@gnu.ai.mit.edu on 1/6/93. | |
| @comment For this document, turn chapters into sections, etc. | |
| @lowersections | |
| @include make-stds.texi | |
| @raisesections | |
| @node Releases | |
| @section Making Releases | |
| @cindex packaging | |
| @cindex version numbers, for releases | |
| You should identify each release with a pair of version numbers, a | |
| major version and a minor. We have no objection to using more than | |
| two numbers, but it is very unlikely that you really need them. | |
| Package the distribution of @code{Foo version 69.96} up in a gzipped tar | |
| file with the name @file{foo-69.96.tar.gz}. It should unpack into a | |
| subdirectory named @file{foo-69.96}. | |
| Building and installing the program should never modify any of the files | |
| contained in the distribution. This means that all the files that form | |
| part of the program in any way must be classified into @dfn{source | |
| files} and @dfn{non-source files}. Source files are written by humans | |
| and never changed automatically; non-source files are produced from | |
| source files by programs under the control of the Makefile. | |
| @cindex @file{README} file | |
| The distribution should contain a file named @file{README} with a | |
| general overview of the package: | |
| @itemize | |
| @item the name of the package; | |
| @item the version number of the package, or refer to where in the | |
| package the version can be found; | |
| @item a general description of what the package does; | |
| @item a reference to the file @file{INSTALL}, which | |
| should in turn contain an explanation of the installation procedure; | |
| @item a brief explanation of any unusual top-level directories or | |
| files, or other hints for readers to find their way around the source; | |
| @item a reference to the file which contains the copying conditions. | |
| The GNU GPL, if used, should be in a file called @file{COPYING}. If | |
| the GNU LGPL is used, it should be in a file called | |
| @file{COPYING.LESSER}. | |
| @end itemize | |
| Naturally, all the source files must be in the distribution. It is | |
| okay to include non-source files in the distribution along with the | |
| source files they are generated from, provided they are up-to-date | |
| with the source they are made from, and machine-independent, so that | |
| normal building of the distribution will never modify them. We | |
| commonly include non-source files produced by Autoconf, Automake, | |
| Bison, @code{flex}, @TeX{}, and @code{makeinfo}; this helps avoid | |
| unnecessary dependencies between our distributions, so that users can | |
| install whichever versions of whichever packages they like. Do not | |
| induce new dependencies on other software lightly. | |
| Non-source files that might actually be modified by building and | |
| installing the program should @strong{never} be included in the | |
| distribution. So if you do distribute non-source files, always make | |
| sure they are up to date when you make a new distribution. | |
| Make sure that all the files in the distribution are world-readable, and | |
| that directories are world-readable and world-searchable (octal mode 755). | |
| We used to recommend that all directories in the distribution also be | |
| world-writable (octal mode 777), because ancient versions of @code{tar} | |
| would otherwise not cope when extracting the archive as an unprivileged | |
| user. That can easily lead to security issues when creating the archive, | |
| however, so now we recommend against that. | |
| Don't include any symbolic links in the distribution itself. If the tar | |
| file contains symbolic links, then people cannot even unpack it on | |
| systems that don't support symbolic links. Also, don't use multiple | |
| names for one file in different directories, because certain file | |
| systems cannot handle this and that prevents unpacking the | |
| distribution. | |
| Try to make sure that all the file names will be unique on MS-DOS@. A | |
| name on MS-DOS consists of up to 8 characters, optionally followed by a | |
| period and up to three characters. MS-DOS will truncate extra | |
| characters both before and after the period. Thus, | |
| @file{foobarhacker.c} and @file{foobarhacker.o} are not ambiguous; they | |
| are truncated to @file{foobarha.c} and @file{foobarha.o}, which are | |
| distinct. | |
| @cindex @file{texinfo.tex}, in a distribution | |
| Include in your distribution a copy of the @file{texinfo.tex} you used | |
| to test print any @file{*.texinfo} or @file{*.texi} files. | |
| Likewise, if your program uses small GNU software packages like regex, | |
| getopt, obstack, or termcap, include them in the distribution file. | |
| Leaving them out would make the distribution file a little smaller at | |
| the expense of possible inconvenience to a user who doesn't know what | |
| other files to get. | |
| @node References | |
| @chapter References to Nonfree Software and Documentation | |
| @cindex references to nonfree material | |
| A GNU program should not recommend, promote, or grant legitimacy to | |
| the use of any nonfree program. Proprietary software is a social and | |
| ethical problem, and our aim is to put an end to that problem. We | |
| can't stop some people from writing proprietary programs, or stop | |
| other people from using them, but we can and should refuse to | |
| advertise them to new potential customers, or to give the public the | |
| impression that their existence is legitimate. | |
| The GNU definition of free software is found on the GNU web site at | |
| @url{https://www.gnu.org/@/philosophy/@/free-sw.html}, and the definition | |
| of free documentation is found at | |
| @url{https://www.gnu.org/@/philosophy/@/free-doc.html}. The terms ``free'' | |
| and ``nonfree'', used in this document, refer to those definitions. | |
| A list of important licenses and whether they qualify as free is in | |
| @url{https://www.gnu.org/@/licenses/@/license-list.html}. If it is not | |
| clear whether a license qualifies as free, please ask the GNU Project | |
| by writing to @email{licensing@@gnu.org}. We will answer, and if the | |
| license is an important one, we will add it to the list. | |
| When a nonfree program or system is well known, you can mention it in | |
| passing---that is harmless, since users who might want to use it | |
| probably already know about it. For instance, it is fine to explain | |
| how to build your package on top of some widely used nonfree | |
| operating system, or how to use it together with some widely used | |
| nonfree program, after first explaining how to use it on the GNU | |
| system. | |
| However, you should give only the necessary information to help those | |
| who already use the nonfree program to use your program with | |
| it---don't give, or refer to, any further information about the | |
| proprietary program, and don't imply that the proprietary program | |
| enhances your program, or that its existence is in any way a good | |
| thing. The goal should be that people already using the proprietary | |
| program will get the advice they need about how to use your free | |
| program with it, while people who don't already use the proprietary | |
| program will not see anything likely to lead them to take an interest | |
| in it. | |
| You shouldn't recommend any nonfree add-ons for the nonfree program, | |
| but it is ok to mention free add-ons that help it to work with your | |
| program, and how to install the free add-ons even if that requires | |
| running some nonfree program. | |
| If a nonfree program or system is obscure in your program's domain, | |
| your program should not mention or support it at all, since doing so | |
| would tend to popularize the nonfree program more than it popularizes | |
| your program. (You cannot hope to find many additional users for your | |
| program among the users of Foobar, if the existence of Foobar is not | |
| generally known among people who might want to use your program.) | |
| Sometimes a program is free software in itself but depends on a | |
| nonfree platform in order to run. For instance, it used to be the | |
| case that many Java programs depended on some nonfree Java libraries. | |
| (See @uref{https://www.gnu.org/philosophy/java-trap.html}.) | |
| To recommend or promote such a program is to promote the other | |
| programs it needs; therefore, judge mentions of the former as if they | |
| were mentions of the latter. For this reason, we were careful about | |
| listing Java programs in the Free Software Directory: we wanted to | |
| avoid promoting the nonfree Java libraries. | |
| Java no longer has this problem, but the general principle will remain | |
| the same: don't recommend, promote or legitimize programs that depend | |
| on nonfree software to run. | |
| Some free programs strongly encourage the use of nonfree software. A | |
| typical example is @command{mplayer}. It is free software in itself, | |
| and the free code can handle some kinds of files. However, | |
| @command{mplayer} recommends use of nonfree codecs for other kinds of | |
| files, and users that install @command{mplayer} are very likely to | |
| install those codecs along with it. To recommend @command{mplayer} | |
| is, in effect, to promote use of the nonfree codecs. | |
| Thus, you should not recommend programs that strongly encourage the | |
| use of nonfree software. This is why we do not list | |
| @command{mplayer} in the Free Software Directory. | |
| A GNU package should not refer the user to any nonfree documentation | |
| for free software. Free documentation that can be included in free | |
| operating systems is essential for completing the GNU system, or any | |
| free operating system, so encouraging it is a priority; to recommend | |
| use of documentation that we are not allowed to include undermines the | |
| impetus for the community to produce documentation that we can | |
| include. So GNU packages should never recommend nonfree | |
| documentation. | |
| By contrast, it is ok to refer to journal articles and textbooks in | |
| the comments of a program for explanation of how it functions, even | |
| though they are nonfree. This is because we don't include such | |
| things in the GNU system even if they are free---they are outside the | |
| scope of what a software distribution needs to include. | |
| Referring to a web site that describes or recommends a nonfree | |
| program is promoting that program, so please do not make links to (or | |
| mention by name) web sites that contain such material. This policy is | |
| relevant particularly for the web pages for a GNU package. | |
| What about chains of links? Following links from nearly any web site | |
| can lead eventually to promotion of nonfree software; this is | |
| inherent in the nature of the web. Here's how we treat that. | |
| You should not refer to AT&T's web site if that recommends AT&T's | |
| nonfree software packages; you should not refer to a page @var{p} | |
| that links to AT&T's site presenting it as a place to get some | |
| nonfree program, because that part of the page @var{p} itself | |
| recommends and legitimizes the nonfree program. | |
| However, if @var{p} contains a link to AT&T's web site for some other | |
| purpose (such as long-distance telephone service), that is no reason | |
| you should not link to @var{p}. | |
| A web page recommends a program in an implicit but particularly strong | |
| way if it requires users to run that program in order to use the page. | |
| Many pages contain JavaScript code which they recommend in this way. | |
| This JavaScript code may be free or nonfree, but nonfree is the usual | |
| case. | |
| If the purpose for which you would refer to the page cannot be carried | |
| out without running nonfree JavaScript code, then you should not refer | |
| to it. Thus, if the purpose of referring to the page is for people to | |
| view a video, or subscribing to a mailing list, and the viewing or | |
| subscribing fail to work if the user's browser blocks the nonfree | |
| JavaScript code, then don't refer to that page. | |
| The extreme case is that of web sites which depend on nonfree | |
| JavaScript code even to @emph{see} the contents of the pages. Any | |
| site hosted on @indicateurl{wix.com} has this problem, and so do some | |
| other sites. Referring people to such pages to read their contents | |
| is, in effect, urging them to run those nonfree programs---so please | |
| don't refer to those pages. (Such pages also break the Web, so they | |
| deserve condemnation for two reasons.) | |
| Instead, please quote excerpts from the page to make your point, | |
| or find another place to refer to that information. | |
| @node GNU Free Documentation License | |
| @appendix GNU Free Documentation License | |
| @cindex FDL, GNU Free Documentation License | |
| @include fdl.texi | |
| @node Index | |
| @unnumbered Index | |
| @printindex cp | |
| @bye | |
| Local variables: | |
| eval: (add-hook 'before-save-hook 'time-stamp) | |
| time-stamp-start: "@set lastupdate " | |
| time-stamp-end: "$" | |
| time-stamp-format: "%:b %:d, %:y" | |
| compile-command: "cd work.s && make" | |
| End: |