home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
SRC
/
drivr.c
< prev
next >
Wrap
C/C++ Source or Header
|
2009-11-06
|
8KB
|
222 lines
/*
* 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 <stdio.h>
#include "h.h"
#include <errno.h>
#include <string.h>
void usage()
{
fputs("Syntax: mk {[<opts>] [<targets>] [<macros>]}\n", stderr);
fputs("Function: keep track of modules for a file\n", stderr);
fputs("Options (case insensitive):\n", stderr);
fputs(" -d<symbol>[=<value>] define <symbol> for cccp\n", stderr);
fputs(" -f[=]<path> 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);
}