home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / CPM3 / CPMMAKE.ARK / MAKE.C < prev    next >
C/C++ Source or Header  |  1986-08-31  |  5KB  |  234 lines

  1. /*
  2.  *    Do the actual making for make
  3.  */
  4.  
  5. #include "c:stdio.h"        /* "c:" is my ramdisk */
  6. #include "c:fcntl.h"
  7. #include "h.h"
  8.  
  9. FILE *execfile;        /* Submit file to execute the "shell-exec's" */
  10.  
  11. extern long ftime();
  12.  
  13. /*
  14.  *    Exec a shell that returns exit status correctly (/bin/esh).
  15.  *    The standard EON shell returns the process number of the last
  16.  *    async command, used by the debugger (ugg).
  17.  *    [exec on eon is like a fork+exec on unix]
  18.  */
  19. int
  20. dosh(command, args)
  21. char *command;
  22. char *args;
  23. {
  24.     if (!execfile) {
  25.         execfile = fopen(MAKERUN, "w");
  26.         if (!execfile) {
  27.             errout("Make: can't create ");
  28.             errout(MAKERUN);
  29.             errout("\r\n");
  30.             exit(-1);
  31.         }
  32.     }
  33.  
  34.     fprintf(execfile, "%s %s", command, args);
  35.     return 0;
  36. }
  37.  
  38.  
  39. /*
  40.  *    Do commands to make a target
  41.  */
  42. void
  43. docmds(np)
  44. struct name *        np;
  45. {
  46.     bool            ssilent;
  47.     bool            signore;
  48.     int            estat;
  49.     register char *        q;
  50.     register char *        p;
  51.     char *            shell;
  52.     register struct line *    lp;
  53.     register struct cmd *    cp;
  54.     ssilent = silent;
  55.  
  56.     /*
  57.      * Under cp/m the "ignore or not to ignore" is sorta done in dosh()
  58.      * where colons are inserted or not into the cp/m submit file.
  59.      * The actual ignoring (or not) is done when cpm 3.0's submit
  60.      * program executes the submit file.
  61.      *
  62.      *                    -mdk
  63.      */
  64.  
  65.     signore = ignore;
  66.  
  67.     if (*(shell = getmacro("SHELL")) == '\0')
  68.         shell = ":bin/esh";
  69.  
  70.     for (lp = np->n_line; lp; lp = lp->l_next)
  71.         for (cp = lp->l_cmd; cp; cp = cp->c_next)
  72.         {
  73.             strcpy(str1, cp->c_cmd);
  74.             expand(str1);
  75.             q = str1;
  76.             while ((*q == '@') || (*q == '-'))
  77.             {
  78.                 if (*q == '@')       /*  Specific silent  */
  79.                     ssilent = TRUE;
  80.                 else           /*  Specific ignore  */
  81.                     signore = TRUE;
  82.                 q++;           /*  Not part of the command  */
  83.             }
  84.  
  85.             if (!ssilent)
  86.                 fputs("   ", stdout);
  87.  
  88.             if ((!ssilent) && (!signore)) {    /* cp/m stuff */
  89.                 putchar(':');
  90.                 putchar(' ');
  91.             }
  92.             for (p=q; *p; p++)
  93.             {
  94.                 if (*p == '\n' && p[1] != '\0')
  95.                 {
  96.                     *p = ' ';
  97.                     if (!ssilent)
  98.                         fputs("\\\n", stdout);
  99.                 }
  100.                 else if (!ssilent)
  101.                     putchar(*p);
  102.             }
  103.             if (!ssilent)
  104.                 putchar('\n');
  105.  
  106.             if (domake)
  107.             {            /*  Get the shell to execute it  */
  108.                 /*
  109.                  * Colon in front of line makes execution
  110.                  * conditional on error code in cp/m 3.0 .
  111.                  * (Sortof, with one "minor" problem)
  112.                  */
  113.  
  114.                 if (!signore)    
  115.                     dosh(":","");
  116.                 
  117.                 if ((estat = dosh(q,"\n")) != 0)
  118.                 {
  119.                     if (estat == -1)
  120.                         fatal("Couldn't execute %s", shell);
  121.                     else
  122.                     {
  123.                         printf("%s: Error code %d", myname, estat);
  124.                         if (signore)
  125.                             fputs(" (Ignored)\n", stdout);
  126.                         else
  127.                         {
  128.                             putchar('\n');
  129.                             if (!(np->n_flag & N_PREC))
  130.                                 if (unlink(np->n_name) == 0)
  131.                                     printf("%s: '%s' removed.\n", myname, np->n_name);
  132.                             exit(estat);
  133.                         }
  134.                     }
  135.                 }
  136.             }
  137.         }
  138. }
  139.  
  140.  
  141.  
  142. /*
  143.  *    Update the mod time of a file to now.
  144.  */
  145. void
  146. touch(np)
  147. struct name *        np;
  148. {
  149.     char            c;
  150.     int            fd;
  151.     char fcb[36];            /* set area for CP/M fcb */
  152.     char tempbuffer[128];        /* CPM record size */
  153.  
  154.  
  155.     if (!domake || !silent)
  156.         printf("    touch %s\n", np->n_name);
  157.  
  158.     if (domake)  {
  159.         if ((fd=open(np->n_name,O_RDONLY)) < 0 ) {
  160.             printf("%s: '%s' not touched - non-existant\n",
  161.                     myname, np->n_name);
  162.         }
  163.         else {
  164.             close(fd);
  165.             OpenRandomFile(np->n_name,fcb);   /* open file      */
  166.             ReadRandomFile(tempbuffer,0,fcb); /* read record    */
  167.             WriteRandomFile(tempbuffer,0,fcb); /* write it back */
  168.         }
  169.         CloseRandomFile(fcb);
  170.     }
  171. }
  172.  
  173.  
  174. /*
  175.  *    Recursive routine to make a target.
  176.  */
  177. int
  178. make(np, level)
  179. struct name *        np;
  180. int            level;
  181. {
  182.     register struct depend *    dp;
  183.     register struct line *        lp;
  184.     time_t                dtime = 1l;
  185.  
  186.  
  187.     if (np->n_flag & N_DONE)
  188.         return 0;
  189.  
  190.     if (!np->n_time) {
  191.         np->n_time = ftime(np->n_name);/*  Gets modtime of this file*/
  192.     }
  193.  
  194.     if (rules) {
  195.         for (lp = np->n_line; lp; lp = lp->l_next)
  196.             if (lp->l_cmd)
  197.                 break;
  198.         if (!lp)
  199.             dyndep(np);
  200.     }
  201.  
  202.     if (!(np->n_flag & N_TARG) && np->n_time == 0L)
  203.         fatal("Don't know how to make %s", np->n_name);
  204.  
  205.     for (lp = np->n_line; lp; lp = lp->l_next)
  206.         for (dp = lp->l_dep; dp; dp = dp->d_next)
  207.         {
  208.             make(dp->d_name, level+1);
  209.             dtime = max(dtime, dp->d_name->n_time);
  210.         }
  211.  
  212.     np->n_flag |= N_DONE;
  213.  
  214.     if (quest)
  215.     {
  216.         time(&np->n_time);      /* used to be rtime() zzz */
  217.         return np->n_time < dtime;
  218.     }
  219.     else if (np->n_time < dtime)
  220.     {
  221.         if (dotouch)
  222.             touch(np);
  223.         else
  224.         {
  225.             setmacro("@", np->n_name);
  226.             docmds(np);
  227.         }
  228.         time(&np->n_time);     /* used to be rtime() zzz */
  229.     }
  230.     else if (level == 0)
  231.         printf("%s: '%s' is up to date\n", myname, np->n_name);
  232.     return 0;
  233. }
  234.