[gnu.utils.bug] gnumake 3.27 patches

imdave@att.att.com (01/05/89)

Hi,

I've found some bugs in gnu make 3.27 for USG system V release 2,
release 3, and Microport's system V release 2 80286 port.  The patchs
are enclosed.  The Microport and ar*.c patches are probably necessary
for other 16-bit systems too.  Some of these fixes were posted previously
-- I don't remember who posted them tho... sorry.

One should define in the Makefile either USGr2 or USGr3 if USG is defined.

------------------- cut here ---------------------
Bugs:

ar.c, arscan.c made the assumption that an int is the same size as a long.

arscan.c needs to strip a trailing '/' from ar_name[] if PORTAR or
	u3b2 is defined.

commands.c had incorrect wait status macros for USG.  I also added
	dup2() for USGr2, and a couple of functions to replace some
	macros that the Microport compiler is too buggy to handle.

	Also, in USG systems (at least the ones I have access to) a
	SIGCLD handler must do a wait() to get rid of the dead child.
	If the signal() system call is issued to re-instate the handler,
	we immediately re-enter the handler.  This continues until the
	stack grows too large, and we get a core file.  The most straight-
	forward fix for USG is just to not use a SIGCLD handler.

dep.h replaces macro dep_name() with a function for Microport.

make.c used "index" as a structure member name -- this makes trouble
	when index is #defined to strchr in make.h when USG is defined.

	The SIGCLD handler is not used for USG.

	Also, I found that job_slots was always being set to 1, even
	when I used the -j command line switch.  The problem is that
	MAKEFLAGS is scanned after the command line, and MAKEFLAGS
	is initialized with "-j1".  So, I made the command line
	override MAKEFLAGS.

make.h replaces macro streq() with a function for Microport.



*** /tmp/,RCSt1a06425	Wed Jan  4 12:21:29 1989
--- ar.c	Wed Jan  4 12:20:31 1989
***************
*** 18,24
  
  
  /* Defined in arscan.c  */
! extern int ar_scan (), ar_member_touch ();
  
  
  /* Return nonzero if NAME is an archive-member reference, zero if not.

--- 18,25 -----
  
  
  /* Defined in arscan.c  */
! extern long ar_scan ();
! extern int ar_member_touch ();
  
  
  /* Return nonzero if NAME is an archive-member reference, zero if not.
***************
*** 41,47
    return 1;
  }
  
! static int ar_member_date_1 ();
  
  /* Return the modtime of NAME.  */
  

--- 42,48 -----
    return 1;
  }
  
! static long ar_member_date_1 ();
  
  /* Return the modtime of NAME.  */
  
***************
*** 52,58
    char *arname;
    char *memname;
    char *p;
!   int val;
  
    /* This "file" is an archive member.  */
    p = index (name, '(');

--- 53,59 -----
    char *arname;
    char *memname;
    char *p;
!   long val;
  
    /* This "file" is an archive member.  */
    p = index (name, '(');
***************
*** 64,70
       member are run, and they will change the archive itself.  */
    (void) f_mtime (enter_file (arname));
  
!   val = ar_scan (arname, ar_member_date_1, (int) memname);
  
    free (arname);
    free (memname);

--- 65,71 -----
       member are run, and they will change the archive itself.  */
    (void) f_mtime (enter_file (arname));
  
!   val = ar_scan (arname, ar_member_date_1, (long) memname);
  
    free (arname);
    free (memname);
***************
*** 74,80
  /* This function is called by `ar_scan' to find which member to look at.  */
  
  /* ARGSUSED */
! static int
  ar_member_date_1 (desc, name, hdrpos, datapos, size, date, uid, gid, mode, mem)
       int desc;
       char *name;

--- 75,81 -----
  /* This function is called by `ar_scan' to find which member to look at.  */
  
  /* ARGSUSED */
! static long
  ar_member_date_1 (desc, name, hdrpos, datapos, size, date, uid, gid, mode, mem)
       int desc;
       char *name;
***************
*** 78,84
  ar_member_date_1 (desc, name, hdrpos, datapos, size, date, uid, gid, mode, mem)
       int desc;
       char *name;
