manpagez: man pages & more
info make
Home | html | info | man

File: make.info,  Node: Loaded Object Example,  Prev: Loaded Object API,  Up: Loading Objects

12.2.4 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 
     #include 
     #include 
     #include 
     #include 

     #include 

     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

© manpagez.com 2000-2025
Individual documents may contain additional copyright information.