summaryrefslogtreecommitdiff
path: root/doc/make.texi
diff options
context:
space:
mode:
Diffstat (limited to 'doc/make.texi')
-rw-r--r--doc/make.texi78
1 files changed, 71 insertions, 7 deletions
diff --git a/doc/make.texi b/doc/make.texi
index 2e76e900..57c13077 100644
--- a/doc/make.texi
+++ b/doc/make.texi
@@ -11990,7 +11990,7 @@ If the load succeeds @code{make} will invoke an initializing function. If
@var{symbol-name} is provided, it will be used as the name of the initializing
function.
-If no @var{symbol-name} is provided, the initializing function name is created
+If @var{symbol-name} is not provided, the initializing function name is created
by taking the base file name of @var{object-file}, up to the first character
which is not a valid symbol name character (alphanumerics and underscores are
valid symbol name characters). To this prefix will be appended the suffix
@@ -12030,6 +12030,31 @@ an error, you can use the @code{-load} directive instead of @code{load}. GNU
to load. The failed object is not added to the @code{.LOADED} variable, which
can then be consulted to determine if the load was successful.
+@subsubheading Unloading Objects
+@cindex unloading objects
+@cindex unload function for loaded objects
+
+When GNU Make needs to unload a loaded object, either because it is exiting or
+because the loaded object has been rebuilt, it will invoke an unload function.
+The unload function name is created by taking the base file name of the object
+file, up to the first character which is not a valid symbol name character
+(alphanumerics and underscores are valid symbol name characters), then
+appending the suffix @code{_gmk_unload}.
+
+If that function exists it will be called using the signature:
+
+@example
+void <name>_gmk_unload (void);
+@end example
+
+If the function does not exist, it will not be called.
+
+Note that only one unload function may be defined per loaded object,
+regardless of how many different setup methods are provided in that loaded
+object. If your loaded object provides multiple setup methods that require
+unload support it's up to you to coordinate which setups have been invoked in
+the unload function.
+
@node Initializing Functions, Remaking Loaded Objects, load Directive, Loading Objects
@subsection Initializing Functions
@cindex loaded object initializing function
@@ -12275,8 +12300,16 @@ take a prefix as an argument. First we can write the function in a file
int plugin_is_GPL_compatible;
-char *
-gen_tmpfile(const char *nm, int argc, char **argv)
+struct tmpfile @{
+ struct tmpfile *next;
+ char *name;
+@};
+static struct tmpfile *files = NULL;
+@end group
+
+@group
+static char *
+gen_tmpfile(const char *nm, unsigned int argc, char **argv)
@{
int fd;
@@ -12290,6 +12323,11 @@ gen_tmpfile(const char *nm, int argc, char **argv)
fd = mkstemp(buf);
if (fd >= 0)
@{
+ struct tmpfile *new = malloc (sizeof (struct tmpfile));
+ new->name = strdup (buf);
+ new->next = files;
+ files = new;
+
/* Don't leak the file descriptor. */
close (fd);
return buf;
@@ -12300,7 +12338,9 @@ gen_tmpfile(const char *nm, int argc, char **argv)
gmk_free (buf);
return NULL;
@}
+@end group
+@group
int
mk_temp_gmk_setup (unsigned int abi, const gmk_floc *floc)
@{
@@ -12311,6 +12351,23 @@ mk_temp_gmk_setup (unsigned int abi, const gmk_floc *floc)
return 1;
@}
@end group
+
+@group
+void
+mk_temp_gmk_close ()
+@{
+ while (files)
+ @{
+ struct tmpfile *f = files;
+ files = f->next;
+ printf ("mk_temp removing %s\n", f->name);
+ remove (f->name);
+ free (f->name);
+ free (f);
+ @}
+ printf ("mk_temp plugin closed\n");
+@}
+@end group
@end example
Next, we will write a @file{Makefile} that can build this shared object, load
@@ -12320,8 +12377,9 @@ it, and use it:
@group
all:
@@echo Temporary file: $(mk-temp tmpfile.)
+ @@echo Temporary file: $(mk-temp tmpfile.)
-load mk_temp.so
+-load mk_temp.so
mk_temp.so: mk_temp.c
$(CC) -shared -fPIC -o $@@ $<
@@ -12332,7 +12390,7 @@ On MS-Windows, due to peculiarities of how shared objects are produced, the
compiler needs to scan the @dfn{import library} produced when building
@code{make}, typically called @file{libgnumake-@var{version}.dll.a}, where
@var{version} is the version of the load object API. So the recipe to produce
-a shared object will look on Windows like this (assuming the API version is
+a shared object will look like this on Windows (assuming the API version is
1):
@example
@@ -12345,10 +12403,16 @@ mk_temp.dll: mk_temp.c
Now when you run @code{make} you'll see something like:
@example
+@group
$ make
-mk_temp abi 1 plugin loaded from Makefile:4
cc -shared -fPIC -o mk_temp.so mk_temp.c
-Temporary filename: tmpfile.A7JEwd
+mk_temp abi 1 plugin loaded from Makefile:5
+Temporary file: tmpfile.OYkGMT
+Temporary file: tmpfile.sYsJO0
+mk_temp removing tmpfile.sYsJO0
+mk_temp removing tmpfile.OYkGMT
+mk_temp plugin closed
+@end group
@end example
@node Integrating make, Features, Extending make, Top