Index: variable.h
===================================================================
RCS file: /cvsroot/make/make/variable.h,v
retrieving revision 1.24
diff -u -B -b -r1.24 variable.h
--- variable.h	8 Aug 2002 00:11:19 -0000	1.24
+++ variable.h	25 Oct 2002 21:37:32 -0000
@@ -107,6 +107,8 @@
 extern char *expand_argument PARAMS ((char *str, char *end));
 extern char *variable_expand_string PARAMS ((char *line, char *string,
                                              long length));
+extern void install_variable_buffer PARAMS ((char **bufp, unsigned int *lenp));
+extern void restore_variable_buffer PARAMS ((char *buf, unsigned int len));
 
 /* function.c */
 extern int handle_function PARAMS ((char **op, char **stringp));
Index: expand.c
===================================================================
RCS file: /cvsroot/make/make/expand.c,v
retrieving revision 1.33
diff -u -B -b -r1.33 expand.c
--- expand.c	14 Oct 2002 21:54:04 -0000	1.33
+++ expand.c	25 Oct 2002 21:37:32 -0000
@@ -545,3 +545,28 @@
 
   return value;
 }
+
+/* Install a new variable_buffer context, returning the current one for
+   safe-keeping.  */
+
+void
+install_variable_buffer (char **bufp, unsigned int *lenp)
+{
+  *bufp = variable_buffer;
+  *lenp = variable_buffer_length;
+
+  variable_buffer = 0;
+  initialize_variable_output ();
+}
+
+/* Restore a previously-saved variable_buffer setting (free the current one).
+ */
+
+void
+restore_variable_buffer (char *buf, unsigned int len)
+{
+  free (variable_buffer);
+
+  variable_buffer = buf;
+  variable_buffer_length = len;
+}
Index: function.c
===================================================================
RCS file: /cvsroot/make/make/function.c,v
retrieving revision 1.71
diff -u -B -b -r1.71 function.c
--- function.c	14 Oct 2002 21:54:04 -0000	1.71
+++ function.c	25 Oct 2002 21:37:32 -0000
@@ -1196,7 +1196,17 @@
 static char *
 func_eval (char *o, char **argv, const char *funcname)
 {
+  char *buf;
+  unsigned int len;
+
+  /* Eval the buffer.  Pop the current variable buffer setting so that the
+     eval'd code can use its own without conflicting.  */
+
+  install_variable_buffer (&buf, &len);
+
   eval_buffer (argv[0]);
+
+  restore_variable_buffer (buf, len);
 
   return o;
 }
