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