uncommitted - gnu-standards

Ready changes

Summary

Import uploads missing from VCS:

Diff

diff --git a/ChangeLog b/ChangeLog
index c85add3..ecb74d8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,619 @@
+2018-01-16  Karl Berry  <karl@freefriends.org>
+
+	* standards.texi: typos, copyright year update.
+
+2018-01-15  Richard Stallman  <rms@gnu.org>
+
+	Be more careful about the word "explanation".
+	* standards.texi (Change Log Concepts, Style of Change Logs):
+	Encourage longer overall explanations of the change.  Clarify
+	other text.
+
+2017-10-16  Richard Stallman  <rms@gnu.org>
+
+	* maintain.texi Change http: to https:
+	(License Notices for Other Files): Mention that public domain is
+	ok for small auxiliary text files.
+
+2017-09-19  John Darrington <jmd@gnu.org>
+
+	* maintain.texi Update the FSF's out of band status url
+
+2016-07-25  Brandon Invergo  <brandon@invergo.net>
+
+	* standards.texi (Program Behavior, Writing C): Remove
+	K&R-specific C recommendations.
+
+2016-07-21  Brandon Invergo  <brandon@invergo.net>
+
+	* maintain.texi (Copyright Papers): Add India to the list of
+	countries that accepts assignments by email.
+
+2016-07-18  Brandon Invergo  <brandon@invergo.net>
+
+	* maintain.texi (Standard Mailing Lists): Use full mailing-list
+	email addresses
+	(Binary Distribution): Fix word transposition typo
+
+2015-04-23  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (@copying),
+	* maintain.texi (@copying): make boilerplate consistent with fdl.
+
+2015-02-03  Karl Berry  <karl@gnu.org>
+
+	* make-stds.texi: insert missing ).  Noted by Mathieu Lirzin,
+	03 Feb 2015 18:53:44.
+
+2014-12-30  Karl Berry  <karl@gnu.org>
+
+	* make-stds.texi: use '...' in examples.
+
+2014-12-24  Karl Berry  <karl@gnu.org>
+
+	* standards.texi: fix broken url to Python manual.
+	* maintain.texi: fix broken url to CVS manual.
+
+2014-12-18  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Invoking gendocs.sh): now maintained in Gnulib.
+
+2014-12-10  Richard Stallman  <rms@gnu.org>
+
+	* standards.texi (Graphical Interfaces): accept GNUstep
+	along with GTK+.
+
+2014-05-13  Richard Stallman  <rms@gnu.org>
+
+	* maintain.texi (Ethical and Philosophical Consideration):
+	no Google Groups.
+
+2014-05-13  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi, standards.texi: use http://www.gnu.org
+	since that is what we've always used to date.
+
+2014-05-13  Richard Stallman  <rms@gnu.org>
+
+	* maintain.texi,
+	* standards.texi (User Interfaces): Explain better about avoiding
+	device-dependence, i.e.,
+	http://www.gnu.org/accessibility/accessibility.html.
+	* standards.texi (Which Languages to Use): Add Lisp.
+
+2014-03-31  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (User Interfaces): give an exception for binary
+	output (such as a compression program) to a terminal.
+
+2014-03-19  Ineiev  <ineiev@gnu.org>  (tiny change)
+
+	* standards.texi (Command-Line Interfaces): use @indicateurl
+	for the example.org url.  From Ineiev (tiny change).
+
+2014-03-19  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Hosting for Web Pages): correct name to
+	``web pages repository'' for the Savannah feature.
+	
+2014-03-19  Richard Stallman  <rms@gnu.org>
+
+	* maintain.texi (GNU and Linux): Minor cleanup.
+	(Free Software and Open Source): Minor cleanup.
+	(Crediting Authors, Binary Distribution): New sections.
+
+2013-12-17  Karl Berry  <karl@gnu.org>
+
+	* gnu-oids.texi (.9): for Rush, request from Sergey.
+	* standards.texi (OID Allocations): Sergey registered the OID
+	for GNU.
+
+2013-12-05  Karl Berry  <karl@gnu.org>
+
+	* gnu-oids.texi (.15): for ellipticCurve, request from Werner Koch.
+	Ed25519 curve, similar but in details different from Curve25519
+	(1.3.6.1.4.1.3029.1.5.1).
+
+2013-10-10  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Formatting): mention that source
+	lines should ideally be kept to <80 chars.  Suggestion from
+	LE GARREC Vincent, 6 Oct 2013 23:47:02.
+
+2013-10-09  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (FTP Upload Directive File): reword to avoid
+	underfull hbox.
+
+2013-10-08  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Copyright Papers): make clear that GNU packages
+	need not be FSF-copyrighted.
+
+2013-09-13  Karl Berry  <karl@gnu.org>
+
+	* make-stds.texi (Directory Variables): new variable runstatedir.
+	* standards.texi: corresponding option --runstatedir.
+	Suggestion from bug-standards mail, 05 Sep 2013 13:47:37 (ff.).
+
+	* maintain.texi (Getting Help): identi.ca/group/fsfstatus
+	is gone; now pumprock.net/fsfstatus.
+
+2013-08-22  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Copyright Papers): GPG allowed for US residents,
+	per Donald Robertson.
+
+2013-07-19  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Automated Upload Registration): more explicit
+	gpg instructions.
+
+2013-05-07  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Creating Mailing Lists): sufficient to mention
+	new-mailing-list@ (= savannah), since sv can help with the
+	(very) occasional aliases request too; FSF sysadmins requested
+	disabling the special alias-file@ address.
+
+2013-04-27  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Automated Upload Procedure): explicitly mention
+	that the hostname ftp-upload.gnu.org is not used with the gnupload
+	script.
+	(Announcements): Mention ::noplanet:: keyword.
+
+	* standards.texi (--version) <Artistic>: new url, perlfoundation.org
+	is gone.
+
+2013-02-13  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (GNU Accounts and Resources): mention
+	http://www.fsf.org/about/systems/sending-mail-via-fencepost.
+
+2013-01-10  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (FTP Upload Directive File): upload
+	FOO.directive.asc, not FOO.directive.
+
+2013-01-06  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Automated Upload Procedure, FTP Upload Directive
+        File - v1.2): split into subsections.
+	(Announcements): mention announce-gen.
+	Ideas from Ineiev.
+
+2013-01-01  Karl Berry  <karl@gnu.org>
+
+	* standards.texi: do not use @sc, for consistency
+	with other manuals.
+
+2013-01-01  Paul Eggert  <eggert@cs.ucla.edu>
+	and Richard Stallman  <rms@gnu.org>
+
+	* standards.texi (Standard C, Calling System Functions):
+	update references to C and POSIX standards.
+	
+2013-01-01  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Releases): no "the the" (report from Stefano
+	Lattarini).
+
+	* maintain.texi (External Libraries): typos/grammar.
+
+2012-11-15  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Copyright Papers): can now accept emailed
+	scans from German residents, as well as US.  Per
+	Donald Robertson, 14 Nov 2012 10:40:04.
+
+2012-10-27  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Releases): make the items that should be in the
+	README into a list, since there are quite a few of them.
+
+	* maintain.texi (Manuals on Web Pages): no point in PostScript
+	output specifically these days, given PDF.
+
+2012-08-24  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Invoking gendocs.sh): don't use @acronym
+	for "HTML", for consistency.
+
+2012-07-13  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* make-stds.texi (Directory Variables): configure.ac preferred
+	to configure.in.
+	bug-standards, 09 Jul 2012 01:25:12.
+
+2012-06-30  Thien-Thi Nguyen  <ttn@gnuvola.org>
+	and Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Change Log Concepts): mention possibility
+	of a one-line description describing the overall purpose;
+	the full description of changes to media files and others without
+	a comment syntax can go in the ChangeLog.
+	bug-standards, 04 Jun 2012 11:52:37.
+
+2012-06-15  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Automated Upload Registration): must confirm
+	some of the answers to gpg --gen-key, not just accept.
+
+2012-06-01  Thien-Thi Nguyen  <ttn@gnuvola.org>
+	and Karl Berry  <karl@gnu.org>
+
+	Clarify ChangeLog terminology.
+	* standards.texi (Change Log Concepts): more clearly distinguish
+	an individual change from the batch of changes typically
+	comprising a change log entry.  Mention the term "change set".
+	(Style of Change Logs): likewise.
+	(Conditional Changes): add filename to last example.
+	bug-standards, 30 May 2012 11:54:09.
+
+2012-05-26  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Change Log Concepts): media files are
+	another example of non-software files worth mentioning.
+	Suggestion from Thien-Thi Nguyen, 25 May 2012 09:29:31.
+
+2012-05-20  Ward Vandewege  <sysadmin@fsf.org>
+
+	* maintain.texi (FTP Upload Directive File - v1.2): new node.
+	(FTP Upload Directive File - v1.1): access to archived files
+	is simply via email to sysadmin.
+	(FTP Upload Directive File - v1.0): no longer supported.
+
+2012-05-14  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (GNU and Linux): url fixes from Ineiev.
+
+2012-05-13  Richard Stallman  <rms@gnu.org>
+
+	* maintain.texi (Interviews and Speeches): new node.
+	(External Libraries): discuss licensing; avoid goffice.
+	
+2012-04-14  Richard Stallman  <rms@gnu.org>
+
+	Explain that employer can assign copyright.
+	* maintain.texi (Copying from Other Packages): Split out two subnodes.
+	(Non-FSF-Copyrighted Package, FSF-Copyrighted Package): New subnodes.
+
+2012-04-07  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Formatting): mention struct+enum types
+	per rms.
+
+2012-04-06  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Comments): Gender neutralize.
+
+	* maintain.texi (Copyright Papers): five business days for
+	the FSF to answer initially.  Information from johns.
+
+2012-03-21  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Distribution on ftp.gnu.org): clarify that
+	using ftp.gnu.org is strongly recommended, though not
+	absolutely required.
+
+2012-03-11  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Announcements): missed @indicateurl for
+	generic ftpmirror and mail examples.
+
+2012-03-10  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Formatting): spurious "that".
+	Report from Jeremy Compostella, RT #725785.
+
+2012-02-11  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi,
+	* standards.texi: typos.
+
+2012-01-12  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (GNU Accounts and Resources): rename from
+	Getting a GNU Account.  Mention Hydra, platform-testers, more.
+
+2012-01-08  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Errors): avoid -'s in metavariable names,
+	too easily confused with the literal -'s in the formats.
+	Suggestion from Per Bothner.
+
+2011-12-31  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* standards.texi (Quote Characters): change to recommending
+	undirected quotes, '...' or "...".
+
+2011-12-23  Alfred M. Szmidt  <ams@gnu.org>
+
+	* standards.texi (Standard C and Pre-Standard C, System Functions):
+	make comments about C99 consistent, by suggesting its use where
+	available, but not making it a requirement.
+
+2011-12-23  Richard Stallman  <rms@gnu.org>
+
+	* maintain.texi (License Notices for Documentation): mention 
+	writing to maintainers about FSF publications on paper.
+
+2011-12-22  Stefano Lattarini  <stefano.lattarini@gmail.com>
+
+	* standards.texi (Conditional Changes): more examples
+	in more languages.
+
+2011-12-10  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Quote Characters): UTF-8 is not compatible
+	with Latin 1.
+
+2011-12-05  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Semantics, Errors, Character Set): more strongly
+	recommend supporting/using UTF-8 if anything non-ASCII is done.
+	Suggestion from Joseph Myers.
+
+2011-12-02  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Standard Mailing Lists): recommend describing
+	mailing lists in README and/or AUTHORS.  Suggestion from Werner Koch.
+
+2011-10-12  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Copyright Papers): new option for US contributors.
+
+2011-09-26  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Replying to Mail): mention the email tracker
+	at http://bugs.gnu.org, and the web trackers savannah supports.
+
+2011-09-25  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Automated Upload Procedure): mention 
+	ftp-upload-report, set up by sysadmin.
+
+	* standards.texi: per rms, consistently use punctuation outside
+	quotes, except when a whole sentence is being quoted.
+
+2011-08-14  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Old Versions): Discourage private GNU packages on
+	Savannah.  Other small wording changes.
+
+2011-06-30  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Free Software and Open Source): Open Source
+	is not a movement; reword.
+
+	* maintain.texi (Automated Upload Registration): include sv
+	username in ftp-upload mail.
+
+2011-05-10  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Semantics): remove the (new) sentence about libiconv
+	since it's insufficient.  Report from Bruno Haible,
+	10 May 2011 13:25:06.
+
+2011-05-09  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Old Versions): VC node name changed in Emacs manual,
+	update xref.
+	(Getting Help): be more encouraging about using mentors;
+	mention sysadmin.
+
+	* standards.texi (Contributions): explicit xref to relevant
+	section in maintainers guide.
+	(Semantics): mention strerror.
+	(Memory Usage): use the more-general "memory analysis" instead
+	of specifically "memory leak", since there are plenty of
+	other false-positive memory diagnostics besides leaks.
+
+2011-03-28  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Top): fix @top to be the real title, not the
+	spurious "Version".
+	(Semantics): mkstemps is better to take from Gnulib these days,
+	not libiberty.
+	(CPU Portability): <stdarg.h> is required these days, no need to
+	explicitly mention using it.
+	(System Functions): rewrite to describe current problems and Gnulib.
+	These changes suggested by Reuben Thomas.
+	
+	* work.m/GNUmakefile,
+	* work.s/GNUmakefile: simplify HTML update methods.
+
+2011-01-28  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Semantics): more info about robust temporary
+	file creation.  Suggestion from Michael Antosha.
+
+	* maintain.texi (Automated Upload Registration): defaults to gpg
+	--gen-key are ok.
+
+2011-01-14  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi: consistently use {package} rather than
+	{program}; other small source updates.
+
+	* maintain.texi (License Notices for Code): include instructions
+	from gpl-howto.html for constructing the LGPL notice.
+
+	* maintain.texi (Licensing of GNU Packages): new node,
+	with wording for dual-license LGPLv2+|GPLv3+.  (Approved by rms
+	and lawyers.)
+
+2010-12-09  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Old Versions): a bit more on Savannah.
+
+2010-12-02  Karl Berry  <karl@gnu.org>
+
+	* standards.texi: a bit more about useful things for --help.
+
+2010-11-22  Karl Berry  <karl@gnu.org>
+
+	* make-stds.texi (Standard Targets): further explication about
+	being helpless without debugging symbols.
+
+2010-11-22  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* doc/make-stds.texi (Standard Targets): Additional information
+	about stripping executables.
+	Suggested by Mark T. Eriksen <halfcountplus at intergate dot com>.
+
+2010-11-22  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Donations): mention FSF, software
+	maintenance fee possibilities.
+
+2010-11-15  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Donations): do not explicitly mention paypal,
+	and do disrecommend Google's payment service.
+
+2010-11-12  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Donations): new node, text written mostly by rms.
+
+2010-10-27  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Copyright Notices): ranges are now allowed,
+	as long as information is not lost.  Approved by rms and SFLC.
+
+2010-10-25  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Hosting): Use short /gethelp url for consistency
+	with standards.texi.  (/help/gethelp.html still works, however.)
+	Report from Eric Blake, webmasters #628890.
+
+2010-10-08  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Getting Help): update information about the
+	advisory committee.
+
+2010-09-09  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* standards.texi (Memory Usage): mention no need to placate valgrind.
+	(Syntactic Conventions): mention no need to placate lint/clang/etc.
+
+2010-08-24  Karl Berry  <karl@gnu.org>
+
+	* make-stds.texi (Standard Targets): parenthetical instead of
+	footnote, for ease of reading.
+
+2010-08-24  Richard Stallman  <rms@gnu.org>
+
+	* standards.texi (Dynamic Plug-In Interfaces): new node.
+
+2010-07-02  Karl Berry  <karl@gnu.org>
+
+	* gnu-oids.texi (.8): for GNU Dico, request from Sergey Poznyakoff.
+
+2010-06-21  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (@gdgnuorgtext{}): needs empty braces following
+	for reliable expansion.
+	(CVS Keywords in Web Pages): refer to CVS manual by url, since
+	there is no other reliable way any more.
+
+	* standards.texi (References): missing word.  Report from
+	Stefan Kangas, 21 Jun 2010 09:44:34.
+
+2010-06-09  Karl Berry  <karl@gnu.org>
+
+	* make-stds.texi (Directory Variables): don't use @raggedright yet,
+	that makeinfo isn't released.  From Nick Clifton,
+	binutils@sourceware.org, Jun 08, 2010 at 02:20:36PM.
+
+2010-05-28  Brian Gough  <bjg@gnu.org>
+
+	* maintain.texi (Web Pages): missed / in boilerplate url.
+
+2010-05-18  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi: make text related to releases agnostic about FTP
+	or HTTP.
+
+2010-05-17  Karl Berry  <karl@gnu.org>
+
+	* gnu-oids.texi (.6): typo in assignment to Shishi.
+	(.7): assign to GNU Radio for Eric Blossom.
+
+2010-05-13  Richard Stallman  <rms@gnu.org>
+
+	* maintain.texi (Hosting): primary ftp distribution point should
+	be an unrestricted site.
+
+2010-05-01  Karl Berry  <karl@gnu.org>
+
+	* work.s/GNUmakefile: fix up HTML refs to more cases of more
+	manuals.  Report from Mateusz Poszwa, webmasters ticket #568736.
+	* work.m/GNUmakefile: keep consistent.
+
+	* maintain.texi: a couple of missing @url's.
+	* make-stds.texi: avoid bad breaks.
+
+2010-04-29  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Preface, Announcements): text cleanups.
+	(Web Pages): mention the boilerplate template.
+	(Mail): split into:
+	(Standard Mailing Lists,
+	 Creating Mailing Lists,
+	 Replying to Mail): new sections.
+
+2010-04-25  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Getting Help): text cleanups.
+
+2010-04-18  Brian Gough  <bjg@gnu.org>
+
+	* maintain.texi (Getting a GNU account): move info from preface
+	to its own section.
+
+2010-04-14  Karl Berry  <karl@gnu.org>
+
+	* maintain.texi (Getting Help): new chapter for mentors@gnu.org
+	and gnu-advisory@gnu.org.
+	
+	Throughout, fix underfull/overfull lines.
+
+2010-04-12  Karl Berry  <karl@gnu.org>
+
+	* make-stds.texi (Makefile Basics): include printf.
+	Suggestion from Eric Blake.
+
+	* standards.texi (--version) <RBSD>: use @* to avoid
+	underfull hbox.
+
+2010-03-27  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Graphical Interfaces): Recommend D-Bus
+	rather than CORBA, for GNOME and use from other programs in general.
+	Suggestion from Andy Wingo.
+
+2010-03-25  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (--version): No more GPL/Guile; the Guile exception
+	was only used in old releases (that didn't use this --version output).
+	These days, Guile is under the LGPL, no special exceptions.
+	Suggestion from Andy Wingo.
+
+2010-03-23  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Preface),
+	* maintain.texi (Preface): Mention Savannah project, and use
+	the same wording.
+	Suggestion from Brian Gough, 23 Mar 2010 12:10:58.
+
+2010-03-11  Karl Berry  <karl@gnu.org>
+
+	* standards.texi (Graphical Interfaces, --version): use
+	"X Window System" consistently.
+	Report from Jon Masters, 08 Mar 2010 20:40:33.
+
 2010-02-18  Karl Berry  <karl@gnu.org>
 
 	* make-stds.texi (Standard Targets) <do-install-info>: Avoid
@@ -645,7 +1261,8 @@
 	(Copyright Papers): typo - missing verb.
 
 
-Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013,
+2014, 2015, 2016 Free Software Foundation, Inc.
 
 Copying and distribution of this file, with or without modification,
 are permitted in any medium without royalty provided the copyright
diff --git a/README b/README
index c8122cf..4c776cf 100644
--- a/README
+++ b/README
@@ -1,31 +1,26 @@
-$Id: README,v 1.4 2008/02/13 01:07:59 karl Exp $
+$Id: README,v 1.6 2017/11/16 18:29:14 jmd Exp $
 This is the README file for the gnustandards project.
 
-  Copyright (C) 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
+  Copyright 2004, 2005, 2006, 2008, 2012 Free Software Foundation, Inc.
 
   Copying and distribution of this file, with or without modification,
   are permitted in any medium without royalty provided the copyright
   notice and this notice are preserved.
 
 This hierarchy contains the canonical sources for the "GNU Coding
-Standards" and "Information for GNU Maintainers" documents.  All changes
-must be approved by rms.
+Standards" and "Information for GNU Maintainers" documents.
+Formatted versions are on the GNU web site: https://www.gnu.org/prep/
 
