/* * mk [-f makefile] [-ginpqrstx] [target(s) ...] * * (Better than EON mk but not quite as good as UNIX make) * * drives cccp and v7make */ #define VERSION "mk 1.0" #include #include "h.h" #include #include void usage() { fputs("Syntax: mk {[] [] []}\n", stderr); fputs("Function: keep track of modules for a file\n", stderr); fputs("Options (case insensitive):\n", stderr); fputs(" -d[=] define for cccp\n", stderr); fputs(" -f[=] makefile name\n", stderr); fputs("The following options may be grouped:\n", stderr); fputs(" -g do not set up for gcc\n", stderr); fputs(" -i ignore exit status\n", stderr); fputs(" -n pretend to make\n", stderr); fputs(" -p Print all macros and targets\n", stderr); fputs(" -q question up-to-dateness of target,\n", stderr); fputs(" return exit status 1 if not\n", stderr); fputs(" -r don not use inbuilt rules\n", stderr); fputs(" -s make silently\n", stderr); fputs(" -t touch files instead of making them\n", stderr); fputs(" -u do not predefine any symbols for cccp\n", stderr); fputs(" -v verbose mode\n", stderr); fputs(" -x keep cccp'ed makefile\n", stderr); /*fputs(" -m change memory requirements (EON only)\n", stderr); */ } char * myname; char * makefile; /* The make file */ FILE * ifd; /* Input file desciptor */ bool keep = FALSE; /* keep cccp'ed makefile */ 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 */ bool verbose = FALSE;/* driver mode */ bool useuWc = FALSE; /* whether or not to set -D__yWcc__ -D__cc__ */ bool usegcc = TRUE; /* whether or not to set -D__gcc__ */ void docmd(line) char *line; { int status; if (verbose) fprintf (stderr, "%s\n", line); if (status = system (line)) exit (status); } int main(argc, argv) int argc; char *argv[]; { char targets[256]; /* target & macro list buffer */ char symbols[256]; /* cccp -D option buffer */ char cptmp[32]; /* temp file name */ char mkcmd[64]; /* v7make command */ char cpcmd[64]; /* cccp command */ char cfile[128]; /* file name for cccp */ char cmdbuf[800]; /* command line to issue */ register char *p; /* For argument processing */ int i, j, targetlen = 0, targetnum = 0, symbollen = 0, status; short wday; /* for unambiguous temp makefile name */ int time, date, tick; _sysdate (2, &time, &date, &wday, &tick); memset (symbols, 0, sizeof (symbols)); memset (targets, 0, sizeof (targets)); myname = argv[0]; for (i = 1; i < argc; i++) if (argv[i][0] == '-') { switch (tolower(argv[i][1])) { case 'd': if (argv[i][2] == '\0') {usage(); exit(_errmsg(1, "symbol missing after '-d'\n"));} if (symbollen + strlen (argv[i]) + 2 >= sizeof (targets)) fatal ("command line too long"); strcpy (&symbols[symbollen], argv[i]); symbols[symbollen+1] = 'D'; symbollen += strlen (argv[i]); symbols[symbollen] = ' '; symbollen++; break; case 'f': makefile = argv[i] + j + (argv[i][j+1] == '=' ? 2 : 1); if (makefile[0] == '\0') {usage(); exit(_errmsg(1, "filename missing after '-f'\n"));} break; default: for (j = 1; j < strlen(argv[i]); j++) switch (tolower(argv[i][j])) { case 'g': usegcc = FALSE; useuWc = TRUE; break; case 'i': ignore = TRUE; break; case 'n': domake = FALSE; break; case 'p': print = TRUE; break; case 'q': quest = TRUE; break; case 'r': rules = FALSE; break; case 's': silent = TRUE; break; case 't': dotouch = TRUE; break; case 'u': usegcc = FALSE; useuWc = FALSE; break; case 'v': verbose = TRUE; break; case 'x': keep = TRUE; break; case '?': usage(); exit (0); default: usage(); exit(_errmsg(1, "unknown option '%c'\n", argv[i][j])); } } } else { if (index(argv[i], '=') == NULL) targetnum++; if (targetlen + strlen (argv[i]) + 2 >= sizeof (targets)) fatal ("command line too long"); targets[targetlen] = ' '; targetlen++; strcpy (&targets[targetlen], argv[i]); targetlen += strlen (argv[i]); } if (targetnum == 0) fatal ("no targets given"); sprintf (cptmp, "Makefile.%d.%d.%d.%d", (time>>16) & 0xFF, (time>> 8) & 0xFF, (time ) & 0xFF, (tick ) & 0xFFFF ); sprintf (cpcmd, "cccp -w -n -u -traditional %s%s%s", (usegcc ? "-D__gcc__ " : ""), (useuWc ? "-D__uWcc__ -D__cc__ " : ""), (verbose ? "-v " : "") ); sprintf (mkcmd, "v7make %s%s%s%s%s%s%s", (domake ? "" : "-n "), (ignore ? "-i " : "" ), (silent ? "-s " : "" ), (print ? "-p " : "" ), (rules ? "" : "-r "), (dotouch ? "-t " : "" ), (quest ? "-q " : "" ) ); if (verbose) fprintf (stderr, "%s\n", VERSION); if (makefile && (strcmp(makefile, "-") == 0)) fatal ("can not use stdin as makefile"); else if (!makefile) { /* If no file, then use default */ if ((ifd = fopen(DEFN1, "r")) != NULL) { fclose (ifd); sprintf (cmdbuf, "%s%s%s %s", cpcmd, symbols, DEFN1, cptmp); docmd (cmdbuf); } else { if (errno != E_PNNF) exit(_errmsg(errno, "can't open '%s'\n", DEFN1)); if ((ifd = fopen(DEFN2, "r")) == NULL) exit(_errmsg(errno, "can't open '%s'\n", DEFN2)); fclose (ifd); sprintf (cmdbuf, "%s%s%s %s", cpcmd, symbols, DEFN2, cptmp); docmd (cmdbuf); } } else { if ((ifd = fopen(makefile, "r")) == NULL) exit(_errmsg(errno, "can't open '%s'\n", makefile)); fclose (ifd); sprintf (cmdbuf, "%s%s%s %s", cpcmd, symbols, makefile, cptmp); docmd (cmdbuf); } sprintf (cmdbuf, "%s-f=%s%s", mkcmd, cptmp, targets); docmd (cmdbuf); if (!keep) {sprintf (cmdbuf, "del %s", cptmp); docmd (cmdbuf);} if (verbose) fprintf (stderr, "%s done\n", VERSION); return (0); } 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); }