home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 342a.lha / make / rules.c < prev   
C/C++ Source or Header  |  1990-02-10  |  8KB  |  327 lines

  1. /*
  2.  *    Control of the implicit suffix rules
  3.  */
  4.  
  5.  
  6. #include "h.h"
  7. #ifndef NULL
  8. #define NULL ((void *) 0)
  9. #endif
  10.  
  11. /*
  12.  * Return a pointer to the suffix of a name
  13.  */
  14. char           *
  15. suffix(name)
  16.     char       *name;
  17. {
  18.     return rindex(name, '.');
  19. }
  20.  
  21.  
  22. /*
  23.  *    Dynamic dependency.  This routine applies the suffis rules
  24.  *    to try and find a source and a set of rules for a missing
  25.  *    target.  If found, np is made into a target with the implicit
  26.  *    source name, and rules.  Returns TRUE if np was made into
  27.  *    a target.
  28.  */
  29. bool
  30. dyndep(np, pbasename, pinputname)
  31.     struct name    *np;
  32.     char      **pbasename;    /*  Name without suffix  */
  33.     char      **pinputname;
  34. {
  35.     register char  *p;
  36.     register char  *q;
  37.     register char  *suff;    /* Old suffix  */
  38.     register char  *basename;    /* Name without suffix    */
  39.     struct name    *op;     /* New dependent  */
  40.     struct name    *sp;     /* Suffix  */
  41.     struct line    *lp;
  42.     struct depend  *dp;
  43.     struct name    *pathnp;    /* .PATH */
  44.     struct line    *pathlp;
  45.     struct depend  *pathdp;
  46.     struct depend  *pathdp1;
  47.     char       *newsuff;
  48.     char       *path;
  49.     void        modtime();
  50.  
  51.  
  52.     p = str1;
  53.     q = np->n_name;
  54.     if (!(suff = suffix(q)))
  55.     return FALSE;        /* No suffix */
  56.     while (q < suff)
  57.     *p++ = *q++;
  58.     *p = '\0';
  59.     if ((*pbasename = basename = malloc(strlen(str1)+1)) == NULL)
  60.     fatal("No memory for basename");
  61.     strcpy(*pbasename, str1);
  62.  
  63.     if (!((sp = newname(".SUFFIXES"))->n_flag & N_TARG))
  64.     return FALSE;
  65.  
  66.     if (!((pathnp = newname(".PATH"))->n_flag & N_TARG))
  67.     pathnp = NULL;
  68.  
  69.     if ((pathnp) && (pathlp = pathnp->n_line))
  70.     pathdp = pathlp->l_dep;
  71.     else
  72.     pathdp = NULL;
  73.  
  74.     for (lp = sp->n_line; lp; lp = lp->l_next)
  75.     for (dp = lp->l_dep; dp; dp = dp->d_next) {
  76.         newsuff = dp->d_name->n_name;   /* .c .o .asm etc */
  77.         if (strlen(suff) + strlen(newsuff) + 1 >= LZ)
  78.         fatal("Suffix rule too long");
  79.         p = str1;
  80.         q = newsuff;
  81.         while (*p++ = *q++);
  82.         p--;
  83.         q = suff;
  84.         while (*p++ = *q++);
  85.         sp = newname(str1);     /* Form for example .c.o */
  86.         if (sp->n_flag & N_TARG) {
  87.         path = "";
  88.         pathdp1 = pathdp;
  89.     nextpath:
  90.         p = str1;
  91.         if (strlen(path) + strlen(basename) + strlen(newsuff) + 2 >= LZ)
  92.             fatal("Implicit name too long");
  93.         q = path;
  94.         while (*p++ = *q++);    /* copy path */
  95.         p--;
  96.         q = basename;
  97.         while (*p++ = *q++);    /* copy basename */
  98.         p--;
  99.         q = newsuff;
  100.         while (*p++ = *q++);    /* copy new suffix */
  101.         op = newname(str1);
  102.         if (!op->n_line && !op->n_time)
  103.             modtime(op);
  104.         if (op->n_line || op->n_time) {     /* file exists? */
  105.             dp = newdep(op, NULL);
  106.             newline(np, dp, sp->n_line->l_cmd, 0);
  107.             *pinputname = op->n_name;    /* $< = path/basename.suffix */
  108.             return TRUE;
  109.         } else {
  110.             delname(op);        /* Forget non-existing file */
  111.             if (pathdp1) {      /* But is there a path? */
  112.             path = pathdp1->d_name->n_name;
  113.             pathdp1 = pathdp1->d_next;
  114.             goto nextpath;
  115.             }
  116.         }
  117.         }
  118.     }
  119.     return FALSE;
  120. }
  121.  
  122.  
  123. /*
  124.  *    Make the default rules
  125.  */
  126. void
  127. makerules()
  128. {
  129.     register struct cmd     *cp;    /*OIS*0.80*/
  130.     register struct name    *np;    /*OIS*0.80*/
  131.     register struct depend  *dp;    /*OIS*0.80*/
  132.  
  133.  
  134. #ifdef eon
  135.     setmacro("BDSCC", "asm");
  136.     /* setmacro("BDSCFLAGS", "");        */
  137.     cp = newcmd("$(BDSCC) $(BDSCFLAGS) -n $<", 0);
  138.     np = newname(".c.o");
  139.     newline(np, 0, cp, 0);
  140.  
  141.     setmacro("CC", "c");
  142.     setmacro("CFLAGS", "-O");
  143.     cp = newcmd("$(CC) $(CFLAGS) -c $<", 0);
  144.     np = newname(".c.obj");
  145.     newline(np, 0, cp, 0);
  146.  
  147.     setmacro("M80", "asm -n");
  148.     /* setmacro("M80FLAGS", "");         */
  149.     cp = newcmd("$(M80) $(M80FLAGS) $<", 0);
  150.     np = newname(".mac.o");
  151.     newline(np, 0, cp, 0);
  152.  
  153.     setmacro("AS", "zas");
  154.     /* setmacro("ASFLAGS", "");  */
  155.     cp = newcmd("$(ZAS) $(ASFLAGS) -o $@ $<", 0);
  156.     np = newname(".as.obj");
  157.     newline(np, 0, cp, 0);
  158.  
  159.     np = newname(".as");
  160.     dp = newdep(np, 0);
  161.     np = newname(".obj");
  162.     dp = newdep(np, dp);
  163.     np = newname(".c");
  164.     dp = newdep(np, dp);
  165.     np = newname(".o");
  166.     dp = newdep(np, dp);
  167.     np = newname(".mac");
  168.     dp = newdep(np, dp);
  169.     np = newname(".SUFFIXES");
  170.     newline(np, dp, 0, 0);
  171. #endif
  172.  
  173. /*
  174.  *    Some of the UNIX implicit rules
  175.  */
  176. #ifdef unix
  177.     setmacro("CC", "cc");
  178.     setmacro("CFLAGS", "-O");
  179. #ifdef MINIXPC
  180.     cp = newcmd("$(CC) $(CFLAGS) -S $<", (struct cmd *)0);
  181.     np = newname(".c.s");
  182. #else
  183.     cp = newcmd("$(CC) $(CFLAGS) -c $<", (struct cmd *)0);
  184.     np = newname(".c.o");
  185. #endif MINIXPC
  186.     newline(np, (struct depend *)0, cp, 0);
  187.  
  188.     setmacro("AS", "as");
  189.     cp = newcmd("$(AS) -o $@ $<", (struct cmd *)0);
  190.     np = newname(".s.o");
  191.     newline(np, (struct depend *)0, cp, 0);
  192.  
  193.     setmacro("YACC", "yacc");
  194.     /*        setmacro("YFLAGS", ""); */
  195.     cp = newcmd("$(YACC) $(YFLAGS) $<", (struct cmd *)0);
  196.     cp = newcmd("mv y.tab.c $@", cp);
  197.     np = newname(".y.c");
  198.     newline(np, (struct depend *)0, cp, 0);
  199.  
  200.     cp = newcmd("$(YACC) $(YFLAGS) $<", (struct cmd *)0);
  201. #ifdef MINIXPC
  202.     cp = newcmd("$(CC) $(CFLAGS) -S y.tab.c", cp);
  203.     cp = newcmd("mv y.tab.s $@", cp);
  204.     np = newname(".y.s");
  205. #else
  206.     cp = newcmd("$(CC) $(CFLAGS) -c y.tab.c", cp);
  207.     cp = newcmd("mv y.tab.o $@", cp);
  208.     np = newname(".y.o");
  209. #endif MINIXPC
  210.     cp = newcmd("rm y.tab.c", cp);
  211.     newline(np, (struct depend *)0, cp, 0);
  212.  
  213.     setmacro("FLEX", "flex");
  214.     cp = newcmd("$(FLEX) $(FLEX_FLAGS) $<", (struct cmd *)0);
  215.     cp = newcmd("mv lex.yy.c $@", cp);
  216.     np = newname(".l.c");
  217.     newline(np, (struct depend *)0, cp, 0);
  218.  
  219.     cp = newcmd("$(FLEX) $(FLEX_FLAGS) $<", (struct cmd *)0);
  220. #ifdef MINIXPC
  221.     cp = newcmd("$(CC) $(CFLAGS) -S lex.yy.s", cp);
  222.     cp = newcmd("mv lex.yy.s $@", cp);
  223.     np = newname(".l.s");
  224. #else
  225.     cp = newcmd("$(CC) $(CFLAGS) -c lex.yy.c", cp);
  226.     cp = newcmd("mv lex.yy.o $@", cp);
  227.     np = newname(".l.o");
  228. #endif MINIXPC
  229.     cp = newcmd("rm lex.yy.c", cp);
  230.     newline(np, (struct depend *)0, cp, 0);
  231.  
  232.     np = newname(".o");
  233.     dp = newdep(np, (struct depend *)0);
  234.     np = newname(".s");
  235.     dp = newdep(np, dp);
  236.     np = newname(".c");
  237.     dp = newdep(np, dp);
  238.     np = newname(".y");
  239.     dp = newdep(np, dp);
  240.     np = newname(".l");
  241.     dp = newdep(np, dp);
  242.     np = newname(".SUFFIXES");
  243.     newline(np, dp, (struct cmd *)0, 0);
  244. #endif
  245.  
  246. #ifdef os9
  247. /*
  248.  *    Fairlight use an enhanced version of the C sub-system.
  249.  *    They have a specialised macro pre-processor.
  250.  */
  251.     setmacro("CC", "cc");
  252.     setmacro("CFLAGS", "-z");
  253.     cp = newcmd("$(CC) $(CFLAGS) -r $<", 0);
  254.  
  255.     np = newname(".c.r");
  256.     newline(np, 0, cp, 0);
  257.     np = newname(".ca.r");
  258.     newline(np, 0, cp, 0);
  259.     np = newname(".a.r");
  260.     newline(np, 0, cp, 0);
  261.     np = newname(".o.r");
  262.     newline(np, 0, cp, 0);
  263.     np = newname(".mc.r");
  264.     newline(np, 0, cp, 0);
  265.     np = newname(".mca.r");
  266.     newline(np, 0, cp, 0);
  267.     np = newname(".ma.r");
  268.     newline(np, 0, cp, 0);
  269.     np = newname(".mo.r");
  270.     newline(np, 0, cp, 0);
  271.  
  272.     np = newname(".r");
  273.     dp = newdep(np, 0);
  274.     np = newname(".mc");
  275.     dp = newdep(np, dp);
  276.     np = newname(".mca");
  277.     dp = newdep(np, dp);
  278.     np = newname(".c");
  279.     dp = newdep(np, dp);
  280.     np = newname(".ca");
  281.     dp = newdep(np, dp);
  282.     np = newname(".ma");
  283.     dp = newdep(np, dp);
  284.     np = newname(".mo");
  285.     dp = newdep(np, dp);
  286.     np = newname(".o");
  287.     dp = newdep(np, dp);
  288.     np = newname(".a");
  289.     dp = newdep(np, dp);
  290.     np = newname(".SUFFIXES");
  291.     newline(np, dp, 0, 0);
  292. #endif
  293.  
  294. #ifdef amiga
  295.  
  296. #ifdef pdc    /*OIS*0.80*/
  297.     static char ccx_c[] = "ccx -c";
  298.  
  299.     setmacro("CC", ccx_c);
  300. #else
  301.     setmacro("CC", "cc");
  302. #endif
  303.     cp = newcmd("$(CC) $(CFLAGS) $<", NULL);
  304.     np = newname(".c.o");
  305.     newline(np, NULL, cp, 0);
  306.  
  307. #ifdef pdc    /*OIS*0.80*/
  308.     setmacro("AS", ccx_c);
  309.     cp = newcmd("$(AS) $(AFLAGS) $<", NULL);        /*OIS*0.80*/
  310. #else
  311.     setmacro("AS", "as");
  312.     cp = newcmd("$(AS) $(AFLAGS) -o $@ $<", NULL);  /*OIS*0.80*/
  313. #endif
  314.     np = newname(".s.o");
  315.     newline(np, NULL, cp, NULL);
  316.  
  317.     np = newname(".o");
  318.     dp = newdep(np, NULL);
  319.     np = newname(".s");
  320.     dp = newdep(np, dp);
  321.     np = newname(".c");
  322.     dp = newdep(np, dp);
  323.     np = newname(".SUFFIXES");
  324.     newline(np, dp, NULL, 0);
  325. #endif
  326. }
  327.