| 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 |