doc: update Vala documentation
[automake.git] / HACKING
blobed644ea9f481f85a3cab2c1cada4bbd677e52352
1 ============================================================================
2 = This file
4 * This file attempts to describe the conventions to use when hacking automake.
6 * After git checkout from Savannah, you can do an initial build with, e.g.:
7     ./bootstrap && ./configure --prefix=/tmp/amdev && make
9 ============================================================================
10 = Administrivia
12 * The correct response to most actual bugs is to write a new test case
13   which demonstrates the bug.  Then fix the bug, rerun the test suite,
14   and check everything in.  Run the test suite in parallel or it takes ages.
16 * If you incorporate a change from somebody on the net:
17   - First, if it is not a tiny change, you must make sure they have
18     signed the appropriate paperwork.
19   - Second, add their name and email address to THANKS.
21 * If a change fixes or adds a test, mention the test in the commit
22   message.  If a change fixes a bug registered in the Automake debbugs
23   tracker, mention the bug number in the commit message, using
24   the short url form, like https://bugs.gnu.org/1234.  See section below
25   about commit messages.
27 * If a person or people report a new bug, mention their name(s) in the
28   commit message that fixes or exposes the bug, and add a line for them
29   in THANKS.
31 * When documenting a non-trivial idiom or example in the manual, be
32   sure to add a test case for it, and to reference such test case from
33   a proper Texinfo comment.
35 * Some files in the automake package are not owned by automake (many
36   by gnulib, https://gnu.org/s/gnulib); these files are listed in the
37   $(FETCHFILES) variable in maintainer/maint.mk.  They should never be
38   edited here.  All but two of them can be updated from respective
39   upstreams with "make fetch" (this should be done especially before
40   releases). The only exceptions are help2man (install the current
41   version and copy in by hand) and 'lib/COPYING' (from FSF), which
42   should be updated by hand whenever the GPL gets updated (which
43   shouldn't happen that often anyway :-).
45   Conversely, automake holds the master copy of a number of files that
46   are copied into other projects, such as install-sh, mdate-sh,
47   Channels.pm and ChannelDefs.pm, and plenty more; grep for bug-automake
48   in lib/* for most of the scripts, and see <gnulib>/config/srclist.txt
49   and <autoconf>/build-aux/fetch.pl for lists of such files on two
50   notable receiving ends. Do your best not to break them.
52 * All changes from the last release that are not trivial bug fixes should
53   be mentioned in NEWS.
55 * Changes which are potentially controversial, require a non-trivial
56   plan, or must be implemented gradually with a roadmap spanning several
57   releases (either minor or major) should be discussed on the list,
58   and have a proper entry in the PLANS directory.  This entry should be
59   always committed in the "maint" branch, even if the change it deals
60   with is only for the master branch, or a topic branch.  Usually, in
61   addition to this, it is useful to open a "wishlist" report on the
62   Automake debbugs tracker, to keep the idea more visible, and have the
63   discussions surrounding it easily archived in a central place.
65 ===========================================================================
66 = Setting the development environment
68 * In development, ./GNUmakefile is used, not (the generated) ./Makefile.
69   Run make V=1 to see the commands that are run.
71 * The required and optional dependencies used by Automake and its test suite
72   can be automatically fetched using the GNU Guix package manager with the
73   following command:
75     guix environment automake --ad-hoc \
76       gettext help2man texinfo libtool flex bison dejagnu zip icedtea \
77       python gcc-toolchain gfortran pkg-config vala
79   For other environments, you'll need to install the equivalent.
81 * To run the bin/automake or bin/aclocal scripts in a checkout, it is
82   necessary to set PERL5LIB, as in:
83      am=/path/to/automake/checkout
84      env PERL5LIB=$am/lib $am/bin/automake --help
85      env PERL5LIB=$am/lib $am/bin/aclocal --help
87 * If you need to test different Python versions, pyenv is probably the
88   most convenient way at this writing. https://github.com/pyenv
90 ============================================================================
91 = Naming
93 * Automake's convention is that internal AC_SUBSTs and make variables
94   should be named with a leading 'am__', and internally generated targets
95   should be named with a leading 'am--'.  This convention, although in
96   place from at least February 2001, isn't yet universally used.
97   But all new code should use it.
99   We used to use '_am_' as the prefix for an internal AC_SUBSTs.
100   However, it turns out that NEWS-OS 4.2R complains if a Makefile
101   variable begins with the underscore character.  Yay for them.
102   I changed the target naming convention just to be safe.
104 * If you'd like to read some general background on automake and the
105   other GNU autotools, you might try this not-too-long web page (not
106   affiliated with GNU):
107   https://www.linux.com/news/best-practices-autotools/
109 ============================================================================
110 = Editing '.am' files
112 * For variables, always use $(...) and not ${...}.
114 * Prefer ':' over 'true', mostly for consistency with existing code.
116 * Use '##' comments liberally.  Comment anything even remotely unusual,
117   and even usual things, to help future readers of the code understand.
119 * Never use basename or dirname.  Instead, use sed.
121 * Do not use 'cd' within back-quotes, use '$(am__cd)' instead.
122   Otherwise the directory name may be printed, depending on CDPATH.
123   More generally, do not ever use plain 'cd' together with a relative
124   directory that does not start with a dot, or you might end up in one
125   computed with CDPATH.
127 * For install and uninstall rules, if a loop is required, it should be
128   silent.  Then the body of the loop itself should print each "important"
129   command it runs.  The printed commands should be preceded by a single
130   space.
132 * Ensure install rules do not create any installation directory where
133   nothing is to be actually installed.  See automake bug#11030.
135 ============================================================================
136 = Editing automake.in and aclocal.in
138 * Indent using GNU style.  For historical reasons, the perl code
139   contains portions indented using Larry Wall's style (perl-mode's
140   default), and other portions using the GNU style (cperl-mode's
141   default).  Write new code using GNU style.
143 * Don't use & for function calls, unless really required.
144   The use of & prevents prototypes from being checked.
146 ============================================================================
147 = Automake versioning and compatibility scheme
149 * There are three kinds of automake releases:
151     - new major releases (e.g., 2.0, 5.0)
152     - new minor releases (e.g., 1.14, 2.1)
153     - micro a.k.a. "bug-fixing" releases (e.g., 1.13.2, 2.0.1, 3.5.17).
155   A new major release should have the major version number bumped, and
156   the minor and micro version numbers reset to zero.  A new minor release
157   should have the major version number unchanged, the minor version number
158   bumped, and the micro version number reset to zero.  Finally, a new
159   micro version should have the major and minor version numbers unchanged,
160   and the micro version number bumped by one.
162   For example, the first minor version after 1.13.2 will be 1.14; the
163   first bug-fixing version after 1.14 that will be 1.14.1; the first
164   new major version after all such releases will be 2.0; the first
165   bug-fixing version after 2.0 will be 2.0.1; and a further bug-fixing
166   version after 2.0.1 will be 2.0.2.
168 * Micro releases should be just bug-fixing releases; no new features
169   should be added, and ideally, only trivial bugs, recent regressions,
170   or documentation issues should be addressed by them.  On the other
171   hand, it's OK to include testsuite work and even testsuite refactoring
172   in a micro version, since a regression there is not going to annoy or
173   inconvenience Automake users, but only the Automake developers.
175 * Minor releases can introduce new "safe" features, do non-trivial but
176   mostly safe code clean-ups, and even add new runtime warnings (rigorously
177   non-fatal).  But they shouldn't include any backward incompatible change,
178   nor contain any potentially destabilizing refactoring or sweeping change,
179   nor introduce new features whose implementation might be liable to cause
180   bugs or regressions in existing code.  However, it might be acceptable to
181   introduce very limited and localized backward-incompatibilities, *only*
182   if that is necessary to fix non-trivial bugs, address serious performance
183   issues, or greatly enhance usability.  But please, do this sparsely and
184   rarely!
186 * Major releases can introduce backward-incompatibilities (albeit such
187   incompatibilities should be announced well in advance, and a smooth
188   transition plan prepared for them), and try more risky and daring
189   refactorings and code cleanups.  Still, backward incompatibilities are
190   extremely undesirable and should be avoided at all costs.
192 * For more information, refer to the extensive discussion associated
193   with automake bug#13578.
195 ============================================================================
196 = Working with git
198 * To regenerate dependent files created by aclocal and automake,
199   use the 'bootstrap' script.  It uses the code from the source
200   tree, so the resulting files (aclocal.m4 and Makefile.in) should
201   be the same as you would get if you install this version of
202   automake and use it to generate those files. 
204 * To get a faithful and correct rebuild, run:
205     ./bootstrap && ./config.status --recheck && make clean all
207 * Usually, it is best to run again latest stable versions of Autoconf,
208   Libtool, etc., since that is what most users will do. Sometimes it may
209   be necessary to use the development versions due to bugs fixed,
210   etc. Whatever is first in PATH wins.
211   (Some background: https://bugs.gnu.org/11347)
212   
213 * The Automake git tree currently carries three basic branches:
214   'master', 'next' and 'maint'.  In practice, for quite a few years now,
215   as of this writing in 2023, we have been using only the master branch,
216   due to lack of time and desire to deal with anything but fixing bugs.
217   The branch information in the items below should thus be taken with a
218   large dose of salt.
220 * The 'master' branch is where the development of the next release
221   takes place.  It should be kept in a stable, almost-releasable state,
222   to simplify testing and deploying of new minor version.  Note that
223   this is not a hard rule, and such "stability" is not expected to be
224   absolute (emergency releases are cut from the 'maint' branch anyway).
226 * When planning a release a dedicated branch should be created and after
227   the release is done, the release branch is to be merged both into the
228   'master' branch and the 'maint' branch.
230 * Besides merges from release branches, the 'maint' branch can contain
231   fixes for regressions, trivial bugs, or documentation issues, that
232   will be part of an emergency regression-fixing or security releases.
233   As a consequence it should always be kept in a releasable state and no
234   "active" development should be done whatsoever.
236 * The 'next' branch is reserved for the development of the next major
237   release.  Experimenting a little is OK here, but don't let the branch
238   grow too unstable; if you need to do exploratory programming or
239   over-arching change, you should use a dedicated topic branch, and
240   only merge that back once it is reasonably stable.
242 * The 'master' branch should be kept regularly merged into the 'next'
243   branch.  It is advisable to merge only after a set of related
244   commits have been applied, to avoid introducing too much noise in
245   the history.
247 * There may be a number of longer-lived feature branches for new
248   developments.  They should be based off of a common ancestor of all
249   active branches to which the feature should or might be merged later.
251 * When merging, prefer 'git merge --log' over plain 'git merge', so that
252   a later 'git log' gives an indication of which actual patches were
253   merged even when they don't appear early in the list.
255 * The 'master', 'maint' and 'next' branches should not be rewound,
256   i.e., should always fast-forward, except maybe for privacy issues.
257   For feature branches, the announcement for the branch should
258   document the rewinding policy.
259   If a topic branch is expected to be rewound, it is good practice to put
260   it in the 'experimental/*' namespace; for example, a rewindable branch
261   dealing with Vala support could be named like "experimental/vala-work".
263 * If you need to trivially fix a change after a commit, e.g., a typo in
264   the NEWS entry, edit the file and then:
265     git commit --amend --no-edit NEWS
266     git commit --amend --date="$(date -R)" # update date of commit
268 * If you want to just completely lose your local changes:
269     git fetch && git reset --hard origin && git checkout && git submodule update
270   (the submodule stuff is for gnulib).
272 * The preferred way to create a patch to mail around:
273     git format-patch --stdout -1 >/tmp/some-patch.diff
274   which can then be applied with:
275     git am mboxfile
277 ============================================================================
278 = Writing a good commit message
280 * Here is the general format that Automake's commit messages are expected
281   to follow.  See the further points below for clarifications and minor
282   corrections.
284       topic: brief description (this is the "summary line")
286       <reference to relevant bugs, if any>
288       Here goes a more detailed explanation of why the commit is needed,
289       and a general overview of what it does, and how.  This section
290       should almost always be provided, possibly only with the exception
291       of obvious fixes or very trivial changes.
293       And if the detailed explanation is quite long or detailed, you can
294       want to break it in more paragraphs.
296       Then you can add references to relevant mailing list discussions
297       (if any), with proper links.  But don't take this as an excuse for
298       writing incomplete commit messages!  The "distilled" conclusions
299       reached in such discussions should have been placed in the
300       paragraphs above.
302       Finally, here you can thank people that motivated or helped the
303       change.  So, thanks to John Doe for bringing up the issue, and to
304       J. Random Hacker for providing suggestions and testing the patch.
306       <detailed list of touched files>
308 * To choose the topic label, please review the previous commits in the
309   git log or the ChangeLog file from a release tarball. There are no
310   hard-and-fast rules; the aim is a usable description. So script
311   names, Makefile targets, and more are all viable. Some examples:
312   aclocal automake build cosmetics doc maint python release test ylwrap
314 * The <detailed list of touched files> should usually be provided (but
315   for short or trivial changes), and should follow the GNU guidelines
316   for ChangeLog entries (described explicitly in the GNU Coding
317   Standards); it might be something of this sort:
319     * some/file (func1): Improved frobnication.
320     (func2): Adjusted accordingly.
321     * another/file (foo, bar): Likewise.
322     * t/foo.sh: New test.
323     * t/list-of-tests.mk (handwritten_TESTS): Add it.
324     * doc/automake.texi (Some Node): Document it.
325     * NEWS: Mention it.
327 * If your commit fixes an automake bug registered in the tracker (say
328   numbered 1234), you should put the following line after the summary
329   line:
331       Fixes automake bug https://bugs.gnu.org/1234.
333 * If your commit is just related to the given bug report, but does not
334   fix it, you might want to add a line like this instead:
336       Related to automake bug https://bugs.gnu.org/1234.
338 * When referring to older commits, use 'git describe' output as pointer.
339   But also try to identify the given commit by date and/or summary line
340   if possible.  Examples:
342       Since yesterday's commit, v1.11-2019-g4d2bf42, ...
344       ... removed in commit 'v1.11-1674-g02e9072' of 2012-01-01,
345       "dist: ditch support for lzma"...
347 * If the commit is a tiny change that is exempt from copyright paperwork, the
348   commit message should contain a separate line after the detailed list of
349   touched files like the following:
351       Copyright-paperwork-exempt: yes
353 * Generally write the commit message in present tense.
355 ============================================================================
356 = Test suite
358 * See file 't/README' for more information.
360 * Use "make check" and "make maintainer-check" liberally.  It is often
361   useful to set VERBOSE=1 for more reporting on what is being done.
363 * Export the 'keep_testdirs' environment variable to "yes" to keep
364   *.dir test directories for successful tests also.
366 * Use Perl coverage information to ensure your new code is thoroughly
367   tested by your new tests.
369 * To run the tests, you should install expect, shar, language compilers,
370   gettext macros.  Anything you don't install won't be tested.  The test
371   suite will report on tests skipped due to software not available.
373 * Run the test suite in parallel (e.g., "make -j12 check"), both so it
374   doesn't take forever and because that is what most users will do.  You
375   can also parallelize the makes that run inside each test with, e.g.:
376     make check AM_TESTSUITE_MAKE="make -j$(( 1*$(nproc) + 1 ))"
377   If you like, try different levels of parallelization to see what
378   runs the fastest on your machine.  We'll use -j12 in this document.
380 * To summarize, here is a typical make check invocation:
381     make -j12 VERBOSE=1 check keep_testdirs=yes
383 * Then check t/test-suite.log for the overall results.  The directory
384   t/TESTNAME.dir is where the work will be left, if the test fails.
386 * You can run a single test, with, e.g.,
387     make check TESTS='t/aclocal-acdir.sh'
388   where t/aclocal-acdir.sh can be any t/*.sh test, including a new one
389   you are writing.  You may want to add --no-print-dir to silence GNU
390   make about the many cd commands, and/or env VERBOSE=1 to get more
391   information about what make is running.
393 * Sometimes you may want to see when each test starts running, not only
394   when they complete.  This can be done by setting TESTS_ENVIRONMENT:
395     make -j12 VERBOSE=1 TESTS_ENVIRONMENT='echo RUNNING: "$$f";' check
397 * Run "make maintainer-check" before commit.  Watch out for trailing spaces.
398   Probably useful to run it more verbosely:
399     make AM_V_GEN= AM_V_at= VERBOSE=1 maintainer-check
401 * After "make -j12 check" succeeds. run "make -j12 distcheck" before
402   pushing a commit, since that exercises yet more of the code.
404 * To un-silence (some) of what make does, use make V=1.
405   For yet more verbosity, make VERBOSE=1.
407 * To set up a new test, first write the test file in t/good-name.sh.
408   Choose a name that fits with existing ones, as best you can devise.
410   - You'll likely want to copy material from an existing test, which is
411   fine and good; depending on how much is copied, it may be useful to
412   mention the other test(s) you used.
414   - Nevertheless, start the copyright year list in the new file fresh,
415   with the current year.
417   - You can run the new test on its own with
418     make check TESTS='t/good-name.sh'
420   - During development of a new test, it can be useful to end it with
421   "exit 33" (or any random value) to force it to fail even when it would
422   otherwise succeed, so you can inspect the test.dir/test.log and other
423   test.dir/* files to be sure things worked as expected.
425   - At some point before releasing, add the test to the appropriate
426   variable in t/list-of-tests.mk, most likely the (alphabetical)
427   handwritten_TESTS.
429 * Some hints for debugging test failures or trying to understand the
430   (complex) test infrastructure.
431   
432   - You may want a simple test just to exercise the setup; t/amassign.sh
433   is such a test. For a simple test that runs automake twice (sometimes
434   useful in finding concurrency failures), try t/nodef.sh.
435   
436   - The t/ax/ dir contains most of the test infrastructure files.
438   - To trace the (complex) test initialization code, change the set -e
439   to set -ex (or whatever you wish) in t/ax/test-init.sh.
440   Automake itself enables -x for the *.log and test-suite.log files,
441   in am_test_setup in t/ax/test-lib.sh. You may want to change to -vx.
442   
443   - If you want to run the individual commands of a test one by one in a
444   shell, you have to reproduce the test environment. Start a subshell and:
445     PATH=$am/bin:$am/t/ax:$PATH # where $am is your automake source checkout
446     set +u          # if needed; automake cannot handle this "nounset" option
447     . test-init.sh  # beginning of test
448   Then each command you type will be executed in the test environment,
449   including -x being enabled. Each test prints the PATH value at the beginning.
450   
451   - If you need to debug a test which fails under installcheck, you need
452   to invoke make with am_running_installcheck=yes, as is done by the
453   installcheck-testsuite target in t/local.mk.
454   
455   - If you want to see the (complex shell) commands that make is
456   running, despite all of Automake's attempt at silence, run (GNU)
457     make --debug=p ... other make args ...
459 ============================================================================
460 = Bug tracker
462 * Automake uses the debbugs instance at https://bugs.gnu.org.  Email
463   from the tracker is sent to bug-automake@gnu.org, and vice versa.
464   Ditto automake-patches@gnu.org. (See
465   https://gnu.org/s/automake for all the mailing lists; if you're
466   working on Automake, please subscribe.)
468 * To see all open bugs resp. patches (and recently closed ones):
469     https://debbugs.gnu.org/cgi/pkgreport.cgi?pkg=automake
470     https://debbugs.gnu.org/cgi/pkgreport.cgi?pkg=automake-patches
472 * For a full search form, initialized to show only bugs tagged confirmed:
473     https://debbugs.gnu.org/cgi/pkgreport.cgi?package=automake;include=tags%3Aconfirmed
475 * We use the "confirmed" tag to mean bugs that have been reviewed, are
476   evidently valid, but no one is currently working or plans to work on
477   them.  Thus they are good candidates for new volunteers to get involved.
479 * To download the so-called maintainer mbox for a bug, say 12345:
480     https://debbugs.gnu.org/cgi/bugreport.cgi?bug=12345;mbox=yes;mboxmaint=yes
481   Only the maintainer mbox consistently has the bug# prefix on Subject:
482   lines, so it is the most usable, as far as we know.
484 * To close a bug, you can mail (or bcc) to 12345-done@debbugs.gnu.org.
485   It's best to do this with a note saying that the bug is being closed
486   because the fix was pushed, or whatever the reason.
488 * To add tags "help" and "confirmed" to bug 12345, mail to
489   control@debbugs.gnu.org with a one-line body:
490     tags 12345 + help confirmed
492 * To merge bugs 12345 and 56789, mail to
493   control@debbugs.gnu.org with a one-line body:
494     merge 12345 56789
496 * In general, all bug operations are done by mail.  Reference information:
497     https://debbugs.gnu.org/server-control.html # dev info
499 ============================================================================
500 = Release procedure
502 * The steps outlined here are meant to be followed for alpha and stable
503   releases as well.  Where differences are expected, they will be
504   explicitly described.
506 * Fetch new versions of the files that are maintained by the FSF by
507   running "make fetch".  help2man has to be updated separately.  In case
508   any file in the automake repository has been updated, commit and
509   rerun the testsuite.
511 * Ensure that the copyright notices of the distributed files are up to
512   date.  The maintainer-only target "update-copyright" can help with this.
514 * Check NEWS; in particular, ensure that all the relevant differences
515   with the last release are actually reported.
517 * Update the version number in configure.ac.  Leading up to a release,
518   say 1.17, pretests should be numbered from 1.16.90. Even numbers
519   (1.16.90, 1.16.92, ...) should be the pretest releases; odd numbers
520   (1.16.91, 1.16.93, ...) should be only the development versions.
521   Leading up to a release 1.17.1, we would have 1.16.0.90, etc.
522   Before 1.17 (January 2024), we used suffixed letters for pretests,
523   as is traditional, but deficient sorting algorithms did not like that.
525 * Run these commands, in this order (as mentioned, adjust -j as desired):
526     make bootstrap
527     make -j12 check keep_testdirs=yes
528     make maintainer-check
529     make -j12 distcheck                                # regular distcheck
530     make -j12 distcheck AM_TESTSUITE_MAKE="make -j12"  # parallelize makes
531     make -j12 check-no-trailing-backslash-in-recipes
532     make -j12 check-cc-no-c-o
534   It is also advised to run "git clean -fdx" before invoking the
535   bootstrap, to ensure a really clean rebuild.  However, it must
536   be done carefully, because that command will remove *all* the
537   files that are not tracked by git!
539 * Run "make git-tag-release".
540   This will run the maintainer checks, verify that the local git
541   repository and working tree are clean and up-to-date, and create
542   a proper signed git tag for the release (based on the contents
543   of $(VERSION)).
545 * Run "make git-upload-release".
546   For pretest releases: "DEVEL_SNAPSHOT=1 make git-upload-release".
547   
548   This will first verify that you are releasing from a tagged version
549   and that the local git repository and working tree are clean and
550   up-to-date, and will then run "make dist" to create the tarballs,
551   and invoke the 'gnupload' script sign and upload them to the correct
552   locations.  In case you need to sign with a non-default key, you can
553   use "make GNUPLOADFLAGS='--user KEY' git-upload-release".
555 * For stable releases you'll have to update the manuals at www.gnu.org.
557   - Check links:
558        make html
559        make checklinkx # various perl prerequisites, see contrib/checklinkx
560     or use:
561       <https://validator.w3.org/checklink>
563   - Generate manuals (with the help of the standard gendocs.sh script):
564        make web-manual
566     The ready-to-be-uploaded manuals (in several formats) will be left
567     in the 'doc/web-manuals' directory.
569   - Commit the updated manuals to web CVS:
570       make web-manual-update
572     If your local username is different from your username at Savannah,
573     you'll have to override the 'CVS_USER' make variable accordingly;
574     for example:
575       make web-manual-update CVS_USER=slattarini
577 * Create an announcement message with "make announcement".  Edit the
578   generated 'announcement' file appropriately, in particularly filling
579   in by hand any "TODO" left in there.
581 * Update version number in configure.ac to next alpha number.
582   Rerun ./bootstrap and commit.
584 * Don't forget to "git push" your changes so they appear in the public
585   git tree.
587 * Send the announcement generated in the earlier steps at least to
588   <autotools-announce@gnu.org> and <automake@gnu.org>.  If the release
589   is a stable one, the announcement must also go to <info-gnu@gnu.org>;
590   if it is an alpha or beta release, announcement should be sent also
591   to <platform-testers@gnu.org>, to maximize the possibility of early
592   testing on exotic or proprietary systems.  Finally, copy an abridged
593   version of the announcement into the NEWS feed at:
594   <https://savannah.gnu.org/projects/automake>.
595   Be sure to link a  version to the complete announcement (from
596   the version you sent to the automake list, as get archived on
597   <https://lists.gnu.org/archive/html/automake/>).
599 ---------
600 Copyright (C) 2003-2024 Free Software Foundation, Inc.
602 This program is free software; you can redistribute it and/or modify
603 it under the terms of the GNU General Public License as published by
604 the Free Software Foundation; either version 2, or (at your option)
605 any later version.
607 This program is distributed in the hope that it will be useful,
608 but WITHOUT ANY WARRANTY; without even the implied warranty of
609 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
610 GNU General Public License for more details.
612 You should have received a copy of the GNU General Public License
613 along with this program.  If not, see <https://www.gnu.org/licenses/>.
615 Local Variables:
616 mode: text
617 End: