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 initenv();123 usage();125 /*126 assignment args become null strings127 */128 temp = 0;129 for(i = 0; argv[i]; i++) if(utfrune(argv[i], '=')){130 bufcpy(buf, argv[i], strlen(argv[i]));131 insert(buf, ' ');132 if(tfd < 0){133 temp = maketmp(&tfd);134 if(temp == 0) {135 fprint(2, "temp file: %r\n");136 Exit();137 }138 Binit(&tb, tfd, OWRITE);139 }140 Bprint(&tb, "%s\n", argv[i]);141 *argv[i] = 0;142 }143 if(tfd >= 0){144 Bflush(&tb);145 LSEEK(tfd, 0L, 0);146 parse("command line args", tfd, 1);147 remove(temp);148 }150 if (buf->current != buf->start) {151 buf->current--;152 insert(buf, 0);153 }154 symlook("MKFLAGS", S_VAR, (void *) stow(buf->start));155 buf->current = buf->start;156 for(i = 0; argv[i]; i++){157 if(*argv[i] == 0) continue;158 if(i)159 insert(buf, ' ');160 bufcpy(buf, argv[i], strlen(argv[i]));161 }162 insert(buf, 0);163 symlook("MKARGS", S_VAR, (void *) stow(buf->start));164 freebuf(buf);166 if(f == files){167 if(access(MKFILE, 4) == 0)168 parse(MKFILE, open(MKFILE, 0), 0);169 } else170 for(ff = files; ff < f; ff++)171 parse(*ff, open(*ff, 0), 0);172 if(DEBUG(D_PARSE)){173 dumpw("default targets", target1);174 dumpr("rules", rules);175 dumpr("metarules", metarules);176 dumpv("variables");177 }178 if(whatif){179 insert(whatif, 0);180 timeinit(whatif->start);181 freebuf(whatif);182 }183 execinit();184 /* skip assignment args */185 while(*argv && (**argv == 0))186 argv++;188 catchnotes();189 if(*argv == 0){190 if(target1)191 for(w = target1; w; w = w->next)192 mk(w->s);193 else {194 fprint(2, "mk: nothing to mk\n");195 Exit();196 }197 } else {198 if(sflag){199 for(; *argv; argv++)200 if(**argv)201 mk(*argv);202 } else {203 Word *head, *tail, *t;205 /* fake a new rule with all the args as prereqs */206 tail = 0;207 t = 0;208 for(; *argv; argv++)209 if(**argv){210 if(tail == 0)211 tail = t = newword(*argv);212 else {213 t->next = newword(*argv);214 t = t->next;215 }216 }217 if(tail->next == 0)218 mk(tail->s);219 else {220 head = newword("command line arguments");221 addrules(head, tail, strdup(""), VIR, mkinline, 0);222 mk(head->s);223 }224 }225 }226 if(uflag)227 prusage();228 exits(0);229 return 0;230 }232 void233 badusage(void)234 {236 fprint(2, "Usage: mk [-f file] [-n] [-a] [-e] [-t] [-k] [-i] [-d[egp]] [targets ...]\n");237 Exit();238 }240 void *241 Malloc(int n)242 {243 register void *s;245 s = malloc(n);246 if(!s) {247 fprint(2, "mk: cannot alloc %d bytes\n", n);248 Exit();249 }250 return(s);251 }253 void *254 Realloc(void *s, int n)255 {256 if(s)257 s = realloc(s, n);258 else259 s = malloc(n);260 if(!s) {261 fprint(2, "mk: cannot alloc %d bytes\n", n);262 Exit();263 }264 return(s);265 }267 void268 assert(char *s, int n)269 {270 if(!n){271 fprint(2, "mk: Assertion ``%s'' failed.\n", s);272 Exit();273 }274 }276 void277 regerror(char *s)278 {279 if(patrule)280 fprint(2, "mk: %s:%d: regular expression error; %s\n",281 patrule->file, patrule->line, s);282 else283 fprint(2, "mk: %s:%d: regular expression error; %s\n",284 infile, mkinline, s);285 Exit();286 }