From 754bbf7a25a8dda49b5d08ef0d0443bbf5af0e36 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sun, 7 Apr 2024 13:41:34 -0500 Subject: new repository --- devdocs/gnu_make/loaded-object-example.html | 67 +++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 devdocs/gnu_make/loaded-object-example.html (limited to 'devdocs/gnu_make/loaded-object-example.html') diff --git a/devdocs/gnu_make/loaded-object-example.html b/devdocs/gnu_make/loaded-object-example.html new file mode 100644 index 00000000..bc4ca849 --- /dev/null +++ b/devdocs/gnu_make/loaded-object-example.html @@ -0,0 +1,67 @@ +

Example Loaded Object

Let’s suppose we wanted to write a new GNU make function that would create a temporary file and return its name. We would like our function to take a prefix as an argument. First we can write the function in a file mk_temp.c:

#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <gnumake.h>
+
+int plugin_is_GPL_compatible;
+
+char *
+gen_tmpfile(const char *nm, int argc, char **argv)
+{
+  int fd;
+
+  /* Compute the size of the filename and allocate space for it.  */
+  int len = strlen (argv[0]) + 6 + 1;
+  char *buf = gmk_alloc (len);
+
+  strcpy (buf, argv[0]);
+  strcat (buf, "XXXXXX");
+
+  fd = mkstemp(buf);
+  if (fd >= 0)
+    {
+      /* Don't leak the file descriptor.  */
+      close (fd);
+      return buf;
+    }
+
+  /* Failure.  */
+  fprintf (stderr, "mkstemp(%s) failed: %s\n", buf, strerror (errno));
+  gmk_free (buf);
+  return NULL;
+}
+
+int
+mk_temp_gmk_setup (const gmk_floc *floc)
+{
+  printf ("mk_temp plugin loaded from %s:%lu\n", floc->filenm, floc->lineno);
+  /* Register the function with make name "mk-temp".  */
+  gmk_add_function ("mk-temp", gen_tmpfile, 1, 1, 1);
+  return 1;
+}
+
+

Next, we will write a Makefile that can build this shared object, load it, and use it:

all:
+        @echo Temporary file: $(mk-temp tmpfile.)
+
+load mk_temp.so
+
+mk_temp.so: mk_temp.c
+        $(CC) -shared -fPIC -o $@ $<
+
+

On MS-Windows, due to peculiarities of how shared objects are produced, the compiler needs to scan the import library produced when building make, typically called libgnumake-version.dll.a, where 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 1):

mk_temp.dll: mk_temp.c
+        $(CC) -shared -o $@ $< -lgnumake-1
+
+

Now when you run make you’ll see something like:

$ make
+mk_temp plugin loaded from Makefile:4
+cc -shared -fPIC -o mk_temp.so mk_temp.c
+Temporary filename: tmpfile.A7JEwd
+
+
+

+ Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
+ https://www.gnu.org/software/make/manual/html_node/Loaded-Object-Example.html +

+
-- cgit v1.2.3