home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / make_1 / !make_c_Rules < prev    next >
Encoding:
Text File  |  1992-12-07  |  2.9 KB  |  161 lines

  1. /* > c.Rules
  2.  * Control of the implicit suffix rules
  3.  */
  4.  
  5.  
  6. #include "h.h"
  7.  
  8.  
  9. /*
  10.  * Return a pointer to the suffix of a name
  11.  */
  12.  
  13. char *
  14. suffix(char *name)
  15. {
  16.  return rindex(name, '.');
  17. }
  18.  
  19.  
  20. /*
  21.  * Dynamic dependency.  This routine applies the suffix rules
  22.  * to try and find a source and a set of rules for a missing
  23.  * target.  If found, np is made into a target with the implicit
  24.  * source name, and rules.  Returns TRUE if np was made into
  25.  * a target.
  26.  */
  27. bool
  28. dyndep(struct name *np)
  29. {
  30.  register char *  p;
  31.  register char *  q;
  32.  register char *  suff;  /*  Old suffix  */
  33.  register char *  basename; /*  Name without suffix  */
  34.  struct name *  op;  /*  New dependent  */
  35.  struct name *  sp;  /*  Suffix  */
  36.  struct line *  lp;
  37.  struct depend *  dp;
  38.  char *   newsuff;
  39.  
  40.  
  41.  p = str1;
  42.  q = np->n_name;
  43.  if (!(suff = suffix(q)))
  44.   return FALSE;  /* No suffix */
  45.  while (q < suff)
  46.   *p++ = *q++;
  47.  *p = '\0';
  48.  
  49.  basename = setmacro("*", str1)->m_val;
  50.  
  51. /*
  52.  printf("$* is : %s\n",basename);
  53. */
  54.  
  55.  if (!((sp = newname(".SUFFIXES"))->n_flag & N_TARG))
  56.   return FALSE;
  57.  for (lp = sp->n_line; lp; lp = lp->l_next)
  58.   for (dp = lp->l_dep; dp; dp = dp->d_next)
  59.   {
  60.    newsuff = dp->d_name->n_name;
  61.    if (strlen(suff)+strlen(newsuff)+1 >= LZ)
  62.     fatal("Suffix rule too long");
  63.    p = str1;
  64.    q = newsuff;
  65.    while (*p++ = *q++) 
  66.     ;
  67.    p--;
  68.    q = suff;
  69.    while (*p++ = *q++)
  70.     ;
  71.    sp = newname(str1);
  72.    if (sp->n_flag & N_TARG)
  73.    {
  74.     p = str1;
  75.     q = basename; 
  76.     if (strlen(basename) + strlen(newsuff)+1 >= LZ)
  77.      fatal("Implicit name too long");
  78.     while (*p++ = *q++)
  79.      ;
  80.     p--;
  81.     q = newsuff;
  82.     while (*p++ = *q++)
  83.      ;
  84.     op = newname(str1);
  85.     if (!op->n_time)
  86.      modtime(op);
  87.     if (op->n_time)
  88.     {
  89.      dp = newdep(op, 0);
  90.      newline(np, dp, sp->n_line->l_cmd, 0);
  91.      setmacro("<", op->n_name);
  92. /*
  93.      printf("$< is : %s\n",op->n_name);
  94. */
  95.  
  96.        
  97.      return TRUE;
  98.     }
  99.    }
  100.   }
  101.  return FALSE;
  102. }
  103.  
  104.  
  105. /*
  106.  * Make the default rules
  107.  */
  108. void
  109. makerules(void)
  110. {
  111.  struct cmd *  cp;
  112.  struct name *  np;
  113.  struct depend *  dp;
  114.  
  115. /*
  116.  * Some of the UNIX implicit rules
  117.  */
  118. #ifdef arc
  119.  setmacro("CC", "cc");
  120.  setmacro("CFLAGS", "-c -w -darc");
  121.  cp = newcmd("$(CC) $* $(CFLAGS)", 0);
  122.  np = newname(".c.o");
  123.  newline(np, 0, cp, 0);
  124.  
  125.  
  126.  setmacro("AS", "as");
  127.  cp = newcmd("$(AS) -o $@ $<", 0);
  128.  np = newname(".s.o");
  129.  newline(np, 0, cp, 0);
  130.  
  131.  setmacro("YACC", "yacc");
  132.  setmacro("YFLAGS", ""); 
  133.  cp = newcmd("$(YACC) $(YFLAGS) $<", 0);
  134.  cp = newcmd("mv y.tab.c $@", cp);
  135.  np = newname(".y.c");
  136.  newline(np, 0, cp, 0);
  137.  
  138.  cp = newcmd("$(YACC) $(YFLAGS) $<", 0);
  139.  cp = newcmd("$(CC) $(CFLAGS) -c y.tab.c", cp);
  140.  cp = newcmd("rm y.tab.c", cp);
  141.  cp = newcmd("mv y.tab.o $@", cp);
  142.  np = newname(".y.o");
  143.  newline(np, 0, cp, 0);
  144.  
  145.  
  146.  np = newname(".a");
  147.  dp = newdep(np, 0); 
  148.  np = newname(".o");
  149.  dp = newdep(np, dp);
  150.  np = newname(".c");
  151.  dp = newdep(np, dp);
  152.  np = newname(".y");
  153.  dp = newdep(np, dp);
  154.  
  155.  np = newname(".SUFFIXES");
  156.  newline(np, dp, 0, 0);
  157. #endif 
  158.  
  159. }
  160.  
  161.