delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2003/12/04/13:35:14

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Date: Thu, 4 Dec 2003 11:34:46 -0700
From: paul cannon <Paul DOT Cannon AT sdl DOT usu DOT edu>
To: cygwin AT cygwin DOT com
Subject: memory problems in Cygwin 'make'
Message-ID: <20031204183446.GE15238@fslc.usu.edu>
Reply-To: Paul DOT Cannon AT sdl DOT usu DOT edu, paul AT fslc DOT usu DOT edu, cygwin AT cygwin DOT com
Mail-Followup-To: Paul DOT Cannon AT sdl DOT usu DOT edu, paul AT fslc DOT usu DOT edu,
cygwin AT cygwin DOT com
Mime-Version: 1.0
User-Agent: Mutt/1.5.4i

Hello-

GNU Make 3.80 has a bug which causes it to try to allocate negative
amounts of memory (which ends up something like 4 gigabytes) under
certain conditions. This leads to the message:

make: *** virtual memory exhausted.  Stop.

The problem is reproducible with this shell script [1]:

============== 8< ===============
for a in `seq 1 5`; do touch 0123456789012345678901234567890123$a.c;
done

cat > Makefile <<'DELIM'
define BUG
SRC := $$(wildcard *.c)
#OBJ := $$(SRC:.c=.o)
OBJ := $$(patsubst %.c,%.o,$$(SRC))

$$(OBJ):%.o:%.c
endef

$(eval $(call BUG))
DELIM

make
============== 8< ===============

It's a known bug which has been fixed in CVS for several months now, but
no version has been released in that time. The problem is affecting us
here at SDL; we have a non-recursive make structure that uses the
$(eval $(call foo)) method, and it produces this same error after only a
very few included files.

It would be great to have a fix put in the Cygwin make package. The
following patch[1] corrects the problem, and applies to the Cygwin
make-3.80-1 source.

paul

[1] The shell script and patch were adapted from notes under Debian bug
#197886 : http://bugs.debian.org/197886

diff -Naur make-3.80-1/expand.c make-3.80-1.patched/expand.c
--- make-3.80-1/expand.c	2002-07-11 00:38:57.000000000 -0600
+++ make-3.80-1.patched/expand.c	2003-12-03 16:48:06.582570500 -0700
@@ -564,3 +564,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;
+}
diff -Naur make-3.80-1/function.c make-3.80-1.patched/function.c
--- make-3.80-1/function.c	2002-11-23 14:08:14.000000000 -0700
+++ make-3.80-1.patched/function.c	2003-12-03 16:48:06.598193600 -0700
@@ -1281,8 +1281,18 @@
      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;
 }
 
diff -Naur make-3.80-1/variable.h make-3.80-1.patched/variable.h
--- make-3.80-1/variable.h	2002-08-07 18:11:19.000000000 -0600
+++ make-3.80-1.patched/variable.h	2003-12-03 16:48:06.582570500 -0700
@@ -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));


-- 
.------------------------------------------------------------.
| paul cannon                                 pik AT debian DOT org |
|                             http://people.debian.org/~pik/ |

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019