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 >
C/C++ Source or Header  |  2009-11-06  |  8KB  |  222 lines

  1. /*
  2.  * mk [-f makefile] [-ginpqrstx] [target(s) ...]
  3.  *
  4.  * (Better than EON mk but not quite as good as UNIX make)
  5.  *
  6.  * drives cccp and v7make
  7.  */
  8.  
  9. #define VERSION "mk 1.0"
  10.  
  11.  
  12.  
  13. #include <stdio.h>
  14. #include "h.h"
  15. #include <errno.h>
  16. #include <string.h>
  17.  
  18.  
  19.  
  20. void usage()
  21.  
  22.   {
  23.   fputs("Syntax: mk {[<opts>] [<targets>] [<macros>]}\n", stderr);
  24.   fputs("Function: keep track of modules for a file\n", stderr);
  25.   fputs("Options (case insensitive):\n", stderr);
  26.   fputs("     -d<symbol>[=<value>] define <symbol> for cccp\n", stderr);
  27.   fputs("     -f[=]<path>          makefile name\n", stderr);
  28.   fputs("The following options may be grouped:\n", stderr);
  29.   fputs("     -g                   do not set up for gcc\n", stderr);
  30.   fputs("     -i                   ignore exit status\n", stderr);
  31.   fputs("     -n                   pretend to make\n", stderr);
  32.   fputs("     -p                   Print all macros and targets\n", stderr);
  33.   fputs("     -q                   question up-to-dateness of target,\n", stderr);
  34.   fputs("                          return exit status 1 if not\n", stderr);
  35.   fputs("     -r                   don not use inbuilt rules\n", stderr);
  36.   fputs("     -s                   make silently\n", stderr);
  37.   fputs("     -t                   touch files instead of making them\n", stderr);
  38.   fputs("     -u                   do not predefine any symbols for cccp\n", stderr);
  39.   fputs("     -v                   verbose mode\n", stderr);
  40.   fputs("     -x                   keep cccp'ed makefile\n", stderr);
  41. /*fputs("     -m                   change memory requirements (EON only)\n", stderr); */
  42.   }
  43.  
  44.  
  45.  
  46. char * myname;
  47. char * makefile;       /*  The make file  */
  48. FILE * ifd;            /*  Input file desciptor  */
  49.  
  50. bool   keep = FALSE;   /*  keep cccp'ed makefile */
  51. bool   domake = TRUE;  /*  Go through the motions option  */
  52. bool   ignore = FALSE; /*  Ignore exit status option  */
  53. bool   silent = FALSE; /*  Silent option  */
  54. bool   print = FALSE;  /*  Print debuging information  */
  55. bool   rules = TRUE;   /*  Use inbuilt rules  */
  56. bool   dotouch = FALSE;/*  Touch files instead of making  */
  57. bool   quest = FALSE;  /*  Question up-to-dateness of file  */
  58. bool   verbose = FALSE;/*  driver mode */
  59. bool   useuWc = FALSE; /*  whether or not to set -D__yWcc__ -D__cc__ */
  60. bool   usegcc = TRUE;  /*  whether or not to set -D__gcc__ */
  61.  
  62.  
  63.  
  64. void docmd(line)
  65.  
  66.   char *line;
  67.  
  68.   {
  69.   int status;
  70.  
  71.   if (verbose) fprintf (stderr, "%s\n", line);
  72.   if (status = system (line)) exit (status);
  73.   }
  74.  
  75.  
  76.  
  77. int main(argc, argv)
  78.  
  79.   int  argc;
  80.   char *argv[];
  81.  
  82.   {
  83.   char  targets[256];   /* target & macro list buffer */
  84.   char  symbols[256];   /* cccp -D option buffer */
  85.   char  cptmp[32];      /* temp file name */
  86.   char  mkcmd[64];      /* v7make command */
  87.   char  cpcmd[64];      /* cccp command */
  88.   char  cfile[128];     /* file name for cccp */
  89.   char  cmdbuf[800];    /* command line to issue */
  90.  
  91.   register char *p;             /*  For argument processing  */
  92.   int   i, j,
  93.         targetlen = 0,
  94.         targetnum = 0,
  95.         symbollen = 0,
  96.         status;
  97.  
  98.   short         wday;           /* for unambiguous temp makefile name */
  99.   int           time, date, tick;
  100.  
  101.   _sysdate (2, &time, &date, &wday, &tick);
  102.   memset (symbols, 0, sizeof (symbols));
  103.   memset (targets, 0, sizeof (targets));
  104.   myname = argv[0];
  105.   for (i = 1; i < argc; i++)
  106.     if (argv[i][0] == '-')
  107.       {
  108.       switch (tolower(argv[i][1]))
  109.         {
  110.         case 'd':
  111.           if (argv[i][2] == '\0')
  112.             {usage(); exit(_errmsg(1, "symbol missing after '-d'\n"));}
  113.           if (symbollen + strlen (argv[i]) + 2 >= sizeof (targets))
  114.             fatal ("command line too long");
  115.           strcpy (&symbols[symbollen], argv[i]);
  116.           symbols[symbollen+1] = 'D'; symbollen += strlen (argv[i]);
  117.           symbols[symbollen]   = ' '; symbollen++;
  118.           break;
  119.         case 'f':
  120.           makefile = argv[i] + j + (argv[i][j+1] == '=' ? 2 : 1);
  121.           if (makefile[0] == '\0')
  122.             {usage(); exit(_errmsg(1, "filename missing after '-f'\n"));}
  123.           break;
  124.         default:
  125.           for (j = 1; j < strlen(argv[i]); j++)
  126.             switch (tolower(argv[i][j]))
  127.               {
  128.               case 'g': usegcc = FALSE; useuWc = TRUE;  break;
  129.               case 'i': ignore = TRUE;                  break;
  130.               case 'n': domake = FALSE;                 break;
  131.               case 'p': print = TRUE;                   break;
  132.               case 'q': quest = TRUE;                   break;
  133.               case 'r': rules = FALSE;                  break;
  134.               case 's': silent = TRUE;                  break;
  135.               case 't': dotouch = TRUE;                 break;
  136.               case 'u': usegcc = FALSE; useuWc = FALSE; break;
  137.               case 'v': verbose = TRUE;                 break;
  138.               case 'x': keep = TRUE;                    break;
  139.               case '?': usage(); exit (0);
  140.               default:  usage(); exit(_errmsg(1, "unknown option '%c'\n", argv[i][j]));
  141.               }
  142.         }
  143.       }
  144.     else
  145.       {
  146.       if (index(argv[i], '=') == NULL) targetnum++;
  147.       if (targetlen + strlen (argv[i]) + 2 >= sizeof (targets))
  148.         fatal ("command line too long");
  149.       targets[targetlen] = ' ';              targetlen++;
  150.       strcpy (&targets[targetlen], argv[i]); targetlen += strlen (argv[i]);
  151.       }
  152.  
  153.   if (targetnum == 0) fatal ("no targets given");
  154.  
  155.   sprintf (cptmp, "Makefile.%d.%d.%d.%d",
  156.                 (time>>16) & 0xFF,
  157.                 (time>> 8) & 0xFF,
  158.                 (time    ) & 0xFF,
  159.                 (tick    ) & 0xFFFF       );
  160.   sprintf (cpcmd, "cccp -w -n -u -traditional %s%s%s",
  161.                 (usegcc  ? "-D__gcc__ "           : ""),
  162.                 (useuWc  ? "-D__uWcc__ -D__cc__ " : ""),
  163.                 (verbose ? "-v "                  : "")  );
  164.   sprintf (mkcmd, "v7make %s%s%s%s%s%s%s",
  165.                 (domake  ? ""    : "-n "),
  166.                 (ignore  ? "-i " : ""   ),
  167.                 (silent  ? "-s " : ""   ),
  168.                 (print   ? "-p " : ""   ),
  169.                 (rules   ? ""    : "-r "),
  170.                 (dotouch ? "-t " : ""   ),
  171.                 (quest   ? "-q " : ""   )  );
  172.  
  173.   if (verbose) fprintf (stderr, "%s\n", VERSION);
  174.  
  175.   if (makefile && (strcmp(makefile, "-") == 0))
  176.     fatal ("can not use stdin as makefile");
  177.   else if (!makefile)
  178.     {         /*  If no file, then use default */
  179.     if ((ifd = fopen(DEFN1, "r")) != NULL)
  180.       {
  181.       fclose (ifd);
  182.       sprintf (cmdbuf, "%s%s%s %s", cpcmd, symbols, DEFN1, cptmp); docmd (cmdbuf);
  183.       }
  184.     else
  185.       {
  186.       if (errno != E_PNNF)
  187.         exit(_errmsg(errno, "can't open '%s'\n", DEFN1));
  188.       if ((ifd = fopen(DEFN2, "r")) == NULL)
  189.         exit(_errmsg(errno, "can't open '%s'\n", DEFN2));
  190.       fclose (ifd);
  191.       sprintf (cmdbuf, "%s%s%s %s", cpcmd, symbols, DEFN2, cptmp); docmd (cmdbuf);
  192.       }
  193.     }
  194.   else
  195.     {
  196.     if ((ifd = fopen(makefile, "r")) == NULL)
  197.       exit(_errmsg(errno, "can't open '%s'\n", makefile));
  198.     fclose (ifd);
  199.     sprintf (cmdbuf, "%s%s%s %s", cpcmd, symbols, makefile, cptmp); docmd (cmdbuf);
  200.     }
  201.  
  202.   sprintf (cmdbuf, "%s-f=%s%s", mkcmd, cptmp, targets); docmd (cmdbuf);
  203.  
  204.   if (!keep) {sprintf (cmdbuf, "del %s", cptmp); docmd (cmdbuf);}
  205.  
  206.   if (verbose) fprintf (stderr, "%s done\n", VERSION);
  207.   return (0);
  208.   }
  209.  
  210.  
  211.  
  212. void fatal(msg, a1, a2, a3, a4, a5, a6)
  213.  
  214.   char   *msg;
  215.  
  216.   {
  217.   fprintf(stderr, "%s: ", myname);
  218.   fprintf(stderr, msg, a1, a2, a3, a4, a5, a6);
  219.   fputc('\n', stderr);
  220.   exit(1);
  221.   }
  222.