james@bigtex.cactus.org (James Van Artsdalen) (12/12/88)
I've managed to get GNU make 3.26 to work under SysVr3. There are a number of changed that were made, some of which are needed for all versions of GNU make, some only for SysV, and some just to make life easier. In arscan.c, there is a call to read(2) where an ampersand was omitted. The program name variable in make.c should be initialized before error() is called (near the getwd() call to be specific). Also, the SIGCLD stuff needs to happen *after* getwd(3) is called, otherwise they'll interfere. remake.c includes <sys/file.h>, which is wrong for SysV: should include <fcntl.h> instead. commands.c ignores SIGCLD before calling child_handler(). This makes child_handler() hang in an infinite loop. I commented out the offending signal(2) call since presumably somebody does need that code or it wouldn't have been added. SysV doesn't have a "union wait". I swiped the information from the BSD include file. That file appears to be entirely free of AT&T license restrictions. Defining the union in the source is bad because the union is machine specific, but I don't know of any other way without making larger changes to the make source. SysV signal handlers don't return anything. Declaring "int" as the return value is misleading and causes needless errors. SysV doesn't have the wait3() call. SysVr3 doesn't use "ndir.h" or "struct direct". It uses <dirent.h> and "struct dirent". malloc(3c) & friends ought to return "void *", not "char *". Declare it as such when using GNU C. Has the side effect of not interfering with prototypes in the include files. I also include <malloc.h> in several additional files in the hopes of getting a declaration for alloc(3c). This is a good thing even for BSD, because you'll likely find a #define alloca __builtin_alloca for those using GNU C. In many places, functions are needlessly declared to return "int". The compiler is going to assume this anyway, so the declaration buys nothing. Since it interferes with attempts to provide ANSI prototypes in the include files, why not omit the declaration? Can't hurt. COFLAGS should default to -q. Much cleaner looking. *** /tmp/,RCSt1a15391 Sun Dec 11 23:45:12 1988 --- arscan.c Sun Dec 11 23:35:45 1988 *************** *** 118,124 **** #endif /* not USG */ ! extern int open (), read (), close (), write (), fstat (); extern long int lseek (); extern int atoi (), strcmp (); --- 118,124 ---- #endif /* not USG */ ! /* extern int open (), read (), close (), write (), fstat (); */ extern long int lseek (); extern int atoi (), strcmp (); *************** *** 172,178 **** #else { int buf; ! register int nread = read(desc, buf, sizeof(int)); if (nread != sizeof(int) || buf != ARMAG) { close (desc); --- 172,178 ---- #else { int buf; ! register int nread = read(desc, &buf, sizeof(int)); if (nread != sizeof(int) || buf != ARMAG) { close (desc); *************** *** 186,192 **** #ifdef SARMAG register long int member_offset = SARMAG; #else ! register long int member_offset = sizeof int; #endif while (1) --- 186,192 ---- #ifdef SARMAG register long int member_offset = SARMAG; #else ! register long int member_offset = sizeof(int); #endif while (1) *************** *** 224,230 **** while (p > name && *--p == ' ') *p = 0; } ! sscanf (member_header.ar_mode, "%o", &eltmode); eltsize = atoi (member_header.ar_size); fnval = --- 224,230 ---- while (p > name && *--p == ' ') *p = 0; } ! sscanf ((char *)member_header.ar_mode, "%o", &eltmode); eltsize = atoi (member_header.ar_size); fnval = *** /tmp/,RCSt1a15391 Sun Dec 11 23:45:16 1988 --- commands.c Sun Dec 11 23:38:50 1988 *************** *** 18,26 **** --- 18,36 ---- #include "commands.h" #include "file.h" #include "variable.h" + + #ifndef USG #include <sys/wait.h> + #else + #define WIFSIGNALED(x) ((x).w_termsig != 0) + #define WIFEXITED(x) ((x).w_termsig == 0) + #endif + + #ifndef USG #include <sys/time.h> #include <sys/resource.h> + #endif + #include <sys/fcntl.h> *************** *** 109,125 **** --- 119,157 ---- If SIG is < 0, - SIG is the maximum number of children to bury (record status of and remove from the chain). */ + #ifndef USG int + #else + void + #endif child_handler (sig) int sig; { + #ifndef USG union wait status; + #else + union wait { + int w_status; + struct { + unsigned short w_Termsig:7; + unsigned short w_Coredump:1; + unsigned short w_Retcode:8; + } w_T; + #define w_termsig w_T.w_Termsig + #define w_coredump w_T.w_Coredump + #define w_retcode w_T.w_Retcode + } status; + #endif register int pid; unsigned int dead_children = 0; + #ifndef USG while ((sig <= 0 ? (pid = wait (&status)) : (pid = wait3 (&status, WNOHANG, (struct rusage *) 0))) + #else + while ((pid = wait ((int *) &status)) + #endif > 0) { register struct child *lastc, *c; *************** *** 131,137 **** --- 163,173 ---- = (WIFEXITED (status) && status.w_retcode == 127) ? -1 : 0; if (sig < 0 && ++dead_children > -sig) + #ifndef USG return 0; + #else + return; + #endif else continue; } *************** *** 246,256 **** --- 282,300 ---- /* See if we have reached our quota for blocking. */ if (sig < 0 && ++dead_children == -sig) + #ifndef USG return 0; + #else + return; + #endif } } + #ifndef USG return 0; + #else + return; + #endif } *************** *** 262,271 **** --- 306,317 ---- unsigned int n; { /* Ignore child termination signals so child_handler won't be called. */ + #if 0 #ifdef SIGCHLD (void) signal (SIGCHLD, SIG_IGN); #else (void) signal (SIGCLD, SIG_IGN); + #endif #endif /* Call child_handler to do the work. */ *** /tmp/,RCSt1a15391 Sun Dec 11 23:45:17 1988 --- commands.h Sun Dec 11 21:03:07 1988 *************** *** 30,36 **** --- 30,40 ---- extern void print_commands (); + #ifndef USG extern int child_handler (); + #else + extern void child_handler (); + #endif extern void wait_for_children (); *** /tmp/,RCSt1a15391 Sun Dec 11 23:45:19 1988 --- dir.c Sun Dec 11 21:08:40 1988 *************** *** 16,22 **** #include "make.h" #ifdef USG ! #include "ndir.h" /* Get ndir.h from the Emacs distribution. */ #else /* not USG */ #include <sys/dir.h> #endif /* USG */ --- 16,23 ---- #include "make.h" #ifdef USG ! #include <dirent.h> /* Get ndir.h from the Emacs distribution. */ ! #include <malloc.h> #else /* not USG */ #include <sys/dir.h> #endif /* USG */ *************** *** 122,128 **** --- 123,133 ---- register char *p; register struct directory *dir; register struct dirfile *df; + #ifndef USG register struct direct *d; + #else + register struct dirent *d; + #endif dir = find_directory (dirname); *************** *** 156,162 **** --- 161,171 ---- /* Enter the file in the hash table. */ register unsigned int newhash = 0; register unsigned int i; + #ifndef USG for (i = 0; i < d->d_namlen; ++i) + #else + for (i = 0; i < strlen(d->d_name); ++i) + #endif { newhash += d->d_name[i]; newhash = (newhash << 7) + (newhash >> 20); *************** *** 165,171 **** --- 174,184 ---- df = (struct dirfile *) xmalloc (sizeof (struct dirfile)); df->next = dir->files[newhash]; dir->files[newhash] = df; + #ifndef USG df->name = savestring (d->d_name, d->d_namlen); + #else + df->name = savestring (d->d_name, strlen(d->d_name)); + #endif df->impossible = 0; /* Check if the name matches the one we're searching for. */ *** /tmp/,RCSt1a15391 Sun Dec 11 23:45:25 1988 --- glob.c Sun Dec 11 21:13:02 1988 *************** *** 101,107 **** #include <sys/types.h> #ifdef USG ! #include <ndir.h> #include <memory.h> #include <string.h> #define bcopy(s, d, n) ((void) memcpy ((d), (s), (n))) --- 101,107 ---- #include <sys/types.h> #ifdef USG ! #include <dirent.h> #include <memory.h> #include <string.h> #define bcopy(s, d, n) ((void) memcpy ((d), (s), (n))) *************** *** 117,126 **** --- 117,135 ---- #ifdef sparc #include <alloca.h> #else + #ifndef USG extern char *alloca (); + #else + #include <malloc.h> /* Try for alloca declaration in malloc.h */ + #endif /* USG */ #endif /* sparc */ + #ifndef __GNUC__ extern char *malloc (), *realloc (); + #else + extern void *malloc (), *realloc (); + #endif + extern void free (); #ifndef NULL *************** *** 322,328 **** --- 331,341 ---- }; DIR *d; + #ifndef USG register struct direct *dp; + #else + register struct dirent *dp; + #endif struct globval *lastlink; register struct globval *nextlink; register char *nextname; *************** *** 351,357 **** --- 364,374 ---- { nextlink = (struct globval *) alloca (sizeof (struct globval)); nextlink->next = lastlink; + #ifndef USG nextname = (char *) malloc (dp->d_namlen + 1); + #else + nextname = (char *) malloc (strlen(dp->d_name) + 1); + #endif if (!nextname) { lose = 1; *************** *** 359,365 **** --- 376,386 ---- } lastlink = nextlink; nextlink->name = nextname; + #ifndef USG bcopy (dp->d_name, nextname, dp->d_namlen + 1); + #else + bcopy (dp->d_name, nextname, strlen(dp->d_name) + 1); + #endif count++; } } *** /tmp/,RCSt1a15391 Sun Dec 11 23:45:30 1988 --- make.c Sun Dec 11 23:31:55 1988 *************** *** 24,30 **** --- 24,34 ---- extern char *version_string; + #ifndef USG extern int fatal_error_signal (); + #else + extern void fatal_error_signal (); + #endif extern struct dep *read_all_makefiles (); *************** *** 37,43 **** extern void exit (); extern long int atol (); extern time_t time (); ! extern int mktemp (); static void log_working_directory (); static void print_data_base (), print_version (); --- 41,47 ---- extern void exit (); extern long int atol (); extern time_t time (); ! /* extern int mktemp (); */ static void log_working_directory (); static void print_data_base (), print_version (); *************** *** 257,262 **** --- 261,287 ---- reading_filename = 0; reading_lineno_ptr = 0; + /* Figure out where this program lives. */ + + if (argv[0] == 0 || argv[0][0] == '\0') + program = "make"; + else + { + program = rindex (argv[0], '/'); + if (program == 0) + program = argv[0]; + else + ++program; + } + + /* Figure out where we are. */ + + if (getwd (current_directory) == 0) + { + error ("getwd: %s", current_directory); + current_directory[0] = '\0'; + } + if (signal (SIGHUP, fatal_error_signal) == SIG_IGN) (void) signal (SIGHUP, SIG_IGN); if (signal (SIGQUIT, fatal_error_signal) == SIG_IGN) *************** *** 296,322 **** (void) signal (SIGCLD, child_handler); #endif - /* Figure out where we are. */ - - if (getwd (current_directory) == 0) - { - error ("getwd: %s", current_directory); - current_directory[0] = '\0'; - } - - /* Figure out where this program lives. */ - - if (argv[0] == 0 || argv[0][0] == '\0') - program = "make"; - else - { - program = rindex (argv[0], '/'); - if (program == 0) - program = argv[0]; - else - ++program; - } - /* Read in variables from the environment. It is important that this be done before `MAKE' and `MAKEOVERRIDES' are figured out so their definitions will not be ones from the environment. */ --- 321,326 ---- *************** *** 1233,1239 **** --- 1237,1247 ---- } /* Like malloc but get fatal error if memory is exhausted. */ + #ifndef __GNUC__ extern char *malloc (), *realloc (); + #else + extern void *malloc (), *realloc (); + #endif char * xmalloc (size) *** /tmp/,RCSt1a15391 Sun Dec 11 23:45:36 1988 --- read.c Sun Dec 11 21:15:34 1988 *************** *** 18,24 **** #include "dep.h" #include "file.h" #include "variable.h" ! static void read_makefile (); static unsigned int readline (), do_define (); --- 18,24 ---- #include "dep.h" #include "file.h" #include "variable.h" ! #include <malloc.h> /* Try for alloca declaration in malloc.h */ static void read_makefile (); static unsigned int readline (), do_define (); *** /tmp/,RCSt1a15391 Sun Dec 11 23:45:40 1988 --- remake.c Sun Dec 11 21:06:20 1988 *************** *** 17,26 **** #include "commands.h" #include "dep.h" #include "file.h" - #include <sys/file.h> ! extern int open (), fstat (), read (), lseek (), write (), close (); extern time_t time (); extern int try_implicit_rule (); --- 17,30 ---- #include "commands.h" #include "dep.h" #include "file.h" + #ifndef USG + #include <sys/file.h> + #else + #include <sys/fcntl.h> + #endif ! /* extern int open (), fstat (), read (), lseek (), write (), close (); */ extern time_t time (); extern int try_implicit_rule (); *** /tmp/,RCSt1a15391 Sun Dec 11 23:45:47 1988 --- rule.c Sun Dec 11 23:44:03 1988 *************** *** 18,25 **** #include "dep.h" #include "file.h" #include "variable.h" - static int pattern_search (); static void new_pattern_rule (), freerule (); --- 18,25 ---- #include "dep.h" #include "file.h" #include "variable.h" + #include <malloc.h> static int pattern_search (); static void new_pattern_rule (), freerule (); *************** *** 261,266 **** --- 261,267 ---- "CWEAVE", "cweave", "TANGLE", "tangle", "CTANGLE", "ctangle", + "COFLAGS", "-q", 0, 0 }; *** /tmp/,RCSt1a15391 Sun Dec 11 23:45:49 1988 --- vpath.c Sun Dec 11 21:04:30 1988 *************** *** 16,22 **** #include "make.h" #include "file.h" #include "variable.h" ! /* Structure used to represent a selective VPATH searchpath. */ --- 16,22 ---- #include "make.h" #include "file.h" #include "variable.h" ! #include <malloc.h> /* Try for declaration of alloca */ /* Structure used to represent a selective VPATH searchpath. */ -- James R. Van Artsdalen james@bigtex.cactus.org "Live Free or Die" Dell Computer Co 9505 Arboretum Blvd Austin TX 78759 512-338-8789