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 PROF
21 short buf[10000];
22 #endif
24 int
25 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 variables
39 * instead of sharing them
40 */
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 else
64 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 else
98 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]));
106 break;
107 default:
108 badusage();
111 #ifdef PROF
113 extern etext();
114 monitor(main, etext, buf, sizeof buf, 300);
116 #endif
118 if(aflag)
119 iflag = 1;
120 usage();
121 syminit();
122 initshell();
123 initenv();
124 usage();
126 /*
127 assignment args become null strings
128 */
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();
139 Binit(&tb, tfd, OWRITE);
141 Bprint(&tb, "%s\n", argv[i]);
142 *argv[i] = 0;
144 if(tfd >= 0){
145 Bflush(&tb);
146 LSEEK(tfd, 0L, 0);
147 parse("command line args", tfd, 1);
148 remove(temp);
151 if (buf->current != buf->start) {
152 buf->current--;
153 insert(buf, 0);
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]));
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 } else
171 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");
179 if(whatif){
180 insert(whatif, 0);
181 timeinit(whatif->start);
182 freebuf(whatif);
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();
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;
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);
227 if(uflag)
228 prusage();
229 exits(0);
230 return 0;
233 void
234 badusage(void)
237 fprint(2, "Usage: mk [-f file] [-n] [-a] [-e] [-t] [-k] [-i] [-d[egp]] [targets ...]\n");
238 Exit();
241 void *
242 Malloc(int n)
244 register void *s;
246 s = malloc(n);
247 if(!s) {
248 fprint(2, "mk: cannot alloc %d bytes\n", n);
249 Exit();
251 return(s);
254 void *
255 Realloc(void *s, int n)
257 if(s)
258 s = realloc(s, n);
259 else
260 s = malloc(n);
261 if(!s) {
262 fprint(2, "mk: cannot alloc %d bytes\n", n);
263 Exit();
265 return(s);
268 void
269 assert(char *s, int n)
271 if(!n){
272 fprint(2, "mk: Assertion ``%s'' failed.\n", s);
273 Exit();
277 void
278 regerror(char *s)
280 if(patrule)
281 fprint(2, "mk: %s:%d: regular expression error; %s\n",
282 patrule->file, patrule->line, s);
283 else
284 fprint(2, "mk: %s:%d: regular expression error; %s\n",
285 infile, mkinline, s);
286 Exit();