home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume27 / genmake / part01 / makef.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-01-17  |  5.7 KB  |  280 lines

  1. /* makef.c */
  2.  
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #ifdef NODIRECT
  6. #include <dirent.h>
  7. #else
  8. #include <sys/dir.h>
  9. #endif
  10. #include "types.h"
  11.  
  12. DNODE        *last_node();
  13. DNODE        *find_dep();
  14.  
  15. make_file(make_list,opts,mname)
  16. DNODE        **make_list;
  17. OPTS        *opts;
  18. char        *mname;
  19. {
  20.     FILE        *fp;
  21.     FILE        *bfp;
  22.     DNODE        *out;
  23.     DNODE        *in;
  24.     DNODE        *last;
  25.     int        count;
  26.     int        type;
  27.     char        name[BUFSIZE];
  28.  
  29.     if ((fp = fopen("Makefile","r")) != NULL) {
  30.         if ((bfp = fopen("Makefile.bak","w")) != NULL) {
  31.             while (fgets(name,BUFSIZE-1,fp) != NULL)
  32.                 fprintf(bfp,"%s",name);
  33.             fclose(bfp);
  34.         }
  35.         fclose(fp);
  36.     }
  37.     if ((fp = fopen("Makefile","w")) == NULL) {
  38.         fprintf(stderr,"make_file(): can't open Makefile for writing\n");
  39.         return(0);
  40.     }
  41.     if (!macros(make_list,fp,opts,mname)) {
  42.         fclose(fp);
  43.         return(0);
  44.     }
  45.     for (out = *make_list; out != NULL; out = out->next) {
  46.         if (target(out->name,name) && out->use_it) {
  47.             type = valid_source_file(out->name);
  48.             fprintf(fp,"%s:\t",name);
  49.             last = last_node(make_list,out->name);
  50.             count = 0;
  51.             for (in = *make_list; in != NULL; in = in->next) {
  52.                 if (valid_source_file(in->name) == CSOURCE &&
  53.                     strcmp(in->name,out->name))
  54.                     continue;
  55.                 if (in_file_list(in,out->name)) {
  56.                     ++count;
  57.                     if (strcmp(in->name,name))
  58.                         write_dep(fp,count,in,last,in->name);
  59.                     else
  60.                         write_dep(fp,count,in,last,"");
  61.                 }
  62.             }
  63.             write_command(fp,out->name,type,opts);
  64.         }
  65.     }
  66.     fclose(fp);
  67.     return(1);
  68. }
  69.  
  70. write_command(fp,name,type,opts)
  71. FILE        *fp;
  72. char        *name;
  73. int        type;
  74. OPTS        *opts;
  75. {
  76.     char    name2[255];
  77.  
  78.     switch (type) {
  79.         case CSOURCE:    fprintf(fp,"\t\t$(CC) $(CFLAGS) -c %s\n\n",name);
  80.                 break;
  81.         case CHEADER:    fprintf(fp,"\t\ttouch %s\n\n",name);
  82.                 break;
  83.         case YACCSOURCE: fprintf(fp,"\t\tyacc %s\n",name);
  84.                 target(name,name2);
  85.                 fprintf(fp,"\t\t$(CC) $(CFLAGS) -c y.tab.c -o %s\n\n",name2);
  86.                 break;
  87.         case LEXSOURCE: fprintf(fp,"\t\tlex %s\n",name);
  88.                 target(name,name2);
  89.                 fprintf(fp,"\t\t$(CC) $(CFLAGS) -c lex.yy.c -o %s\n\n",name2);
  90.                 break;
  91.     }
  92. }
  93.  
  94. write_dep(fp,count,in,last,name)
  95. FILE        *fp;
  96. int        count;
  97. DNODE        *in;
  98. DNODE        *last;
  99. char        *name;
  100. {
  101.     if (count == 1 && in != last)
  102.         fprintf(fp,"%s\\\n",name);
  103.     else if (count == 1)
  104.         fprintf(fp,"%s\n",name);
  105.     else if (in == last)
  106.         fprintf(fp,"\t\t%s\n",name);
  107.     else
  108.         fprintf(fp,"\t\t%s\\\n",name);
  109. }
  110.  
  111. DNODE *
  112. last_node(make_list,name)
  113. DNODE        **make_list;
  114. char        *name;
  115. {
  116.     DNODE        *last = NULL;
  117.     DNODE        *in;
  118.  
  119.     for (in = *make_list; in != NULL; in = in->next) {
  120.         if (valid_source_file(in->name) == CSOURCE &&
  121.             strcmp(in->name,name))
  122.             continue;
  123.         if (in_file_list(in,name))
  124.             last = in;
  125.     }
  126.     return(last);
  127. }    
  128.  
  129. macros(make_list,fp,opts,mname)
  130. DNODE        **make_list;
  131. FILE        *fp;
  132. OPTS        *opts;
  133. char        *mname;
  134. {
  135.     fprintf(fp,"#%s\n",BANNER);
  136.     fprintf(fp,"CC= %s\n",(opts->cc==NULL)?"cc":opts->cc);
  137.     fprintf(fp,"CFLAGS= %s\n",(opts->cflags==NULL)?"-g":opts->cflags);
  138.     fprintf(fp,"LFLAGS= %s\n",(opts->lflags==NULL)?"-lc":opts->lflags);
  139.     fprintf(fp,"OFILES= \\\n");
  140.     if (!ofiles(make_list,fp,opts))
  141.         return(0);
  142.     fprintf(fp,"#\n");
  143.     if (!main_target(fp,opts,mname))
  144.         return(0);
  145.     return(1);
  146. }
  147.  
  148. ofiles(make_list,fp,opts)
  149. DNODE        **make_list;
  150. FILE        *fp;
  151. OPTS        *opts;
  152. {
  153.     DNODE        *cur;
  154.     DIR        *dirp;
  155.     struct direct    *dp;
  156.     int        type;
  157.     char        name[BUFSIZE];
  158.     char        last[BUFSIZE];
  159.  
  160.     if ((dirp = opendir(".")) == NULL) {
  161.         fprintf(stderr,"ofiles(): can't open directory\n");
  162.         return(0);
  163.     }
  164.     if (!last_ofile(make_list,opts,last)) {
  165.         closedir(dirp);
  166.         return(0);    
  167.     }
  168.     for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
  169.         type = valid_source_file(dp->d_name);
  170.         if ((cur = find_dep(make_list,dp->d_name)) == NULL)
  171.             continue;
  172.         if ((type == YACCSOURCE ||
  173.              type == LEXSOURCE ||
  174.              type == CSOURCE) && target(dp->d_name,name) && cur->use_it)
  175.             if (strcmp(last,dp->d_name))
  176.                 fprintf(fp,"\t%s\\\n",name);
  177.             else
  178.                 fprintf(fp,"\t%s\n",name);
  179.     }
  180.     closedir(dirp);
  181.     return(1);
  182. }
  183.  
  184. last_ofile(make_list,opts,last)
  185. DNODE        **make_list;
  186. OPTS        *opts;
  187. char        *last;
  188. {
  189.     DNODE        *cur;
  190.     DIR        *dirp;
  191.     struct direct    *dp;
  192.     int        type;
  193.     char        name[BUFSIZE];
  194.  
  195.     if ((dirp = opendir(".")) == NULL) {
  196.         fprintf(stderr,"last_ofile(): can't open directory\n");
  197.         return(0);
  198.     }
  199.     for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
  200.         type = valid_source_file(dp->d_name);
  201.         if ((cur = find_dep(make_list,dp->d_name)) == NULL)
  202.             continue;
  203.         if ((type == CSOURCE ||
  204.             type == YACCSOURCE ||
  205.             type == LEXSOURCE) && target(dp->d_name,name) && cur->use_it)
  206.             strcpy(last,dp->d_name);
  207.     }
  208.     closedir(dirp);
  209.     return(1);
  210. }
  211.  
  212. find_main_target(opts,mname)
  213. OPTS        *opts;
  214. char        *mname;
  215. {
  216.     DIR        *dirp;
  217.     struct direct    *dp;
  218.     int        type;
  219.     int        count = 0;
  220.  
  221.     if ((dirp = opendir(".")) == NULL) {
  222.         fprintf(stderr,"main_target(): can't open directory\n");
  223.         return(0);
  224.     }
  225.     mname[0] = NULL;    
  226.     for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
  227.         type = valid_source_file(dp->d_name);
  228.         if (type == CSOURCE)
  229.             if (depends(dp->d_name,"main")) {
  230.                 if (++count > 1) 
  231.                     fprintf(stderr,"Warning: main() multiply defined: %s\n",dp->d_name);
  232.                 strcpy(mname,dp->d_name);
  233.             }
  234.  
  235.     }
  236.     closedir(dirp);
  237.     return(1);
  238. }
  239.  
  240. main_target(fp,opts,mname)
  241. FILE        *fp;
  242. OPTS        *opts;
  243. char        *mname;
  244. {
  245.     int        i;
  246.     char        name[BUFSIZE];
  247.  
  248.     strcpy(name,mname);
  249.     for (i = 0; name[i] != '.' && name[i] != NULL; i++)
  250.         ;
  251.     name[i] = NULL;    
  252.     fprintf(fp,"%s:\t$(OFILES)\n",name);
  253.     fprintf(fp,"\t\t$(CC) $(CFLAGS) -o %s $(OFILES) $(LFLAGS)\n\n",name);
  254.     return(1);
  255. }
  256.  
  257. target(old,new)
  258. char        *old;
  259. char        *new;
  260. {
  261.     int        i;
  262.  
  263.     strcpy(new,old);
  264.     for (i = 0; old[i] != '.' && old[i] != NULL; i++)
  265.         ;
  266.     if (old[i] == NULL)
  267.         return(0);
  268.     if (!strcmp(&old[i+1],"c"))
  269.         new[i+1] = 'o';
  270.     else if (!strcmp(&old[i+1],"h"))
  271.         ;
  272.     else if (!strcmp(&old[i+1],"y"))
  273.         new[i+1] = 'o';
  274.     else if (!strcmp(&old[i+1],"l"))
  275.         new[i+1] = 'o';
  276.     else
  277.         return(0);
  278.     return(1);
  279. }
  280.