262 lines
4.7 KiB
C
262 lines
4.7 KiB
C
/*
|
|
* make [-f makefile] [-ins] [target(s) ...]
|
|
*
|
|
* (Better than EON mk but not quite as good as UNIX make)
|
|
*
|
|
* -f makefile name
|
|
* -i ignore exit status
|
|
* -n Pretend to make
|
|
* -p Print all macros & targets
|
|
* -q Question up-to-dateness of target. Return exit status 1 if not
|
|
* -r Don't not use inbuilt rules
|
|
* -s Make silently
|
|
* -t Touch files instead of making them
|
|
* -m Change memory requirements (EON only)
|
|
* -k For the time being: accept but ignore
|
|
*
|
|
* $Header$
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include "h.h"
|
|
|
|
#ifdef unix
|
|
#include <errno.h>
|
|
#endif
|
|
#ifdef eon
|
|
#include <sys/err.h>
|
|
#endif
|
|
#ifdef os9
|
|
#include <errno.h>
|
|
#endif
|
|
|
|
|
|
#ifdef eon
|
|
#define MEMSPACE (16384)
|
|
#endif
|
|
|
|
|
|
char * myname;
|
|
char * makefile; /* The make file */
|
|
#ifdef eon
|
|
unsigned memspace = MEMSPACE;
|
|
#endif
|
|
|
|
FILE * ifd; /* Input file desciptor */
|
|
bool domake = TRUE; /* Go through the motions option */
|
|
bool ignore = FALSE; /* Ignore exit status option */
|
|
bool silent = FALSE; /* Silent option */
|
|
bool print = FALSE; /* Print debuging information */
|
|
bool rules = TRUE; /* Use inbuilt rules */
|
|
bool dotouch = FALSE;/* Touch files instead of making */
|
|
bool quest = FALSE; /* Question up-to-dateness of file */
|
|
|
|
|
|
void
|
|
main(argc, argv)
|
|
int argc;
|
|
char ** argv;
|
|
{
|
|
register char * p; /* For argument processing */
|
|
int estat = 0; /* For question */
|
|
register struct name * np;
|
|
int nargc = 0;
|
|
char **nargv;
|
|
int fflag = 0;
|
|
|
|
|
|
myname = (argc-- < 1) ? "make" : *argv++;
|
|
nargv = argv;
|
|
|
|
while (argc > 0)
|
|
{
|
|
argc--; /* One less to process */
|
|
p = *argv++; /* Now processing this one */
|
|
|
|
if (*p == '-') while (*++p != '\0')
|
|
{
|
|
switch(*p)
|
|
{
|
|
case 'f': /* Alternate file name */
|
|
fflag = 1;
|
|
break;
|
|
#ifdef eon
|
|
case 'm': /* Change space requirements */
|
|
if (*++p == '\0')
|
|
{
|
|
if (argc-- <= 0)
|
|
usage();
|
|
p = *argv++;
|
|
}
|
|
memspace = atoi(p);
|
|
goto end_of_args;
|
|
#endif
|
|
case 'n': /* Pretend mode */
|
|
domake = FALSE;
|
|
break;
|
|
case 'i': /* Ignore fault mode */
|
|
ignore = TRUE;
|
|
break;
|
|
case 's': /* Silent about commands */
|
|
silent = TRUE;
|
|
break;
|
|
case 'p':
|
|
print = TRUE;
|
|
break;
|
|
case 'r':
|
|
rules = FALSE;
|
|
break;
|
|
case 't':
|
|
dotouch = TRUE;
|
|
break;
|
|
case 'q':
|
|
quest = TRUE;
|
|
break;
|
|
case 'k':
|
|
break;
|
|
default: /* Wrong option */
|
|
usage();
|
|
}
|
|
}
|
|
else {
|
|
if (fflag) {
|
|
if (argc <= 0) usage();
|
|
makefile = p;
|
|
fflag = 0;
|
|
}
|
|
else {
|
|
nargc++;
|
|
*nargv++ = p;
|
|
}
|
|
}
|
|
end_of_args:;
|
|
}
|
|
argv = nargv - nargc;
|
|
argc = nargc;
|
|
|
|
#ifdef eon
|
|
if (initalloc(memspace) == 0xffff) /* Must get memory for alloc */
|
|
fatal("Cannot initalloc memory");
|
|
#endif
|
|
|
|
if (makefile && strcmp(makefile, "-") == 0) /* Can use stdin as makefile */
|
|
ifd = stdin;
|
|
else
|
|
if (!makefile) /* If no file, then use default */
|
|
{
|
|
if ((ifd = fopen(DEFN1, "r")) == (FILE *)0)
|
|
#ifdef eon
|
|
if (errno != ER_NOTF)
|
|
fatal("Can't open %s; error %02x", DEFN1, errno);
|
|
#endif
|
|
#ifdef unix
|
|
if (errno != ENOENT)
|
|
fatal("Can't open %s; error %02x", DEFN1, errno);
|
|
#endif
|
|
#ifndef os9
|
|
if ((ifd == (FILE *)0)
|
|
&& ((ifd = fopen(DEFN2, "r")) == (FILE *)0))
|
|
fatal("Can't open %s", DEFN2);
|
|
#else
|
|
fatal("Can't open %s", DEFN1);
|
|
#endif
|
|
}
|
|
else
|
|
if ((ifd = fopen(makefile, "r")) == (FILE *)0)
|
|
fatal("Can't open %s", makefile);
|
|
|
|
makerules();
|
|
|
|
setmacro("$", "$", 4);
|
|
|
|
while (argc && (p = index(*argv, '=')))
|
|
{
|
|
char c;
|
|
|
|
c = *p;
|
|
*p = '\0';
|
|
setmacro(*argv, p+1, 3);
|
|
*p = c;
|
|
|
|
argv++;
|
|
argc--;
|
|
}
|
|
|
|
input(ifd); /* Input all the gunga */
|
|
fclose(ifd); /* Finished with makefile */
|
|
lineno = 0; /* Any calls to error now print no line number */
|
|
|
|
if (print)
|
|
prt(); /* Print out structures */
|
|
|
|
np = newname(".SILENT");
|
|
if (np->n_flag & N_TARG)
|
|
silent = TRUE;
|
|
|
|
np = newname(".IGNORE");
|
|
if (np->n_flag & N_TARG)
|
|
ignore = TRUE;
|
|
|
|
precious();
|
|
|
|
if (!firstname)
|
|
fatal("No targets defined");
|
|
|
|
circh(); /* Check circles in target definitions */
|
|
|
|
if (!argc)
|
|
estat = make(firstname, 0);
|
|
else while (argc--)
|
|
{
|
|
if (!print && !silent && strcmp(*argv, "love") == 0)
|
|
printf("Not war!\n");
|
|
estat |= make(newname(*argv++), 0);
|
|
}
|
|
|
|
if (quest)
|
|
exit(estat);
|
|
else
|
|
exit(0);
|
|
}
|
|
|
|
|
|
usage()
|
|
{
|
|
fprintf(stderr, "Usage: %s [-f makefile] [-inpqrst] [macro=val ...] [target(s) ...]\n", myname);
|
|
exit(1);
|
|
}
|
|
|
|
|
|
/*VARARGS1*/
|
|
void
|
|
fatal(msg, a1, a2, a3, a4, a5, a6)
|
|
char *msg;
|
|
{
|
|
fprintf(stderr, "%s: ", myname);
|
|
fprintf(stderr, msg, a1, a2, a3, a4, a5, a6);
|
|
fputc('\n', stderr);
|
|
exit(1);
|
|
}
|
|
|
|
char *
|
|
index(s, c)
|
|
register char *s, c;
|
|
{
|
|
while (*s)
|
|
if (*s++ == c)
|
|
return --s;
|
|
return (char *)0;
|
|
}
|
|
|
|
char *
|
|
rindex(str, chr)
|
|
register char *str, chr;
|
|
{
|
|
register char *retptr = 0;
|
|
|
|
while (*str)
|
|
if (*str++ == chr)
|
|
retptr = &str[-1];
|
|
return retptr;
|
|
}
|