| ============================================================================ | |
| = This file | |
| * This file attempts to describe the rules to use when hacking | |
| automake. | |
| ============================================================================ | |
| = Administrivia | |
| * The correct response to most actual bugs is to write a new test case | |
| which demonstrates the bug. Then fix the bug, re-run the test suite, | |
| and check everything in. | |
| * If you incorporate a change from somebody on the net: | |
| - First, if it is a large change, you must make sure they have | |
| signed the appropriate paperwork. | |
| - Second, be sure to add their name and email address to THANKS. | |
| * If a change fixes a test, mention the test in the commit message. | |
| If a change fixes a bug registered in the Automake debbugs tracker, | |
| mention the bug number in the commit message. | |
| * If somebody reports a new bug, mention his name in the commit message | |
| that fixes or exposes the bug, and put him into THANKS. | |
| * When documenting a non-trivial idiom or example in the manual, be | |
| sure to add a test case for it, and to reference such test case from | |
| a proper Texinfo comment. | |
| * Some files in the automake package are not owned by automake; these | |
| files are listed in the $(FETCHFILES) variable in Makefile.am. They | |
| should never be edited here. Almost all of them can be updated from | |
| respective upstreams with "make fetch" (this should be done especially | |
| before releases). The only exception is the 'lib/COPYING' (from FSF), | |
| which should be updated by hand whenever the GPL gets updated (which | |
| shouldn't happen that often anyway :-) | |
| * Changes other than *trivial* bug fixes must be mentioned in NEWS. | |
| * Changes which are potentially controversial, require a non-trivial | |
| plan, or must be implemented gradually with a roadmap spanning several | |
| releases (either minor or major) should be discussed on the list, | |
| and have a proper entry in the PLANS directory. This entry should be | |
| always committed in the "maint" branch, even if the change it deals | |
| with is only for the master branch, or a topic branch. Usually, in | |
| addition to this, it is useful to open a "wishlist" report on the | |
| Automake debbugs tracker, to keep the idea more visible, and have the | |
| discussions surrounding it easily archived in a central place. | |
| ============================================================================ | |
| = Naming | |
| * We've adopted the convention that internal AC_SUBSTs and make variables | |
| should be named with a leading 'am__', and internally generated targets | |
| should be named with a leading 'am--'. This convention, although in | |
| place from at least February 2001, isn't yet universally used. | |
| But all new code should use it. | |
| We used to use '_am_' as the prefix for an internal AC_SUBSTs. | |
| However, it turns out that NEWS-OS 4.2R complains if a Makefile | |
| variable begins with the underscore character. Yay for them. | |
| I changed the target naming convention just to be safe. | |
| ============================================================================ | |
| = Editing '.am' files | |
| * Always use $(...) and not ${...} | |
| * Prefer ':' over 'true', mostly for consistency with existing code. | |
| * Use '##' comments liberally. Comment anything even remotely unusual. | |
| * Never use basename or dirname. Instead, use sed. | |
| * Do not use 'cd' within back-quotes, use '$(am__cd)' instead. | |
| Otherwise the directory name may be printed, depending on CDPATH. | |
| More generally, do not ever use plain 'cd' together with a relative | |
| directory that does not start with a dot, or you might end up in one | |
| computed with CDPATH. | |
| * For install and uninstall rules, if a loop is required, it should be | |
| silent. Then the body of the loop itself should print each "important" | |
| command it runs. The printed commands should be preceded by a single | |
| space. | |
| * Ensure install rules do not create any installation directory where | |
| nothing is to be actually installed. See automake bug#11030. | |
| ============================================================================ | |
| = Editing automake.in and aclocal.in | |
| * Indent using GNU style. For historical reasons, the perl code | |
| contains portions indented using Larry Wall's style (perl-mode's | |
| default), and other portions using the GNU style (cperl-mode's | |
| default). Write new code using GNU style. | |
| * Don't use & for function calls, unless really required. | |
| The use of & prevents prototypes from being checked. | |
| ============================================================================ | |
| = Automake versioning and compatibility scheme | |
| * There are three kinds of automake releases: | |
| - new major releases (e.g., 2.0, 5.0) | |
| - new minor releases (e.g., 1.14, 2.1) | |
| - micro a.k.a. "bug-fixing" releases (e.g., 1.13.2, 2.0.1, 3.5.17). | |
| A new major release should have the major version number bumped, and | |
| the minor and micro version numbers reset to zero. A new minor release | |
| should have the major version number unchanged, the minor version number | |
| bumped, and the micro version number reset to zero. Finally, a new | |
| micro version should have the major and minor version numbers unchanged, | |
| and the micro version number bumped by one. | |
| For example, the first minor version after 1.13.2 will be 1.14; the | |
| first bug-fixing version after 1.14 that will be 1.14.1; the first | |
| new major version after all such releases will be 2.0; the first | |
| bug-fixing version after 2.0 will be 2.0.1; and a further bug-fixing | |
| version after 2.0.1 will be 2.0.2. | |
| * Micro releases should be just bug-fixing releases; no new features | |
| should be added, and ideally, only trivial bugs, recent regressions, | |
| or documentation issues should be addressed by them. On the other | |
| hand, it's OK to include testsuite work and even testsuite refactoring | |
| in a micro version, since a regression there is not going to annoy or | |
| inconvenience Automake users, but only the Automake developers. | |
| * Minor releases can introduce new "safe" features, do non-trivial but | |
| mostly safe code clean-ups, and even add new runtime warnings (rigorously | |
| non-fatal). But they shouldn't include any backward incompatible change, | |
| nor contain any potentially destabilizing refactoring or sweeping change, | |
| nor introduce new features whose implementation might be liable to cause | |
| bugs or regressions in existing code. However, it might be acceptable to | |
| introduce very limited and localized backward-incompatibilities, *only* | |
| if that is necessary to fix non-trivial bugs, address serious performance | |
| issues, or greatly enhance usability. But please, do this sparsely and | |
| rarely! | |
| * Major releases can introduce backward-incompatibilities (albeit such | |
| incompatibilities should be announced well in advance, and a smooth | |
| transition plan prepared for them), and try more risking and daring | |
| refactorings and code cleanups. | |
| * For more information, refer to the extensive discussion associated | |
| with automake bug#13578. | |
| =========================================================================== | |
| = Setting the development environment | |
| * The required and optional dependencies used by Automake and its test suite | |
| can be automatically fetched using the GNU Guix package manager with the | |
| following command: | |
| $ guix environment automake --ad-hoc \ | |
| gettext help2man texinfo libtool flex bison dejagnu zip icedtea \ | |
| python gcc-toolchain gfortran pkg-config vala | |
| ============================================================================ | |
| = Working with git | |
| * To regenerate dependent files created by aclocal and automake, | |
| use the 'bootstrap' script. It uses the code from the source | |
| tree, so the resulting files (aclocal.m4 and Makefile.in) should | |
| be the same as you would get if you install this version of | |
| automake and use it to generate those files. Be sure to have the | |
| latest stable version of Autoconf installed and available early | |
| in your PATH. | |
| * The Automake git tree currently carries three basic branches: 'master', | |
| 'next' and 'maint'. | |
| * The 'master' branch is where the development of the next release | |
| takes place. It should be kept in a stable, almost-releasable state, | |
| to simplify testing and deploying of new minor version. Note that | |
| this is not a hard rule, and such "stability" is not expected to be | |
| absolute (emergency releases are cut from the 'maint' branch anyway). | |
| * When planning a release a dedicated branch should be created and after | |
| the release is done, the release branch is to be merged both into the | |
| 'master' branch and the 'maint' branch. | |
| * Besides merges from release branches, the 'maint' branch can contain | |
| fixes for regressions, trivial bugs, or documentation issues, that | |
| will be part of an emergency regression-fixing or security releases. | |
| As a consequence it should always be kept in a releasable state and no | |
| "active" development should be done whatsoever. | |
| * The 'next' branch is reserved for the development of the next major | |
| release. Experimenting a little is OK here, but don't let the branch | |
| grow too unstable; if you need to do exploratory programming or | |
| over-arching change, you should use a dedicated topic branch, and | |
| only merge that back once it is reasonably stable. | |
| * The 'master' branch should be kept regularly merged into the 'next' | |
| branch. It is advisable to merge only after a set of related | |
| commits have been applied, to avoid introducing too much noise in | |
| the history. | |
| * There may be a number of longer-lived feature branches for new | |
| developments. They should be based off of a common ancestor of all | |
| active branches to which the feature should or might be merged later. | |
| * When merging, prefer 'git merge --log' over plain 'git merge', so that | |
| a later 'git log' gives an indication of which actual patches were | |
| merged even when they don't appear early in the list. | |
| * The 'master', 'maint' and 'next' branches should not be rewound, | |
| i.e., should always fast-forward, except maybe for privacy issues. | |
| For feature branches, the announcement for the branch should | |
| document the rewinding policy. | |
| If a topic branch is expected to be rewound, it is good practice to put | |
| it in the 'experimental/*' namespace; for example, a rewindable branch | |
| dealing with Vala support could be named like "experimental/vala-work". | |
| ============================================================================ | |
| = Writing a good commit message | |
| * Here is the general format that Automake's commit messages are expected | |
| to follow. See the further points below for clarifications and minor | |
| corrections. | |
| topic: brief description (this is the "summary line") | |
| <reference to relevant bugs, if any> | |
| Here goes a more detailed explanation of why the commit is needed, | |
| and a general overview of what it does, and how. This section | |
| should almost always be provided, possibly only with the expection | |
| of obvious fixes or very trivial changes. | |
| And if the detailed explanation is quite long or detailed, you can | |
| want to break it in more paragraphs. | |
| Then you can add references to relevant mailing list discussions | |
| (if any), with proper links. But don't take this as an excuse for | |
| writing incomplete commit messages! The "distilled" conclusions | |
| reached in such discussions should have been placed in the | |
| paragraphs above. | |
| Finally, here you can thank people that motivated or helped the | |
| change. So, thanks to John Doe for bringing up the issue, and to | |
| J. Random Hacker for providing suggestions and testing the patch. | |
| <detailed list of touched files> | |
| * The <detailed list of touched files> should usually be provided (but | |
| for short or trivial changes), and should follow the GNU guidelines | |
| for ChangeLog entries (described explicitly in the GNU Coding | |
| Standards); it might be something of this sort: | |
| * some/file (func1): Improved frobnication. | |
| (func2): Adjusted accordingly. | |
| * another/file (foo, bar): Likewise. | |
| * tests/foo.tap: New test. | |
| * tests/Makefile.am (TESTS): Add it. | |
| * If your commit fixes an automake bug registered in the tracker (say | |
| numbered 1234), you should put the following line after the summary | |
| line: | |
| This change fixes automake bug#1234. | |
| * If your commit is just related to the given bug report, but does not | |
| fix it, you might want to add a line like this instead: | |
| This change is related to automake bug#1234. | |
| * When referring to older commits, use 'git describe' output as pointer. | |
| But also try to identify the given commit by date and/or summary line | |
| if possible. Examples: | |
| Since yesterday's commit, v1.11-2019-g4d2bf42, ... | |
| ... removed in commit 'v1.11-1674-g02e9072' of 01-01-2012, | |
| "dist: ditch support for lzma"... | |
| * If the commit is a tiny change that is exempt from copyright paperwork, the | |
| commit message should contain a separate line after the detailed list of | |
| touched files like the following: | |
| Copyright-paperwork-exempt: yes | |
| ============================================================================ | |
| = Test suite | |
| * Use "make check" and "make maintainer-check" liberally. | |
| * Export the 'keep_testdirs' environment variable to "yes" to keep | |
| test directories for successful tests also. | |
| * Use perl coverage information to ensure your new code is thoroughly | |
| tested by your new tests. | |
| * See file 't/README' for more information. | |
| ============================================================================ | |
| = Release procedure | |
| * The steps outlined here are meant to be followed for alpha and stable | |
| releases as well. Where differences are expected, they will be | |
| explicitly described. | |
| * Fetch new versions of the files that are maintained by the FSF by | |
| running "make fetch". In case any file in the automake repository | |
| has been updated, commit and re-run the testsuite. | |
| * Ensure that the copyright notices of the distributed files is up to | |
| date. The maintainer-only target "update-copyright" can help with | |
| this. | |
| * Check NEWS; in particular, ensure that all the relevant differences | |
| with the last release are actually reported. | |
| * Update the version number in configure.ac. | |
| (The idea is that every other alpha number will be a net release. | |
| The repository will always have its own "odd" number so we can easily | |
| distinguish net and repo versions.) | |
| * Run these commands, in this order: | |
| make bootstrap | |
| make check keep_testdirs=yes | |
| make maintainer-check | |
| make distcheck | |
| make check-no-trailing-backslash-in-recipes | |
| make check-cc-no-c-o | |
| It is also advised to run "git clean -fdx" before invoking the | |
| bootstrap, to ensure a really clean rebuild. However, it must | |
| be done carefully, because that command will remove *all* the | |
| files that are not tracked by git! | |
| * Run "make git-tag-release". | |
| This will run the maintainer checks, verify that the local git | |
| repository and working tree are clean and up-to-date, and create | |
| a proper signed git tag for the release (based on the contents | |
| of $(VERSION)). | |
| * Run "make git-upload-release". | |
| This will first verify that you are releasing from a tagged version | |
| and that the local git repository and working tree are clean and | |
| up-to-date, and will then run "make dist" to create the tarballs, | |
| and invoke the 'gnupload' script sign and upload them to the correct | |
| locations. In case you need to sign with a non-default key, you can | |
| use "make GNUPLOADFLAGS='--user KEY' git-upload-release". | |
| * For stable releases you'll have to update the manuals at www.gnu.org. | |
| - Generate manuals (with the help of the standard gendocs.sh script): | |
| make web-manual | |
| The ready-to-be-uploaded manuals (in several formats) will be left | |
| in the 'doc/web-manuals' directory. | |
| - Commit the updated manuals to web CVS: | |
| make web-manual-update | |
| If your local username is different from your username at Savannah, | |
| you'll have to override the 'CVS_USER' make variable accordingly; | |
| for example: | |
| make web-manual-update CVS_USER=slattarini | |
| - Check for link errors, fix them, recheck until convergence: | |
| <http://validator.w3.org/checklink> | |
| * Create an announcement message with "make announcement". Edit the | |
| generated 'announcement' file appropriately, in particularly filling | |
| in by hand any "TODO" left in there. | |
| * Update version number in configure.ac to next alpha number. | |
| Re-run ./bootstrap and commit. | |
| * Don't forget to "git push" your changes so they appear in the public | |
| git tree. | |
| * Send the announcement generated in the earlier steps at least to | |
| <autotools-announce@gnu.org> and <automake@gnu.org>. If the release | |
| is a stable one, the announcement must also go to <info-gnu@gnu.org>; | |
| if it is an alpha or beta release, announcement should be sent also | |
| to <platform-testers@gnu.org>, to maximize the possibility of early | |
| testing on exotic or proprietary systems. Finally, copy an abridged | |
| version of the announcement into the NEWS feed at: | |
| <https://savannah.gnu.org/projects/automake>. | |
| Be sure to link a version to the complete announcement (from | |
| the version you sent to the automake list, as get archived on | |
| <https://lists.gnu.org/archive/html/automake/>). | |
| ----- | |
| Copyright (C) 2003-2018 Free Software Foundation, Inc. | |
| This program 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 2, or (at your option) | |
| any later version. | |
| 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 | |
| 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 <https://www.gnu.org/licenses/>. | |
| Local Variables: | |
| mode: text | |
| End: |