!      int hdrpos, datapos, size, date, uid, gid, mode;
       char *mem;
  {
    return streq (name, mem) ? date : 0;

--- 79,86 -----
  ar_member_date_1 (desc, name, hdrpos, datapos, size, date, uid, gid, mode, mem)
       int desc;
       char *name;
!      long hdrpos, datapos, size, date;
!      int uid, gid, mode;
       char *mem;
  {
    return streq (name, mem) ? date : 0;
*** /tmp/,RCSt1a06425	Wed Jan  4 12:21:31 1989
--- arscan.c	Wed Jan  4 12:20:32 1989
***************
*** 119,125
  
  
  extern int open (), read (), close (), write (), fstat ();
! extern long int lseek ();
  extern int atoi (), strcmp ();
  
  /* Takes three arguments ARCHIVE, FUNCTION and ARG.

--- 119,125 -----
  
  
  extern int open (), read (), close (), write (), fstat ();
! extern long int atol (), lseek ();
  extern int atoi (), strcmp ();
  
  /* Takes three arguments ARCHIVE, FUNCTION and ARG.
***************
*** 128,137
     and for each one call FUNCTION with the following arguments:
       archive file descriptor for reading the data,
       member name,
!      member header position in file,
!      member data position in file,
!      member data size,
!      member date,
       member uid,
       member gid,
       member protection mode,

--- 128,137 -----
     and for each one call FUNCTION with the following arguments:
       archive file descriptor for reading the data,
       member name,
!      member header position (long) in file,
!      member data position (long) in file,
!      member data size (long),
!      member date (long),
       member uid,
       member gid,
       member protection mode,
***************
*** 135,141
       member uid,
       member gid,
       member protection mode,
!      ARG.
  
     The descriptor is poised to read the data of the member
     when FUNCTION is called.  It does not matter how much

--- 135,141 -----
       member uid,
       member gid,
       member protection mode,
!      ARG (long).
  
     The descriptor is poised to read the data of the member
     when FUNCTION is called.  It does not matter how much
***************
*** 148,154
     Returns -2 if archive has invalid format.
     Returns 0 if have scanned successfully.  */
  
! int
  ar_scan (archive, function, arg)
       char *archive;
       int (*function) ();

--- 148,154 -----
     Returns -2 if archive has invalid format.
     Returns 0 if have scanned successfully.  */
  
! long
  ar_scan (archive, function, arg)
       char *archive;
       int (*function) ();
***************
*** 152,158
  ar_scan (archive, function, arg)
       char *archive;
       int (*function) ();
!      int arg;
  {
    register int desc = open (archive, O_RDONLY, 0);
    if (desc < 0)

--- 152,158 -----
  ar_scan (archive, function, arg)
       char *archive;
       int (*function) ();
!      long arg;
  {
    register int desc = open (archive, O_RDONLY, 0);
    if (desc < 0)
***************
*** 194,200
  	register int nread;
  	struct ar_hdr member_header;
  	char name [1 + sizeof member_header.ar_name];
! 	int eltsize;
  	int eltmode;
  	int fnval;
  

--- 194,200 -----
  	register int nread;
  	struct ar_hdr member_header;
  	char name [1 + sizeof member_header.ar_name];
! 	long eltsize;
  	int eltmode;
  	long fnval;
  
***************
*** 196,202
  	char name [1 + sizeof member_header.ar_name];
  	int eltsize;
  	int eltmode;
! 	int fnval;
  
  	if (lseek (desc, member_offset, 0) < 0)
  	  {

--- 196,202 -----
  	char name [1 + sizeof member_header.ar_name];
  	long eltsize;
  	int eltmode;
! 	long fnval;
  
  	if (lseek (desc, member_offset, 0) < 0)
  	  {
***************
*** 222,227
  	{
  	  register char *p = name + sizeof member_header.ar_name;
  	  while (p > name && *--p == ' ') *p = 0;
  	}
  
  	sscanf (member_header.ar_mode, "%o", &eltmode);

--- 222,231 -----
  	{
  	  register char *p = name + sizeof member_header.ar_name;
  	  while (p > name && *--p == ' ') *p = 0;
+ #if defined(PORTAR) || defined(u3b2)
+ 	  if (*p == '/')
+ 	    *p = 0;
+ #endif
  	}
  
  	sscanf (member_header.ar_mode, "%o", &eltmode);
***************
*** 225,231
  	}
  
  	sscanf (member_header.ar_mode, "%o", &eltmode);
! 	eltsize = atoi (member_header.ar_size);
  
  	fnval =
  	  (*function) (desc, name, member_offset,

--- 229,235 -----
  	}
  
  	sscanf (member_header.ar_mode, "%o", &eltmode);
! 	eltsize = atol (member_header.ar_size);
  
  	fnval =
  	  (*function) (desc, name, member_offset,
***************
*** 230,236
  	fnval =
  	  (*function) (desc, name, member_offset,
  		       member_offset + sizeof (member_header), eltsize,
! 		       atoi (member_header.ar_date),
  		       atoi (member_header.ar_uid),
  		       atoi (member_header.ar_gid),
  		       eltmode, arg);

--- 234,240 -----
  	fnval =
  	  (*function) (desc, name, member_offset,
  		       member_offset + sizeof (member_header), eltsize,
! 		       atol (member_header.ar_date),
  		       atoi (member_header.ar_uid),
  		       atoi (member_header.ar_gid),
  		       eltmode, arg);
***************
*** 251,257
  }
  
  /* ARGSUSED */
! static int
  ar_member_pos (desc, name, hdrpos, datapos, size, date, uid, gid, mode, mem)
       int desc;
       char *name;

--- 255,261 -----
  }
  
  /* ARGSUSED */
! static long
  ar_member_pos (desc, name, hdrpos, datapos, size, date, uid, gid, mode, mem)
       int desc;
       char *name;
***************
*** 255,261
  ar_member_pos (desc, name, hdrpos, datapos, size, date, uid, gid, mode, mem)
       int desc;
       char *name;
!      int hdrpos, datapos, size, date, uid, gid, mode;
       char *mem;
  {
    if (strcmp (name, mem))

--- 259,266 -----
  ar_member_pos (desc, name, hdrpos, datapos, size, date, uid, gid, mode, mem)
       int desc;
       char *name;
!      long hdrpos, datapos, size, date;
!      int uid, gid, mode;
       char *mem;
  {
    if (strcmp (name, mem))
***************
*** 274,280
  ar_member_touch (arname, memname)
       char *arname, *memname;
  {
!   register long int pos = ar_scan (arname, ar_member_pos, (int) memname);
    register int fd;
    struct ar_hdr ar_hdr;
    register int i;

--- 279,285 -----
  ar_member_touch (arname, memname)
       char *arname, *memname;
  {
!   register long int pos = ar_scan (arname, ar_member_pos, (long) memname);
    register int fd;
    struct ar_hdr ar_hdr;
    register int i;
***************
*** 305,311
    /* Advance member's time to that time */
    for (i = 0; i < sizeof ar_hdr.ar_date; i++)
      ar_hdr.ar_date[i] = ' ';
!   sprintf (ar_hdr.ar_date, "%d", statbuf.st_mtime);
  #else
    ar_hdr.ar_date = statbuf.st_mtime;
  #endif

--- 310,316 -----
    /* Advance member's time to that time */
    for (i = 0; i < sizeof ar_hdr.ar_date; i++)
      ar_hdr.ar_date[i] = ' ';
!   sprintf (ar_hdr.ar_date, "%ld", statbuf.st_mtime);
  #else
    ar_hdr.ar_date = statbuf.st_mtime;
  #endif
***************
*** 326,332
  
  #ifdef TEST
  
! int
  describe_member (desc, name, hdrpos, datapos, size, date, uid, gid, mode)
       int desc;
       char *name;

--- 331,337 -----
  
  #ifdef TEST
  
! long
  describe_member (desc, name, hdrpos, datapos, size, date, uid, gid, mode)
       int desc;
       char *name;
***************
*** 330,336
  describe_member (desc, name, hdrpos, datapos, size, date, uid, gid, mode)
       int desc;
       char *name;
!      int hdrpos, datapos, size, date, uid, gid, mode;
  {
    printf ("Member %s: %d bytes at %d (%d).\n", name, size, hdrpos, datapos);
    printf ("  Date %s", ctime (&date));

--- 335,342 -----
  describe_member (desc, name, hdrpos, datapos, size, date, uid, gid, mode)
       int desc;
       char *name;
!      long hdrpos, datapos, size, date;
!      int uid, gid, mode;
  {
    extern char *ctime();
    printf ("Member %s: %ld bytes at %ld (%ld).\n", name, size, hdrpos, datapos);
***************
*** 332,338
       char *name;
       int hdrpos, datapos, size, date, uid, gid, mode;
  {
!   printf ("Member %s: %d bytes at %d (%d).\n", name, size, hdrpos, datapos);
    printf ("  Date %s", ctime (&date));
    printf ("  uid = %d, gid = %d, mode = 0%o.\n", uid, gid, mode);
    return 0;

--- 338,345 -----
       long hdrpos, datapos, size, date;
       int uid, gid, mode;
  {
!   extern char *ctime();
!   printf ("Member %s: %ld bytes at %ld (%ld).\n", name, size, hdrpos, datapos);
    printf ("  Date %s", ctime (&date));
    printf ("  uid = %d, gid = %d, mode = 0%o.\n", uid, gid, mode);
    return 0;
*** /tmp/,RCSt1a06425	Wed Jan  4 12:21:33 1989
--- commands.c	Wed Jan  4 12:20:32 1989
***************
*** 22,30
  #ifdef	USG
  
  #define WAIT_T int
! #define WTERMSIG(x) ((x) & 0xf7)
! #define WCOREDUMP(x) ((x) & 0x01)
! #define WRETCODE(x) ((x) & (0xff >> 8))
  #define WIFSIGNALED(x) (WTERMSIG (x) != 0)
  #define WIFEXITED(x) (WTERMSIG (x) == 0)
  

--- 22,30 -----
  #ifdef	USG
  
  #define WAIT_T int
! #define WTERMSIG(x) ((x) & 0x7f)
! #define WCOREDUMP(x) ((x) & 0200)
! #define WRETCODE(x) (((x) >> 8) & 0xff)
  #define WIFSIGNALED(x) (WTERMSIG (x) != 0)
  #define WIFEXITED(x) (WTERMSIG (x) == 0)
  
***************
*** 28,33
  #define WIFSIGNALED(x) (WTERMSIG (x) != 0)
  #define WIFEXITED(x) (WTERMSIG (x) == 0)
  
  #else	/* not USG	*/
  
  #include <sys/wait.h>

--- 28,38 -----
  #define WIFSIGNALED(x) (WTERMSIG (x) != 0)
  #define WIFEXITED(x) (WTERMSIG (x) == 0)
  
+ #ifdef	USGr2
+ #include <errno.h>
+ #include <fcntl.h>
+ #endif
+ 
  #else	/* not USG	*/
  
  #include <sys/wait.h>
***************
*** 116,122
  
  extern int shell_function_pid;
  
! /* Handle a child-termination signal (SIGCHLD, or SIGCLD for USG),
     storing the returned status and the new command state (`cs_finished')
     in the `file' member of the `struct child' for the dead child,
     and removing the child from the chain.

--- 121,127 -----
  
  extern int shell_function_pid;
  
! /* Handle a child-termination signal (SIGCHLD),
     storing the returned status and the new command state (`cs_finished')
     in the `file' member of the `struct child' for the dead child,
     and removing the child from the chain.
***************
*** 121,128
     in the `file' member of the `struct child' for the dead child,
     and removing the child from the chain.
  
!    If we were called as a signal handler, SIG should be SIGCHLD
!    (SIGCLD for USG).  If instead it is zero, we were called explicitly
     and should block waiting for running children.
     If SIG is < 0, - SIG is the maximum number of children to bury (record
     status of and remove from the chain).  */

--- 126,133 -----
     in the `file' member of the `struct child' for the dead child,
     and removing the child from the chain.
  
!    If we were called as a signal handler (never true for USG), SIG
!    should be SIGCHLD.  If instead it is zero, we were called explicitly
     and should block waiting for running children.
     If SIG is < 0, - SIG is the maximum number of children to bury (record
     status of and remove from the chain).  */
***************
*** 136,151
    unsigned int dead_children = 0;
  
  #ifdef	USG
-   if (sig > 0)
-     {
-       /* No safe signals!  */
- #	ifdef	SIGCHLD
-       (void) signal (SIGCHLD, child_handler);
- #	else
-       (void) signal (SIGCLD, child_handler);
- #	endif
-     }
- 
    /* System V has no wait3 system call, so it can't wait without
       blocking, so we must avoid hanging if we have no children.  */
    if (children == 0 && shell_function_pid <= 0)

--- 141,146 -----
    unsigned int dead_children = 0;
  
  #ifdef	USG
    /* System V has no wait3 system call, so it can't wait without
       blocking, so we must avoid hanging if we have no children.  */
    if (children == 0 && shell_function_pid <= 0)
***************
*** 151,157
    if (children == 0 && shell_function_pid <= 0)
      return 0;
  
!   while (wait (&status) > 0)
  #else	/* not USG	*/
    while ((sig <= 0
  	  ? (pid = wait (&status))

--- 146,152 -----
    if (children == 0 && shell_function_pid <= 0)
      return 0;
  
!   while ((pid = wait (&status)) > 0)
  #else	/* not USG	*/
    while ((sig <= 0
  	  ? (pid = wait (&status))
***************
*** 165,171
        if (pid == shell_function_pid)
  	{
  	  shell_function_pid
! 	    = (WIFEXITED (status) && status.w_retcode == 127) ? -1 : 0;
  
  	  if (sig < 0 && ++dead_children > -sig)
  	    return 0;

--- 160,166 -----
        if (pid == shell_function_pid)
  	{
  	  shell_function_pid
! 	    = (WIFEXITED (status) && WRETCODE(status) == 127) ? -1 : 0;
  
  	  if (sig < 0 && ++dead_children > -sig)
  	    return 0;
***************
*** 180,187
  	    char buf[100];
  
  	    if (WIFEXITED (status))
! 	      if (status.w_retcode != 0)
! 		sprintf (buf, "*** Error %d", status.w_retcode);
  	      else
  		buf[0] = '\0';
  	    else if (WIFSIGNALED (status))

--- 175,182 -----
  	    char buf[100];
  
  	    if (WIFEXITED (status))
! 	      if (WRETCODE (status) != 0)
! 		sprintf (buf, "*** Error %d", WRETCODE (status));
  	      else
  		buf[0] = '\0';
  	    else if (WIFSIGNALED (status))
***************
*** 186,194
  		buf[0] = '\0';
  	    else if (WIFSIGNALED (status))
  	      {
! 		char *cd = status.w_coredump ? " (core dumped)" : "";
! 		if (status.w_termsig > 0 && status.w_termsig < NSIG)
! 		  sprintf (buf, "*** %s%s", sys_siglist[status.w_termsig], cd);
  		else
  		  sprintf (buf, "*** Signal %d%s", status.w_termsig, cd);
  	      }

--- 181,189 -----
  		buf[0] = '\0';
  	    else if (WIFSIGNALED (status))
  	      {
! 		char *cd = WCOREDUMP (status) ? " (core dumped)" : "";
! 		if (WTERMSIG (status) > 0 && WTERMSIG (status) < NSIG)
! 		  sprintf (buf, "*** %s%s", sys_siglist[WTERMSIG(status)], cd);
  		else
  		  sprintf (buf, "*** Signal %d%s", WTERMSIG (status), cd);
  	      }
***************
*** 190,196
  		if (status.w_termsig > 0 && status.w_termsig < NSIG)
  		  sprintf (buf, "*** %s%s", sys_siglist[status.w_termsig], cd);
  		else
! 		  sprintf (buf, "*** Signal %d%s", status.w_termsig, cd);
  	      }
  	    else
  	      strcpy (buf, "*** Strange Error");

--- 185,191 -----
  		if (WTERMSIG (status) > 0 && WTERMSIG (status) < NSIG)
  		  sprintf (buf, "*** %s%s", sys_siglist[WTERMSIG(status)], cd);
  		else
! 		  sprintf (buf, "*** Signal %d%s", WTERMSIG (status), cd);
  	      }
  	    else
  	      strcpy (buf, "*** Strange Error");
***************
*** 302,307
  #ifdef SIGCHLD
    (void) signal (SIGCHLD, SIG_IGN);
  #else
    (void) signal (SIGCLD, SIG_IGN);
  #endif
  

--- 297,303 -----
  #ifdef SIGCHLD
    (void) signal (SIGCHLD, SIG_IGN);
  #else
+ #ifndef USG
    (void) signal (SIGCLD, SIG_IGN);
  #endif
  #endif
***************
*** 304,309
  #else
    (void) signal (SIGCLD, SIG_IGN);
  #endif
  
    /* Call child_handler to do the work.  */
    (void) child_handler (- (int) n);

--- 300,306 -----
  #ifndef USG
    (void) signal (SIGCLD, SIG_IGN);
  #endif
+ #endif
  
    /* Call child_handler to do the work.  */
    (void) child_handler (- (int) n);
***************
*** 312,317
  #ifdef SIGCHLD
    (void) signal (SIGCHLD, child_handler);
  #else
    (void) signal (SIGCLD, child_handler);
  #endif
  }

--- 309,315 -----
  #ifdef SIGCHLD
    (void) signal (SIGCHLD, child_handler);
  #else
+ #ifndef USG
    (void) signal (SIGCLD, child_handler);
  #endif
  #endif
***************
*** 314,319
  #else
    (void) signal (SIGCLD, child_handler);
  #endif
  }
  
  /* Start a job to run the commands specified in CHILD.

--- 312,318 -----
  #ifndef USG
    (void) signal (SIGCLD, child_handler);
  #endif
+ #endif
  }
  
  /* Start a job to run the commands specified in CHILD.
***************
*** 475,480
    return 0;
  }
  
  /* Execute the commands to remake FILE.  If they are currently executing,
     return success (0).  If they have already finished executing, return
     their status.  Otherwise, fork off a child process to run the first

--- 474,502 -----
    return 0;
  }
  
+ #ifdef	USGr2
+ /*
+  * SVR2 does not have the dup2() system call...
+  */
+ int
+ dup2( fd1, fd2 )
+ {
+   extern int errno;
+   int newfd;
+ 
+   (void) close (fd2);
+   if ((newfd = fcntl (fd1, F_DUPFD, fd2)) == -1)
+     return -1;
+   if (newfd != fd2)
+     {
+     (void) close (newfd);
+     errno = EMFILE;
+     return -1;
+     }
+   return newfd;
+ }
+ #endif
+ 
  /* Execute the commands to remake FILE.  If they are currently executing,
     return success (0).  If they have already finished executing, return
     their status.  Otherwise, fork off a child process to run the first
***************
*** 851,856
  
    puts (cmds->commands);
  }
  
  /* Set Emacs C-mode style.
     Local Variables:

--- 873,901 -----
  
    puts (cmds->commands);
  }
+ 
+ #ifdef	iAPX286
+ /*
+  * Streq() -- compiler cannot handle streq() macro in some contexts, so...
+  */
+ int
+ streq (a, b)
+      register char *a, *b;
+ {
+   return (a == b || (*a == *b && (*a == '\0' || !strcmp (a + 1, b + 1))));
+ }
+ 
+ /*
+  * Dep_name() -- compiler cannot handle dep_name() macro in some
+  * contexts either...
+  */
+ char *
+ dep_name (d)
+      register struct dep *d;
+ {
+   return d->name == 0 ? d->file->name : d->name;
+ }
+ #endif
  
  /* Set Emacs C-mode style.
     Local Variables:
No differences encountered
*** /tmp/,RCSt1a06425	Wed Jan  4 12:21:39 1989
--- dep.h	Wed Jan  4 12:20:33 1989
***************
*** 40,45
  extern struct nameseq *multi_glob (), *parse_file_seq ();
  
  
  #define dep_name(d) ((d)->name == 0 ? (d)->file->name : (d)->name)
  
  

--- 40,48 -----
  extern struct nameseq *multi_glob (), *parse_file_seq ();
  
  
+ #ifdef	iAPX286
+ extern char *dep_name();	/* buggy compiler work-around */
+ #else
  #define dep_name(d) ((d)->name == 0 ? (d)->file->name : (d)->name)
  #endif
  
***************
*** 41,46
  
  
  #define dep_name(d) ((d)->name == 0 ? (d)->file->name : (d)->name)
  
  
  /* Set Emacs C-mode style.

--- 44,50 -----
  extern char *dep_name();	/* buggy compiler work-around */
  #else
  #define dep_name(d) ((d)->name == 0 ? (d)->file->name : (d)->name)
+ #endif
  
  
  /* Set Emacs C-mode style.
*** /tmp/,RCSt1a06425	Wed Jan  4 12:21:46 1989
--- make.c	Wed Jan  4 12:20:35 1989
***************
*** 96,102
  struct stringlist
    {
      char **list;	/* Nil-terminated list of strings.  */
!     unsigned int index;	/* Index into above.  */
      unsigned int max;	/* Number of pointers allocated.  */
    };
  

--- 96,102 -----
  struct stringlist
    {
      char **list;	/* Nil-terminated list of strings.  */
!     unsigned int ndex;	/* Index into above.  */
      unsigned int max;	/* Number of pointers allocated.  */
    };
  
***************
*** 244,249
    register struct file *f;
    register unsigned int i;
    int status;
    register char *cmd_defs;
    register unsigned int cmd_defs_len, cmd_defs_idx;
    char **p;

--- 244,250 -----
    register struct file *f;
    register unsigned int i;
    int status;
+   int original_job_slots;
    register char *cmd_defs;
    register unsigned int cmd_defs_len, cmd_defs_idx;
    char **p;
***************
*** 257,262
    reading_filename = 0;
    reading_lineno_ptr = 0;
    
    if (signal (SIGHUP, fatal_error_signal) == SIG_IGN)
      (void) signal (SIGHUP, SIG_IGN);
    if (signal (SIGQUIT, fatal_error_signal) == SIG_IGN)

--- 258,264 -----
    reading_filename = 0;
    reading_lineno_ptr = 0;
    
+ #ifndef DEBUG
    if (signal (SIGHUP, fatal_error_signal) == SIG_IGN)
      (void) signal (SIGHUP, SIG_IGN);
    if (signal (SIGQUIT, fatal_error_signal) == SIG_IGN)
***************
*** 289,294
    if (signal (SIGXFSZ, fatal_error_signal) == SIG_IGN)
      (void) signal (SIGXFSZ, SIG_IGN);
  #endif
  
    /* Figure out where this program lives.  */
  

--- 291,297 -----
    if (signal (SIGXFSZ, fatal_error_signal) == SIG_IGN)
      (void) signal (SIGXFSZ, SIG_IGN);
  #endif
+ #endif
  
    /* Figure out where this program lives.  */
  
***************
*** 466,472
    if (makefiles != 0)
      {
        register unsigned int i;
!       for (i = 0; i < makefiles->index; ++i)
  	if (makefiles->list[i][0] == '-' && makefiles->list[i][1] == '\0')
  	  {
  	    /* This makefile is standard input.  Since we may re-exec

--- 469,475 -----
    if (makefiles != 0)
      {
        register unsigned int i;
!       for (i = 0; i < makefiles->ndex; ++i)
  	if (makefiles->list[i][0] == '-' && makefiles->list[i][1] == '\0')
  	  {
  	    /* This makefile is standard input.  Since we may re-exec
***************
*** 514,519
  #ifdef SIGCHLD
    (void) signal (SIGCHLD, child_handler);
  #else
    (void) signal (SIGCLD, child_handler);
  #endif
  

--- 517,523 -----
  #ifdef SIGCHLD
    (void) signal (SIGCHLD, child_handler);
  #else
+ #ifndef USG
    (void) signal (SIGCLD, child_handler);
  #endif
  #endif
***************
*** 516,521
  #else
    (void) signal (SIGCLD, child_handler);
  #endif
  
    read_makefiles
      = read_all_makefiles (makefiles == 0 ? (char **) 0 : makefiles->list);

--- 520,526 -----
  #ifndef USG
    (void) signal (SIGCLD, child_handler);
  #endif
+ #endif
  
    read_makefiles
      = read_all_makefiles (makefiles == 0 ? (char **) 0 : makefiles->list);
***************
*** 520,525
    read_makefiles
      = read_all_makefiles (makefiles == 0 ? (char **) 0 : makefiles->list);
  
    decode_env_switches ("MAKEFLAGS", 9);
    decode_env_switches ("MFLAGS", 6);
  

--- 525,538 -----
    read_makefiles
      = read_all_makefiles (makefiles == 0 ? (char **) 0 : makefiles->list);
  
+   /* job_slots is either 1 (as initialized), or it has been set from the
+      command line -j argument.  However, MAKEFLAGS has been created with
+      -j1, so we can't just call decode_env_switches() -- this will always
+      reset job_slots to 1.  So, if -j is specified on the command line,
+      it will override the environment. */
+ 
+   original_job_slots = job_slots;
+ 
    decode_env_switches ("MAKEFLAGS", 9);
    decode_env_switches ("MFLAGS", 6);
  
***************
*** 523,528
    decode_env_switches ("MAKEFLAGS", 9);
    decode_env_switches ("MFLAGS", 6);
  
    ignore_errors_flag |= lookup_file (".IGNORE") != 0;
  
    silent_flag |= lookup_file (".SILENT") != 0;

--- 536,551 -----
    decode_env_switches ("MAKEFLAGS", 9);
    decode_env_switches ("MFLAGS", 6);
  
+   if (original_job_slots != 1)		/* command line -jn */
+     {
+       if (job_slots == 1)		/* MAKEFLAGS=-j1 */
+ 	job_slots = original_job_slots;	/* command line overrides MAKEFLAGS */
+       else
+ 	/* both command line and MAKEFLAGS specified -j */
+ 	if (makelevel == 0)
+ 	  job_slots = original_job_slots;/* command line takes precedence */
+     }
+ 
    ignore_errors_flag |= lookup_file (".IGNORE") != 0;
  
    silent_flag |= lookup_file (".SILENT") != 0;
***************
*** 658,664
  		      ++j;
  		    }
  	    }
! 	  if (directories != 0 && directories->index > 0)
  	    {
  	      char bad;
  	      if (current_directory[0] != '\0')

--- 681,687 -----
  		      ++j;
  		    }
  	    }
! 	  if (directories != 0 && directories->ndex > 0)
  	    {
  	      char bad;
  	      if (current_directory[0] != '\0')
***************
*** 742,748
    other_args = (struct stringlist *) xmalloc (sizeof (struct stringlist));
    other_args->max = 5;
    other_args->list = (char **) xmalloc (5 * sizeof (char *));
!   other_args->index = 1;
    other_args->list[0] = savestring (argv[0], strlen (argv[0]));
  
    for (i = 1; i < argc; i++)

--- 765,771 -----
    other_args = (struct stringlist *) xmalloc (sizeof (struct stringlist));
    other_args->max = 5;
    other_args->list = (char **) xmalloc (5 * sizeof (char *));
!   other_args->ndex = 1;
    other_args->list[0] = savestring (argv[0], strlen (argv[0]));
  
    for (i = 1; i < argc; i++)
***************
*** 782,788
  			  sl = (struct stringlist *)
  			    xmalloc (sizeof (struct stringlist));
  			  sl->max = 5;
! 			  sl->index = 0;
  			  sl->list = (char **) xmalloc (5 * sizeof (char *));
  			  *(struct stringlist **) cs->value_ptr = sl;
  			}

--- 805,811 -----
  			  sl = (struct stringlist *)
  			    xmalloc (sizeof (struct stringlist));
  			  sl->max = 5;
! 			  sl->ndex = 0;
  			  sl->list = (char **) xmalloc (5 * sizeof (char *));
  			  *(struct stringlist **) cs->value_ptr = sl;
  			}
***************
*** 786,792
  			  sl->list = (char **) xmalloc (5 * sizeof (char *));
  			  *(struct stringlist **) cs->value_ptr = sl;
  			}
! 		      else if (sl->index == sl->max - 1)
  			{
  			  sl->max += 5;
  			  sl->list = (char **)

--- 809,815 -----
  			  sl->list = (char **) xmalloc (5 * sizeof (char *));
  			  *(struct stringlist **) cs->value_ptr = sl;
  			}
! 		      else if (sl->ndex == sl->max - 1)
  			{
  			  sl->max += 5;
  			  sl->list = (char **)
***************
*** 793,800
  			    xrealloc ((char *) sl->list,
  				      sl->max * sizeof (char *));
  			}
! 		      sl->list[sl->index++] = savestring (arg, strlen (arg));
! 		      sl->list[sl->index] = 0;
  		      sw = "";
  		      break;
  

--- 816,823 -----
  			    xrealloc ((char *) sl->list,
  				      sl->max * sizeof (char *));
  			}
! 		      sl->list[sl->ndex++] = savestring (arg, strlen (arg));
! 		      sl->list[sl->ndex] = 0;
  		      sw = "";
  		      break;
  
***************
*** 827,833
  	  }
        else
  	{
! 	  if (other_args->index == other_args->max - 1)
  	    {
  	      other_args->max += 5;
  	      other_args->list = (char **)

--- 850,856 -----
  	  }
        else
  	{
! 	  if (other_args->ndex == other_args->max - 1)
  	    {
  	      other_args->max += 5;
  	      other_args->list = (char **)
***************
*** 834,840
  		xrealloc ((char *) other_args->list,
  			  other_args->max * sizeof (char *));
  	    }
! 	  other_args->list[other_args->index++] = argv[i];
  	}
      }
  

--- 857,863 -----
  		xrealloc ((char *) other_args->list,
  			  other_args->max * sizeof (char *));
  	    }
! 	  other_args->list[other_args->ndex++] = argv[i];
  	}
      }
  
***************
*** 839,845
      }
  
    if (other_args != 0)
!     other_args->list[other_args->index] = 0;
  }
  
  static void

--- 862,868 -----
      }
  
    if (other_args != 0)
!     other_args->list[other_args->ndex] = 0;
  }
  
  static void
*** /tmp/,RCSt1a06425	Wed Jan  4 12:21:51 1989
--- make.h	Wed Jan  4 12:20:35 1989
***************
*** 32,37
  #define MAXPATHLEN 1024
  #endif	/* no MAXPATHLEN	*/
  
  #define streq(a, b) \
    ((a) == (b) || \
     (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1))))

--- 32,40 -----
  #define MAXPATHLEN 1024
  #endif	/* no MAXPATHLEN	*/
  
+ #ifdef	iAPX286
+ extern int streq();	/* buggy compiler work-around */
+ #else
  #define streq(a, b) \
    ((a) == (b) || \
     (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1))))
***************
*** 35,40
  #define streq(a, b) \
    ((a) == (b) || \
     (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1))))
  
  
  extern void die ();

--- 38,44 -----
  #define streq(a, b) \
    ((a) == (b) || \
     (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1))))
+ #endif
  
  
  extern void die ();

----------------- end of patches ----------------


Dave Bodenstab
AT&T Bell Labs
...att!iwsl8!imdave

rms@WHEATIES.AI.MIT.EDU (Richard Stallman) (01/05/89)

In general, GNU software assumes that an int is the same size as a long.
Although some programs may distinguish in a few cases,
we don't undertake to support 16-bit machines.

mcgrath%homer.Berkeley.EDU@GINGER.BERKELEY.EDU (Roland McGrath) (01/05/89)

I think that distinctions between `int's and `long int's are
stylistically important, so I make them, and consider places
where they are not made to be bugs.  Therefore I have fixed
Make's problems in this area.