-Formatted versions are on the GNU web site: http://www.gnu.org/prep/
+Send proposals for changes to bug-standards@gnu.org (aka
+https://lists.gnu.org/mailman/listinfo/bug-standards).  All substantive
+changes must eventually be approved by rms.
 
 Copies of these sources are maintained in the gnulib project
-(http://savannah.gnu.org/projects/gnulib) for convenience of the
+(https://savannah.gnu.org/projects/gnulib) for convenience of the
 maintainers who already check out gnulib.
 
-If you're interested in these, you might also be interested in the
-additional "Gnits" standards.  They are completely unofficial and no
-longer updated, but go into somewhat more detail in some areas.  They're
-available as part of the GNU Womb:
-http://savannah.gnu.org/cgi-bin/viewcvs/womb/gnits/ cvs
--d:ext:anoncvs@cvs.gnu.org:/cvsroot/womb co gnits
-
 To update the manuals, see the work.m and work.s directories here.  Each
 has a GNUmakefile with assorted targets and comments.  They use the
 gendocs.sh script, which is in Texinfo CVS on savannah, which in turn
 needs a file gendocs_template, also in Texinfo CVS:
-http://cvs.savannah.gnu.org/viewcvs/texinfo/util/?root=texinfo
+https://cvs.savannah.gnu.org/viewcvs/texinfo/util/?root=texinfo
diff --git a/debian/changelog b/debian/changelog
index 2ca7b8d..66e8cbf 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,14 @@
+gnu-standards (2022.03.23-0.1) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * Update from the upstream VCS. Closes: #741151.
+  * Bump debhelper and standards version. Closes: #965564.
+  * Add build targets. Closes: #998980.
+  * Mark as M-A: foreign. Closes: #978484.
+  * Make the build reproduible. Closes: #995652.
+
+ -- Matthias Klose <doko@debian.org>  Wed, 23 Mar 2022 15:48:33 +0100
+
 gnu-standards (2010.03.11-1.2) UNRELEASED; urgency=medium
 
   * Apply multi-arch hints.
diff --git a/debian/compat b/debian/compat
index 7ed6ff8..b4de394 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-5
+11
diff --git a/debian/control b/debian/control
index 2cebe83..0277daa 100644
--- a/debian/control
+++ b/debian/control
@@ -2,15 +2,16 @@ Source: gnu-standards
 Section: doc
 Priority: optional
 Maintainer: Tim Retout <diocles@debian.org>
-Standards-Version: 4.4.1
+Standards-Version: 4.6.0
 Build-Depends-Indep: texinfo (>= 4.6), texlive-base, texlive-latex-base, texlive-plain-generic
-Build-Depends: debhelper (>= 5.0.0)
+Build-Depends: debhelper (>= 11)
 Homepage: http://savannah.gnu.org/projects/gnustandards
 Vcs-Git: https://salsa.debian.org/debian/gnu-standards.git
 Vcs-Browser: https://salsa.debian.org/debian/gnu-standards
 
 Package: gnu-standards
 Architecture: all
+Multi-Arch: foreign
 Depends: ${misc:Depends}
 Multi-Arch: foreign
 Description: GNU coding and package maintenance standards
diff --git a/debian/rules b/debian/rules
index a8f6c74..96a41ad 100755
--- a/debian/rules
+++ b/debian/rules
@@ -8,7 +8,12 @@
 
 DOCUMENTS = standards.texi maintain.texi
 
+# Ensure texlive respects SOURCE_DATE_EPOCH
+export FORCE_SOURCE_DATE=1
+
 build: build-stamp
+build-arch: build
+build-indep: build
 build-stamp:
 	dh_testdir
 	for d in $(DOCUMENTS); do					\
diff --git a/fdl.texi b/fdl.texi
index 8805f1a..eaf3da0 100644
--- a/fdl.texi
+++ b/fdl.texi
@@ -6,7 +6,7 @@
 
 @display
 Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
-@uref{http://fsf.org/}
+@uref{https://fsf.org/}
 
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.
@@ -92,16 +92,16 @@ An image format is not Transparent if used for any substantial amount
 of text.  A copy that is not ``Transparent'' is called ``Opaque''.
 
 Examples of suitable formats for Transparent copies include plain
-@sc{ascii} without markup, Texinfo input format, La@TeX{} input
-format, @acronym{SGML} or @acronym{XML} using a publicly available
-@acronym{DTD}, and standard-conforming simple @acronym{HTML},
-PostScript or @acronym{PDF} designed for human modification.  Examples
-of transparent image formats include @acronym{PNG}, @acronym{XCF} and
-@acronym{JPG}.  Opaque formats include proprietary formats that can be
-read and edited only by proprietary word processors, @acronym{SGML} or
-@acronym{XML} for which the @acronym{DTD} and/or processing tools are
-not generally available, and the machine-generated @acronym{HTML},
-PostScript or @acronym{PDF} produced by some word processors for
+ASCII without markup, Texinfo input format, La@TeX{} input
+format, SGML or XML using a publicly available
+DTD, and standard-conforming simple HTML,
+PostScript or PDF designed for human modification.  Examples
+of transparent image formats include PNG, XCF and
+JPG@.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, SGML or
+XML for which the DTD and/or processing tools are
+not generally available, and the machine-generated HTML,
+PostScript or PDF produced by some word processors for
 output purposes only.
 
 The ``Title Page'' means, for a printed book, the title page itself,
@@ -414,7 +414,7 @@ The Free Software Foundation may publish new, revised versions
 of the GNU Free Documentation License from time to time.  Such new
 versions will be similar in spirit to the present version, but may
 differ in detail to address new problems or concerns.  See
-@uref{http://www.gnu.org/copyleft/}.
+@uref{https://www.gnu.org/licenses/}.
 
 Each version of the License is given a distinguishing version number.
 If the Document specifies that a particular numbered version of this
@@ -481,7 +481,7 @@ license notices just after the title page:
 @end smallexample
 
 If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
-replace the ``with@dots{}Texts.'' line with this:
+replace the ``with@dots{}Texts.''@: line with this:
 
 @smallexample
 @group
@@ -503,4 +503,3 @@ to permit their use in free software.
 @c Local Variables:
 @c ispell-local-pdict: "ispell-dict"
 @c End:
-
diff --git a/gnu-oids.texi b/gnu-oids.texi
index 46cfd62..559042c 100644
--- a/gnu-oids.texi
+++ b/gnu-oids.texi
@@ -1,21 +1,20 @@
 @c This table of OID's is included in the GNU Coding Standards.
 @c
-@c Copyright 2008, 2009 Free Software Foundation, Inc.
+@c Copyright 2008, 2009, 2010, 2013 Free Software Foundation, Inc.
 @c
 @c Copying and distribution of this file, with or without modification,
 @c are permitted in any medium without royalty provided the copyright
 @c notice and this notice are preserved.
 @c
 @c When adding new OIDs, please add them also to
-@c http://www.alvestrand.no/objectid/  (except it gets an internal
-@c server error, so never mind)
-@c (Our page is http://www.alvestrand.no/objectid/1.3.6.1.4.1.11591.html.)
+@c   https://www.alvestrand.no/objectid/
+@c (Our page is https://www.alvestrand.no/objectid/1.3.6.1.4.1.11591.html.)
 
 1.3.6.1.4.1.11591 GNU
 
 1.3.6.1.4.1.11591.1 GNU Radius
 
-1.3.6.1.4.1.11591.2 GnuPG 
+1.3.6.1.4.1.11591.2 GnuPG
   1.3.6.1.4.1.11591.2.1   notation
   1.3.6.1.4.1.11591.2.1.1 pkaAddress
 
@@ -27,24 +26,38 @@
 1.3.6.1.4.1.11591.5 GNU Mailutils
 
 @c Added 2009-03-03 on request from Simon Josefsson <simon@josefsson.org>
-1.3.6.1.4.1.11591.5 GNU Shishi
+1.3.6.1.4.1.11591.6 GNU Shishi
+
+@c Added 2010-05-17 on request from Eric Blossom <eb@comsec.com>
+1.3.6.1.4.1.11591.7 GNU Radio
+
+@c Added 2010-07-02 on request from Sergey Poznyakoff <gray@gnu.org.ua>
+1.3.6.1.4.1.11591.8 GNU Dico
+
+@c Added 2013-12-17 on request from Sergey Poznyakoff <gray@gnu.org.ua>
+1.3.6.1.4.1.11591.9 GNU Rush
 
 1.3.6.1.4.1.11591.12 digestAlgorithm
   1.3.6.1.4.1.11591.12.2 TIGER/192
-  1.3.6.1.4.1.11591.13 encryptionAlgorithm
-    1.3.6.1.4.1.11591.13.2 Serpent
-      1.3.6.1.4.1.11591.13.2.1 Serpent-128-ECB
-      1.3.6.1.4.1.11591.13.2.2 Serpent-128-CBC
-      1.3.6.1.4.1.11591.13.2.3 Serpent-128-OFB
-      1.3.6.1.4.1.11591.13.2.4 Serpent-128-CFB
-      1.3.6.1.4.1.11591.13.2.21 Serpent-192-ECB
-      1.3.6.1.4.1.11591.13.2.22 Serpent-192-CBC
-      1.3.6.1.4.1.11591.13.2.23 Serpent-192-OFB
-      1.3.6.1.4.1.11591.13.2.24 Serpent-192-CFB
-      1.3.6.1.4.1.11591.13.2.41 Serpent-256-ECB
-      1.3.6.1.4.1.11591.13.2.42 Serpent-256-CBC
-      1.3.6.1.4.1.11591.13.2.43 Serpent-256-OFB
-      1.3.6.1.4.1.11591.13.2.44 Serpent-256-CFB
-  1.3.6.1.4.1.11591.14 CRC algorithms
-    1.3.6.1.4.1.11591.14.1 CRC 32
 
+1.3.6.1.4.1.11591.13 encryptionAlgorithm
+  1.3.6.1.4.1.11591.13.2 Serpent
+    1.3.6.1.4.1.11591.13.2.1 Serpent-128-ECB
+    1.3.6.1.4.1.11591.13.2.2 Serpent-128-CBC
+    1.3.6.1.4.1.11591.13.2.3 Serpent-128-OFB
+    1.3.6.1.4.1.11591.13.2.4 Serpent-128-CFB
+    1.3.6.1.4.1.11591.13.2.21 Serpent-192-ECB
+    1.3.6.1.4.1.11591.13.2.22 Serpent-192-CBC
+    1.3.6.1.4.1.11591.13.2.23 Serpent-192-OFB
+    1.3.6.1.4.1.11591.13.2.24 Serpent-192-CFB
+    1.3.6.1.4.1.11591.13.2.41 Serpent-256-ECB
+    1.3.6.1.4.1.11591.13.2.42 Serpent-256-CBC
+    1.3.6.1.4.1.11591.13.2.43 Serpent-256-OFB
+    1.3.6.1.4.1.11591.13.2.44 Serpent-256-CFB
+
+1.3.6.1.4.1.11591.14 CRC algorithms
+  1.3.6.1.4.1.11591.14.1 CRC 32
+
+@c Added 2013-12-05 on request from Werner Koch <wk@gnupg.org>
+1.3.6.1.4.1.11591.15 ellipticCurve
+  1.3.6.1.4.1.11591.15.1 Ed25519
diff --git a/maintain.texi b/maintain.texi
index 3e264ef..99f4089 100644
--- a/maintain.texi
+++ b/maintain.texi
@@ -5,8 +5,9 @@
 @c For double-sided printing, uncomment:
 @c @setchapternewpage odd
 @c This date is automagically updated when you save this file:
-@set lastupdate January 27, 2010
+@set lastupdate February 26, 2022
 @c %**end of header
+@documentencoding UTF-8
 
 @dircategory GNU organization
 @direntry
@@ -23,17 +24,16 @@
 Information for maintainers of GNU software, 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 Free Software
-Foundation, Inc.
+2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2019, 2022
+Free Software Foundation, Inc.
 
-@quotation
 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, with no Front-Cover Texts, and with no Back-Cover
+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 quotation
 @end copying
 
 @titlepage
@@ -56,20 +56,28 @@ Texts.  A copy of the license is included in the section entitled
 
 @menu
 * Preface::
+* Getting Help::
+* GNU Accounts and Resources::
 * Stepping Down::
 * Recruiting Developers::
 * Legal Matters::
 * Clean Ups::
 * Platforms::
+* Patches Not to Accept::
 * Mail::
 * Old Versions::
 * Distributions::
 * Web Pages::
 * Ethical and Philosophical Consideration::
+* Humor::
+* Other Politics::
 * Terminology::
+* Interviews and Speeches::
 * Hosting::
+* Donations::
 * Free Software Directory::
 * Using the Proofreaders List::
+* Suggested Responses::
 * GNU Free Documentation License::
 * Index::
 @end menu
@@ -81,64 +89,138 @@ Texts.  A copy of the license is included in the section entitled
 This file contains guidelines and advice for someone who is the
 maintainer of a GNU program on behalf of the GNU Project.  Everyone is
 entitled to change and redistribute GNU software; you need not pay
-attention to this file to get permission.  But if you want to maintain a
-version for widespread distribution, we suggest you follow these
-guidelines.  If you would like to be a GNU maintainer, then it is
-essential to follow these guidelines.
+attention to this file to get permission.  But if you want to maintain
+a version for widespread distribution, we suggest you follow these
+guidelines.  If you are or would like to be a GNU maintainer, then it
+is essential to follow these guidelines.
 
 In addition to this document, please read and follow the GNU Coding
 Standards (@pxref{Top, , Contents, standards, GNU Coding Standards}).
+You may also usefully check the ``Tips for new GNU maintainers''
+(@url{https://www.gnu.org/software/maintainer-tips}), a list of the
+most important things you will need to do as a new maintainer.
+
+@cindex @code{bug-standards@@gnu.org} email address
+@cindex Savannah repository for @code{gnustandards}
+@cindex @code{gnustandards} project repository
+Please send corrections or suggestions for this document to
+@email{bug-standards@@gnu.org}.  If you make a suggestion, please
+include suggested new wording if you can.  We prefer a context diff to
+the Texinfo source, but if that's difficult for you, you can make a
+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}.
 
 @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{http://lists.gnu.org/mailman/listinfo/gnustandards-commit}.
+join the mailing list @code{gnustandards-commit@@gnu.org}, for
+instance via the web interface at
+@url{https://lists.gnu.org/mailman/listinfo/gnustandards-commit}.
 Archives are also available there.
 
-@cindex @code{maintainers@@gnu.org} email address
-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
-@file{maintain.texi} file, but if you don't have that file, you can
-make a context diff for some other version of this document, or
-propose it in any way that makes it clear.
+@cindex Piercy, Marge
+This document uses the gender-neutral third-person pronouns ``person''
+(which can be shortened to ``perse''), ``per'', ``pers'' and
+``perself.''  These pronouns (aside from ``perse'') were promoted, and
+perhaps invented, by Marge Piercy in @cite{Woman on the Edge of Time}.
+They are used just like ``she'', ``her'', ``hers'' and ``herself'',
+except that they apply regardless of gender.  For example, ``Person
+placed per new program under the GNU GPL, to maintain freedom for all
+users of per work, and this way perse knows perse has done the right
+thing.''
+
+This release of the GNU Maintainer Information was last updated
+@value{lastupdate}.
 
-@cindex @code{mentors@@gnu.org} mailing list
-If you have general questions or encounter a situation where it isn't
-clear what to do, you can ask @email{mentors@@gnu.org}, which is a
-list of a few experienced GNU contributors who have offered to answer
-questions for new maintainers.
+@node Getting Help
+@chapter Getting Help
+@cindex help, getting
 
+@cindex @code{mentors@@gnu.org} mailing list
+If you have any general questions or encounter a situation where it
+isn't clear how to get something done or who to ask, you (as a GNU
+contributor) can always write to @email{mentors@@gnu.org}, which is a
+list of a few experienced GNU folks who have volunteered to answer
+questions.  Any GNU-related question is fair game for the
+@code{mentors} list.
+
+@cindex advisory committee
+The GNU Advisory Committee helps to coordinate activities in the GNU
+project on behalf of RMS (Richard Stallman, the Chief GNUisance).  If
+you have any organizational questions or concerns you can contact the
+committee at @email{gnu-advisory@@gnu.org}.  See
+@url{https://www.gnu.org/contact/gnu-advisory.html} for the current
+committee members.  Additional information is in
+@file{/gd/gnuorg/advisory}.
+
+@cindex down, when GNU machines are
+@cindex outage, of GNU machines
+@cindex @url{https://hostux.social/@@fsfstatus}
+If you find that any GNU computer systems (@code{fencepost.gnu.org},
+@code{ftp.gnu.org}, @code{www.gnu.org}, @code{savannah.gnu.org},
+@dots{}) seem to be down, you can check the current status at
+@url{https://hostux.social/@@fsfstatus}.  Most likely the problem, if
+it can be alleviated at the FSF end, is already being worked on.
+
+@cindex sysadmin, FSF
+@cindex FSF system administrators
+@cindex GNU system administrators
+The FSF system administrators maintain the GNU network and server
+hardware.  You can email them at @email{sysadmin@@fsf.org}.  Please
+report any failures in GNU servers to them without delay.  Aside from
+that, please try not to burden them unnecessarily.
+
+@node GNU Accounts and Resources
+@chapter GNU Accounts and Resources
+@cindex shell account, on fencepost
+@cindex @code{fencepost.gnu.org} GNU login host
+@cindex resources for GNU developers
+@cindex development resources
+
+@c We want to repeat this text later, so define a macro.
+@macro gdgnuorgtext
 The directory @file{/gd/gnuorg} mentioned throughout this document is
-found on the GNU file server, currently @code{fencepost.gnu.org}; if
-you are the maintainer of a GNU package, you should have an account
-there.  See @url{http://www.gnu.org/software/README.accounts.html} if
-you don't have one.  (You can also ask for accounts for people who
-help you a large amount in working on the package.)
-
-If on occasion you find that any GNU computer systems
-(@code{fencepost.gnu.org}, @code{ftp.gnu.org},
-@code{savannah.gnu.org}, or others) seem to be down, you can check the
-current status at @url{http://identi.ca/group/fsfstatus}.  Most likely
-the problem, if it is at the FSF end, is already being worked on.
+available on the general GNU server, currently
+@code{fencepost.gnu.org}.  If you are the maintainer of a GNU package,
+you should have an account there.  If you don't have one already, see
+@url{https://www.gnu.org/software/README.accounts.html}.  Such GNU
+login accounts include email (see
+@url{https://www.fsf.org/about/systems/sending-mail-via-fencepost}).
 
-@cindex Piercy, Marge
-This document uses the gender-neutral third-person pronouns ``person'',
-``per'', ``pers'' and ``perself'' which were promoted, and perhaps
-invented, by Marge Piercy in @cite{Woman on the Edge of Time}.  They are
-used just like ``she'', ``her'', ``hers'' and ``herself'', except that
-they apply equally to males and females.  For example, ``Person placed
-per new program under the GNU GPL, to let the public benefit from per
-work, and to enable per to feel person has done the right thing.''
-
-This release of the GNU Maintenance Instructions was last updated
-@value{lastupdate}.
+You can request for accounts for people who significantly help you in
+working on the package; we will do this in special cases when there is
+a good reason.
+@end macro
+
+@gdgnuorgtext{}
+
+Other resources available to GNU maintainers are described at
+@url{https://www.gnu.org/software/devel.html}, as well as throughout
+this document.  In brief:
+
+@itemize @bullet
+@item Login accounts (see above).
+
+@item Version control (@pxref{Old Versions}).
+
+@item Mailing lists (@pxref{Mail}).
+
+@item Web pages (@pxref{Web Pages}).
+
+@item Mirrored release areas (@pxref{Distributions}).
+
+@cindex Hydra
+@cindex @code{platform-testers} mailing list
+@item Pre-release portability testing, both automated (via Hydra) and
+on request (via volunteers).
+
+@end itemize
 
 
 @node Stepping Down
 @chapter Stepping Down
+@cindex stepping down as maintainer
+@cindex resigning as maintainer
 
 With good fortune, you will continue maintaining your package for many
 decades.  But sometimes for various reasons maintainers decide to step
@@ -149,17 +231,17 @@ step down, please inform the GNU Project (@email{maintainers@@gnu.org}).
 We need to know that the package no longer has a maintainer, so we can
 look for and appoint a new maintainer.
 
+@cindex @email{maintainers@@gnu.org}
 If you have an idea for who should take over, please tell
 @email{maintainers@@gnu.org} your suggestion.  The appointment of a new
 maintainer needs the GNU Project's confirmation, but your judgment that
 a person is capable of doing the job will carry a lot of weight.
 
-As your final act as maintainer, it would be helpful to set up the
-package under @code{savannah.gnu.org} if it is not there already
-(@pxref{Old Versions}).  This will make it much easier for the new
-maintainer to pick up where you left off and will ensure that the
-source tree is not misplaced if it takes us a while to find a new
-maintainer.
+As your final act as maintainer, it would be helpful to set up or
+update the package under @code{savannah.gnu.org} (@pxref{Old
+Versions}).  This will make it much easier for the new maintainer to
+pick up where you left off and will ensure that the source tree is not
+misplaced if it takes us a while to find a new maintainer.
 
 
 @node Recruiting Developers
@@ -193,7 +275,7 @@ some of your developers as co-maintainers, please contact
 @email{maintainers@@gnu.org}.
 
 We're happy to acknowledge all major contributors to GNU packages on
-the @url{http://www.gnu.org/people/people.html} web page.  Please send
+the @url{https://www.gnu.org/people/people.html} web page.  Please send
 an entry for yourself to @email{webmasters@@gnu.org}, and feel free to
 suggest it to other significant developers on your package.
 
@@ -213,22 +295,41 @@ as you maintain the program, to avoid legal difficulties.
 * Copyright Notices::
 * License Notices::
 * External Libraries::
+* Crediting Authors::
 @end menu
 
 @node Copyright Papers
 @section Copyright Papers
 @cindex copyright papers
-
-If you maintain an FSF-copyrighted package
-certain legal procedures are required when incorporating legally significant
-changes written by other people.  This ensures that the FSF has the
-legal right to distribute the package, and the standing to defend its
-GPL-covered status in court if necessary.
-
-@strong{Before} incorporating significant changes, make sure that the
+@cindex assignments, copyright
+@cindex disclaimers
+
+If you maintain an FSF-copyrighted package, certain legal procedures
+are required when incorporating legally significant changes written by
+other people.  This ensures that the FSF has the legal right to
+distribute the package, and the standing to defend its GPL-covered
+status in court if necessary.
+
+GNU packages need not be FSF-copyrighted; this is up to the author(s),
+generally at the time the package is dubbed GNU@.  When copyright is
+assigned to the FSF, the FSF can act to stop GPL violations about the
+package.  Otherwise, legal actions are up to the author(s).  The rest
+of this section is about the case when a package is FSF-copyrighted.
+
+@emph{Before} incorporating significant changes, make sure that the
 person who wrote the changes has signed copyright papers and that the
-Free Software Foundation has received and signed them.  We may also need
-an employer's disclaimer from the person's employer.
+Free Software Foundation has received and signed them.  We may also
+need an employer's disclaimer from the person's employer, which
+confirms that the work was not part of the person's job and the
+employer makes no claim on it.  However, a copy of the person's
+employment contract, showing that the employer can't claim any rights
+to this work, is often sufficient.
+
+If the employer does claim the work was part of the person's job, and
+there is no clear basis to say that claim is invalid, then we have to
+consider it valid.  Then the person cannot assign copyright, but the
+employer can.  Many companies have done this.  Please ask the
+appropriate managers to contact @code{assign@@gnu.org}.
 
 @cindex data base of GNU copyright assignments
 To check whether papers have been received, look in
@@ -240,12 +341,7 @@ expected papers arrive.
 @cindex @file{/gd/gnuorg} directory
 @c This paragraph intentionally duplicates information given
 @c near the beginning of the file--to make sure people don't miss it.
-The directory @file{/gd/gnuorg} is found on the GNU machines,
-currently @code{fencepost.gnu.org}; if you are the maintainer of a GNU
-package, you should have an account on them.  Contact
-@email{accounts@@gnu.org} if you don't have one.  (You can also ask
-for accounts for people who help you a large amount in working on the
-package.)
+@gdgnuorgtext{}
 
 In order for the contributor to know person should sign papers, you need
 to ask per for the necessary papers.  If you don't know per well, and you
@@ -255,7 +351,7 @@ this:
 
 @quotation
 Would you be willing to assign the copyright to the Free Software
-Foundation, so that we could install it in @var{program}?
+Foundation, so that we could install it in @var{package}?
 @end quotation
 
 @noindent
@@ -263,10 +359,10 @@ or
 
 @quotation
 Would you be willing to sign a copyright disclaimer to put this change
-in the public domain, so that we can install it in @var{program}?
+in the public domain, so that we can install it in @var{package}?
 @end quotation
 
-If the contributor wants more information, you can send per
+If the contributor then wants more information, you can send per the file
 @file{/gd/gnuorg/conditions.text}, which explains per options (assign
 vs.@: disclaim) and their consequences.
 
@@ -274,7 +370,7 @@ Once the conversation is under way and the contributor is ready for
 more details, you should send one of the templates that are found in
 the directory @file{/gd/gnuorg/Copyright/}; they are also available
 from the @file{doc/Copyright/} directory of the @code{gnulib} project
-at @url{http://savannah.gnu.org/projects/gnulib}.  This section
+at @url{https://savannah.gnu.org/projects/gnulib}.  This section
 explains which templates you should use in which circumstances.
 @strong{Please don't use any of the templates except for those listed
 here, and please don't change the wording.}
@@ -303,10 +399,21 @@ file gives per instructions for how to ask the FSF to mail per the
 papers to sign.  The @file{request-} file also raises the issue of
 getting an employer's disclaimer from the contributor's employer.
 
-When the contributor emails the form to the FSF, the FSF sends per
-papers to sign.  If person signs them right away, the whole process
-takes about two weeks--mostly waiting for letters to go back and
-forth.
+When the contributor emails the form to the FSF, the FSF sends per an
+electronic (usually PDF) copy of the assignment.  This, or whatever
+response is required, should happen within five business days of the
+initial request.  If no reply from the FSF comes after that time,
+please send a reminder.  If there is still no response after an
+additional week, please write to @email{maintainers@@gnu.org} about it.
+
+After receiving the necessary form, the contributor needs to sign
+it. Contributors residing in the USA or Italy may use GPG in order to
+sign their assignment. Contributors located anywhere else can print,
+sign, and then email (or fax) a scanned copy back to the
+FSF@. (Specific instructions for both cases are sent with the
+assignment form.) They may use postal mail, if they prefer. To
+emphasize, the necessary distinction is between residents and
+non-residents of these countries; citizenship does not matter. 
 
 For less common cases, we have template files you should send to the
 contributor.  Be sure to fill in the name of the person and the name
@@ -329,9 +436,9 @@ changes to a manual, you can use @file{assign.future.manual}.
 For a translation of a manual, use @file{assign.translation.manual}.
 
 For translations of program strings (as used by GNU Gettext, for
-example; @pxref{Internationalization,,,standards,GNU Coding
+example; @pxref{Internationalization,,, standards, GNU Coding
 Standards}), use @file{disclaim.translation}.  If you make use of the
-Translation Project (@url{http://translationproject.org}) facilities,
+Translation Project (@url{https://translationproject.org}) facilities,
 please check with the TP coordinators that they have sent the
 contributor the papers; if they haven't, then you should send the
 papers.  In any case, you should wait for the confirmation from the
@@ -353,6 +460,18 @@ an assignment for a new separate program or manual, unless it is quite
 small, but a disclaimer is acceptable if the contributor insists on
 handling the matter that way.
 
+When a copyright holder has signed an assignment for all future
+changes to the package, and contributes a change made up of new files
+which require no change to any of the old files, we want to avoid any
+uncertainty about whether these files are intended as a change to the
+package and thus covered by that assignment.  The way to do this is to
+ask the contributor to say so in a message to you --- for instance,
+``My modules `frog' and `kangaroo' are intended as changes to the
+program Hoppers.''  Forward the message to @email{assign@@gnu.org},
+who will save it permanently.  A variation on this procedure: the
+contributor who wrote the new files can send copies of the new files
+which contain such a message.
+
 If a contributor wants the FSF to publish only a pseudonym, that is
 ok.  The contributor should say this, and state the desired pseudonym,
 when answering the @file{request-} form.  The actual legal papers will
@@ -446,7 +565,7 @@ These records don't need to be as detailed as a change log.  They
 don't need to distinguish work done at different times, only different
 people.  They don't need describe changes in more detail than which
 files or parts of a file were changed.  And they don't need to say
-anything about the function or purpose of a file or change--the
+anything about the function or purpose of a file or change---the
 Register of Copyrights doesn't care what the text does, just who wrote
 or contributed to which parts.
 
@@ -482,9 +601,29 @@ trivial to matter for copyright purposes.  Later on you can update the
 automatically, if you are careful about the formatting of the change
 log entries.
 
+It is ok to include other email addresses, names, and program
+information in @file{AUTHORS}, such as bug-reporting information.
+@xref{Standard Mailing Lists}.
+
+
 @node Copying from Other Packages
 @section Copying from Other Packages
 
+This section explains legal considerations when merging code from
+other packages into your package.  Using an entire module as a whole,
+and maintaining its separate identity, is a different issue;
+see @ref{External Libraries}.
+
+@menu
+* Non-FSF-Copyrighted Package::
+* FSF-Copyrighted Package::
+@end menu
+
+@node Non-FSF-Copyrighted Package
+@subsection Non-FSF-Copyrighted Package
+
+Here we suppose that your package is not FSF-copyrighted.
+
 When you copy legally significant code from another free software
 package with a GPL-compatible license, you should look in the
 package's records to find out the authors of the part you are copying,
@@ -492,12 +631,11 @@ and list them as the contributors of the code that you copied.  If all
 you did was copy it, not write it, then for copyright purposes you are
 @emph{not} one of the contributors of @emph{this} code.
 
-Especially when code has been released into the public domain, authors
-sometimes fail to write a license statement in each file.  In this
-case, please first be sure that all the authors of the code have
-disclaimed copyright interest.  Then, when copying the new files into
-your project, add a brief note at the beginning of the files recording
-the authors, the public domain status, and anything else relevant.
+If the code is supposed to be in the public domain, make sure that is
+really true: that all the authors of the code have disclaimed
+copyright interest.  Then, when copying the new files into your
+project, add a brief note at the beginning of the files recording the
+authors, the public domain status, and anything else relevant.
 
 On the other hand, when merging some public domain code into an
 existing file covered by the GPL (or LGPL or other free software
@@ -505,13 +643,18 @@ license), there is no reason to indicate the pieces which are public
 domain.  The notice saying that the whole file is under the GPL (or
 other license) is legally sufficient.
 
-Using code that is released under a GPL-compatible free license,
-rather than being in the public domain, may require preserving
-copyright notices or other steps.  Of course, you should do what is
-needed.
+Using code that is not in the public domain, but rather released under
+a GPL-compatible free license, may require preserving copyright
+notices or other steps.  Of course, you should follow the requirements
+stated.
+
+@node FSF-Copyrighted Package
+@subsection FSF-Copyrighted Package
+
+If you are maintaining an FSF-copyrighted package, please don't copy
+in any code without verifying first that we have suitable legal papers
+for that code.
 
-If you are maintaining an FSF-copyrighted package, please verify we
-have papers for the code you are copying, @emph{before} copying it.
 If you are copying from another FSF-copyrighted package, then we
 presumably have papers for that package's own code, but you must check
 whether the code you are copying is part of an external library; if
@@ -592,8 +735,11 @@ domain, if the movie companies don't continue buying laws to further
 extend copyright.  If you copy a file into the package from some other
 program, keep the copyright years that come with the file.
 
-Do not abbreviate the year list using a range; for instance, do not
-write @samp{1996--1998}; instead, write @samp{1996, 1997, 1998}.
+You can use a range (@samp{2008-2010}) instead of listing individual
+years (@samp{2008, 2009, 2010}) if and only if: 1)@tie{}every year in
+the range, inclusive, really is a ``copyrightable'' year that would be
+listed individually; @emph{and} 2)@tie{}you make an explicit statement
+in a @file{README} file about this usage.
 
 For files which are regularly copied from another project (such as
 @samp{gnulib}), leave the copyright notice as it is in the original.
@@ -636,7 +782,7 @@ is optional.
 
 Every nontrivial file needs a license notice as well as the copyright
 notice.  (Without a license notice giving permission to copy and
-change the file, the file is non-free.)
+change the file, the file is nonfree.)
 
 The package itself should contain a full copy of GPL in plain text
 (conventionally in a file named @file{COPYING}) and the GNU Free
@@ -646,17 +792,74 @@ any files distributed under the Lesser GPL, it should contain a full
 copy of its plain text version also (conventionally in a file named
 @file{COPYING.LESSER}).
 
-If you have questions about license issues for your GNU package,
+If you have questions about licensing issues for your GNU package,
 please write @email{licensing@@gnu.org}.
 
 @menu
-* Source: Canonical License Sources.
-* Code: License Notices for Code.
+* Which:         Licensing of GNU Packages.
+* Canonical:     Canonical License Sources.
+* Code:          License Notices for Code.
 * Documentation: License Notices for Documentation.
-* Other: License Notices for Other Files.
+* Examples:      License Notices for Code Examples.
+* Other:         License Notices for Other Files.
 @end menu
 
 
+@node Licensing of GNU Packages
+@subsection Licensing of GNU Packages
+
+Normally, GNU packages should use the latest version of the GNU GPL,
+with the ``or any later version'' formulation.  @xref{License Notices
+for Code}, for the exact wording of the license notice.
+
+Occasionally, a GNU library may provide functionality which is already
+widely available to proprietary programs through alternative
+implementations; for example, the GNU C Library.  In such cases, the
+Lesser GPL should be used (again, for the notice wording,
+@pxref{License Notices for Code}).  If a GNU library provides unique
+functionality, however, the GNU GPL should be used.
+@url{https://www.gnu.org/licenses/why-not-lgpl.html} discusses this
+strategic choice.
+
+Some of these libraries need to work with programs released under
+GPLv2-only; that is, which allow the GNU GPL version 2 but not later
+versions.  In this case, the GNU package should be released under a
+dual license: GNU GPL version 2 (or any later version) and the GNU
+Lesser GPL version 3 (or any later version).  Here is the notice for
+that case:
+
+@smallexample
+This file is part of GNU @var{package}.
+
+GNU @var{package} is free software: you can redistribute it and/or
+modify it under the terms of either:
+
+  * the GNU Lesser General Public License as published by the Free
+    Software Foundation; either version 3 of the License, or (at your
+    option) any later version.
+
+or
+
+  * the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your
+    option) any later version.
+
+or both in parallel, as here.
+
+GNU @var{package} is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE@.  See the GNU
+General Public License for more details.
+
+You should have received copies of the GNU General Public License and
+the GNU Lesser General Public License along with this program.  If
+not, see @url{https://www.gnu.org/licenses/}.
+@end smallexample
+
+For small packages, you can use ``This program'' instead of ``GNU
+@var{package}''.
+
+
 @node Canonical License Sources
 @subsection Canonical License Sources
 
@@ -665,19 +868,19 @@ You can use whichever is the most convenient for you.
 
 @itemize @bullet
 @item
-@uref{http://www.gnu.org/licenses/}.
+@uref{https://www.gnu.org/licenses/}.
 
 @item
 The @code{gnulib} project on @code{savannah.gnu.org}, which you
-can access via anonymous Git or CVS.  See
-@uref{http://savannah.gnu.org/projects/gnulib}.
+can access via anonymous Git or CVS@.  See
+@uref{https://savannah.gnu.org/projects/gnulib}.
 
 @end itemize
 
 The official Texinfo sources for the licenses are also available in
 those same places, so you can include them in your documentation.  A
 GFDL-covered manual should include the GFDL in this way.  @xref{GNU
-Sample Texts,,,texinfo,Texinfo}, for a full example in a Texinfo
+Sample Texts,,, texinfo, Texinfo}, for a full example in a Texinfo
 manual.
 
 
@@ -688,20 +891,20 @@ Typically the license notice for program files (including build scripts,
 configure files and makefiles) should cite the GPL, like this:
 
 @quotation
-This file is part of GNU @var{program}.
+This file is part of GNU @var{package}.
 
-GNU @var{program} is free software: you can redistribute it and/or
+GNU @var{package} is free software: you can redistribute it and/or
 modify it under the terms of the GNU General Public License as
 published by the Free Software Foundation, either version 3 of the
 License, or (at your option) any later version.
 
-GNU @var{program} is distributed in the hope that it will be useful,
+GNU @var{package} is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE@.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with this program.  If not, see @url{http://www.gnu.org/licenses/}.
+along with this program.  If not, see @url{https://www.gnu.org/licenses/}.
 @end quotation
 
 But in a small program which is just a few files, you can use
@@ -715,13 +918,19 @@ the Free Software Foundation; either version 3 of the License, or
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE@.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with this program.  If not, see @url{http://www.gnu.org/licenses/}.
+along with this program.  If not, see @url{https://www.gnu.org/licenses/}.
 @end quotation
 
+In either case, for those few packages which use the Lesser GPL
+(@pxref{Licensing of GNU Packages}), insert the word ``Lesser'' before
+``General'' in @emph{all three} places.
+@url{https://@/www.gnu.org/@/licenses/@/gpl-howto.html} discusses application
+the GPL in more detail.
+
 
 @node License Notices for Documentation
 @subsection License Notices for Documentation
@@ -753,13 +962,18 @@ name.
 Please adjust the list of invariant sections as appropriate for your
 manual.  If there are none, then say ``with no Invariant Sections''.
 If your manual is not published by the FSF, and under 400 pages, you
-can omit both cover texts.
+can omit both cover texts.  However, if it is copyright FSF, always
+ask the FSF what to do.
 
-@xref{GNU Sample Texts,,,texinfo,Texinfo}, for a full example in a
+@xref{GNU Sample Texts,,, texinfo, Texinfo}, for a full example in a
 Texinfo manual, and see
-@url{http://www.gnu.org/licenses/fdl-howto.html} for more advice about
+@url{https://www.gnu.org/licenses/fdl-howto.html} for more advice about
 how to use the GNU FDL.
 
+If you write a manual that people might want to buy on paper, please
+write to @email{maintainers@@gnu.org} to tell the FSF about it.  We
+might want to publish it.
+
 If the manual is over 400 pages, or if the FSF thinks it might be a
 good choice for publishing on paper, then please include the GNU GPL,
 as in the notice above.  Please also include our standard invariant
@@ -773,7 +987,20 @@ section@tie{}6).  However, the printed (@samp{.dvi}, @samp{.pdf},
 set up to be printed and published only together.  Therefore, it is
 usually simplest to include the GFDL in each manual.
 
+@node License Notices for Code Examples
+@subsection License Notices for Code Examples
 
+When a code example in documentation is more than two or three lines,
+and specific enough that people might want to copy and adapt it, we
+suggest putting a copy of the example in a file of code and releasing
+that under some free software license.  That means it will be
+released under two different licenses: in the manual under the GFDL,
+and in the code example file under a software license.
+
+If the example is important and nontrivial, and 40 lines or more, we
+suggest releasing the code copy under the same license as the program
+it pertains to.  Otherwise, we recommend releasing it under the X11 license.
+ 
 @node License Notices for Other Files
 @subsection License Notices for Other Files
 
@@ -797,48 +1024,87 @@ used (hence distributed) by third-party packages under possibly
 incompatible licenses, you may also use the above all-permissive
 license for these macros.
 
+These kinds of files can also be put in the public domain.  If
+publishing in the US, it is enough to insert a notice saying so.
+Otherwise, use Creative Commons's CC0---See
+@url{https://creativecommons.org/choose/zero/}.
 
 @node External Libraries
 @section External Libraries
 
-When maintaining an FSF-copyrighted GNU package, you may occasionally
-want to use a general-purpose free software module which offers a
-useful functionality, as a ``library'' facility (though the module is
-not always packaged technically as a library).
-
-In a case like this, it would be unreasonable to ask the author of that
-module to assign the copyright to the FSF.  After all, person did not
-write it specifically as a contribution to your package, so it would be
-impertinent to ask per, out of the blue, ``Please give the FSF your
-copyright.''
-
-So the thing to do in this case is to make your program use the module,
-but not consider it a part of your program.  There are two reasonable
-methods of doing this:
+As maintainer of an FSF-copyrighted GNU package, how do you use
+separately-published general-purpose free modules?  (We also call them
+``libraries'' because we are using them as libraries; it doesn't
+matter whether they are packaged as libraries or not.)
+
+It would be unreasonable to ask their authors to assign copyright to
+the FSF@.  They didn't write those modules as contributions to GNU@.  We
+just happen to want to use them, as any developer might.  It would be
+rude to ask developers, out of the blue, to give the FSF their
+copyright.  Please don't ask for that in cases like these.
+
+The proper way to use those modules is to link your package with them
+and say they are @emph{not} part of your package.  See below for the
+mechanics of this.
+
+To avoid present or future legal trouble, you must make sure the
+license of the module is compatible with current @emph{and future} GPL
+versions.  ``GNU GPL version 3 or later'' is good, and so is anything
+which includes permission for use under those GPL versions (including
+``GNU GPL version 2 or later'', ``LGPL version @var{n} or later'',
+``LGPL version 2.1'', ``GNU Affero GPL version 3 or later'').  Lax
+permissive licenses are ok too, since they are compatible with all GPL
+versions.
+
+``GPL version 2 only'' is obviously unacceptable because it is
+incompatible with GPL version 3.  ``GPL version 3 only'' and ``GPL
+version 2 or 3 only'' have a subtler problem: they would be incompatible
+with GPL version 4, if we ever make one, so the module would become an
+obstacle to upgrading your package's license to ``GPL version 4 or
+later''.  Don't use such modules.
+
+One library you need to avoid is @code{goffice}, since it allows only
+GPL versions 2 and 3.
+
+So, here are the mechanics of how to arrange your package to use the
+unrelated free module.
 
 @enumerate
 @item
-Assume the module is already installed on the system, and use it when
-linking your program.  This is only reasonable if the module really has
-the form of a library.
+Assume the module is already installed on the system, and link with it
+when linking your program.  This is only reasonable if the module
+really has the form of a library.
 
 @item
-Include the module in your package, putting the source in a separate
-subdirectory whose @file{README} file says, ``This is not part of the
-GNU FOO program, but is used with GNU FOO.''  Then set up your makefiles
-to build this module and link it into the executable.
-
-For this method, it is not necessary to treat the module as a library
-and make a @samp{.a} file from it.  You can link with the @samp{.o}
-files directly in the usual manner.
+Include the module in your package's distribution, putting the source
+in a separate subdirectory whose @file{README} file says, ``This is
+not part of the GNU FOO program, but is used with GNU FOO.''  Then set
+up your makefiles to build this module and link it into the
+executable.
+
+With this method, it is not necessary to treat the module as a library
+and make a @samp{.a} file from it.  You can link directly with the
+@samp{.o} files in the usual manner.
 @end enumerate
 
-Both of these methods create an irregularity, and our lawyers have told
-us to minimize the amount of such irregularity.  So consider using these
-methods only for general-purpose modules that were written for other
-programs and released separately for general use.  For anything that was
-written as a contribution to your package, please get papers signed.
+Both of these methods create an irregularity, and our lawyers have
+told us to minimize the amount of such irregularity.  So use these
+methods only for general-purpose modules that were @emph{not} written
+for your package.  For anything that was written as a contribution to
+your package, please get papers signed.
+
+@node Crediting Authors
+@section Crediting Authors
+@cindex crediting authors
 
+Strictly speaking, this is not a legal issue, but it seems to belong
+with copyright notices.
+
+In any FSF-copyrighted GNU package, the authors of a file are not
+named in the copyright notice.  Therefore, it is nice to include a
+comment line @samp{Authors: @var{authors of this file}} at the top
+near the copyright notice, to give them credit in close association
+with their contribution.
 
 @node Clean Ups
 @chapter Cleaning Up Changes
@@ -874,41 +1140,47 @@ coding standards for Emacs Lisp programs; it is good to urge Lisp authors to
 read it (@pxref{Tips, , Tips and Conventions, elisp, The GNU Emacs Lisp
 Reference Manual}).
 
-
 @node Platforms
 @chapter Platforms to Support
 
-Most GNU packages run on a wide range of platforms.  These platforms are
-not equally important.
+Most GNU packages run on a wide range of platforms.  These platforms
+are not equally important.  The most important platforms for a GNU
+package to support are the free variants of the GNU operating system,
+regardless of which kernel it uses.
+
+The GNU Project's practical work is developing the GNU operating
+system; a GNU package should make the whole GNU system more powerful
+and encourage people to switch to that system.
+
+Please keep those goals in mind in your work.  For instance, every new
+feature you add should work on GNU.  If a new feature runs only on GNU
+(for instance, on GNU/Linux), it is acceptable.  However, a feature
+that runs only on other systems, and not on GNU, would undermine the
+goal.
 
-The most important platforms for a GNU package to support are GNU and
-GNU/Linux.  Developing the GNU operating system is the whole point of
-the GNU Project; a GNU package exists to make the whole GNU system more
-powerful.  So please keep that goal in mind and let it shape your work.
-For instance, every new feature you add should work on GNU, and
-GNU/Linux if possible too.  If a new feature only runs on GNU and
-GNU/Linux, it could still be acceptable.  However, a feature that runs
-only on other systems and not on GNU or GNU/Linux makes no sense in a
-GNU package.
+Therefore, please say no when asked to implement such a feature,
+citing these reasons, and ask the contributors to implement the
+feature for the GNU system as well.  @xref{Patches Not to Accept}.
 
 You will naturally want to keep the program running on all the platforms
 it supports.  But you personally will not have access to most of these
-platforms--so how should you do it?
-
-Don't worry about trying to get access to all of these platforms.  Even
-if you did have access to all the platforms, it would be inefficient for
-you to test the program on each platform yourself.  Instead, you should
-test the program on a few platforms, including GNU or GNU/Linux, and let
-the users test it on the other platforms.  You can do this through a
-pretest phase before the real release; when there is no reason to expect
-problems, in a package that is mostly portable, you can just make a
-release and let the users tell you if anything unportable was
-introduced.
+platforms---so how should you handle them?
+
+Don't worry about trying to get access to all of these platforms.
+Even if you did have access to all of them, it would be inefficient
+for you to test the program on each platform yourself.  Instead, you
+should test the program on a few platforms, including some free
+variants of GNU, and let the users test it on the other platforms.
+You can do this through a pretest phase before the real release; when
+there is no reason to expect problems, especially in a package that is
+mostly portable, you can just make a release and let the users tell
+you if anything unportable was introduced.
 
 It is important to test the program personally on GNU or GNU/Linux,
 because these are the most important platforms for a GNU package.  If
-you don't have access to one of these platforms, please ask
-@email{maintainers@@gnu.org} to help you out.
+you don't have access to one of these platforms, as a GNU maintainer
+you can get access to the general GNU login machine; see
+@url{https://www.gnu.org/software/README.accounts.html}.
 
 Supporting other platforms is optional---we do it when that seems like
 a good idea, but we don't consider it obligatory.  If the users don't
@@ -919,56 +1191,324 @@ install them, but you don't have to.  If you feel the changes are
 complex and ugly, if you think that they will increase the burden of
 future maintenance, you can and should reject them.  This includes
 both free or mainly-free platforms such as OpenBSD, FreeBSD, and
-NetBSD, and non-free platforms such as Windows.
+NetBSD, and nonfree platforms such as Windows.
+
+@node Patches Not to Accept
+@chapter Patches Not to Accept
+
+Maintaining a program includes receiving suggested patches from users
+and deciding which of them to install.  For the most part that is a
+matter of technical benefits and drawbacks, which you as maintainer
+will weigh and judge.
+
+However, there are certain patches which have fundamental moral
+problems, so you should not accept them unless/until those problems
+are fixed.
+
+@menu
+* Non-GNU-only Features::    Every feature in a GNU package should work on GNU.
+* Interoperation with Nonfree::    Don't interoperate better with nonfree
+                                    than with free software.
+* Uninstalled Code in Repo:: Putting code in the package repo without
+                               installing it.
+@end menu
+
+@node Non-GNU-only Features
+@section Don't Install a Feature Till It Works on GNU
+
+Please @emph{don't} write or install code for features that would have
+worse or less functionality (or none) on the GNU system than on some
+non-GNU systems.
+
+The primary purpose of any GNU program is to enhance the capability of
+the GNU system to give users freedom, so every feature of a GNU
+package should be usable and useful on free distributions of the GNU
+operating system (@uref{https://www.gnu.org/distros/}).  For this
+purpose, a ``feature'' is an operation which does something
+substantially useful for the user and not the technical details of an
+implementation.  We explain this point further below.
+
+A feature that functions only on, or functions better on, some non-GNU
+operating system would undermine that primary purpose; worse, it would
+promote that non-GNU system at the expense of GNU.  Such a situation
+would work directly against the goal of liberating users from those
+systems, even though installing features that create such a situation
+would be seen as desirable in terms of the ``open source'' philosophy.
+
+Since freedom in use of computing is the overall purpose, we need to
+aim clearly for that freedom.  We need to show with our practical
+decisions---and with our explanations of them---that we're working for
+something deeper and more important than ``better software'' and
+``more convenience.''  That will give users a chance to reflect about
+our reasons for taking a path different from what most programmers
+would do.  See
+@uref{https://www.gnu.org/philosophy/open-source-misses-the-point.html}.
+
+Therefore, when you as a GNU maintainer receive contributions of
+features that do not work on the GNU system, please explain this rule
+and why it is necessary.  Explain that we need all features in GNU
+packages to work properly on the GNU system, so that they potentiate
+each other and make the GNU system better.  Thus, the change should
+not be installed in its present form.
+
+That doesn't mean the change can't be installed @emph{ever}.  It could
+be installed later, if and when equally good support on the GNU system
+for the same feature can be installed at the same time.  Explaining
+this is a good opportunity to ask people to help write the code to
+support the feature on GNU.  Also inform the contributor about
+resources to learn about how to support this feature on GNU, so perse
+could consider doing that job---or recruiting others to help.
+
+If parts of the code are system-independent, and will do part of the
+job of supporting the feature on the GNU system, you can install them
+right away.  Or you can put them in the package repo without actually
+installing them, in a @samp{wip-@var{name}} branch.  Having them in
+the repository may help and encourage people to finish implementing
+the feature on GNU.
+
+If you think it is very important, you can implement the support for
+that feature on the GNU system yourself.  If you think it is highly
+desirable to have that feature on GNU someday, you can make special
+arrangements to put the non-GNU system-specific code in the package
+repo but not install it---see @ref{Uninstalled Code in Repo}.
+
+It is ok to implement or support a feature for non-GNU systems if the
+feature works at least as well on GNU, even if it is implemented
+differently on different systems, uses different system facilities in
+its implementation, or looks different to the user in some details.
+It is ok to implement those little details, on each system, in the way
+that is convenient or conventional for making the features work.  The
+point is that the program and the feature should ``run best on GNU.''
+
+If system facilities on some other system provide, without any special
+application code, a feature not available on GNU, there is no need
+to do work to prevent it from functioning.  In that case, we should
+work to implement that feature in GNU.
+
+We don't consider the little details of interfaces to control or
+configure specific operations, or details of implementing operations,
+as ``features.''  Likewise, a system facility (including libraries
+that come with the system) is a means for implementing features but
+use of the facility is not in itself a feature.
+
+For instance, a programming platform often offers an interface to
+control the computer or the operating system at a low level.  It is OK
+to support the feature of low-level control on a non-GNU system
+provided the package supports the same capabilities on the GNU system
+also, even if the details of how to invoke the feature vary from
+system to system.  But do undertake to make the invocation of this
+feature consistent across systems, for the specific actions that are
+supported on multiple systems.
+
+Features mainly for communicating with other users' computers, or
+between computers not set up for tightly-coupled use as a group, are a
+different matter entirely.  A communication feature is truly ``the
+same feature'' as on GNU only if it interoperates with a free distribution
+of the GNU system---as, for instance, TCP/IP does.  Unportable,
+system-specific communication facilities for non-GNU systems are abuse
+of the community, so don't install support for them.  This point also
+applies to file formats used for communication between programs, if
+there is ever an occasion to move those files between unrelated
+computers.  (Exception: it is admirable to write code to extract the user's
+data from such a file, if you can do it.)
+
+Finally, please be careful not to let installing or supporting
+system-specific code for non-GNU systems consume much of your own
+time.  @xref{System Portability, GNU Coding Standards, , standards,
+GNU Coding Standards}.
+
+Suppose people ask for support for feature F on some non-GNU system,
+and feature F does work on GNU.  You can say yes if you wish, but you
+have no obligation to write or maintain that code.  You can tell them
+that it's their responsibility to write it and maintain it.  If they
+write good clean code for it, you can approve its installation, but
+that doesn't mean you or anyone else is obliged to support it.  If
+someday the code suffers from bitrot, you can delete it if users don't
+fix it.
+
+@xref{Suggested Responses}, for some text you can use or adapt, if you
+like, to say no to these patches.  It aims to invite them to support
+the GNU system equally well in the new feature.  If there is no hope
+of that, just ``No thanks'' is enough.
+
+@node Interoperation with Nonfree
+@section Interoperation with Nonfree Applications
+
+It is quite usual to implement features in GNU programs to make them
+work conveniently with widely used nonfree tools and applications.
+But there are situations where you should not implement cooperation
+with a nonfree program, which we can refer to here as ShackleMe.
+
+@itemize @bullet
+@item
+If ShackleMe is not well-known, reject the idea.  GNU packages should
+not even @emph{mention} an obscure nonfree program
+(@pxref{References,,, standards, GNU Coding Standards}).
+
+@item
+If ShackleMe imposes something particularly nasty or dangerous, such
+as effective DRM or monopolistic file formats, you should refuse to
+give it any specific support.  But don't cripple general features so
+that they refuse to work with ShackleMe; that would be excessive.  It
+is ok to write code to extract the user's data from such files, if
+that is possible.
+
+@item
+If ShackleMe does not run on the GNU operating system, and there is no
+comparable free program that people could use on the GNU system to do
+the same job, special support for ShackleMe would be a feature that
+works on non-GNU systems only.  Thus, you should refuse to support it.
+@xref{Non-GNU-only Features}.
+
+@item
+If ShackleMe runs on GNU systems also, you can include support for it
+if you wish, but you don't have an obligation to include that, let
+alone ever to @emph{run} it.  If you do include support for it, make
+sure the support for communicating with it works as well on the GNU
+system as it does on non-GNU systems.
+
+@item
+If there are free programs that can replace ShackleMe, or try to, make
+sure your program works with them as well as it is reported to work
+with ShackleMe, or better.
+
+@item
+You never have an obligation to write, install or maintain any sort of
+support for a nonfree program.  If it is unmaintained and breaks, and
+nobody else wants to maintain it you can delete it.  Don't feel
+trapped into working on it!
+@end itemize
+
+@xref{Suggested Responses}, for text you can use, if you wish, to
+state your refusal to support ShackleMe without equally good support
+for ShackleMe's free competitors.  Its purpose is to invite the
+contributors to support those.  You can modify it as needed to fit the
+situation.
 
+@node Uninstalled Code in Repo
+@section Uninstalled Code in Repo
+
+When you want to put system-dependent code for a non-GNU feature into
+the package repository, without actually installing it, you need to make
+special arrangements with the GNU Project.
+
+To do that, you write to @email{maintainers@@gnu.org} and explain the
+feature, its dependance on some other system, and the obstacle that
+has prevented supporting it on GNU.  They will make sure you
+understand the situation and the arrangements, and get your commitment
+to make the branch fade away later, in the proper way, if the feature
+goes unfinished.
+
+Practically speaking, these special arrangements mean you put the code
+in the package repository in a @dfn{discouraged branch} to show it is
+@emph{not} installed, that you have no commitment to finish it, and
+that it might fade away.  Name the branch
+@samp{ungnu-temp/@var{name}}.  (If that name doesn't fit with the
+version control system you use, we will work out a solution.)
+
+Put in the branch a @file{README} file saying this:
+
+@smallexample
+This code partially implements the @var{what is it} feature.  We can't
+install it now because it needs to be finished, so that it runs on the
+GNU system.
+
+We invite you to write the missing code to implement this feature on
+GNU, so we can install the feature.  Until then, this branch must not
+be merged into any branch that might ever be released.
+
+See the section "Don't Install a Feature Until It Works on GNU", in the
+GNU Maintainer's Guide, for explanation of the reasons for this.
+@end smallexample
+
+The discouraged branch ``fades away'' because you don't merge in
+changes from the program's trunk of development.  If the branch gets
+too obsolete to work at all, you simply delete it.
 
 @node Mail
 @chapter Dealing With Mail
-@cindex bug reports
+@cindex email
+
+This chapter describes setting up mailing lists for your package, and
+gives advice on how to handle bug reports and random requests once you
+have them.
+
+@menu
+* Standard Mailing Lists::  @samp{bug-pkg@@gnu.org} and other standard names.
+* Creating Mailing Lists::  The best way is to use Savannah.
+* Replying to Mail::        Advice on replying to incoming mail.
+@end menu
+
+
+@node Standard Mailing Lists
+@section Standard Mailing Lists
+
+@cindex standard mailing lists
+@cindex mailing lists, standard names of
 
-@cindex email, for receiving bug reports
 @cindex mailing list for bug reports
 Once a program is in use, you will get bug reports for it.  Most GNU
 programs have their own special lists for sending bug reports.  The
 advertised bug-reporting email address should always be
-@samp{bug-@var{program}@@gnu.org}, to help show users that the program
+@samp{bug-@var{package}@@gnu.org}, to help show users that the program
 is a GNU package, but it is ok to set up that list to forward to another
-site for further forwarding.  The package distribution should state the
-name of the bug-reporting list in a prominent place, and ask users to
-help us by reporting bugs there.
+site if you prefer.
 
+@cindex @email{bug-gnu-utils@@gnu.org}
 We also have a catch-all list, @email{bug-gnu-utils@@gnu.org}, which is
 used for all GNU programs that don't have their own specific lists.  But
 nowadays we want to give each program its own bug-reporting list and
 move away from using @email{bug-gnu-utils}.
 
-If you wish, you can also have mailing lists such as
-@samp{info-@var{program}} for announcements (@pxref{Announcements}),
-@samp{help-@var{program}} for general help and discussion (see below),
-or any others you find useful.
-
-By far the easiest way to create mailing lists is through
-@code{savannah.gnu.org}.  Once you register your program, you can do
-this yourself through the `Mailing Lists' menu, without needing
-intervention by anyone else.  Furthermore, lists created through
-Savannah will have a reasonable default configuration for antispam
-purposes (see below).
-
-If you are the maintainer of a GNU package, you should have an account
-on the GNU servers; contact
-@url{http://www.gnu.org/software/README.accounts.html} if you don't
-have one.  (You can also ask for accounts for people who help you a
-large amount in working on the package.)  With this account, you can
-edit @file{/com/mailer/aliases} to create a new unmanaged list or add
-yourself to an existing unmanaged list.  A comment near the beginning
-of that file explains how to create a Mailman-managed mailing list.
-
-But if you don't want to learn how to do those things, you can
-alternatively ask @email{alias-file@@gnu.org} to add you to the
-bug-reporting list for your program.  To set up a new list, contact
-@email{new-mailing-list@@gnu.org}.  You can subscribe to a list managed
-by Mailman by sending mail to the corresponding @samp{-request} address.
+@xref{Replying to Mail}, for more about handling and tracking bug
+reports.
 
+@cindex help for users, mailing list for
+Some GNU programs with many users have a help list,
+@samp{help-@var{package}@@gnu.org}, for people to ask other users for
+help.  If your program has many users, you should create such a list
+for it.  For a fairly new program, which doesn't have a large user
+base yet, it is better not to bother with this.
+
+@cindex announcements, mailing list for
+If you wish, you can also have a mailing list
+@samp{info-@var{package}@@gnu.org} for announcements
+(@pxref{Announcements}).  Any other mailing lists you find useful can
+also be created.
+
+The package distribution should state the name of all the package's
+mailing lists in a prominent place, and ask users to help us by
+reporting bugs appropriately.  The top-level @file{README} file and/or
+@file{AUTHORS} file are good places.  Mailing list information should
+also be included in the manual and the package web pages (@pxref{Web
+Pages}).
+
+
+
+@node Creating Mailing Lists
+@section Creating Mailing Lists
+
+@cindex creating mailing lists
+@cindex mailing lists, creating
+
+Using the web interface on @code{savannah.gnu.org} is by far the
+easiest way to create normal mailing lists, managed through Mailman on
+the GNU mail server.  Once you register your package on Savannah, you
+can create (and remove) lists yourself through the `Mailing Lists'
+menu, without needing to wait for intervention by anyone else.
+Furthermore, lists created through Savannah will have a reasonable
+default configuration for antispam purposes (see below).
+
+To create and maintain simple aliases and unmanaged lists, you can
+edit @file{/com/mailer/aliases} on the main GNU server.  If you don't
+have an account there, please read
+@url{https://www.gnu.org/software/README.accounts.html} (@pxref{GNU
+Accounts and Resources}).
+
+But if you don't want to learn how to do those things, you can ask
+@email{new-mailing-list@@gnu.org} to help you.
+
+@cindex spam prevention
 You should moderate postings from non-subscribed addresses on your
 mailing lists, to prevent propagation of unwanted messages (``spam'')
 to subscribers and to the list archives.  For lists controlled by
@@ -977,7 +1517,20 @@ Filter - generic_nonmember_action} to @code{Hold}, and then
 periodically (daily is best) reviewing the held messages, accepting
 the real ones and discarding the junk.
 
+Lists created through Savannah will have this setting, and a number of
+others, such that spam will be automatically deleted (after a short
+delay).  The Savannah mailing list page describes all the details.
+You should still review the held messages in order to approve any that
+are real.
+
+
+@node Replying to Mail
+@section Replying to Mail
+
 @cindex responding to bug reports
+@cindex bug reports, handling
+@cindex help requests, handling
+
 When you receive bug reports, keep in mind that bug reports are crucial
 for your work.  If you don't know about problems, you cannot fix them.
 So always thank each person who sends a bug report.
@@ -1009,9 +1562,20 @@ maintain the program!  Know how to say no; when you are pressed for
 time, just ``thanks for the bug report---I will fix it'' is enough
 response.
 
-Some GNU packages, such as Emacs and GCC, come with advice about how to
-make bug reports useful.  If you want to copy and adapt that, it could
-be a very useful thing to do.
+Some GNU packages, such as Emacs and GCC, come with advice about how
+to make bug reports useful.  Copying and adapting that could be very
+useful for your package.
+
+@cindex @url{https://bugs.gnu.org}
+@cindex bug reports, email tracker for
+@cindex bug reports, web tracker for
+If you would like to use an email-based bug tracking system, see
+@url{https://bugs.gnu.org}; this can be connected with the regular
+bug-reporting address.  Alternatively, if you would like to use a
+web-based bug tracking system, Savannah supports this (@pxref{Old
+Versions}), but please don't fail to accept bugs by regular email as
+well---we don't want to put up unnecessary barriers against users
+submitting reports.
 
 
 @node Old Versions
@@ -1019,10 +1583,11 @@ be a very useful thing to do.
 @cindex version control
 
 It is very important to keep backup files of all source files of GNU.
-You can do this using a source control system (such as RCS, CVS, Git,
-@dots{}) if you like.  The easiest way to use RCS or CVS is via the
-Version Control library in Emacs (@pxref{VC Concepts,, Concepts of
-Version Control, emacs, The GNU Emacs Manual}).
+You can do this using a source control system (such as Bazaar, RCS,
+CVS, Git, Subversion, @dots{}) if you like.  An easy way to use
+many such systems is via the Version Control library in Emacs
+(@pxref{Introduction to VC,, Introduction to Version Control, emacs,
+The GNU Emacs Manual}).
 
 The history of previous revisions and log entries is very important for
 future maintainers of the package, so even if you do not make it
@@ -1031,22 +1596,23 @@ change log that you would not want to hand over to another maintainer
 some day.
 
 @cindex @code{savannah-hackers@@gnu.org}
-The GNU Project provides a server that GNU software packages can use
+The GNU Project provides a server that GNU packages can use
 for source control and other package needs: @code{savannah.gnu.org}.
-You don't have to use this repository, but if you plan to allow public
-read-only access to your development sources, it is convenient for
-people to be able to find various GNU packages in a central place.
-Savannah is managed by @email{savannah-hackers@@gnu.org}.
+Savannah is managed by @email{savannah-hackers@@gnu.org}.  For more
+details on using and contributing to Savannah, see
+@url{https://savannah.gnu.org/maintenance}.
 
-All GNU maintainers are strongly encouraged to take advantage of
-Savannah, as sharing such a central point can serve to foster a sense
-of community among GNU developers and help in keeping up with project
-management.
+It's not an absolute requirement, but all GNU maintainers are strongly
+encouraged to take advantage of Savannah, as sharing such a central
+point can serve to foster a sense of community among GNU developers as
+well as help in keeping up with project management.  Please don't mark
+Savannah projects for GNU packages as private; that defeats a large
+part of the purpose of using Savannah in the first place.
 
 @cindex @code{savannah-announce@@gnu.org} mailing list
-If you do use Savannah, it is a good idea to subscribe to the
+If you do use Savannah, please subscribe to the
 @email{savannah-announce@@gnu.org} mailing list
-(@url{http://lists.gnu.org/mailman/listinfo/savannah-announce}).  This
+(@url{https://lists.gnu.org/mailman/listinfo/savannah-announce}).  This
 is a very low-volume list to keep Savannah users informed of system
 upgrades, problems, and the like.
 
@@ -1054,12 +1620,13 @@ upgrades, problems, and the like.
 @node Distributions
 @chapter Distributions
 
-It is important to follow the GNU conventions when making GNU software
+Please follow the GNU conventions when making GNU software
 distributions.
 
 @menu
 * Distribution tar Files::
 * Distribution Patches::
+* Binary Distribution::
 * Distribution on ftp.gnu.org::
 * Test Releases::
 * Automated FTP Uploads::
@@ -1070,11 +1637,13 @@ distributions.
 @section Distribution tar Files
 @cindex distribution, tar files
 
-The tar file for version @var{m}.@var{n} of program @code{foo} should be
-named @file{foo-@var{m}.@var{n}.tar}.  It should unpack into a
-subdirectory named @file{foo-@var{m}.@var{n}}.  Tar files should not
-unpack into files in the current directory, because this is inconvenient
-if the user happens to unpack into a directory with other files in it.
+All packages should provide tar files for the distribution of their
+releases.  The tar file for version @var{m}.@var{n} of program
+@code{foo} should be named @file{foo-@var{m}.@var{n}.tar}.  It should
+unpack into a subdirectory named @file{foo-@var{m}.@var{n}}.  Tar
+files should not unpack into files in the current directory, because
+this is inconvenient if the user happens to unpack into a directory
+with other files in it.
 
 Here is how the @file{Makefile} for Bison creates the tar file.
 This method is good for other programs.
@@ -1129,7 +1698,7 @@ it will be very clear from the diffs themselves which version is which.
 @cindex time stamp in diffs
 If you use GNU @code{diff} to make the patch, use the options
 @samp{-rc2P}.  That will put any new files into the output as ``entirely
-different.''  Also, the patch's context diff headers should have dates
+different''.  Also, the patch's context diff headers should have dates
 and times in Universal Time using traditional Unix format, so that patch
 recipients can use GNU @code{patch}'s @samp{-Z} option.  For example,
 you could use the following Bourne shell command to create the patch:
@@ -1153,23 +1722,37 @@ which subdirectory to find each file in.
 It's wise to test your patch by applying it to a copy of the old
 version, and checking that the result exactly matches the new version.
 
+@node Binary Distribution
+@section Binary Distribution for Nonfree Platforms
+
+Some package maintainers release pre-compiled binaries for proprietary
+systems such as Microsoft Windows or MacOS@.  It's entirely up to you
+whether to do that; we don't ask you to do it, but we don't object.
+Please do not let anyone make you feel you have an obligation to do
+this.
+
+If you distribute them, please inform their users prominently that
+those nonfree platforms trample their freedom.  It is useful to refer
+them to
+@url{https://www.gnu.org/philosophy/free-software-even-more-important.html}.
+You can say, ``This program respects your freedom, but Windows does
+not.  To have freedom, you need to stop using Windows and other
+software that denies your freedom.''
+
 @node Distribution on ftp.gnu.org
 @section Distribution on @code{ftp.gnu.org}
 @cindex GNU ftp site
-@cindex @code{ftp.gnu.org}, the GNU ftp site
+@cindex @code{ftp.gnu.org}, the GNU release site
 
-GNU packages are distributed through directory @file{/gnu} on
-@code{ftp.gnu.org}.  Each package should have a subdirectory
-named after the package, and all the distribution files for the package
-should go in that subdirectory.
+We strongly recommend using @code{ftp.gnu.org} to distribute official
+releases.  If you want to also distribute the package from a site of
+your own, that is fine.  To use some other site instead of
+@code{ftp.gnu.org} is acceptable, provided it allows connections from
+anyone anywhere.
 
-@c If you have an interest in seeing the monthly download logs from the FTP
-@c site at @code{ftp.gnu.org} for your program, that is something that
-@c @email{ftp-upload@@gnu.org} can set up for you.  Please contact them if
-@c you are interested.
+@xref{Automated FTP Uploads}, for the procedural details of putting
+new versions on @code{ftp.gnu.org}.
 
-@xref{Automated FTP Uploads}, for procedural details of putting new
-versions on @code{ftp.gnu.org}.
 
 @node Test Releases
 @section Test Releases
@@ -1177,21 +1760,21 @@ versions on @code{ftp.gnu.org}.
 @cindex beta releases
 @cindex pretest releases
 
-@cindex @code{alpha.gnu.org}, ftp site for test releases
+@cindex @code{alpha.gnu.org}, test release site
 When you release a greatly changed new major version of a program, you
 might want to do so as a pretest.  This means that you make a tar file,
 but send it only to a group of volunteers that you have recruited.  (Use
 a suitable GNU mailing list/newsgroup to recruit them.)
 
-We normally use the FTP server @code{alpha.gnu.org} for pretests and
-prerelease versions.  @xref{Automated FTP Uploads}, for procedural details
-of putting new versions on @code{alpha.gnu.org}.
+We normally use the server @code{alpha.gnu.org} for pretests and
+prerelease versions.  @xref{Automated FTP Uploads}, for the procedural
+details of putting new versions on @code{alpha.gnu.org}.
 
 Once a program gets to be widely used and people expect it to work
 solidly, it is a good idea to do pretest releases before each ``real''
 release.
 
-There are two ways of handling version numbers for pretest versions.
+There are three ways of handling version numbers for pretest versions.
 One method is to treat them as versions preceding the release you are going
 to make.
 
@@ -1202,7 +1785,7 @@ are not enough, after 4.5.99 you could advance to 4.5.990 and so on.
 (You could also use 4.5.100, but 990 has the advantage of sorting in
 the right order.)
 
-The other method is to attach a date to the release number that is
+Another method is to attach a date to the release number that is
 coming.  For a pretest for version 4.6, made on Dec 10, 2002, this
 would be 4.6.20021210.  A second pretest made the same day could be
 4.6.20021210.1.
@@ -1210,6 +1793,14 @@ would be 4.6.20021210.  A second pretest made the same day could be
 For development snapshots that are not formal pretests, using just
 the date without the version numbers is ok too.
 
+A third method, if the package uses Git, is to run the script
+@code{build-aux/git-version-gen} from Gnulib to generate test release
+version numbers.  It generates version numbers in the form
+@samp{@var{version}.@var{commits}-@var{commithash}}, where
+@var{version} is the latest version tag, @var{commits} is the number
+of commits since that tag, and @var{commithash} is a hash code for the
+latest commit.
+
 One thing that you should never do is to release a pretest with the same
 version number as the planned real release.  Many people will look only
 at the version number (in the tar file name, in the directory name that
@@ -1228,12 +1819,17 @@ In order to upload new releases to @code{ftp.gnu.org} or
 information.  Then, you can perform uploads yourself, with no
 intervention needed by the system administrators.
 
-The general idea is that releases should be crytographically signed
+The general idea is that releases should be cryptographically signed
 before they are made publicly available.
 
 @menu
 * Automated Upload Registration::
 * Automated Upload Procedure::
+* FTP Upload Release File Triplet::
+* FTP Upload Directive File::
+* FTP Upload Directory Trees::
+* FTP Upload File Replacement::
+* FTP Upload Standalone Directives::
 * FTP Upload Directive File - v1.1::
 * FTP Upload Directive File - v1.0::
 @end menu
@@ -1249,38 +1845,25 @@ Here is how to register your information so you can perform uploads
 for your GNU package:
 
 @enumerate
-
 @item
-Create an account for yourself at @url{http://savannah.gnu.org}, if
-you don't already have one.  By the way, this is also needed to
-maintain the web pages at @url{www.gnu.org} for your project
-(@pxref{Web Pages}).
-
-@item
-In the @samp{My Account Conf} page on @code{savannah}, upload the GPG
-key you will use to sign your packages.
-
-You can create a key with the command @code{gpg --gen-key}.  It is
-good to also send your key to the GPG public key server: @code{gpg
---keyserver keys.gnupg.net --send-keys @var{keyid}}, where @var{keyid}
-is the eight hex digits reported by @code{gpg --list-public-keys} on
-the @code{pub} line before the date.  For full information about GPG,
-see @url{http://www.gnu.org/software/gpg})
+Create an account for yourself at @url{https://savannah.gnu.org},
+and register your package there, if you haven't already done that.
+By the way, this is also needed to maintain the web pages at
+@url{https://www.gnu.org} for your project (@pxref{Web Pages}).
 
 @item
 Compose a message with the following items in some @var{msgfile}.
 Then GPG-sign it by running @code{gpg --clearsign @var{msgfile}}, and
-finally email the resulting @file{@var{msgfile}.asc}), to
+finally email the resulting @file{@var{msgfile}.asc} as an attachment to
 @email{ftp-upload@@gnu.org}.
 
 @enumerate
 @item
-Name of package(s) that you are the maintainer for, and your
-preferred email address.
+Name of package(s) that you are the maintainer for, your
+preferred email address, and your Savannah username.
 
 @item
-An ASCII armored copy of your GnuPG key, as an attachment.  (@samp{gpg
---export -a @var{your_key_id} >mykey.asc} should give you this.)
+The ASCII armored copy of your GPG key, as an attachment.
 
 @item
 A list of names and preferred email addresses of other individuals you
@@ -1288,8 +1871,20 @@ authorize to make releases for which packages, if any (in the case that you
 don't make all releases yourself).
 
 @item
-ASCII armored copies of GnuPG keys for any individuals listed in (3).
+ASCII armored copies of GPG keys for any individuals listed in (3).
 @end enumerate
+
+@item
+Publish the concatenated ASCII armored copies of your GPG key
+with the GPG keys listed in the previous step in the @samp{GPG Keys Used
+for Releases} area of the @samp{Public info} of the Savannah group
+of your package.
+
+Optional but recommended: Send your keys to a GPG public key server:
+@code{gpg --keyserver keys.gnupg.net --send-keys @var{keyid}...}, where
+@var{keyid} is the eight hex digits reported by @code{gpg
+--list-public-keys} on the @code{pub} line before the date.  For full
+information about GPG, see @url{https://www.gnu.org/software/gpg}.
 @end enumerate
 
 The administrators will acknowledge your message when they have added
@@ -1299,6 +1894,10 @@ corresponding packages.
 The upload system will email receipts to the given email addresses
 when an upload is made, either successfully or unsuccessfully.
 
+Should you later have to update your GPG key, you'll have to re-submit
+it to both Savannah and @email{ftp-upload@@gnu.org}, as these systems
+are not connected.
+
 
 @node Automated Upload Procedure
 @subsection Automated Upload Procedure
@@ -1306,215 +1905,366 @@ when an upload is made, either successfully or unsuccessfully.
 @cindex uploads
 
 Once you have registered your information as described in the previous
-section, you will be able to do ftp uploads for yourself using the
-following procedure.
-
-For each upload destined for @code{ftp.gnu.org} or
-@code{alpha.gnu.org}, three files (a @dfn{triplet}) need to be
-uploaded via ftp to the host @code{ftp-upload.gnu.org}.
+section, you can and should do ftp uploads for your package.  There
+are two basic kinds of uploads (details in the following sections):
 
 @enumerate
 @item
-The file to be distributed; for example, @file{foo.tar.gz}.
-
-@item
-Detached GPG binary signature file for (1); for example,
-@file{foo.tar.gz.sig}.  Make this with @samp{gpg -b foo.tar.gz}.
-
+Three related files (a ``triplet'') to upload a file destined for
+@code{ftp.gnu.org} or @code{alpha.gnu.org}: @pxref{FTP Upload Release
+File Triplet}.
 
 @item
-A clearsigned @dfn{directive file}; for example,
-@file{foo.tar.gz.directive.asc}.  Make this by preparing the plain
-text file @file{foo.tar.gz.directive} and then run @samp{gpg
---clearsign foo.tar.gz.directive}.  @xref{FTP Upload Directive File -
-v1.1}, for the contents of the directive file.
+A single (signed) standalone ``directive file'' to perform operations
+on the server: @pxref{FTP Upload Standalone Directives}.
 @end enumerate
 
-The names of the files are important. The signature file must have the
-same name as the file to be distributed, with an additional
-@file{.sig} extension. The directive file must have the same name as
-the file to be distributed, with an additional @file{.directive.asc}
-extension. If you do not follow this naming convention, the upload
-@emph{will not be processed}.
-
-Since v1.1 of the upload script, it is also possible to upload a
-clearsigned directive file on its own (no accompanying @file{.sig} or
-any other file) to perform certain operations on the server.
-@xref{FTP Upload Directive File - v1.1}, for more information.
-
-Upload the file(s) via anonymous ftp to @code{ftp-upload.gnu.org}. If
-the upload is destined for @code{ftp.gnu.org}, place the file(s) in
-the @file{/incoming/ftp} directory. If the upload is destined for
-@code{alpha.gnu.org}, place the file(s) in the @file{/incoming/alpha}
-directory.
+In either case, you upload the file(s) via anonymous ftp to the host
+@code{ftp-upload.gnu.org}.  If the upload is destined for
+@code{ftp.gnu.org}, place the file(s) in the directory
+@file{/incoming/ftp}.  If the upload is destined for
+@code{alpha.gnu.org}, place the file(s) in the directory
+@file{/incoming/alpha}.
 
 Uploads are processed every five minutes.  Uploads that are in
 progress while the upload processing script is running are handled
-properly, so do not worry about the timing of your upload.  Uploaded
-files that belong to an incomplete triplet are deleted automatically
-after 24 hours.
+properly, so do not worry about the timing of your upload.  Spurious
+and stale uploaded files are deleted automatically after 24 hours.
 
-Your designated upload email addresses (@pxref{Automated Upload Registration})
-are sent a message if there are any problems processing an upload for your
-package. You also receive a message when your upload has been successfully
-processed.
+Your designated upload email addresses (@pxref{Automated Upload
+Registration}) are sent a message if there are problems processing an
+upload for your package.  You also receive a message when an upload
+has been successfully processed.
 
-One automated way to create and transfer the necessary files is to use
-the @code{gnupload} script, which is available from the
+One programmatic way to create and transfer the necessary files is to
+use the @code{gnupload} script, which is available from the
 @file{build-aux/} directory of the @code{gnulib} project at
-@url{http://savannah.gnu.org/projects/gnulib}.  @code{gnupload} can
-also remove uploaded files.  Run @code{gnupload --help} for a
-description and examples.
+@url{https://savannah.gnu.org/projects/gnulib}.  Run
+@code{gnupload@tie{}--help} for a description and examples.  (With
+@code{gnupload}, you specify a destination such as
+@samp{ftp.gnu.org:}@var{pkgname} rather than using the
+@samp{ftp-upload} hostname.)
 
-@code{gnupload} uses the @code{ncftpput} program to do the actual
+@code{gnupload} invokes the program @code{ncftpput} to do the actual
 transfers; if you don't happen to have the @code{ncftp} package
 installed, the @code{ncftpput-ftp} script in the @file{build-aux/}
-directory of @code{gnulib} serves as a replacement which uses plain
-command line @code{ftp}.
+directory of @code{gnulib} can serve as a replacement.  It uses the
+plain command line @code{ftp} program.
 
 If you have difficulties with an upload, email
-@email{ftp-upload@@gnu.org}.
+@email{ftp-upload@@gnu.org}.  You can check the archive of uploads
+processed at
+@url{https://lists.gnu.org/archive/html/ftp-upload-report}.
 
 
-@node FTP Upload Directive File - v1.1
-@subsection FTP Upload Directive File - v1.1
+@node FTP Upload Release File Triplet
+@subsection FTP Upload Release File Triplet
+
+@cindex FTP uploads, of release files
+
+Ordinarily, the goal is to upload a new release of your package, let's
+say, the source archive @file{foo-1.0.tar.gz}.  To do this, you
+simultaneously upload three files:
+
+@enumerate
+@item
+The file to be distributed; in our example, @file{foo-1.0.tar.gz}.
 
-The directive file name must end in @file{directive.asc}.
+@item
+Detached GPG binary signature file for (1); for example,
+@file{foo-1.0.tar.gz.sig}.  Make this with @samp{gpg -b foo-1.0.tar.gz}.
 
-When part of a triplet, the directive file must always contain the
-directives @code{version}, @code{directory} and @code{filename}, as
-described. In addition, a 'comment' directive is allowed.
+@item
+A clearsigned @dfn{directive file}; for example,
+@file{foo-1.0.tar.gz.directive.asc}, created with @samp{gpg
+--clearsign foo-1.0.tar.gz.directive}.  Its contents are described in
+the next section.
+@end enumerate
+
+The names of the files are important.  The signature file must have
+the same name as the file to be distributed, with an additional
+@file{.sig} extension.  The directive file must have the same name as
+the file to be distributed, with an additional @file{.directive.asc}
+extension.  If you do not follow this naming convention, the upload
+@emph{will not be processed}.
 
-The @code{version} directive must always have the value @samp{1.1}.
 
-The @code{directory} directive specifies the final destination
-directory where the uploaded file and its @file{.sig} companion are to
-be placed.
+@node FTP Upload Directive File
+@subsection FTP Upload Directive File
 
-The @code{filename} directive must contain the name of the file to be
-distributed (item@tie{}(1) above).
+@cindex directive file, for FTP uploads
 
-For example, as part of an uploaded triplet, a
-@file{foo.tar.gz.directive.asc} file might contain these lines (before
-being gpg clearsigned):
+To repeat, a (signed) @dfn{directive file} must be part of every
+upload.  The unsigned original is just a plain text file you can
+create with any text editor.  Its name must be, e.g.,
+@file{foo-1.0.tar.gz.directive} for accompanying an upload of
+@file{foo-1.0.tar.gz}.
+
+After creating the file, run @samp{gpg --clearsign
+foo-1.0.tar.gz.directive}, which will create
+@file{foo-1.0.tar.gz.directive.asc}; this is the file to be uploaded.
+
+When part of a triplet for uploading a release file, the directive
+file must always contain the directives @code{version},
+@code{filename} and @code{directory}.  In addition, a @code{comment}
+directive is optional.  These directives can be given in any order.
+
+Continuing our example of uploading @file{foo-1.0.tar.gz} for a
+package named @code{foo} to @code{ftp.gnu.org}, the values would be as
+follows:
+
+@table @code
+@item version
+must be the value @samp{1.2} (the current version, as of May@tie{}2012):@*
+@t{version: 1.2}
+
+@item filename
+must be the name of the file to be distributed:@*
+@t{filename: foo-1.0.tar.gz}
+
+@item directory
+specifies the final destination directory where the uploaded file and
+its @file{.sig} companion are to be placed.  Here we will put our file
+in the top level directory of the package, as is the most common
+practice:@*
+@t{directory: foo}
+
+@item comment
+is optional, and ignored if present:@*
+@t{comment: let's hope this works!}
+@end table
+
+Putting all of the above together, the complete contents of the
+directive file @file{foo-1.0.tar.gz.directive} for our example would
+be:
 
 @example
-version: 1.1
-directory: bar/v1
-filename: foo.tar.gz
-comment: hello world!
+version: 1.2
+directory: foo
+filename: foo-1.0.tar.gz
+comment: let's hope this works!
 @end example
 
-This directory line indicates that @file{foo.tar.gz} and
-@file{foo.tar.gz.sig} are part of package @code{bar}.  If you uploaded
-this triplet to @file{/incoming/ftp} and the system positively
-authenticates the signatures, the files @file{foo.tar.gz} and
-@file{foo.tar.gz.sig} will be placed in the directory
-@file{gnu/bar/v1} of the @code{ftp.gnu.org} site.
+Then you @samp{gpg --clearsign} the file as given above, and upload
+(using anonymous ftp) the three files:
 
-The directive file can be used to create currently non-existent
-directory trees, as long as they are under the package directory for
-your package (in the example above, that is @code{bar}).
+@table @file
+@item foo-1.0.tar.gz
+@item foo-1.0.tar.gz.sig
+@item foo-1.0.tar.gz.directive.asc
+@end table
 
-If you upload a file that already exists in the FTP directory, the
-original will simply be archived and replaced with the new upload.
+@noindent to the host @file{ftp-upload.gnu.org}, directory
+@file{/incoming/ftp} (for official releases), or the directory
+@file{/incoming/alpha} (for test releases).
 
-@subheading Standalone directives
+After the system authenticates the signatures, the files
+@file{foo-1.0.tar.gz} and @file{foo-1.0.tar.gz.sig} are placed in
+the directory @file{gnu/foo/} on @code{ftp.gnu.org}.  That is, we'll
+have made our release available at
+@indicateurl{https://ftp.gnu.org/gnu/foo/foo-1.0.tar.gz} (and then from
+our many mirrors via
+@indicateurl{https://ftpmirror.gnu.org/foo/foo-1.0.tar.gz}).  Whew.
 
-When uploaded by itself, the directive file must contain one or more
-of the directives @code{symlink}, @code{rmsymlink} or @code{archive},
-in addition to the obligatory @code{directory} and @code{version}
-directives.  A @code{filename} directive is not allowed, and a
-@code{comment} directive remains optional.
+A common reason for the upload not succeeding is your GPG signature
+not being registered with the upload system.  There is nothing that
+makes this happen automatically.  You must email the system
+administrators as described above (@pxref{Automated Upload
+Registration}).
 
-If you use more than one directive, the directives are executed in the
-sequence they are specified in.  If a directive results in an error,
-further execution of the upload is aborted.
 
-Removing a symbolic link (with @code{rmsymlink}) which does not exist
-results in an error.  However, attempting to create a symbolic link
-that already exists (with @code{symlink}) is not an error.  In this
-case @code{symlink} behaves like the command @command{ln -s -f}: any
-existing symlink is removed before creating the link.  (But an
-existing regular file or directory is not removed.)
+@node FTP Upload Directory Trees
+@subsection FTP Upload Directory Trees
 
-Here are a few examples.  The first removes a symlink:
+@cindex directory trees, in ftp uploads
+@cindex hierarchy, under ftp upload directory
+@cindex uploads, directory trees in
+
+You can make any directory hierarchy you like under your package
+directory.  The system automatically creates any intermediate
+directories you specify in the @code{directory} directive.
+
+Slightly modifying the example above, the following directive file:
 
 @example
-version: 1.1
-directory: bar/v1
-rmsymlink: foo-latest.tgz
-comment: remove a symlink
+version: 1.2
+directory: foo/foo-1.0
+filename: foo-1.0.tar.gz
+comment: creates per-version subdirectory as needed
 @end example
 
 @noindent
-Archive an old file, taking it offline:
+would put the tar file in the @file{foo-1.0/} subdirectory of the
+package @code{foo}, thus ending up at
+@indicateurl{ftp.gnu.org:gnu/foo/foo-1.0/foo-1.0.tar.gz}.
+
+However, to keep things simpler for users, we recommend not using
+subdirectories, unless perhaps each release of your package consists
+of many separate files.
+
+
+@node FTP Upload File Replacement
+@subsection FTP Upload File Replacement
+
+@cindex replacing uploaded files
+@cindex uploads, replacing
+
+You can replace existing files that have already been uploaded by
+including a directive line @code{replace:@tie{}true}.  For example,
+you might like to provide a README file in the release directory and
+update it from time to time.  The full directive file for that would
+look like this:
 
 @example
-version: 1.1
-directory: bar/v1
-archive: foo-1.1.tar.gz
-comment: archive an old file; it will not be available through FTP anymore
+replace: true
+version: 1.2
+directory: foo
+filename: README
+comment: replaces an existing README
 @end example
 
-@noindent
-Archive an old directory (with all contents), taking it offline:
+It is ok if the file to be replaced doesn't already exist; then the
+new file is simply added, i.e., the @file{replace} directive has no
+effect.
+
+When an existing file is replaced, the original is archived to a
+private location.  There is no automated or public access to such
+archived files; if you want to retrieve or view them, please email
+@email{sysadmin@@fsf.org}.
+
+We very strongly discourage replacing an actual software release file,
+such as @file{foo-1.0.tar.gz}.  Releases should be unique, and
+forever.  If you need to make fixes, make another release.  If you
+have an exigent reason for a particular release file to no longer be
+available, it can be explicitly archived, as described in the next
+section.
+
+If you want to make the current release available under a generic
+name, such as @code{foo-latest.tar.gz}, that is better done with
+symlinks, also as described in the next section.
+
+
+@node FTP Upload Standalone Directives
+@subsection FTP Upload Standalone Directives
+
+@cindex standalone directives, for ftp uploads
+@cindex directives for ftp uploads, standalone
+
+The previous sections describe how to upload a file to be publicly
+released.  It's also possible to upload a directive file by itself to
+perform a few operations on the upload directory.  The supported
+directives are:
+
+@table @code
+@item symlink
+creates a symlink.
+
+@item rmsymlink
+removes a symlink.
+
+@item archive
+takes a file or directory offline.
+@end table
+
+As for the directives described above, the @code{directory} and
+@code{version} directives are still required, the @code{comment}
+directive remains optional, and the @code{filename} directive is not
+allowed.
+
+The @file{.sig} file should not be explicitly mentioned in a directive.
+When you specify a directive to operate on a file, its corresponding
+@file{.sig} file will be handled automatically.
+
+When uploaded by itself, the name of the directive file is not
+important.  But it must be still be signed, using @samp{gpg
+--clearsign}; the resulting @file{.asc} file is what should be
+uploaded.
+
+Here's an example of the full directive file to create a
+@file{foo-latest.tar.gz} symlink:
 
 @example
-version: 1.1
-directory: bar/v1
-archive: foo
-comment: archive an old directory; it will not be available through FTP anymore
+version: 1.2
+directory: foo
+symlink: foo-1.1.tar.gz foo-latest.tar.gz
+comment: create a symlink
 @end example
 
-@noindent
-Create a new symlink:
+If you include more than one directive in a standalone upload, the
+directives are executed in the sequence they are specified in.  If a
+directive results in an error, further execution of the upload is
+aborted.
+
+Removing a symbolic link (with @code{rmsymlink}) which does not exist
+results in an error.  On the other hand, attempting to create a
+symbolic link that already exists (with @code{symlink}) is not an
+error.  In this case @code{symlink} behaves like the command
+@command{ln -s -f}: any existing symlink is removed before creating
+the link.  (But an existing regular file or directory is not replaced.)
+
+Here's an example of removing a symlink, e.g., if you decide not to
+maintain a @file{foo-latest} link any more:
 
 @example
-version: 1.1
-directory: bar/v1
-symlink: foo-1.2.tar.gz foo-latest.tgz
-comment: create a new symlink
+version: 1.2
+directory: foo
+rmsymlink: foo-latest.tar.gz
+comment: remove a symlink
 @end example
 
 @noindent
-Do everything at once:
+And here's an example of archiving a file, e.g., an unintended upload:
 
 @example
-version: 1.1
-directory: bar/v1
-rmsymlink: foo-latest.tgz
-symlink: foo-1.2.tar.gz foo-latest.tgz
-archive: foo-1.1.tar.gz
-comment: now do everything at once
+version: 1.2
+directory: foo
+archive: foo-1.1x.tar.gz
+comment: archive an old file; it will not be
+comment: publicly available any more.
 @end example
 
+The @code{archive} directive causes the specified items to become
+inaccessible.  This should only be used when it is actively bad for
+them to be available, e.g., you uploaded something by mistake.
+
+If all you want to do is reduce how much stuff is in your release
+directory, an alternative is to email @email{sysadmin@@fsf.org} and
+ask them to move old items to the @file{https://ftp.gnu.org/old-gnu/}
+directory; then they will still be available.  In general, however, we
+recommend leaving all official releases in the main release directory.
+
+
+@node FTP Upload Directive File - v1.1
+@subsection FTP Upload Directive File - v1.1
+
+The v1.1 protocol for uploads lacked the @code{replace} directive;
+instead, file replacements were done automatically and silently
+(clearly undesirable).  This is the only difference between v1.2 and
+v1.1.
+
 
 @node FTP Upload Directive File - v1.0
 @subsection FTP Upload Directive File - v1.0
 
-@dfn{As of June 2006, the upload script is running in compatibility
-mode, allowing uploads with either version@tie{}1.1 or
-version@tie{}1.0 of the directive file syntax.  Support for v1.0
-uploads will be phased out by the end of 2006, so please upgrade
-to@tie{}v1.1.}
+Support for v1.0 uploads was discontinued in May 2012; please upgrade
+to@tie{}v1.2.
 
-The directive file should contain one line, excluding the clearsigned
-data GPG that inserts, which specifies the final destination directory
-where items (1) and (2) are to be placed.
+In v1.0, the directive file contained one line, excluding the
+clearsigned data GPG that inserts, which specifies the final
+destination directory where items (1) and (2) are to be placed.
 
-For example, the @file{foo.tar.gz.directive.asc} file might contain the
+For example, the @file{foo-1.0.tar.gz.directive.asc} file might contain the
 single line:
 
 @example
 directory: bar/v1
 @end example
 
-This directory line indicates that @file{foo.tar.gz} and
-@file{foo.tar.gz.sig} are part of package @code{bar}.  If you were to
+This directory line indicates that @file{foo-1.0.tar.gz} and
+@file{foo-1.0.tar.gz.sig} are part of package @code{bar}.  If you were to
 upload the triplet to @file{/incoming/ftp}, and the system can
 positively authenticate the signatures, then the files
-@file{foo.tar.gz} and @file{foo.tar.gz.sig} will be placed in the
+@file{foo-1.0.tar.gz} and @file{foo-1.0.tar.gz.sig} will be placed in the
 directory @file{gnu/bar/v1} of the @code{ftp.gnu.org} site.
 
 The directive file can be used to create currently non-existent
@@ -1535,22 +2285,23 @@ and developers to find the latest GNU releases.  On the other hand,
 please do not announce test releases on @code{info-gnu} unless it's a
 highly unusual situation.
 
-@cindex @url{http://planet.gnu.org}
+@cindex @url{https://planet.gnu.org}
 @cindex Savannah, news area
 Please also post release announcements in the news section of your
-Savannah project site.  It is fine to also write news entries for test
-releases and any other newsworthy events.  The news feeds from all GNU
-projects at savannah are aggregated at @url{http://planet.gnu.org}
-(GNU Planet).  You can also post items directly, or arrange for feeds
-from other locations; see contact information on the GNU Planet web
-page.
+Savannah project site.  Here, it is fine to also write news entries
+for test releases and any other newsworthy events.  The news feeds
+from all GNU projects at savannah are aggregated at
+@url{https://planet.gnu.org} (GNU Planet), unless the text of the entry
+contains the string @samp{::noplanet::}.  You can also post items
+directly, or arrange for feeds from other locations; see information
+on the GNU Planet web page.
 
 @cindex announcement mailing list, project-specific
 You can maintain your own mailing list (typically
-@email{info-@var{program}@@gnu.org}) for announcements as well if you
+@indicateurl{info-@var{package}@@gnu.org}) for announcements as well if you
 like.  For your own list, of course you decide as you see fit what
-events are worth announcing.  (@xref{Mail}, for more suggestions on
-handling mail for your package.)
+events are worth announcing.  (@xref{Mail}, for setting this up, and
+more suggestions on handling mail for your package.)
 
 @cindex contents of announcements
 When writing an announcement, please include the following:
@@ -1562,39 +2313,74 @@ purpose of your package.
 
 @item
 Your package's web page (normally
-@indicateurl{http://www.gnu.org/software/@var{package}/}).
+@indicateurl{https://www.gnu.org/software/@var{package}/}).
 
 @item
 Your package's download location (normally
-@indicateurl{http://ftp.gnu.org/gnu/@var{package}/}).  It is also
-useful to mention the FTP mirror list at
-@url{http://www.gnu.org/order/ftp.html}, and that
-@url{http://ftpmirror.gnu.org/@var{package/}} will automatically
+@indicateurl{https://ftp.gnu.org/gnu/@var{package}/}).  It is also
+useful to mention the mirror list at
+@url{https://www.gnu.org/order/ftp.html}, and that
+@indicateurl{https://ftpmirror.gnu.org/@var{package/}} will automatically
 redirect to a nearby mirror.
 
 @item
-The NEWS (@pxref{NEWS File,,, standards, GNU Coding Standards}) for
+The @t{NEWS} (@pxref{NEWS File,,, standards, GNU Coding Standards}) for
 the present release.
 @end itemize
 
+You may find the @file{announce-gen} script useful for creating
+announcements, which is available from the @file{build-aux/} directory
+of the @code{gnulib} project at
+@url{https://savannah.gnu.org/projects/gnulib}.
+
 
 @node Web Pages
 @chapter Web Pages
 @cindex web pages
 
-Please write web pages about your package for installation on
-@code{www.gnu.org}.  They should follow our usual standards for web
-pages (see @url{http://www.gnu.org/server/fsf-html-style-sheet.html}).
-The overall goals are to support a wide variety of browsers, to focus
-on information rather than flashy eye candy, and to keep the site
-simple and uniform.
+When we dub a program a GNU package, we list its GNU home page, named
+@var{package} in @indicateurl{https://www.gnu.org/software/}, on
+@url{https://www.gnu.org/software/software.html} and
+@url{https://www.gnu.org/manual/manual.html}.  To avoid broken links,
+the webmasters create a temporary home page as follows:
+
+@itemize @bullet
+@item
+If there is a Savannah project for this package (@pxref{Hosting for
+Web Pages}), the temporary home page redirects to the project's main
+page, @indicateurl{https://savannah.gnu.org/projects/@var{package}},
+where a short description should be available.
+
+@item
+Otherwise, the webmasters make a simple home page containing the short
+description provided with the original submission of the package to GNU.
+@end itemize
+
+This temporary home page ought to be replaced with the real one as soon
+as possible.
 
 Some GNU packages have just simple web pages, but the more information
 you provide, the better.  So please write as much as you usefully can,
 and put all of it on @code{www.gnu.org}.  However, pages that access
-databases (including mail logs and bug tracking) are an exception; set
-them up on whatever site is convenient for you, and make the pages on
-@code{www.gnu.org} link to that site.
+databases (including mail archives and bug tracking) are an exception;
+set them up on whatever site is convenient for you, and make the pages
+on @code{www.gnu.org} link to that site.
+
+Your web pages should follow our usual standards (see
+@url{https://www.gnu.org/server/@/fsf-html-style-sheet.html}). The
+overall goals are to support a wide variety of browsers, to focus on
+information rather than visual adornments, and to keep gnu.org/software/
+consistent on certain important points.
+
+We encourage you to use the standard @code{www.gnu.org} template as
+the basis for your pages:
+@url{https://www.gnu.org/server/@/standards/@/boilerplate-source.html}.
+This template changes slightly from time to time for various reasons. If
+a change affects existing web pages, the webmasters will inform you;
+then you can make the change or they can.
+
+Please follow the best practices of accessibility in your web pages
+(see @url{https://www.gnu.org/accessibility/accessibility.html}).
 
 @menu
 * Hosting for Web Pages::
@@ -1605,12 +2391,13 @@ them up on whatever site is convenient for you, and make the pages on
 
 @node Hosting for Web Pages
 @section Hosting for Web Pages
+@cindex web pages, hosting for
 
 The best way to maintain the web pages for your project is to register
 the project on @code{savannah.gnu.org}.  Then you can edit the pages
-using CVS, using the separate ``web repository'' available on
+using CVS, using the separate ``web pages repository'' available on
 Savannah, which corresponds to
-@indicateurl{http://www.gnu.org/software/@var{package}/}.  You can
+@indicateurl{https://www.gnu.org/software/@var{package}/}.  You can
 keep your source files there too (using any of a variety of version
 control systems), but you can use @code{savannah.gnu.org} only for
 your gnu.org web pages if you wish; simply register a ``web-only''
@@ -1621,21 +2408,26 @@ If you don't want to use that method, please talk with
 instance, you can mail them pages to install, if necessary.  But that
 is more work for them, so please use Savannah if you can.
 
-If you use Savannah, you can use a special @file{.symlinks} file in
-order to create symbolic links, which are not supported in CVS.  For
-details, see
-@url{http://www.gnu.org/server/standards/README.webmastering.html#symlinks}.
+Please note that the GNU webmasters may fix technical details in your
+web pages (HTML, CSS, obvious typos, broken links in the footer, etc.)
+and inform you of the change afterwards.
+
+If you use Savannah, you can use a special file named @file{.symlinks}
+in order to create symbolic links, which are not supported in CVS.
+For details, see
+@url{https://www.gnu.org/server/standards/README.webmastering.html#symlinks}.
 
 
 @node Freedom for Web Pages
 @section Freedom for Web Pages
+@cindex web pages, freedom for
 
 If you use a site other than @code{www.gnu.org}, please make sure that
 the site runs on free software alone.  (It is ok if the site uses
 unreleased custom software, since that is free in a trivial sense:
 there's only one user and it has the four freedoms.)  If the web site
-for a GNU package runs on non-free software, the public will see this,
-and it will have the effect of granting legitimacy to the non-free
+for a GNU package runs on nonfree software, the public will see this,
+and it will have the effect of granting legitimacy to the nonfree
 program.
 
 If you use multiple sites, they should all follow that criterion.
@@ -1643,20 +2435,34 @@ Please don't link to a site that is about your package, which the
 public might perceive as connected with it and reflecting the position
 of its developers, unless it follows that criterion.
 
+Please make sure it is possible to use the web site fully using the
+Lynx browser, and with the IceCat browser with LibreJS enabled.  It
+should work both with Tor and without Tor.  Of course, it is desirable
+for the site to support as many other browsers as possible.
+
 Historically, web pages for GNU packages did not include GIF images,
 because of patent problems (@pxref{Ethical and Philosophical
 Consideration}).  Although the GIF patents expired in 2006, using GIF
 images is still not recommended, as the PNG and JPEG formats are
-generally superior.  See @url{http://www.gnu.org/philosophy/gif.html}.
+generally superior.  See @url{https://www.gnu.org/philosophy/gif.html}.
 
+Please make sure that any Javascript code in your web pages is covered
+by a free license, and has its license indicated in a way LibreJS can
+recognize.  See @url{https://gnu.org/philosophy/javascript-trap.html}.
+If the Javascript in the page is minified, or for any other reason is
+not the source code, it must point to its source code as described
+there.
 
 @node Manuals on Web Pages
 @section Manuals on Web Pages
+@cindex web pages, including manuals on
+@cindex formats for documentation, desired
 
 The web pages for the package should include its manuals, in HTML,
-DVI, Info, PostScript, PDF, plain ASCII, and Texinfo format (source).
-All of these can be generated automatically from the Texinfo source
-using Makeinfo and other programs.
+DVI, Info, PDF, plain ASCII, and the source Texinfo.  All of these can
+be generated automatically from Texinfo using Makeinfo and other
+programs.  If the Texinfo itself is generated from some other source
+format, include that too.
 
 When there is only one manual, put it in a subdirectory called
 @file{manual}; the file @file{manual/index.html} should have a link to
@@ -1670,11 +2476,10 @@ subdirectory to link to that manual in all its forms, and make
 See the section below for details on a script to make the job of
 creating all these different formats and index pages easier.
 
-We would like to include links to all GNU manuals on the page
-@url{http://www.gnu.org/manual}, so if yours isn't listed, please send
-mail to @code{webmasters@@gnu.org} telling them the name of your
-package and asking them to edit @url{http://www.gnu.org/manual}, and
-they will do so based on the contents of your @file{manual} directory.
+We would like to list all GNU manuals on the page
+@url{https://www.gnu.org/manual}, so if yours isn't there, please send
+mail to @code{webmasters@@gnu.org}, asking them to add yours, and they
+will do so based on the contents of your @file{manual} directory.
 
 @menu
 * Invoking gendocs.sh::
@@ -1685,22 +2490,23 @@ they will do so based on the contents of your @file{manual} directory.
 @subsection Invoking @command{gendocs.sh}
 @pindex gendocs.sh
 @cindex generating documentation output
+@cindex documentation output, generating
 
 The script @command{gendocs.sh} eases the task of generating the
 Texinfo documentation output for your web pages
 section above.  It has a companion template file, used as the basis
-for the HTML index pages.  Both are available from the Texinfo CVS
-sources:
+for the HTML index pages.  Both are available from the Gnulib
+development:
 
 @smallformat
-@uref{http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs.sh}
-@uref{http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template}
+@uref{https://git.savannah.gnu.org/cgit/gnulib.git/tree/build-aux/gendocs.sh}
+@uref{https://git.savannah.gnu.org/cgit/gnulib.git/tree/doc/gendocs_template}
 @end smallformat
 
 There is also a minimalistic template, available from:
 
 @smallformat
-@uref{http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template_min}
+@uref{https://git.savannah.gnu.org/cgit/gnulib.git/tree/doc/gendocs_template_min}
 @end smallformat
 
 Invoke the script like this, in the directory containing the Texinfo
@@ -1711,15 +2517,15 @@ gendocs.sh --email @var{yourbuglist} @var{yourmanual} "GNU @var{yourmanual} manu
 @end smallexample
 
 @noindent where @var{yourmanual} is the short name for your package
-and @var{yourbuglist} is the email address for bug reports (typically
-@code{bug-@var{package}@@gnu.org}).  The script processes the file
-@file{@var{yourmanual}.texinfo} (or @file{.texi} or @file{.txi}).  For
-example:
+and @var{yourbuglist} is the email address for bug reports (which
+should be @code{bug-@var{package}@@gnu.org}).  The script processes
+the file @file{@var{yourmanual}.texinfo} (or @file{.texi} or
+@file{.txi}).  For example:
 
 @smallexample
-cd .../emacs/man
+cd .../texinfo/doc
 # download gendocs.sh and gendocs_template
-gendocs.sh --email bug-gnu-emacs@@gnu.org emacs "GNU Emacs manual"
+gendocs.sh --email bug-texinfo@@gnu.org texinfo "GNU Texinfo manual"
 @end smallexample
 
 @command{gendocs.sh} creates a subdirectory @file{manual/} containing
@@ -1751,9 +2557,9 @@ gendocs.sh --email bug-texinfo@@gnu.org -o info info "GNU Info manual"
 gendocs.sh --email bug-texinfo@@gnu.org -o info-stnd info-stnd "GNU info-stnd manual"
 @end smallexample
 
-By default, the script uses @command{makeinfo} for generating
-@acronym{HTML} output.  If you prefer to use @command{texi2html}, use
-the @option{--texi2html} command line option, e.g.:
+By default, the script uses @command{makeinfo} for generating HTML
+output.  If you prefer to use @command{texi2html}, use the
+@option{--texi2html} command line option, e.g.:
 
 @smallexample
 gendocs --texi2html -o texinfo texinfo "GNU Texinfo manual"
@@ -1764,15 +2570,15 @@ HTML output generated by @command{texi2html} (i.e., split by sections
 and chapters).
 
 You can set the environment variables @env{MAKEINFO}, @env{TEXI2DVI},
-@env{TEXI2HTML} and @env{DVIPS} to control the programs that get
-executed, and @env{GENDOCS_TEMPLATE_DIR} to control where the
+etc., to control the programs that get executed, and
+@env{GENDOCS_TEMPLATE_DIR} to control where the
 @file{gendocs_template} file is found.
 
 As usual, run @samp{gendocs.sh --help} for a description of all the
 options, environment variables, and more information.
 
 Please email bug reports, enhancement requests, or other
-correspondence to @email{bug-texinfo@@gnu.org}.
+correspondence about @command{gendocs} to @email{bug-texinfo@@gnu.org}.
 
 
 @node CVS Keywords in Web Pages
@@ -1802,7 +2608,10 @@ For new files:
 cvs add -ko @var{file1} @var{file2} ...
 @end example
 
-@xref{Keyword substitution,,,cvs,Version Management with CVS}.
+@c The CVS manual is now built with numeric references and no nonsplit
+@c form, so it's not worth trying to give a direct link.
+See the ``Keyword Substitution'' section in the CVS manual, available
+from @url{https://cvs.nongnu.org}.
 
 In Texinfo source, the recommended way to literally specify a
 ``dollar'' keyword is:
@@ -1815,7 +2624,6 @@ The @code{@@w} prevents keyword expansion in the Texinfo source
 itself.  Also, @code{makeinfo} notices the @code{@@w} and generates
 output avoiding the literal keyword string.
 
-
 @node Ethical and Philosophical Consideration
 @chapter Ethical and Philosophical Consideration
 @cindex ethics
@@ -1833,39 +2641,119 @@ self-defeating to try to find and avoid all these patents.  But there
 are some patents which we know are likely to be used to threaten free
 software, so we make an effort to avoid the patented techniques.  If
 you are concerned about the danger of a patent and would like advice,
-write to @email{maintainers@@gnu.org}, and we will try to help you get
+write to @email{licensing@@gnu.org}, and we will try to help you get
 advice from a lawyer.
 
 Sometimes the GNU project takes a strong stand against a particular
-patented technology in order to encourage society to reject it.
-
-For example, the MP3 audio format is covered by a software patent in
-the USA and some other countries.  A patent holder has threatened
-lawsuits against the developers of free programs (these are not GNU
-programs) to produce and play MP3, and some GNU/Linux distributors are
-afraid to include them.  Development of the programs continues, but we
-campaign for the rejection of MP3 format in favor of Ogg Vorbis format.
-
-A GNU package should not recommend use of any non-free program, nor
-should it require a non-free program (such as a non-free compiler or
+patented technology in order to encourage society to reject it.  That
+is why we rejected MP3 audio format in favor of the unpatented Ogg
+Vorbis format.  These patents have reportedly expired, but we still
+prefer Ogg formats to MP3 formats.  Please support this campaign by
+making Ogg Vorbis the preferred format for audio distribution
+in GNU packages and their web sites.
+
+We will consider using Ogg Opus at some point in the future.
+It is fine to distribute Ogg Opus files @emph{also}, but please
+continue distributing Ogg Vorbis, so as not to hurry users to change
+the software with which they listen to audio.
+
+We are unable to find a modern compressed video format that is truly
+safe from patents, so we use the Ogg Theora and WebM formats for which
+no licensing consortium has been set up.  GNU programs and their web
+sites should not distribute video in MPEG-2 or MPEG 4 formats.
+
+A GNU package should not recommend use of any nonfree program, nor
+should it require a nonfree program (such as a nonfree compiler or
 IDE) to build.  Thus, a GNU package cannot be written in a programming
 language that does not have a free software implementation.  Now that
 GNU/Linux systems are widely available, all GNU packages should
 provide full functionality on a 100% free GNU/Linux system, and should
-not require any non-free software to build or function.
+not require any nonfree software to build or function.
 The GNU Coding Standards say a lot more about this issue.
 
-A GNU package should not refer the user to any non-free documentation
+Similarly, a GNU package should not require the use of nonfree
+software, including JavaScript, for the coordination of its
+development.  For example, please don't use Transifex for translation
+of your software because it requires your translators to use nonfree,
+JavaScript-based editing tools.  Instead, a service without any
+ethical concerns should be used, such as The Translation Project
+(@url{https://translationproject.org}).
+
+A GNU package should not refer the user to any nonfree documentation
 for free software.  The need for free documentation to come with free
 software is now a major focus of the GNU project; to show that we are
 serious about the need for free documentation, we must not contradict
 our position by recommending use of documentation that isn't free.
 
+Please don't host discussions about your package in a service that
+requires nonfree software.  For instance, Google+ ``communities''
+require running a nonfree JavaScript program to post a message, so
+they can't be used in the Free World.  Google Groups has the same
+problem.  To host discussions there would be excluding people who live
+by free software principles.
+
+Of course, you can't order people not to use such services to talk
+with each other.  What you can do is not legitimize them, and use your
+influence to lead people away from them.  For instance, where you say
+where to have discussions related to the program, don't list such a
+place.
+
 Finally, new issues concerning the ethics of software freedom come up
 frequently.  We ask that GNU maintainers, at least on matters that
 pertain specifically to their package, stand with the rest of the GNU
 project when such issues come up.
 
+@node Humor
+@chapter Humor and GNU
+
+In GNU, we appreciate humor in our work.
+
+GNU is a project of hackers, and
+@uref{https://stallman.org/articles/on-hacking.html,,hacking means
+playful cleverness}.  Even the name ``GNU'' is an example of playful
+cleverness---it is a
+@uref{https://gnu.org/gnu/the-gnu-project.html,,recursive acronym for
+``GNU's Not Unix.''}
+
+In that spirit, we prize occasional doses of humor in GNU packages.
+Humor is not mandatory in a GNU package; we do not tell maintainers,
+``Make users smile, or else!''  But when maintainers do that, we too
+smile.
+
+Nowadays, our humor-positive approach occasionally encounters direct,
+blanket opposition.  Some people advocate, and even demand, removal of
+jokes from software packages simply because they are jokes.  We shrug
+off that point of view.
+
+Jokes are subject to the same sorts of issues and criticism as other
+writing.  Sometimes there is a valid objection to text which is
+humorous, so we do not defend every joke obtusely to the bitter end.
+But @emph{the fact that it is a joke} is not a valid objection.
+
+There are people who frown on anything that is slightly risqué or
+controversial, including jokes.  It would be a terrible shame for that
+attitude to prevail, so our policy is that the occasional risqué joke
+is ok.  GNU is a 21st century project, not a 19th.
+
+@node Other Politics
+@chapter Other Politics
+
+The GNU Project supports the cause of software freedom, that the users
+of computing should have control of their computing activities.  This
+requires that they have control of their software that does those
+activities, which in turn requires that they do these activities
+with free software and have the possibility of replacing any shared
+copies with their own copies.
+
+It also supports basic human rights in computing including use of the
+internet; opposing censorship, for instance.
+
+A GNU package should not seriously advocate any other political
+causes.  Not that the GNU Project opposes those other causes.  Rather,
+it is neutral on them, and GNU packages should be neutral too.  For
+example, if you are (say) a pacifist, you must not advocate pacifism
+in the GNU package you develop.  Contrariwise, if you want to launch a
+war, the GNU package you develop shouldn't advocate that either.
 
 @node Terminology
 @chapter Terminology Issues
@@ -1882,46 +2770,50 @@ about GNU.
 
 @node Free Software and Open Source
 @section Free Software and Open Source
-@cindex free software
+@cindex free software movement
 @cindex open source
-@cindex movements, Free Software and Open Source
-
-The terms ``free software'' and ``open source'' are the slogans of two
-different movements which differ in their basic philosophy.  The Free
-Software Movement is idealistic, and raises issues of freedom, ethics,
-principle and what makes for a good society.  The Open Source Movement,
-founded in 1998, studiously avoids such questions.  For more explanation,
-see @url{http://www.gnu.org/philosophy/open-source-misses-the-point.html}.
-
-The GNU Project is aligned with the Free Software Movement.  This
+@cindex movement, free software
+@cindex development method, open source
+
+The terms ``free software'' and ``open source'', while describing
+almost the same category of software, stand for views based on
+fundamentally different values.  The free software movement is
+idealistic, and raises issues of freedom, ethics, principle and what
+makes for a good society.  The term open source, initiated in 1998, is
+associated with a philosophy which studiously avoids such questions.
+For a detailed explanation, see
+@url{https://www.gnu.org/philosophy/open-source-misses-the-point.html}.
+
+The GNU Project is aligned with the free software movement.  This
 doesn't mean that all GNU contributors and maintainers have to agree;
 your views on these issues are up to you, and you're entitled to express
 them when speaking for yourself.
 
-However, due to the much greater publicity that the Open Source
-Movement receives, the GNU Project needs to overcome a widespread
-mistaken impression that GNU is @emph{and always was} an activity of
-the Open Source Movement.  For this reason, please use the term ``free
-software'', not ``open source'', in GNU software releases, GNU
+However, due to the much greater publicity that the term ``open source''
+receives, the GNU Project needs to overcome a widespread
+mistaken impression that GNU is @emph{and always was} an ``open
+source'' activity.  For this reason, please use the term ``free
+software'', not ``open source'' or ``FOSS'', in GNU software releases, GNU
 documentation, and announcements and articles that you publish in your
 role as the maintainer of a GNU package.  A reference to the URL given
 above, to explain the difference, is a useful thing to include as
 well.
 
+
 @node GNU and Linux
 @section GNU and Linux
 @cindex Linux
 @cindex GNU/Linux
 
 The GNU Project was formed to develop a free Unix-like operating system,
-GNU.  The existence of this system is our major accomplishment.
+GNU@.  The existence of this system is our major accomplishment.
 However, the widely used version of the GNU system, in which Linux is
 used as the kernel, is often called simply ``Linux''.  As a result, most
 users don't know about the GNU Project's major accomplishment---or more
 precisely, they know about it, but don't realize it is the GNU Project's
 accomplishment and reason for existence.  Even people who believe they
 know the real history often believe that the goal of GNU was to develop
-``tools'' or ``utilities.''
+``tools'' or ``utilities''.
 
 To correct this confusion, we have made a years-long effort to
 distinguish between Linux, the kernel that Linus Torvalds wrote, and
@@ -1934,17 +2826,98 @@ Please make this distinction consistently in GNU software releases, GNU
 documentation, and announcements and articles that you publish in your
 role as the maintainer of a GNU package.  If you want to explain the
 terminology and its reasons, you can refer to the URL
-@url{http://www.gnu.org/gnu/linux-and-gnu.html}.
-
-To contrast the GNU system properly with respect to GNU/Linux, you can
-call it ``GNU/Hurd'' or ``the GNU/Hurd system.''  However, when that
-contrast is not specifically the focus, please call it just ``GNU'' or
-``the GNU system.''
+@url{https://www.gnu.org/gnu/linux-and-gnu.html}.
+
+To make it clear that Linux is a kernel, not an operating system,
+please take care to avoid using the term ``Linux system'' in those
+materials.  If you want to have occasion to make a statement about
+systems in which the kernel is Linux, write ``systems in which the
+kernel is Linux'' or ``systems with Linux as the kernel.''  That
+explicitly contrasts the system and the kernel, and will help readers
+understand the difference between the two.  Please avoid simplified
+forms such as ``Linux-based systems'' because those fail to highlight
+the difference between the kernel and the system, and could encourage
+readers to overlook the distinction.
+
+To contrast the GNU system proper with GNU/Linux, you can call it
+``GNU/Hurd'' or ``the GNU/Hurd system''.  However, when that contrast
+is not specifically the focus, please call it just ``GNU'' or ``the
+GNU system''.
 
 When referring to the collection of servers that is the higher level
-of the GNU kernel, please call it ``the Hurd'' or ``the GNU Hurd.''
+of the GNU kernel, please call it ``the Hurd'' or ``the GNU Hurd''.
 Note that this uses a space, not a slash.
 
+For more about this point, see
+@url{https://www.gnu.org/gnu/gnu-linux-faq.html}.
+
+@node Interviews and Speeches
+@chapter Interviews and Speeches
+
+Interviews and speeches about your package are an important channel
+for informing the public about the GNU system and the ideas of the
+free software movement.  Please avoid saying ``open source'' and avoid
+calling the GNU system ``Linux'', just as you would in the package
+itself (@pxref{Terminology}).  Likewise, avoid promoting nonfree
+programs (@pxref{References,,, standards, GNU Coding
+Standards}) as you would in the package itself.
+
+Many GNU users have erroneous ideas about GNU@.  Outside of our
+community, most people think it is Linux.  Please use your opportunity
+to set them straight.  Start the presentation with the answers to
+these basic questions:
+
+@itemize @bullet
+@item
+What GNU is (an operating system developed to be Unix-like and totally
+free software).  It is good to mention @url{https://www.gnu.org}.
+
+@item
+What free software is (the users control it, so it doesn't control
+them).  It is good to state the four freedoms and/or refer to
+@url{https://www.gnu.org/philosophy/free-sw.html}.
+
+@item
+What GNU/Linux is (Linux filled the last gap in GNU).  It is useful to
+refer to @url{https://www.gnu.org/gnu/linux-and-gnu.html}.
+
+@item
+What the GNU Project is (the project to develop GNU).
+
+@item
+How your package fits in (it's part of GNU, and the work is part of
+the GNU Project).
+@end itemize
+
+If you feel a social pressure not to say these things, you may be
+coming in contact with some who would prefer that these things not be
+said.  That's precisely when we need your support most.
+
+Please don't include advertisements or plugs for any company, product
+or service.  Even if the product would meet the standards for the FSF
+to endorse it, an ad for it is out of place in a presentation about a
+GNU package.  Likewise, please don't include company slogans.  Mention
+a company only when called for by the subject matter.
+
+A few GNU packages are actually business activities of a particular
+company.  In that case, it is ok to say so at the start.  Otherwise,
+please show that this is a project of the GNU Project, and avoid
+suggesting it is any company's project.
+
+If you are paid by a company to work on the GNU package, it is
+appropriate to thank the company in a discreet way, but please don't
+go beyond that.
+
+Before you do a speech or interview, please contact the GNU Project
+leadership.  We can give you advice on how to deal with various
+eventualities.
+
+When your interviews and speech recordings or transcript are posted,
+please tell us about them.  Then we can publicize them.
+
+Please post them in formats that are friendly to free software: not in
+Doc or Docx format, not with Flash, not with QuickTime, not with MP3,
+MPEG2 or MPEG4.  Plain text, HTML and PDF are good.
 
 @node Hosting
 @chapter Hosting
@@ -1953,29 +2926,35 @@ Note that this uses a space, not a slash.
 @cindex source repository
 @cindex version control system
 @cindex FTP site
+@cindex release site
 @cindex hosting
 
 We recommend using @code{savannah.gnu.org} for the source code
-repository for your package, and, even more so, using
-@code{ftp.gnu.org} as the standard distribution site.  Doing so makes
-it easier for developers and users to find the latest GNU releases.
-@xref{Old Versions}, for more information about Savannah.
-
-However, it is ok to use other machines if you wish.  If you use a
-company's machine to hold the repository for your program, or as its
-ftp site, please put this statement in a prominent place on the site,
-so as to prevent people from getting the wrong idea about the
-relationship between the package and the company:
+repository for your package, but that's not required.  @xref{Old
+Versions}, for more information about Savannah.
+
+We strongly urge you to use @code{ftp.gnu.org} as the standard
+distribution site for releases.  Doing so makes it easier for
+developers and users to find the latest GNU releases.  However, it is
+ok to use another server if you wish, provided it allows access from
+the general public without limitation (for instance, without excluding
+any country).
+
+If you use a company's machine to hold the repository for your
+program, or as its release distribution site, please put this
+statement in a prominent place on the site, so as to prevent people
+from getting the wrong idea about the relationship between the package
+and the company:
 
 @smallexample
 The programs <list of them> hosted here are free software packages
 of the GNU Project, not products of <company name>.  We call them
 "free software" because you are free to copy and redistribute them,
 following the rules stated in the license of each package.  For more
-information, see http://www.gnu.org/philosophy/free-sw.html.
+information, see https://www.gnu.org/philosophy/free-sw.html.
 
 If you are looking for service or support for GNU software, see
-http://www.gnu.org/help/gethelp.html for suggestions of where to ask.
+https://www.gnu.org/gethelp/ for suggestions of where to ask.
 
 If you would like to contribute to the development of one of these
 packages, contact the package maintainer or the bug-reporting address
@@ -1984,6 +2963,63 @@ on www.gnu.org for more information on how to contribute.
 @end smallexample
 
 
+@node Donations
+@chapter Donations
+@cindex Donations, for packages
+@cindex Money, donated to packages
+
+As a maintainer, you might want to accept donations for your work,
+especially if you pay for any of your own hosting/development
+infrastructure.  Following is some text you can adapt to your own
+situation, and use on your package's web site, @file{README}, or
+in wherever way you find it useful:
+
+@smallexample
+We appreciate contributions of any size -- donations enable us to spend
+more time working on the project, and help cover our infrastructure
+expenses.
+
+If you'd like to make a small donation, please visit @var{url1} and do
+it through @var{payment-service}.  Since our project isn't a
+tax-exempt organization, we can't offer you a tax deduction, but for
+all donations over @var{amount1}, we'd be happy to recognize your
+contribution on @var{url2}.
+
+We are also happy to consider making particular improvements or
+changes, or giving specific technical assistance, in return for a
+substantial donation over @var{amount2}.  If you would like to discuss
+this possibility, write to us at @var{address}.
+
+Another possibility is to pay a software maintenance fee.  Again,
+write to us about this at @var{address} to discuss how much you want
+to pay and how much maintenance we can offer in return.  If you pay
+more than @var{amount1}, we can give you a document for your records.
+
+Thanks for your support!
+@end smallexample
+
+We don't recommend any specific payment service.  However, GNU
+developers should not use a service that requires them to sign a
+proprietary software license, such as Google's payment service.
+Please also avoid sites that requires users to run nonfree software in
+order to donate.  (This includes JavaScript software, so try it with
+LibreJS or with JavaScript disabled.)
+
+In the text you post on the site, please pay attention to the
+terminological issues we care about (@pxref{Terminology}).
+
+We have no objections to using Bitcoin to receive donations.
+
+The FSF can collect donations for a limited number of projects; if you
+want to propose that for your project, write to
+@email{maintainers@@gnu.org}.  The FSF is required to supervise the
+spending of these funds.
+
+Of course, it is also good to encourage people to join the FSF
+(@url{https://www.fsf.org}) or make a general donation, either instead
+of or as well as package-specific donations.
+
+
 @node Free Software Directory
 @chapter Free Software Directory
 @cindex Free Software Directory
@@ -1992,7 +3028,7 @@ on www.gnu.org for more information on how to contribute.
 The Free Software Directory aims to be a complete list of free
 software packages, within certain criteria.  Every GNU package should
 be listed there, so please see
-@url{http://www.gnu.org/help/directory.html#adding-entries} for
+@url{https://www.gnu.org/help/directory.html#adding-entries} for
 information on how to write an entry for your package.  Contact
 @email{bug-directory@@gnu.org} with any questions or suggestions for
 the Free Software Directory.
@@ -2056,6 +3092,58 @@ When you get enough volunteers, send another message to the list saying
 @end itemize
 
 
+@node Suggested Responses
+@appendix Suggested Responses
+
+Here are some responses you can use when appropriate, if you want to.
+
+Here's a way to say no to installing code to make your package
+work on a proprietary operating system, ShackleOS.
+
+@quotation
+You've asked us to install support for doing XYZ on ShackleOS.  We can't
+do that until we have support for XYZ on the GNU system.  GNU Project
+policy is not to add special support for a nonfree operating system
+until we have equivalent support for the GNU system.
+
+A nonfree system subjugates users.  You may not notice this if you
+have become accustomed to such subjugation, but we do.  The Free Software
+Movement aims to liberate those users by replacing nonfree systems
+with free software such as the GNU system.
+
+This program does not aim to replace ShackleOS, but the GNU system does.
+We must support the effort to supplant ShackleOS, not weaken it.  If
+we were to implement more or better support for ShackleOS than for GNU, we
+would score an own goal.
+
+So please make this feature work on GNU, and then we can install it.
+@end quotation
+
+Here's a way to say no to installing code to make your package
+work with a proprietary program, ShackleMe.
+
+@quotation
+You've asked us to install a feature specifically to work with
+ShackleMe, but that program is nonfree.  GNU Project policy is not to
+add special support for interoperation with a nonfree program until we
+support interoperation with comparable free programs equally well or
+better.
+
+A nonfree program subjugates users.  You may not notice this if you
+have become accustomed to such subjugation, but we do.  The mission of
+the GNU Project is to liberate those users by replacing the nonfree
+programs with free programs.
+
+This program does not aim to replace ShackleMe, but other free
+programs do or should.  We must support their effort to supplant
+ShackleMe.  If we were to implement interoperability with ShackleMe
+more than with them, this program would become an additional obstacle
+to their success.  We would score an own goal.
+
+So please make this feature work well with those free replacements
+first.  Once we support them, we can support ShackleMe too.
+@end quotation
+
 @node GNU Free Documentation License
 @appendix GNU Free Documentation License
 
@@ -2070,10 +3158,10 @@ When you get enough volunteers, send another message to the list saying
 @bye
 
 Local variables:
-eval: (add-hook 'write-file-hooks 'time-stamp)
-time-stamp-start: "@set lastupdate "
+eval: (add-hook 'before-save-hook 'time-stamp)
 time-stamp-start: "@set lastupdate "
 time-stamp-end: "$"
 time-stamp-format: "%:b %:d, %:y"
 compile-command: "make -C work.m"
+coding: utf-8
 End:
diff --git a/make-stds.texi b/make-stds.texi
index c8e0d63..b0745a8 100644
--- a/make-stds.texi
+++ b/make-stds.texi
@@ -8,7 +8,8 @@
 @cindex standards for makefiles
 
 @c Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001,
-@c 2004, 2005, 2006, 2007, 2008, 2010 Free Software Foundation, Inc.
+@c 2004, 2005, 2006, 2007, 2008, 2010, 2013, 2014, 2015
+@c Free Software Foundation, Inc.
 @c
 @c Permission is granted to copy, distribute and/or modify this document
 @c under the terms of the GNU Free Documentation License, Version 1.3
@@ -44,7 +45,7 @@ Autoconf}.
 * DESTDIR::                     Supporting staged installs.
 * Directory Variables::         Variables for installation directories.
 * Standard Targets::            Standard targets for users.
-* Install Command Categories::  Three categories of commands in the `install'
+* Install Command Categories::  Three categories of commands in the @samp{install}
                                   rule: normal, pre-install and post-install.
 @end menu
 
@@ -159,8 +160,8 @@ installation should not use any utilities directly except these:
 @c mkfifo mknod tee uname
 
 @example
-awk cat cmp cp diff echo egrep expr false grep install-info
-ln ls mkdir mv pwd rm rmdir sed sleep sort tar test touch tr true
+awk cat cmp cp diff echo egrep expr false grep install-info ln ls
+mkdir mv printf pwd rm rmdir sed sleep sort tar test touch tr true
 @end example
 
 Compression programs such as @code{gzip} can be used in the
@@ -320,7 +321,7 @@ make DESTDIR=/tmp/stage install
 useful.
 
 If your installation step would normally install
-@file{/usr/local/bin/foo} and @file{/usr/local/lib/libfoo.a}, then an
+@file{/usr/local/bin/foo} and @file{/usr/@/local/@/lib/@/libfoo.a}, then an
 installation invoked as in the example above would install
 @file{/tmp/stage/usr/local/bin/foo} and
 @file{/tmp/stage/usr/local/lib/libfoo.a} instead.
@@ -360,7 +361,7 @@ variants of it are used in GNU/Linux and other modern operating
 systems.
 
 Installers are expected to override these values when calling
-@command{make} (e.g., @kbd{make prefix=/usr install} or
+@command{make} (e.g., @kbd{make prefix=/usr install}) or
 @command{configure} (e.g., @kbd{configure --prefix=/usr}).  GNU
 packages should not try to guess which value should be appropriate for
 these variables on the system they are being installed onto: use the
@@ -478,9 +479,11 @@ the same place as @samp{datarootdir}, but we use the two separate
 variables so that you can move these program-specific files without
 altering the location for Info files, man pages, etc.
 
+@c raggedright  (not until next Texinfo release)
 This should normally be @file{/usr/local/share}, but write it as
 @file{$(datarootdir)}.  (If you are using Autoconf, write it as
 @samp{@@datadir@@}.)
+@c end raggedright
 
 The definition of @samp{datadir} is the same for all packages, so you
 should install your data in a subdirectory thereof.  Most packages
@@ -516,6 +519,19 @@ in @file{$(datadir)} or @file{$(sysconfdir)}.  @file{$(localstatedir)}
 should normally be @file{/usr/local/var}, but write it as
 @file{$(prefix)/var}.
 (If you are using Autoconf, write it as @samp{@@localstatedir@@}.)
+
+@item runstatedir
+The directory for installing data files which the programs modify
+while they run, that pertain to one specific machine, and which need
+not persist longer than the execution of the program---which is
+generally long-lived, for example, until the next reboot.  PID files
+for system daemons are a typical use.  In addition, this directory
+should not be cleaned except perhaps at reboot, while the general
+@file{/tmp} (@code{TMPDIR}) may be cleaned arbitrarily.  This should
+normally be @file{/var/run}, but write it as
+@file{$(localstatedir)/run}.  Having it as a separate variable allows
+the use of @file{/run} if desired, for example.  (If you are using
+Autoconf 2.70 or later, write it as @samp{@@runstatedir@@}.)
 @end table
 
 These variables specify the directory for installing certain specific
@@ -525,7 +541,6 @@ need @samp{libdir} or @samp{lispdir}.
 
 @table @samp
 @item includedir
-@c rewritten to avoid overfull hbox --roland
 The directory for installing header files to be included by user
 programs with the C @samp{#include} preprocessor directive.  This
 should normally be @file{/usr/local/include}, but write it as
@@ -534,15 +549,15 @@ should normally be @file{/usr/local/include}, but write it as
 
 Most compilers other than GCC do not look for header files in directory
 @file{/usr/local/include}.  So installing the header files this way is
-only useful with GCC.  Sometimes this is not a problem because some
-libraries are only really intended to work with GCC.  But some libraries
+only useful with GCC@.  Sometimes this is not a problem because some
+libraries are only really intended to work with GCC@.  But some libraries
 are intended to work with other compilers.  They should install their
 header files in two places, one specified by @code{includedir} and one
 specified by @code{oldincludedir}.
 
 @item oldincludedir
 The directory for installing @samp{#include} header files for use with
-compilers other than GCC.  This should normally be @file{/usr/include}.
+compilers other than GCC@.  This should normally be @file{/usr/include}.
 (If you are using Autoconf, you can write it as @samp{@@oldincludedir@@}.)
 
 The Makefile commands should check whether the value of
@@ -601,7 +616,7 @@ should be written as @file{$(datarootdir)/emacs/site-lisp}.
 
 If you are using Autoconf, write the default as @samp{@@lispdir@@}.
 In order to make @samp{@@lispdir@@} work, you need the following lines
-in your @file{configure.in} file:
+in your @file{configure.ac} file:
 
 @example
 lispdir='$@{datarootdir@}/emacs/site-lisp'
@@ -671,7 +686,7 @@ prefix = /usr/local
 datarootdir = $(prefix)/share
 datadir = $(datarootdir)
 exec_prefix = $(prefix)
-# Where to put the executable for the command `gcc'.
+# Where to put the executable for the command 'gcc'.
 bindir = $(exec_prefix)/bin
 # Where to put the directories used by the compiler.
 libexecdir = $(exec_prefix)/libexec
@@ -714,8 +729,9 @@ documentation format) files should be made only when explicitly asked
 for.
 
 By default, the Make rules should compile and link with @samp{-g}, so
-that executable programs have debugging symbols.  Users who don't mind
-being helpless can strip the executables later if they wish.
+that executable programs have debugging symbols.  Otherwise, you are
+essentially helpless in the face of a crash, and it is often far from
+easy to reproduce with a fresh build.
 
 @item install
 Compile the program and copy the executables, libraries, and so on to
@@ -723,8 +739,11 @@ the file names where they should reside for actual use.  If there is a
 simple test to verify that a program is properly installed, this target
 should run that test.
 
-Do not strip executables when installing them.  Devil-may-care users can
-use the @code{install-strip} target to do that.
+Do not strip executables when installing them.  This helps eventual
+debugging that may be needed later, and nowadays disk space is cheap
+and dynamic loaders typically ensure debug sections are not loaded during
+normal execution.  Users that need stripped binaries may invoke the
+@code{install-strip} target to do that.
 
 If possible, write the @code{install} target rule so that it does not
 modify anything in the directory where the program was built, provided
@@ -763,9 +782,9 @@ do-install-info: foo.info installdirs
         $(INSTALL_DATA) $$d/foo.info \
           "$(DESTDIR)$(infodir)/foo.info"
 # Run install-info only if it exists.
-# Use `if' instead of just prepending `-' to the
+# Use 'if' instead of just prepending '-' to the
 # line so we notice real errors from install-info.
-# Use `$(SHELL) -c' because some shells do not
+# Use '$(SHELL) -c' because some shells do not
 # fail gracefully when there is an unknown command.
         $(POST_INSTALL)
         if $(SHELL) -c 'install-info --version' \
@@ -836,10 +855,7 @@ the program has no bugs.  However, it can be reasonable to install a
 stripped executable for actual execution while saving the unstripped
 executable elsewhere in case there is a bug.
 
-@comment The gratuitous blank line here is to make the table look better
-@comment in the printed Make manual.  Please leave it in.
 @item clean
-
 Delete all files in the current directory that are normally created by
 building the program.  Also delete files in other directories if they
 are created by this makefile.  However, don't delete the files that
@@ -942,11 +958,12 @@ foo.dvi: foo.texi chap1.texi chap2.texi
 @end smallexample
 
 @noindent
-You must define the variable @code{TEXI2DVI} in the Makefile.  It should
-run the program @code{texi2dvi}, which is part of the Texinfo
-distribution.@footnote{@code{texi2dvi} uses @TeX{} to do the real work
-of formatting. @TeX{} is not distributed with Texinfo.}  Alternatively,
-write just the dependencies, and allow GNU @code{make} to provide the command.
+You must define the variable @code{TEXI2DVI} in the Makefile.  It
+should run the program @code{texi2dvi}, which is part of the Texinfo
+distribution.  (@code{texi2dvi} uses @TeX{} to do the real work of
+formatting. @TeX{} is not distributed with Texinfo.)  Alternatively,
+write only the dependencies, and allow GNU @code{make} to provide the
+command.
 
 Here's another example, this one for generating HTML from Texinfo:
 
diff --git a/standards.texi b/standards.texi
index 53519bd..30592c6 100644
--- a/standards.texi
+++ b/standards.texi
@@ -3,7 +3,7 @@
 @setfilename standards.info
 @settitle GNU Coding Standards
 @c This date is automagically updated when you save this file:
-@set lastupdate March 11, 2010
+@set lastupdate August 17, 2021
 @c %**end of header
 
 @dircategory GNU organization
@@ -27,13 +27,14 @@
 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 Free Software
-Foundation, Inc.
+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, with no Front-Cover Texts, and with no Back-Cover
+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
@@ -50,8 +51,8 @@ Texts.  A copy of the license is included in the section entitled
 @contents
 
 @ifnottex
-@node Top, Preface, (dir), (dir)
-@top Version
+@node Top
+@top GNU Coding Standards
 
 @insertcopying
 @end ifnottex
@@ -87,7 +88,7 @@ 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, DVI, plain
-text, and more, at: @uref{http://www.gnu.org/prep/standards/}.
+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
@@ -98,14 +99,20 @@ Software}).
 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{http://lists.gnu.org/mailman/listinfo/gnustandards-commit}.
+@url{https://lists.gnu.org/mailman/listinfo/gnustandards-commit}.
 Archives are also available there.
 
-Corrections or suggestions for this document should be sent to
-@email{bug-standards@@gnu.org}.  If you make a suggestion, please include a
-suggested new wording for it; our time is limited.  We prefer a context
-diff to the @file{standards.texi} or @file{make-stds.texi} files, but if
-you don't have those files, please mail your suggestion anyway.
+@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.
@@ -121,7 +128,7 @@ 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{http://www.gnu.org/software/hello/hello.html}.
+@uref{https://www.gnu.org/software/hello/hello.html}.
 
 This release of the GNU Coding Standards was last updated
 @value{lastupdate}.
@@ -175,6 +182,7 @@ 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
@@ -217,21 +225,22 @@ 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 programs; if you have
-reached the stage of actually maintaining a program for GNU (whether
-released or not), please ask us for a copy.  It is also available
-online for your perusal: @uref{http://www.gnu.org/prep/maintain/}.
+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 acknowledgements in GNU software
+Please do not include any trademark acknowledgments in GNU software
 packages or documentation.
 
-Trademark acknowledgements are the statements that such-and-such is a
+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 acknowledgements feel like kowtowing,
+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
@@ -246,12 +255,10 @@ 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.  If you wish to praise
-Microsoft Windows when speaking on your own, by all means do so, but
-not in GNU software.  Usually we write the name ``Windows'' in full,
-but when brevity is very important (as in file names and sometimes
-symbol names), we abbreviate it to ``w''.  For instance, the files and
-functions in Emacs that deal with Windows start with @samp{w32}.
+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 Design Advice
 @chapter General Program Design
@@ -283,68 +290,52 @@ account when designing your program.
 @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.  Using another language is like
-using a non-standard feature: it will cause trouble for users.  Even if
-GCC supports the other language, users may find it inconvenient to have
-to install the compiler for that other language in order to build your
-program.  For example, if you write your program in C++, people will
-have to install the GNU C++ compiler in order to compile your program.
-
-C has one other advantage over C++ and other compiled languages: more
-people know C, so more people will find it easy to read and modify the
-program if it is written in C.
-
-So in general it is much better to use C, rather than the
-comparable alternatives.
-
-But there are two exceptions to that conclusion:
-
-@itemize @bullet
-@item
-It is no problem to use another language to write a tool specifically
-intended for use with that language.  That is because the only people
-who want to build the tool will be those who have installed the other
-language anyway.
-
-@item
-If an application is of interest only to a narrow part of the community,
-then the question of which language it is written in has less effect on
-other people, so you may as well please yourself.
-@end itemize
+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
+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{http://www.gnu.org/@/software/@/guile/}), which implements the
+(@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 very important for the overall consistency of the GNU
-system.
+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 @sc{posix} standards
-@cindex @sc{posix} compatibility
+@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 @sc{posix} if @sc{posix} specifies
+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 @sc{posix} prohibit many kinds of extensions.  Feel
+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
@@ -352,7 +343,7 @@ 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 @sc{posix} if the
+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.
@@ -400,18 +391,24 @@ already.  That would be extremely troublesome in certain cases.
 
 @node Standard C
 @section Standard C and Pre-Standard C
-@cindex @sc{ansi} C standard
+@cindex ANSI C standard
 
 1989 Standard C is widespread enough now that it is ok to use its
-features in new programs.  There is one exception: do not ever use the
+features in programs.  There is one exception: do not ever use the
 ``trigraph'' feature of Standard C.
 
-1999 Standard C is not widespread yet, so please do not require its
-features in programs.  It is ok to use its features if they are present.
+The 1999 and 2011 editions of Standard C are not fully supported
+on all platforms.  If you aim to support compilation by
+compilers other than GCC, you should not require these C
+features in your programs.  It is ok to use these features
+conditionally when the compiler supports them.
+
+If your program is only meant to compile with GCC, then you can
+use these features if GCC supports them, when they give substantial
+benefit.
 
 However, it is easy to support pre-standard compilers in most programs,
-so if you know how to do that, feel free.  If a program you are
-maintaining has such support, you should try to keep it working.
+so if you know how to do that, feel free.
 
 @cindex function prototypes
 To support pre-standard C, instead of writing function definitions in
@@ -535,8 +532,11 @@ command line interface, and how libraries should behave.
 * 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.
@@ -569,7 +569,7 @@ 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
+we can say ``GCC is a 100% implementation of the standard'', not
 because there is any reason to actually use it.
 
 POSIX.2 specifies that @samp{df} and @samp{du} must output sizes by
@@ -585,7 +585,8 @@ 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.''
+merely because a standard says it is ``forbidden'' or ``deprecated''.
+
 
 @node Semantics
 @section Writing Robust Programs
@@ -597,36 +598,27 @@ 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 @emph{including those with codes above 0177}.
-The only sensible exceptions would be utilities specifically intended
-for interface to certain types of terminals or printers
-that can't handle those characters.
-Whenever possible, try to make programs work properly with
-sequences of bytes that represent multibyte characters, using encodings
-such as UTF-8 and others.
+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{perror} 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.
+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 zero.  Check @code{realloc} even if you are making the block
-smaller; in a system that rounds block sizes to a power of 2,
+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.
 
-In Unix, @code{realloc} can destroy the storage block if it returns
-zero.  GNU @code{realloc} does not have this bug: if it fails, the
-original block is unchanged.  Feel free to assume the bug is fixed.  If
-you wish to run your program on Unix, and wish to avoid lossage in this
-case, you can use the GNU @code{malloc}.
-
 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}.
@@ -642,8 +634,10 @@ 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.  Reserve C initialized declarations
-for data that will not be changed.
+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
@@ -654,10 +648,10 @@ These are supported compatibly by GNU.
 
 @cindex signal handling
 The preferred signal handling facilities are the BSD variant of
-@code{signal}, and the @sc{posix} @code{sigaction} function; the
+@code{signal}, and the POSIX @code{sigaction} function; the
 alternative USG @code{signal} interface is an inferior design.
 
-Nowadays, using the @sc{posix} signal functions may be the easiest way
+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
@@ -694,9 +688,14 @@ fd = open (filename, O_WRONLY | O_CREAT | O_EXCL, 0600);
 @end example
 
 @noindent
-or by using the @code{mkstemps} function from libiberty.
+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}).
 
-In bash, use @code{set -C} to avoid this problem.
 
 @node Libraries
 @section Library Behavior
@@ -736,24 +735,27 @@ fit any naming convention.
 Error messages from compilers should look like this:
 
 @example
-@var{source-file-name}:@var{lineno}: @var{message}
+@var{sourcefile}:@var{lineno}: @var{message}
 @end example
 
 @noindent
 If you want to mention the column number, use one of these formats:
 
 @example
-@var{source-file-name}:@var{lineno}:@var{column}: @var{message}
-@var{source-file-name}:@var{lineno}.@var{column}: @var{message}
+@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.
+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
@@ -761,22 +763,22 @@ avoid redundant information such as a duplicate line number.
 Here are the possible formats:
 
 @example
-@var{source-file-name}:@var{lineno-1}.@var{column-1}-@var{lineno-2}.@var{column-2}: @var{message}
-@var{source-file-name}:@var{lineno-1}.@var{column-1}-@var{column-2}: @var{message}
-@var{source-file-name}:@var{lineno-1}-@var{lineno-2}: @var{message}
+@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{file-1}:@var{lineno-1}.@var{column-1}-@var{file-2}:@var{lineno-2}.@var{column-2}: @var{message}
+@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{source-file-name}:@var{lineno}: @var{message}
+@var{program}:@var{sourcefile}:@var{lineno}: @var{message}
 @end example
 
 @noindent
@@ -792,7 +794,7 @@ when there is no relevant source file.
 If you want to mention the column number, use this format:
 
 @example
-@var{program}:@var{source-file-name}:@var{lineno}:@var{column}: @var{message}
+@var{program}:@var{sourcefile}:@var{lineno}:@var{column}: @var{message}
 @end example
 
 In an interactive program (one that is reading commands from a
@@ -816,26 +818,39 @@ end with a period.
 
 @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.
+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.
+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 the program depend on the
-type of output device it is used with.  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.)
+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.
+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
@@ -845,41 +860,119 @@ 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 GTK+
+@cindex GNUstep
 When you write a program that provides a graphical user interface,
-please make it work with the X Window System and the GTK+ toolkit
-unless the functionality specifically requires some alternative (for
-example, ``displaying jpeg images while in console mode'').
+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
-Please also consider providing a CORBA interface (for use from GNOME), 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.
-
+@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 @sc{posix} guidelines for the
+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 @sc{posix}
+special argument @samp{--} is used.  This is not what POSIX
 specifies; it is a GNU extension.
 
 @cindex long-named options
@@ -909,7 +1002,7 @@ among GNU utilities, and fewer idiosyncrasies for users to remember.
 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 @url{http://example.org/p.cgi/--help} in a browser should
+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.
 
@@ -973,7 +1066,7 @@ 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
-abbrevations below, and a brief statement that the program is free
+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.
@@ -986,7 +1079,7 @@ 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 <http://gnu.org/licenses/gpl.html>
+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
@@ -1022,7 +1115,8 @@ 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.
+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
@@ -1030,61 +1124,59 @@ abbreviation as usual, as in the examples below.
 
 @table @asis
 @item GPL
-GNU General Public License, @url{http://www.gnu.org/@/licenses/@/gpl.html}.
+GNU General Public License, @url{https://www.gnu.org/@/licenses/@/gpl.html}.
 
 @item LGPL
-GNU Lesser General Public License, @url{http://www.gnu.org/@/licenses/@/lgpl.html}.
-
-@item GPL/Guile
-GNU GPL with the exception for Guile; for example, GPLv3+/Guile means
-the GNU GPL version 3 or later, with the extra exception for Guile.
+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{http://www.apache.org/@/licenses}.
+@url{https://directory.fsf.org/@/wiki/@/License:Apache2.0}.
 
 @item Artistic
-The Artistic license used for Perl, @url{http://www.perlfoundation.org/@/legal}.
+The Artistic license used for Perl,
+@url{https://directory.fsf.org/@/wiki/@/License:ArtisticLicense2.0}.
 
 @item Expat
-The Expat license, @url{http://www.jclark.com/@/xml/@/copying.txt}.
+The Expat license, @url{https://directory.fsf.org/@/wiki/@/License:Expat}.
 
 @item MPL
-The Mozilla Public License, @url{http://www.mozilla.org/@/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{http://www.xfree86.org/@/3.3.6/@/COPYRIGHT2.html#6}.
+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{http://www.php.net/@/license/}.
+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{http://www.gnu.org/@/licenses/@/license-list.html#PublicDomain}.
+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{http://www.python.org/@/2.0.1/@/license.html}.
+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{http://www.xfree86.org/@/3.3.6/@/COPYRIGHT2.html#5}.
+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{http://www.xfree86.org/@/3.3.6/@/COPYRIGHT2.html#3}.
+System, @url{https://directory.fsf.org/@/wiki/@/License:X11}.
 
 @item Zlib
-The license for Zlib, @url{http://www.gzip.org/@/zlib/@/zlib_license.html}.
+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{http://www.gnu.org/@/licenses/@/license-list.html}.
+@url{https://www.gnu.org/@/licenses/@/license-list.html}.
 
 
 @node --help
@@ -1101,18 +1193,56 @@ is seen, and the program should not perform its normal function.
 @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{http://www.gnu.org/software/@var{pkg}}, and the
+(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: <http://www.gnu.org/software/@var{pkg}/>
-General help using GNU software: <http://www.gnu.org/gethelp/>
+@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
@@ -2240,9 +2370,9 @@ Print the version number.
 @cindex X.509
 
 The OID (object identifier) 1.3.6.1.4.1.11591 has been assigned to the
-GNU Project (thanks to Werner Koch).  These are used for SNMP, LDAP,
-X.509 certificates, and so on.  The web site
-@url{http://www.alvestrand.no/objectid} has a (voluntary) listing of
+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
@@ -2272,7 +2402,15 @@ 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 zero.
+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
@@ -2307,7 +2445,7 @@ when writing GNU software.
 * System Functions::            Portability and ``standard'' library functions.
 * Internationalization::        Techniques for internationalization.
 * Character Set::               Use ASCII by default.
-* Quote Characters::            Use `...' in the C locale.
+* Quote Characters::            Use "..." or '...' in the C locale.
 * Mmap::                        How you can safely use @code{mmap}.
 @end menu
 
@@ -2315,8 +2453,14 @@ when writing GNU software.
 @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
@@ -2363,6 +2507,20 @@ lots_of_args (int an_integer, long a_long, short a_short,
 @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
@@ -2509,7 +2667,7 @@ 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 the reader can see that for himself.
+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.
 
@@ -2582,6 +2740,17 @@ 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
@@ -2599,6 +2768,7 @@ 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.
@@ -2689,7 +2859,7 @@ inside @code{while}-conditions are ok).  For example, don't write
 this:
 
 @example
-if ((foo = (char *) malloc (sizeof *foo)) == 0)
+if ((foo = (char *) malloc (sizeof *foo)) == NULL)
   fatal ("virtual memory exhausted");
 @end example
 
@@ -2698,15 +2868,10 @@ instead, write this:
 
 @example
 foo = (char *) malloc (sizeof *foo);
-if (foo == 0)
+if (foo == NULL)
   fatal ("virtual memory exhausted");
 @end example
 
-@pindex lint
-Don't make the program ugly to placate @code{lint}.  Please don't insert any
-casts to @code{void}.  Zero without a cast is perfectly fine as a null
-pointer constant, except when calling a varargs function.
-
 @node Names
 @section Naming Variables, Functions, and Files
 
@@ -2761,6 +2926,7 @@ 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
@@ -2769,18 +2935,33 @@ 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 on top of the GNU kernel,
-compiled with the GNU C compiler, on various types of @sc{cpu}.  So the
-kinds of portability that are absolutely necessary are quite limited.
-But it is important to support Linux-based GNU systems, since they
-are the form of GNU that is popular.
-
-Beyond that, it is good to support the other free operating systems
-(*BSD), and it is nice to support other Unix-like systems if you want
-to.  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.
+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
@@ -2792,21 +2973,22 @@ written.
 Avoid using the format of semi-internal data bases (e.g., directories)
 when there is a higher-level alternative (@code{readdir}).
 
-@cindex non-@sc{posix} systems, and portability
-As for systems that are not like Unix, such as MSDOS, Windows, VMS, MVS,
+@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''.  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 this in GNU packages.  Instead of abbreviating
-``Windows'' to ``win'', you can write it in full or abbreviate it to
-``woe'' or ``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}.
+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
@@ -2821,30 +3003,34 @@ 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 @sc{cpu}s
+@section Portability between CPUs
 
 @cindex data types, and portability
 @cindex portability, and data types
-Even GNU systems will differ because of differences among @sc{cpu}
+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.
 
-Similarly, don't make any effort to cater to the possibility that
-@code{long} will be smaller than predefined types like @code{size_t}.
-For example, the following code is ok:
+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
 
-1989 Standard C requires this to work, and we know of only one
-counterexample: 64-bit programs on Microsoft Windows.  We will
-leave it to those who want to port GNU programs to that environment
-to figure out how to do it.
+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
@@ -2875,51 +3061,6 @@ while ((c = getchar ()) != EOF)
   @}
 @end example
 
-It used to be ok to not worry about the difference between pointers
-and integers when passing arguments to functions.  However, on most
-modern 64-bit machines pointers are wider than @code{int}.
-Conversely, integer types like @code{long long int} and @code{off_t}
-are wider than pointers on most modern 32-bit machines.  Hence it's
-often better nowadays to use prototypes to define functions whose
-argument types are not trivial.
-
-In particular, if functions accept varying argument counts or types
-they should be declared using prototypes containing @samp{...} and
-defined using @file{stdarg.h}.  For an example of this, please see the
-@uref{http://www.gnu.org/software/gnulib/, Gnulib} error module, which
-declares and defines the following function:
-
-@example
-/* Print a message with `fprintf (stderr, FORMAT, ...)';
-   if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
-   If STATUS is nonzero, terminate the program with `exit (STATUS)'.  */
-
-void error (int status, int errnum, const char *format, ...);
-@end example
-
-A simple way to use the Gnulib error module is to obtain the two
-source files @file{error.c} and @file{error.h} from the Gnulib library
-source code repository at
-@uref{http://git.savannah.gnu.org/@/gitweb/@/?p=gnulib.git}.
-Here's a sample use:
-
-@example
-#include "error.h"
-#include <errno.h>
-#include <stdio.h>
-
-char *program_name = "myprogram";
-
-FILE *
-xfopen (char const *name)
-@{
-  FILE *fp = fopen (name, "r");
-  if (! fp)
-    error (1, errno, "cannot read %s", name);
-  return fp;
-@}
-@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
@@ -2930,133 +3071,75 @@ 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
 
-C implementations differ substantially.  Standard C reduces but does
-not eliminate the incompatibilities; meanwhile, many GNU packages still
-support pre-standard compilers because this is not hard to do.  This
-chapter gives recommendations for how to use the more-or-less standard C
-library functions to avoid unnecessary loss of portability.
-
-@itemize @bullet
-@item
-Don't use the return value of @code{sprintf}.  It returns the number of
-characters written on some systems, but not on all systems.
-
-@item
-Be aware that @code{vfprintf} is not always available.
-
-@item
-@code{main} should be declared to return type @code{int}.  It should
-terminate either by calling @code{exit} or by returning the integer
-status code; make sure it cannot ever return an undefined value.
-
-@cindex declaration for system functions
-@item
-Don't declare system functions explicitly.
-
-Almost any declaration for a system function is wrong on some system.
-To minimize conflicts, leave it to the system header files to declare
-system functions.  If the headers don't declare a function, let it
-remain undeclared.
-
-While it may seem unclean to use a function without declaring it, in
-practice this works fine for most system library functions on the
-systems where this really happens; thus, the disadvantage is only
-theoretical.  By contrast, actual declarations have frequently caused
-actual conflicts.
-
-@item
-If you must declare a system function, don't specify the argument types.
-Use an old-style declaration, not a Standard C prototype.  The more you
-specify about the function, the more likely a conflict.
-
-@item
-In particular, don't unconditionally declare @code{malloc} or
-@code{realloc}.
-
-Most GNU programs use those functions just once, in functions
-conventionally named @code{xmalloc} and @code{xrealloc}.  These
-functions call @code{malloc} and @code{realloc}, respectively, and
-check the results.
-
-Because @code{xmalloc} and @code{xrealloc} are defined in your program,
-you can declare them in other files without any risk of type conflict.
-
-On most systems, @code{int} is the same length as a pointer; thus, the
-calls to @code{malloc} and @code{realloc} work fine.  For the few
-exceptional systems (mostly 64-bit machines), you can use
-@strong{conditionalized} declarations of @code{malloc} and
-@code{realloc}---or put these declarations in configuration files
-specific to those systems.
-
-@cindex string library functions
-@item
-The string functions require special treatment.  Some Unix systems have
-a header file @file{string.h}; others have @file{strings.h}.  Neither
-file name is portable.  There are two things you can do: use Autoconf to
-figure out which file to include, or don't include either file.
-
-@item
-If you don't include either strings file, you can't get declarations for
-the string functions from the header file in the usual way.
-
-That causes less of a problem than you might think.  The newer standard
-string functions should be avoided anyway because many systems still
-don't support them.  The string functions you can use are these:
-
-@example
-strcpy   strncpy   strcat   strncat
-strlen   strcmp    strncmp
-strchr   strrchr
-@end example
-
-The copy and concatenate functions work fine without a declaration as
-long as you don't use their values.  Using their values without a
-declaration fails on systems where the width of a pointer differs from
-the width of @code{int}, and perhaps in other cases.  It is trivial to
-avoid using their values, so do that.
-
-The compare functions and @code{strlen} work fine without a declaration
-on most systems, possibly all the ones that GNU software runs on.
-You may find it necessary to declare them @strong{conditionally} on a
-few systems.
-
-The search functions must be declared to return @code{char *}.  Luckily,
-there is no variation in the data type they return.  But there is
-variation in their names.  Some systems give these functions the names
-@code{index} and @code{rindex}; other systems use the names
-@code{strchr} and @code{strrchr}.  Some systems support both pairs of
-names, but neither pair works on all systems.
-
-You should pick a single pair of names and use it throughout your
-program.  (Nowadays, it is better to choose @code{strchr} and
-@code{strrchr} for new programs, since those are the standard
-names.)  Declare both of those names as functions returning @code{char
-*}.  On systems which don't support those names, define them as macros
-in terms of the other pair.  For example, here is what to put at the
-beginning of your file (or in a header) if you want to use the names
-@code{strchr} and @code{strrchr} throughout:
-
-@example
-#ifndef HAVE_STRCHR
-#define strchr index
-#endif
-#ifndef HAVE_STRRCHR
-#define strrchr rindex
-#endif
+Historically, C implementations differed substantially, and many
+systems lacked a full implementation of ANSI/ISO C89.  Nowadays,
+however, all practical systems have a C89 compiler and GNU C supports
+almost all of C99 and some of C11.  Similarly, most systems implement
+POSIX.1-2001 libraries and tools, and many have POSIX.1-2008.
+
+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
 
-char *strchr ();
-char *strrchr ();
-@end example
-@end itemize
+@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-1.2008 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 type-safe 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.
 
-Here we assume that @code{HAVE_STRCHR} and @code{HAVE_STRRCHR} are
-macros defined in systems where the corresponding functions exist.
-One way to get them properly defined is to use Autoconf.
 
 @node Internationalization
 @section Internationalization
@@ -3073,12 +3156,12 @@ 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'..."));
+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.
+'%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.
@@ -3196,11 +3279,12 @@ 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
-to use non-ASCII characters to represent proper names of contributors in
-change logs (@pxref{Change Logs}).
+(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, as one cannot in general mix encodings reliably.
+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
@@ -3208,43 +3292,59 @@ one encoding, as one cannot in general mix encodings reliably.
 @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.
 
-In the C locale, GNU programs should stick to plain ASCII for quotation
-characters in messages to users: preferably 0x60 (@samp{`}) for left
-quotes and 0x27 (@samp{'}) for right quotes.  It is ok, but not
-required, to use locale-specific quotes in other locales.
+It is ok, but not required, for GNU programs to generate
+locale-specific quotes in non-C locales.  For example:
 
-The @uref{http://www.gnu.org/software/gnulib/, Gnulib} @code{quote} and
-@code{quotearg} modules provide a reasonably straightforward way to
-support locale-specific quote characters, as well as taking care of
-other issues, such as quoting a filename that itself contains a quote
-character.  See the Gnulib documentation for usage details.
+@example
+printf (gettext ("Processing file '%s'..."), file);
+@end example
 
-In any case, the documentation for your program should clearly specify
-how it does quoting, if different than the preferred method of @samp{`}
-and @samp{'}.  This is especially important if the output of your
-program is ever likely to be parsed by another program.
+@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.
 
-Quotation characters are a difficult area in the computing world at
-this time: there are no true left or right quote characters in Latin1;
-the @samp{`} character we use was standardized there as a grave
-accent.  Moreover, Latin1 is still not universally usable.
+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.
 
-Unicode contains the unambiguous quote characters required, and its
-common encoding UTF-8 is upward compatible with Latin1.  However,
-Unicode and UTF-8 are not universally well-supported, either.
+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}.
 
-This may change over the next few years, and then we will revisit
-this.
+@clear txicodequoteundirected
+@clear txicodequotebacktick
 
 
 @node Mmap
 @section Mmap
 @findex mmap
 
-Don't assume that @code{mmap} either works on all files or fails
-for all files.  It may work on some files and fail on others.
+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
@@ -3252,10 +3352,11 @@ 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
+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
@@ -3300,6 +3401,33 @@ 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
@@ -3358,13 +3486,13 @@ are purely tutorial and cover the basics of the subject.  These provide
 the framework for a beginner to understand the rest of the manual.  The
 Bison manual provides a good example of how to do this.
 
-To serve as a reference, a manual should have an Index that list all the
-functions, variables, options, and important concepts that are part of
-the program.  One combined Index should do for a short manual, but
-sometimes for a complex package it is better to use multiple indices.
-The Texinfo manual includes advice on preparing good index entries, see
-@ref{Index Entries, , Making Index Entries, texinfo, GNU Texinfo}, and
-see @ref{Indexing Commands, , Defining the Entries of an
+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;
@@ -3388,6 +3516,18 @@ 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
 
@@ -3454,11 +3594,11 @@ 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{http://www.gnu.org/copyleft/fdl-howto.html} for more explanation
+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
+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.
@@ -3479,7 +3619,7 @@ 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{http://www.gnu.org/order/order.html}.  This should not be included
+@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
@@ -3510,7 +3650,76 @@ future will know about the changes that might have introduced the bug.
 Often a new bug can be found by looking at what was recently changed.
 More importantly, change logs can help you eliminate conceptual
 inconsistencies between different parts of a program, by giving you a
-history of how the conflicting concepts arose and who they came from.
+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::
@@ -3521,44 +3730,127 @@ history of how the conflicting concepts arose and who they came from.
 @end menu
 
 @node Change Log Concepts
-@subsection 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
-explains how earlier versions were different from the current version.
-People can see the current version; they don't need the change log
-to tell them what is in it.  What they want from a change log is a
-clear explanation of how the earlier version differed.
+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:
 
-The change log file is normally called @file{ChangeLog} and covers an
-entire directory.  Each directory can have its own change log, or a
-directory can use the change log of its parent directory---it's up to
-you.
+@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.
 
-Another alternative is to record change log information with a version
-control system such as RCS or CVS.  This can be converted automatically
-to a @file{ChangeLog} file using @code{rcs2log}; in Emacs, the command
-@kbd{C-x v a} (@code{vc-update-change-log}) does the job.
-
-There's no need to describe the full purpose of the changes or how
-they work together.  However, sometimes it is useful to write one line
-to describe the overall purpose of a change or a batch of changes.  If
-you think that a change calls for explanation, you're probably right.
-Please do explain it---but please put the full explanation in comments
-in the code, where people will see it whenever they see the code.  For
-example, ``New function'' is enough for the change log when you add a
-function, because there should be a comment before the function
-definition to explain what it does.
-
-In the past, we recommended not mentioning changes in non-software
-files (manuals, help files, etc.) in change logs.  However, we've been
-advised that it is a good idea to include them, for the sake of
-copyright records.
+@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.
 
-The easiest way to add an entry to @file{ChangeLog} is with the Emacs
-command @kbd{M-x add-change-log-entry}.  An entry should have an
-asterisk, the name of the changed file, and then in parentheses the name
-of the changed functions, variables or whatever, followed by a colon.
-Then describe the changes you made to that function or variable.
+@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
@@ -3567,50 +3859,76 @@ Then describe the changes you made to that function or variable.
 Here are some simple examples of change log entries, starting with the
 header line that says who made the change and when it was installed,
 followed by descriptions of specific changes.  (These examples are
-drawn from Emacs and GCC.)
+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
-1998-08-17  Richard Stallman  <rms@@gnu.org>
+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>
 
-* register.el (insert-register): Return nil.
-(jump-to-register): Likewise.
+	Port to platforms where tputs is in libtinfow
 
-* sort.el (sort-subr): Return nil.
+	* configure.ac (tputs_library): Also try tinfow, ncursesw (Bug#33977).
 
-* tex-mode.el (tex-bibtex-file, tex-file, tex-region):
-Restart the tex shell if process is gone or stopped.
-(tex-shell-running): New function.
+2019-02-08  Eli Zaretskii  <eliz@@gnu.org>
 
-* expr.c (store_one_arg): Round size up for move_block_to_reg.
-(expand_call): Round up when emitting USE insns.
-* stmt.c (assign_parms): Round size up for move_block_from_reg.
+	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
 
-It's important to name the changed function or variable in full.  Don't
-abbreviate function or variable names, and don't combine them.
-Subsequent maintainers will often search for a function name to find all
-the change log entries that pertain to it; if you abbreviate the name,
-they won't find it when they search.
+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.  When two
-entries represent parts of the same change, so that they work together,
-then don't put blank lines between them.  Then you can omit the file
-name and the asterisk when successive entries are in the same file.
+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{(} as in this example:
+@samp{(}.  This makes highlighting in Emacs work better.
+Here is an example:
 
 @example
-* keyboard.c (menu_bar_items, tool_bar_items)
-(Fexecute_extended_command): Deal with `keymap' property.
+* 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:
@@ -3630,7 +3948,24 @@ rather than this:
         * 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
@@ -3638,6 +3973,15 @@ As for the date, that should be the date you applied the change.
 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
@@ -3653,61 +3997,98 @@ When you change just comments or doc strings, it is enough to write an
 entry for the file, without mentioning the functions.  Just ``Doc
 fixes'' is enough for the change log.
 
-There's no technical need to make change log entries for documentation
-files.  This is because documentation is not susceptible to bugs that
-are hard to fix.  Documentation does not consist of parts that must
-interact in a precisely engineered fashion.  To correct an error, you
-need not know the history of the erroneous passage; it is enough to
-compare what the documentation says with the way the program actually
-works.
+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:
 
-However, you should keep change logs for documentation files when the
+@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.
+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
 
-C programs often contain compile-time @code{#if} conditionals.  Many
-changes are conditional; sometimes you add a new definition which is
-entirely contained in a conditional.  It is very useful to indicate in
-the change log the conditions for which the change applies.
+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 square
-brackets around the name of the condition.
+Our convention for indicating conditional changes is to use
+@emph{square brackets around the name of the condition}.
 
-Here is a simple example, describing a change which is conditional but
-does not have a function or entity name associated with it:
+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.
+* 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
 
-Here is an entry describing a new definition which is entirely
-conditional.  This new definition for the macro @code{FRAME_WINDOW_P} is
-used only when @code{HAVE_X_WINDOWS} is defined:
+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
 
-Here is 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:
+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
 
-Here is an entry for a change that takes affect only when
+Finally, here is an entry for a change that takes effect only when
 a certain macro is @emph{not} defined:
 
 @example
-(gethostname) [!HAVE_SOCKETS]: Replace with winsock version.
+* host.c (gethostname) [!HAVE_SOCKETS]: Replace with winsock version.
 @end example
 
+
 @node Indicating the Part Changed
 @subsection Indicating the Part Changed
 
@@ -3750,7 +4131,7 @@ distribution until someone else agrees to update it.
 When a program changes only a little, you may feel that the
 discrepancies are small enough that the man page remains useful without
 updating.  If so, put a prominent note near the beginning of the man
-page explaining that you don't maintain it and that the Texinfo manual
+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.
 
@@ -3764,7 +4145,7 @@ they can be considered true manuals, use the GFDL (@pxref{License for
 Manuals}).
 
 Finally, the GNU help2man program
-(@uref{http://www.gnu.org/software/help2man/}) is one way to automate
+(@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.
 
@@ -3788,7 +4169,7 @@ with the FSF about the individual case.
 @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
+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
@@ -3840,7 +4221,7 @@ 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 explaining that they were generated
+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.
 
@@ -3873,7 +4254,8 @@ corresponding to most of the standard directory variables
 
 @example
 --prefix --exec-prefix --bindir --sbindir --libexecdir --sysconfdir
---sharedstatedir --localstatedir --libdir --includedir --oldincludedir
+--sharedstatedir --localstatedir --runstatedir
+--libdir --includedir --oldincludedir
 --datarootdir --datadir --infodir --localedir --mandir --docdir
 --htmldir --dvidir --pdfdir --psdir
 @end example
@@ -3893,7 +4275,7 @@ 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{http://git.savannah.gnu.org/@/gitweb/@/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD,
+@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.
 
@@ -3904,7 +4286,7 @@ plain @var{buildtype} argument.  For example, @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{http://git.savannah.gnu.org/@/gitweb/@/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD,
+@uref{https://git.savannah.gnu.org/cgit/config.git/plain/config.guess,
 @file{config.guess}}.
 
 @cindex optional features, configure-time
@@ -4019,6 +4401,7 @@ ignore most of its arguments.
 @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.
@@ -4035,28 +4418,39 @@ 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} which gives
-the name of the package, and a general description of what it does.  It
-is also good to explain the purpose of each of the first-level
-subdirectories in the package, if there are any.  The @file{README} file
-should either state the version number of the package, or refer to where
-in the package it can be found.
-
-The @file{README} file should refer to the file @file{INSTALL}, which
-should contain an explanation of the installation procedure.
-
-The @file{README} file should also refer 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
+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, provided they are
-up-to-date and machine-independent, so that building the distribution
-normally will never modify them.  We commonly include non-source files
-produced by Bison, @code{lex}, @TeX{}, and @code{makeinfo}; this helps avoid
+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 packages they want to install.
+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
@@ -4078,7 +4472,7 @@ 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
+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,
@@ -4106,16 +4500,16 @@ 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
-idea that their existence is ethical.
+impression that their existence is legitimate.
 
 The GNU definition of free software is found on the GNU web site at
-@url{http://www.gnu.org/@/philosophy/@/free-sw.html}, and the definition
+@url{https://www.gnu.org/@/philosophy/@/free-sw.html}, and the definition
 of free documentation is found at
-@url{http://www.gnu.org/@/philosophy/@/free-doc.html}.  The terms ``free''
+@url{https://www.gnu.org/@/philosophy/@/free-doc.html}.  The terms ``free''
 and ``non-free'', used in this document, refer to those definitions.
 
 A list of important licenses and whether they qualify as free is in
-@url{http://www.gnu.org/@/licenses/@/license-list.html}.  If it is not
+@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.
@@ -4125,7 +4519,8 @@ 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 non-free
 operating system, or how to use it together with some widely used
-non-free program.
+non-free 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 non-free program to use your program with
@@ -4138,6 +4533,11 @@ 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 non-free add-ons for the non-free 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 non-free program.
+
 If a non-free 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 non-free program more than it popularizes
@@ -4146,17 +4546,18 @@ 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
-non-free platform in order to run.  For instance, many Java programs
-depend on some non-free Java libraries.  To recommend or promote such
-a program is to promote the other programs it needs.  This is why we
-are careful about listing Java programs in the Free Software
-Directory: we don't want to promote the non-free Java libraries.
-
-We hope this particular problem with Java will be gone by and by, as
-we replace the remaining non-free standard Java libraries with free
-software, but the general principle will remain the same: don't
-recommend, promote or legitimize programs that depend on non-free
-software to run.
+non-free platform in order to run.  For instance, it used to be the
+case that many Java programs depended on some non-free 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 non-free 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 non-free software to run.
 
 Some free programs strongly encourage the use of non-free software.  A
 typical example is @command{mplayer}.  It is free software in itself,
@@ -4182,28 +4583,51 @@ 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 non-free.  This is because we don't include such
-things in the GNU system even they are free---they are outside the
+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 non-free
-program is promoting that program, so please do not make links (or
+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.
 
-Following links from nearly any web site can lead eventually to
-non-free software; this is inherent in the nature of the web.  So it
-makes no sense to criticize a site for having such links.  As long as
-the site does not itself recommend a non-free program, there is no
-need to consider the question of the sites that it links to for other
-reasons.
-
-Thus, for example, you should not refer to AT&T's web site if that
-recommends AT&T's non-free software packages; you should not refer to
-a site that links to AT&T's site presenting it as a place to get some
-non-free program, because that link recommends and legitimizes the
-non-free program.  However, that a site contains a link to AT&T's web
-site for some other purpose (such as long-distance telephone service)
-is not an objection against it.
+What about chains of links?  Following links from nearly any web site
+can lead eventually to promotion of non-free 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
+non-free 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
+non-free program, because that part of the page @var{p} itself
+recommends and legitimizes the non-free 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 non-free, but non-free is the usual
+case.
+
+If the purpose for which you would refer to the page cannot be carried
+out without running non-free 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 non-free
+Javascript code, then don't refer to that page.
+
+The extreme case is that of web sites which depend on non-free
+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 non-free 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
@@ -4218,7 +4642,7 @@ is not an objection against it.
 @bye
 
 Local variables:
-eval: (add-hook 'write-file-hooks 'time-stamp)
+eval: (add-hook 'before-save-hook 'time-stamp)
 time-stamp-start: "@set lastupdate "
 time-stamp-end: "$"
 time-stamp-format: "%:b %:d, %:y"
diff --git a/work.m/GNUmakefile b/work.m/GNUmakefile
index 4986a51..1325962 100644
--- a/work.m/GNUmakefile
+++ b/work.m/GNUmakefile
@@ -1,4 +1,5 @@
-# Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
+# $Id: GNUmakefile,v 1.10 2011/09/26 18:18:16 karl Exp $
+# Copyright 2006, 2007, 2008, 2010, 2011 Free Software Foundation, Inc.
 #
 # Copying and distribution of this file, with or without modification,
 # are permitted in any medium without royalty provided the copyright
@@ -7,41 +8,22 @@
 # To use these targets, first do (one time only):
 # - ln -s ../*.texi .
 # - copy gendocs.sh and gendocs_template from texinfo/util here.
-# - then try make a, then make b, then make c
-# - if all goes well, see info at end for updating the web.
+# - then try make a, then make b, then make c.
 # - also update gnulib/doc.
 
 # check that makeinfo is happy.
 a:
+	rm -rf maintain
 	makeinfo maintain
 
 # build everything.
 b:
 	gendocs.sh maintain "Information for maintainers of GNU software"
 
-# fix cross-manual xrefs.
-# be nice to do this more cleanly later, but needs Texinfo config file, etc.
 c:
-# new-style gendocs.sh
-	perl -pi -e 's,href="(texinfo|emacs).html,href="/software/\1/manual/\1/\1.html,g' manual/maintain.html 
-	perl -pi -e 's,href="\.\./(texinfo|emacs)/,href="/software/\1/manual/\1/html_node/,g' manual/html_node/*.html
-#
-# new-style gendocs.sh, but special location.
-	perl -pi -e 's,href="(standards).html,href="/prep/\1/\1.html,g' manual/maintain.html 
-	perl -pi -e 's,href="\.\./(standards)/,href="/prep/\1/html_node/,g' manual/html_node/*.html
-#
-# old-style (and not updated for ages)
-	perl -pi -e 's,href="(cvs).html,href="/software/\1/manual/html_mono/\1.html,g' manual/maintain.html 
-	perl -pi -e 's,href="\.\./(cvs)/,href="/software/\1/manual/\1/html_node/,g' manual/html_node/*.html
-#
-# elisp
-	perl -pi -e 's,href="elisp.html,href="/software/emacs/manual/html_mono/elisp.html,g' manual/maintain.html 
-	perl -pi -e 's,href="\.\./elisp/,href="/software/emacs/manual/html_node/elisp/,g' manual/html_node/*.html
-#
-	gzip -9f <manual/maintain.html >manual/maintain.html.gz
-	cd manual/html_node && tar czf ../maintain.html_node.tar.gz -- *.html
-#
-	cd manual && tar cjf ../m.tbz .
-
-# then unpack m.tbz in a cvs checkout of www/prep/maintain, cvs add any
-# new files, cvs remove any old ones, and cvs commit everything.
+# copy to a local checkout of all of www (specified by envvar $gw):
+	cd manual && for f in `find -type f`; do \
+	     cmp -s $$f $$gw/prep/maintain/$$f \
+	  || \cp -f $$f $$gw/prep/maintain/$$f -v; done
+	# if nodes were removed, remove their html_node files.
+	# (and leave an anchor behind!)
diff --git a/work.s/GNUmakefile b/work.s/GNUmakefile
index b472b99..67a3607 100644
--- a/work.s/GNUmakefile
+++ b/work.s/GNUmakefile
@@ -1,4 +1,5 @@
-# Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+# $Id: GNUmakefile,v 1.11 2011/08/02 16:34:16 karl Exp $
+# Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 #
 # Copying and distribution of this file, with or without modification,
 # are permitted in any medium without royalty provided the copyright
@@ -7,8 +8,7 @@
 # To use these targets, first do (one time only):
 # - ln -s ../*.texi .
 # - copy gendocs.sh and gendocs_template from texinfo/util here.
-# - then try make a, then make b, then make c
-# - if all goes well, see info at end for updating the web.
+# - then try make a, then make b, then make c.
 # - also update gnulib/doc.
 
 # check that makeinfo is happy.  (Best error messages, etc.)
@@ -19,29 +19,10 @@ a:
 b:
 	gendocs.sh standards "GNU coding standards"
 
-# fix cross-manual xrefs.
-# be nice to do this more cleanly later, but needs Texinfo config file, etc.
 c:
-#
-# new-style gendocs.sh, but special location.
-	perl -pi -e 's,href="(maintain).html,href="/prep/\1/\1.html,g' manual/standards.html 
-	perl -pi -e 's,href="\.\./(maintain)/,href="/prep/\1/html_node/,g' manual/html_node/*.html
-#
-# new-style gendocs.sh
-	perl -pi -e 's,href="\.\./texinfo/,href="/software/texinfo/manual/texinfo/html_node/,g' manual/html_node/*.html
-	perl -pi -e 's,href="\.\./autoconf/,href="/software/autoconf/manual/html_node/,g' manual/html_node/*.html
-#
-# makeinfo bug in toc creation of standalone html (for --version/help nodes).
-	perl -pi -e 's,#_00,#g_t_00,' manual/standards.html
-#
-	gzip -9f <manual/standards.html >manual/standards.html.gz
-	cd manual/html_node && tar czf ../standards.html_node.tar.gz -- *.html
-#
-	(cd manual && tar cjf ../s.tbz .)
-# then unpack s.tbz in a cvs checkout of www/prep/standards, cvs add any
-# new files, cvs remove any old ones, and cvs commit everything.
-#
-# to copy to a local checkout ($gw).
-#	cd manual && for f in `find -type f`; do \
-#	  cmp -s $$f $$gw/prep/standards/$$f \
-#	  || \cp -f $$f $$gw/prep/standards/$$f -v; done
+# copy to a local checkout of all of www (specified by envvar $gw):
+	cd manual && for f in `find -type f`; do \
+	     cmp -s $$f $$gw/prep/standards/$$f \
+	  || \cp -f $$f $$gw/prep/standards/$$f -v; done
+	# if nodes were removed, remove their html_node files.
+	# (and leave an anchor behind!)

Run locally

More details

Full run details

Historical runs