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.