Blame


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