| GNU Libtool | |
| *********** | |
| 1. Introduction | |
| =============== | |
| This file attempts to describe the processes we use to maintain libtool, | |
| and is not part of a release distribution. | |
| 2. Maintenance Notes | |
| ==================== | |
| * If you incorporate a change from somebody on the net: | |
| If it is a large change, you must make sure they have signed the | |
| appropriate paperwork, and be sure to add their name and email | |
| address to THANKS. | |
| * If a change fixes a test, mention the test in the git log entry. | |
| * If somebody reports a new bug, mention their name in the git log entry | |
| and in the test case you write. | |
| * The correct response to most actual bugs is to write a new test case | |
| that demonstrates the bug. Then fix the bug, re-run the test suite, | |
| and check everything in. | |
| * Always run the testsuite after applying a patch: | |
| make check syntax-check TESTSUITEFLAGS="--jobs=$(nproc)" -j$(nproc) | |
| Ideally also verify the release process doesn't break: | |
| make distcheck TESTSUITEFLAGS="--jobs=$(nproc)" -j$(nproc) | |
| This will run check & syntax-check from above, but will take longer as | |
| builds & tests in different configurations. | |
| * Some files in the libtool package are not owned by libtool. These | |
| files should never be edited here. These files are: | |
| COPYING | |
| INSTALL | |
| doc/ | |
| + gendocs_template | |
| + gendocs_template_min | |
| + fdl.texi | |
| libltdl/ | |
| + COPYING.LIB | |
| libltdl/config/ | |
| + compile | |
| + config.guess | |
| + config.sub | |
| + depcomp | |
| + install-sh | |
| + mdate-sh | |
| + missing | |
| + texinfo.tex | |
| m4/ | |
| + 00gnulib.m4 | |
| + gnulib-cache.m4 | |
| + gnulib-common.m4 | |
| + gnu-comp.m4 | |
| + gnulib-tool.m4 | |
| + ltversion.m4 | |
| + zzgnulib.m4 | |
| GNUmakefile | |
| maint.mk | |
| The ones that are important for a release can be updated by ensuring | |
| gnulib is up-to-date, and running 'bootstrap' to recheck the links are | |
| correct. | |
| * Changes other than bug fixes must be mentioned in NEWS. | |
| 3. Test Suite | |
| ============= | |
| * When writing tests, make sure the link invocation (first argument to | |
| AT_CHECK) is on a single line so that 'testsuite -x' displays the | |
| whole thing. You can use m4_do or '[... ]dnl' to wrap long lines. | |
| * To debug a failing or skipped range of tests, e.g. 13 to 14: | |
| make check-local TESTSUITEFLAGS="--debug 13-14" | |
| More generally, in the TESTSUITEFLAGS you can use the documented | |
| options for Autotest generated testsuites: | |
| https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.72/html_node/testsuite-Invocation.html | |
| * Run tests in parallel with | |
| make -k check TESTSUITEFLAGS="--jobs=$(nproc)" | |
| liberally, on as many platforms as you can. Use as many compilers and | |
| linkers you can. To run old and new testsuites separately, use: | |
| make check TESTSUITEFLAGS=-V | |
| make check-local | |
| * The gnulib module also provides some maintainer-focused tests that only | |
| work when run from a git checkout. | |
| make syntax-check | |
| * The new Autotest testsuite uses keywords to denote test features: | |
| autoconf needs Autoconf | |
| automake needs Automake | |
| libltdl exercises the 'libltdl' library | |
| libtool exercises the 'libtool' script | |
| libtoolize exercises the 'libtoolize' script | |
| recursive runs the suite recursively, with a modified | |
| 'libtool' script and with '-k libtool' | |
| CXX F77 FC GCJ exercises a language other than C | |
| 4. Naming | |
| ========= | |
| * We've adopted the convention that exported Autoconf macros should be | |
| named with a leading 'LT_' and be documented in the libtool manual. | |
| Internal macros begin with '_LT_' if they are visible to aclocal, or | |
| potentially part of an AC_DEFUN/AC_REQUIRE path, or else '_lt_' if | |
| they are very low level. This convention was only introduced just | |
| before libtool-2.0, so there may still be exceptions in the existing | |
| code. But all new code should use it. | |
| * All shell variables used internally by libtool's Autoconf macros | |
| should be named with the a leading 'lt_' (not that they cannot clash | |
| with the '_lt_' macro namespace). | |
| 5. Using git | |
| ============ | |
| * ChangeLog is generated from git log messages, so you have to format | |
| the git log carefully. Use --author for the (first, main) author | |
| of changesets from others, and sign patches you have reviewed. If the | |
| changeset has additional authors that need to be mentioned in the | |
| generated ChangeLog, then add them to the git log message with: | |
| Co-authored-by: A U Thor <email@example.com> | |
| Similarly, if the ChangeLog will need a '(tiny change)' annotation, | |
| then you should indicate that in the git log message with: | |
| Copyright-paperwork-exempt: Yes | |
| Start the git log message with a short one line summary, then an empty | |
| line, then the rest of the log entry. | |
| If you forgot to annotate correctly in the git log message, or made | |
| any other mistake that needs correcting in the distributed ChangeLog | |
| file, make an amendment against the SHA1 of the errored commit in | |
| $aux_dir/git-log-fix. | |
| * You may find it useful to install the $aux_dir/git-hooks/commit-msg | |
| script to .git/hooks in your libtool working directory to help you | |
| make the best use of git log message metadata. | |
| * Do not ever rewind the public master branch nor any public release | |
| branch on savannah, neither any release tags once they have been | |
| published. Other branches and tags may have different rules. | |
| * Avoid merge commits on the master branch of the public git repository. | |
| For unpublished changes in your development tree, it's easiest to | |
| rebase against the current master before applying them, this preserves | |
| a linear history. | |
| 6. Editing '.am' Files | |
| ====================== | |
| * Always use $(...) and not ${...}. | |
| * Use ':', not 'true'. Use 'exit 1', not 'false'. | |
| * Use '##' comments liberally. Comment anything even remotely unusual. | |
| * Never use basename or dirname. Instead use sed. | |
| * Do not use 'cd' within back-quotes, use '$(lt__cd)' instead. | |
| Otherwise the directory name may be printed, depending on CDPATH. | |
| * In general, if a loop is required, it should be silent. Then the body | |
| of the loop itself should print each "important" command it runs. | |
| * Use 4 extra spaces to indent continued dependencies. | |
| * One needs to remember that for our whole logic for the different | |
| libltdl modes to function correctly, the thing we need to ensure | |
| *before the client runs libtoolize*, is that the subpackage case is | |
| correct (because all files may be symlinked there). All others can | |
| and will be fixed in the 'libtoolize --ltdl --(non)recursive' stage. | |
| 7. Editing '.m4' Files | |
| ====================== | |
| * Be careful with both 'echo' and '$ECHO'. As the latter may be one of | |
| print -r -- | |
| printf %s\n | |
| func_fallback_echo | |
| it may not have more than one argument and its value may not be | |
| eval'ed. However, the argument may start with a '-' and contain | |
| backslashes. As a rule of thumb, use | |
| echo .. for literal (constant) strings without leading | |
| hyphen and no backslashes within, | |
| $ECHO ".." otherwise. | |
| func_echo_all when multiple arguments are present, or when | |
| placed in an eval'ed variable. | |
| * The Autoconf manual says that giving an empty parameter is equivalent | |
| to not giving it at all. (In particular, the Autoconf manual doesn't | |
| explain that "FOO()" is calling macro FOO with one empty parameter.) | |
| To prevent misunderstanding, we should use m4_ifval to check whether | |
| a parameter is empty, and not $# to check for the number of parameters. | |
| * Any time we add a macro to an older version, lt~obsolete.m4 needs to | |
| be updated in all newer versions. | |
| 8. Abstraction layers in libltdl | |
| ================================ | |
| * The libltdl API uses a layered approach to differentiate internal and | |
| external interfaces, among other things. To keep the abstraction | |
| consistent, files in a given layer may only use APIs from files in the | |
| lower layers. The ASCII art boxes below represent this stack, from | |
| top to bottom... | |
| * But first, outside of the stack, there is a convenience header that | |
| defines the internal interfaces (as evidenced by the 'lt__' prefix to | |
| the filename!) shared between implementation files in the stack, that | |
| are however not exported to libltdl clients: | |
| ,-------------. | |
| |lt__private.h| | |
| `-------------' | |
| * The top layer of the stack is the libltdl API proper, which includes | |
| the relevant subsystems automatically. Clients of libltdl need only | |
| invoke: | |
| #include <ltdl.h> | |
| ,------. | |
| |ltdl.h| | |
| +------+ | |
| |ltdl.c| | |
| `------' | |
| * The next layer is comprised of the subsystems of the exported libltdl | |
| API, which are implemented by files that are named with a leading 'lt_' | |
| (single underscore!): | |
| ,------------v---------------. | |
| | lt_error.h | lt_dlloader.h | | |
| +------------+---------------+ | |
| | lt_error.c | lt_dlloader.c | | |
| `------------^---------------' | |
| * The next file is used both by the headers that implement it (in which | |
| case its function is to avoid namespace clashes when linking with the | |
| GNU C library proper) and is included by code that wants to program | |
| against a glibc-like interface, in which case it serves to pull in all | |
| the glibc-like functionality used by libltdl with a simple: | |
| #include <libltdl/lt__glibc.h> | |
| It consists of a single file: | |
| ,-----------. | |
| |lt__glibc.h| | |
| `-----------' | |
| * Next to last is the libc abstraction layer, which provides a uniform | |
| API to various system libc interfaces that differ between hosts | |
| supported by libtool. Typically, the files that implement this layer | |
| begin: | |
| #if defined(LT_CONFIG_H) | |
| # include LT_CONFIG_H | |
| #else | |
| # include <config.h> | |
| #endif | |
| #include "lt_system.h" | |
| Or if they are installed headers that must work outside the libtool | |
| source tree, simply: | |
| #include <libltdl/lt_system.h> | |
| This layer's interface is defined by files that are usually named with | |
| a leading 'lt__': | |
| ,--------------v-------------v------------v--------v---------. | |
| | lt__dirent.h | lt__alloc.h | lt__strl.h | argz.h | slist.h | | |
| +--------------+-------------+------------+--------+---------+ | |
| | lt__dirent.c | lt__alloc.c | lt__strl.c | argz.c | slist.c | | |
| `--------------^-------------^------------^--------^---------' | |
| (argz.h and slist.h are used independently of libltdl in other projects) | |
| * At the bottom of the stack we have the system abstraction layer, | |
| which tries to smooth over the cracks where there are differences | |
| between host systems and compilers. config.h is generated at | |
| configure time and is not installed; lt_system.h is an installed | |
| file and cannot use macros from config.h: | |
| ,-----------. | |
| |../config.h| | |
| `-----------' | |
| ,-----------. | |
| |lt_system.h| | |
| `-----------' | |
| * Tacked on the side of this stack, attached via the lt_dlloader.h | |
| definitions are the various implementation modules for run-time module | |
| loading: preopen.c, dlopen.c etc. | |
| 9. Licensing Rules | |
| ================== | |
| GNU Libtool uses 3 different licenses for the files distributed herein, | |
| with several variations on license text. It is important that you use | |
| the correct license text in each new file added. Here are the texts | |
| along with some notes on when each is appropriate. Appropriate | |
| commenting (shell, C etc) and decoration (m4 etc) assumed throughout. | |
| 9.1. Notice preservation | |
| Autoconf macros and files used to generate them need this license, along | |
| with files such as HACKING, NEWS, README, README.alpha, TODO and | |
| ChangeLogs: | |
| Copyright (C) <year list> Free Software Foundation, Inc. | |
| Written by <author>, <year> | |
| 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 file is offered as-is, | |
| without warranty of any kind. | |
| 9.2. GPL | |
| Everything else in the distribution has the following license text | |
| unless there is good reason to use one of the other license texts | |
| below: | |
| Copyright (C) <year list> Free Software Foundation, Inc. | |
| Written by <author>, <year> | |
| This file is part of GNU Libtool. | |
| GNU Libtool 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 of | |
| the License, or (at your option) any later version. | |
| GNU Libtool 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 GNU Libtool. If not, see <https://www.gnu.org/licenses/>. | |
| 9.3. GPL with self extracting version | |
| Some of the sources built atop the options-parser framework use | |
| func_version() to extract their --version output from the copyright | |
| block. Those files also need the --version copyright text paragraph as | |
| follows: | |
| <program name> (GNU @PACKAGE@) <version number> | |
| Written by <author> <email address>. | |
| This file is part of <parent package name>. | |
| Copyright (C) <year list> Free Software Foundation, Inc. | |
| This is free software; see the source for copying conditions. There is NO | |
| warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
| <program name> 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 of the License, or | |
| (at your option) any later version. | |
| <program name> 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 <program name>. If not, see <https://www.gnu.org/licenses/>. | |
| 9.4. GPL with self extracting version and Libtool exception clause | |
| Although the libtool script is generated from 'ltmain.in' according | |
| to the rules in the preceding subsection, it also needs the Libtool | |
| exception clause so that it can be redistributed by other projects | |
| that use libtool: | |
| <program name> (GNU @PACKAGE@@TIMESTAMP@) <version number> | |
| Written by <author> <email address>. | |
| This file is part of GNU Libtool. | |
| Copyright (C) <year list> Free Software Foundation, Inc. | |
| This is free software; see the source for copying conditions. There is NO | |
| warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
| <program name> 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 of the License, or | |
| (at your option) any later version. | |
| As a special exception to the GNU General Public License, | |
| if you distribute this file as part of a program or library that | |
| is built using GNU Libtool, you may include this file under the | |
| same distribution terms that you use for the rest of that program. | |
| <program name> 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 <program name>. If not, see <https://www.gnu.org/licenses/>. | |
| 9.5. LGPL with Libtool exception clause | |
| Finally, not only is Libltdl is LGPLed, but it is routinely | |
| redistributed inside projects that use it, so its sources need to use | |
| the following license text citing the LGPL along with Libtool's special | |
| exception clause: | |
| Copyright (C) <year list> Free Software Foundation, Inc. | |
| Written by <author>, <year> | |
| NOTE: The canonical source of this file is maintained with the | |
| GNU Libtool package. Report bugs to bug-libtool@gnu.org. | |
| GNU Libltdl is free software; you can redistribute it and/or | |
| modify it under the terms of the GNU Lesser General Public | |
| License as published by the Free Software Foundation; either | |
| version 2 of the License, or (at your option) any later version. | |
| As a special exception to the GNU Lesser General Public License, | |
| if you distribute this file as part of a program or library that | |
| is built using GNU Libtool, you may include this file under the | |
| same distribution terms that you use for the rest of that program. | |
| GNU Libltdl 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 Lesser General Public License for more details. | |
| You should have received a copy of the GNU Lesser General Public | |
| License along with GNU Libltdl. If not, see <https://www.gnu.org/licenses/>. | |
| -- | |
| Copyright (C) 2004-2008, 2010-2019, 2021-2025 Free Software | |
| Foundation, Inc. | |
| Written by Gary V. Vaughan, 2004 | |
| This file is part of GNU Libtool. | |
| 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 file is offered as-is, | |
| without warranty of any kind. | |
| Local Variables: | |
| mode: text | |
| fill-column: 72 | |
| End: | |
| vim:tw=72 |