Blob
1 #include "mk.h"3 #define MKFILE "mkfile"5 int debug;6 Rule *rules, *metarules;7 int nflag = 0;8 int tflag = 0;9 int iflag = 0;10 int kflag = 0;11 int aflag = 0;12 int uflag = 0;13 char *explain = 0;14 Word *target1;15 int nreps = 1;16 Job *jobs;17 Biobuf bout;18 Rule *patrule;19 void badusage(void);20 #ifdef PROF21 short buf[10000];22 #endif24 int25 main(int argc, char **argv)26 {27 Word *w;28 char *s, *temp;29 char *files[256], **f = files, **ff;30 int sflag = 0;31 int i;32 int tfd = -1;33 Biobuf tb;34 Bufblock *buf;35 Bufblock *whatif;37 /*38 * start with a copy of the current environment variables39 * instead of sharing them40 */42 Binit(&bout, 1, OWRITE);43 buf = newbuf();44 whatif = 0;45 USED(argc);46 for(argv++; *argv && (**argv == '-'); argv++)47 {48 bufcpy(buf, argv[0], strlen(argv[0]));49 insert(buf, ' ');50 switch(argv[0][1])51 {52 case 'a':53 aflag = 1;54 break;55 case 'd':56 if(*(s = &argv[0][2]))57 while(*s) switch(*s++)58 {59 case 'p': debug |= D_PARSE; break;60 case 'g': debug |= D_GRAPH; break;61 case 'e': debug |= D_EXEC; break;62 }63 else64 debug = 0xFFFF;65 break;66 case 'e':67 explain = &argv[0][2];68 break;69 case 'f':70 if(*++argv == 0)71 badusage();72 *f++ = *argv;73 bufcpy(buf, argv[0], strlen(argv[0]));74 insert(buf, ' ');75 break;76 case 'i':77 iflag = 1;78 break;79 case 'k':80 kflag = 1;81 break;82 case 'n':83 nflag = 1;84 break;85 case 's':86 sflag = 1;87 break;88 case 't':89 tflag = 1;90 break;91 case 'u':92 uflag = 1;93 break;94 case 'w':95 if(whatif == 0)96 whatif = newbuf();97 else98 insert(whatif, ' ');99 if(argv[0][2])100 bufcpy(whatif, &argv[0][2], strlen(&argv[0][2]));101 else {102 if(*++argv == 0)103 badusage();104 bufcpy(whatif, &argv[0][0], strlen(&argv[0][0]));105 }106 break;107 default:108 badusage();109 }110 }111 #ifdef PROF112 {113 extern etext();114 monitor(main, etext, buf, sizeof buf, 300);115 }116 #endif118 if(aflag)119 iflag = 1;120 usage();121 syminit();122 initshell();123 initenv();124 usage();126 /*127 assignment args become null strings128 */129 temp = 0;130 for(i = 0; argv[i]; i++) if(utfrune(argv[i], '=')){131 bufcpy(buf, argv[i], strlen(argv[i]));132 insert(buf, ' ');133 if(tfd < 0){134 temp = maketmp(&tfd);135 if(temp == 0) {136 fprint(2, "temp file: %r\n");137 Exit();138 }139 Binit(&tb, tfd, OWRITE);140 }141 Bprint(&tb, "%s\n", argv[i]);142 *argv[i] = 0;143 }144 if(tfd >= 0){145 Bflush(&tb);146 LSEEK(tfd, 0L, 0);147 parse("command line args", tfd, 1);148 remove(temp);149 }151 if (buf->current != buf->start) {152 buf->current--;153 insert(buf, 0);154 }155 symlook("MKFLAGS", S_VAR, (void *) stow(buf->start));156 buf->current = buf->start;157 for(i = 0; argv[i]; i++){158 if(*argv[i] == 0) continue;159 if(i)160 insert(buf, ' ');161 bufcpy(buf, argv[i], strlen(argv[i]));162 }163 insert(buf, 0);164 symlook("MKARGS", S_VAR, (void *) stow(buf->start));165 freebuf(buf);167 if(f == files){168 if(access(MKFILE, 4) == 0)169 parse(MKFILE, open(MKFILE, 0), 0);170 } else171 for(ff = files; ff < f; ff++)172 parse(*ff, open(*ff, 0), 0);173 if(DEBUG(D_PARSE)){174 dumpw("default targets", target1);175 dumpr("rules", rules);176 dumpr("metarules", metarules);177 dumpv("variables");178 }179 if(whatif){180 insert(whatif, 0);181 timeinit(whatif->start);182 freebuf(whatif);183 }184 execinit();185 /* skip assignment args */186 while(*argv && (**argv == 0))187 argv++;189 catchnotes();190 if(*argv == 0){191 if(target1)192 for(w = target1; w; w = w->next)193 mk(w->s);194 else {195 fprint(2, "mk: nothing to mk\n");196 Exit();197 }198 } else {199 if(sflag){200 for(; *argv; argv++)201 if(**argv)202 mk(*argv);203 } else {204 Word *head, *tail, *t;206 /* fake a new rule with all the args as prereqs */207 tail = 0;208 t = 0;209 for(; *argv; argv++)210 if(**argv){211 if(tail == 0)212 tail = t = newword(*argv);213 else {214 t->next = newword(*argv);215 t = t->next;216 }217 }218 if(tail->next == 0)219 mk(tail->s);220 else {221 head = newword("command line arguments");222 addrules(head, tail, strdup(""), VIR, mkinline, 0);223 mk(head->s);224 }225 }226 }227 if(uflag)228 prusage();229 exits(0);230 return 0;231 }233 void234 badusage(void)235 {237 fprint(2, "Usage: mk [-f file] [-n] [-a] [-e] [-t] [-k] [-i] [-d[egp]] [targets ...]\n");238 Exit();239 }241 void *242 Malloc(int n)243 {244 register void *s;246 s = malloc(n);247 if(!s) {248 fprint(2, "mk: cannot alloc %d bytes\n", n);249 Exit();250 }251 return(s);252 }254 void *255 Realloc(void *s, int n)256 {257 if(s)258 s = realloc(s, n);259 else260 s = malloc(n);261 if(!s) {262 fprint(2, "mk: cannot alloc %d bytes\n", n);263 Exit();264 }265 return(s);266 }268 void269 assert(char *s, int n)270 {271 if(!n){272 fprint(2, "mk: Assertion ``%s'' failed.\n", s);273 Exit();274 }275 }277 void278 regerror(char *s)279 {280 if(patrule)281 fprint(2, "mk: %s:%d: regular expression error; %s\n",282 patrule->file, patrule->line, s);283 else284 fprint(2, "mk: %s:%d: regular expression error; %s\n",285 infile, mkinline, s);286 Exit();287 }