|
|
1.1 root 1: #include "mk.h"
2:
3: #define MKFILE "mkfile"
4:
5: static char *version = "@(#)mk general release 3";
6: int debug;
7: Rule *rules, *metarules;
8: int nproclimit;
9: int nflag = 0;
10: int tflag = 0;
11: int iflag = 0;
12: int kflag = 0;
13: int mflag = 0;
14: int aflag = 0;
15: int uflag = 0;
16: char *explain = 0;
17: Word *target1;
18: int nreps = 1;
19: Job *jobs;
20: char *whatif = 0;
21: #ifdef PROF
22: short buf[10000];
23: #endif
24:
25: main(argc, argv)
26: char **argv;
27: {
28: register Word *w;
29: register char *s;
30: char *files[256], **f = files, **ff;
31: char mkargs[256], *ma = mkargs;
32: int i;
33: int tfd = -1;
34: char *temp = "/tmp/mkargXXXXXX";
35:
36: *ma = 0;
37: for(argv++; *argv && (**argv == '-'); argv++)
38: {
39: for(s = argv[0]; *s; *ma++ = *s++);
40: *ma++ = ' ';
41: switch(argv[0][1])
42: {
43: case 'a':
44: aflag = 1;
45: break;
46: case 'd':
47: if(*(s = &argv[0][2]))
48: while(*s) switch(*s++)
49: {
50: case 'p': debug |= D_PARSE; break;
51: case 'g': debug |= D_GRAPH; break;
52: case 'e': debug |= D_EXEC; break;
53: }
54: else
55: debug = 0xFFFF;
56: break;
57: case 'e':
58: explain = &argv[0][2];
59: break;
60: case 'f':
61: if(*++argv == 0)
62: usage();
63: *f++ = *argv;
64: for(s = argv[0]; *s; *ma++ = *s++);
65: *ma++ = ' ';
66: break;
67: case 'i':
68: iflag = 1;
69: break;
70: case 'k':
71: kflag = 1;
72: break;
73: case 'm':
74: mflag = 1;
75: aflag = nflag = 1;
76: break;
77: case 'n':
78: nflag = 1;
79: break;
80: case 't':
81: tflag = 1;
82: break;
83: case 'u':
84: uflag = 1;
85: break;
86: case 'w':
87: if(argv[0][2])
88: whatif = &argv[0][2];
89: else {
90: if(*++argv == 0)
91: usage();
92: whatif = &argv[0][0];
93: }
94: break;
95: default:
96: usage();
97: }
98: }
99: #ifdef PROF
100: {
101: extern etext();
102: monitor(main, etext, buf, sizeof buf, 300);
103: }
104: #endif
105:
106: if(aflag)
107: iflag = 1;
108:
109: account();
110: syminit();
111: builtins();
112: initenv();
113:
114: /*
115: assignment args become null strings
116: */
117: for(i = 0; argv[i]; i++) if(strchr(argv[i], '=')){
118: for(s = argv[i]; *s; *ma++ = *s++);
119: *ma++ = ' ';
120: if(tfd < 0){
121: mktemp(temp);
122: close(creat(temp, 0600));
123: if((tfd = open(temp, 2)) < 0){
124: perror(temp);
125: Exit();
126: }
127: }
128: Fprint(tfd, "%s\n", argv[i]);
129: *argv[i] = 0;
130: }
131: if(tfd >= 0){
132: Fflush(tfd);
133: lseek(tfd, 0L, 0);
134: parse("command line args", tfd, 1, 1);
135: unlink(temp);
136: }
137:
138: if(ma != mkargs) ma--;
139: *ma = 0;
140: symlook("MKFLAGS", S_VAR, strdup(mkargs));
141: for(ma = mkargs, i = 0; argv[i]; i++){
142: if(*argv[i] == 0) continue;
143: if(i) *ma++ = ' ';
144: for(s = argv[i]; *s; *ma++ = *s++);
145: }
146: *ma = 0;
147: symlook("MKARGS", S_VAR, strdup(mkargs));
148:
149: if(f == files){
150: if(access(MKFILE, 4) == 0)
151: parse(MKFILE, open(MKFILE, 0), 0, 1);
152: } else
153: for(ff = files; ff < f; ff++)
154: parse(*ff, open(*ff, 0), 0, 1);
155: parsebuiltins();
156: if(DEBUG(D_PARSE)){
157: dumpw("default targets", target1);
158: dumpr("rules", rules);
159: dumpr("metarules", metarules);
160: dumpv("variables");
161: }
162: if(whatif)
163: timeinit(whatif);
164: execinit();
165: /* skip assignment args */
166: while(*argv && (**argv == 0))
167: argv++;
168: sigcatch();
169: if(*argv == 0){
170: if(target1)
171: for(w = target1; w; w = w->next)
172: mk(w->s);
173: else {
174: Fprint(2, "mk: nothing to mk\n");
175: Exit();
176: }
177: } else
178: for(; *argv; argv++)
179: if(**argv)
180: mk(*argv);
181: if(uflag)
182: praccount();
183: if(mflag)
184: makefile();
185: exit(0);
186: }
187:
188: usage()
189: {
190:
191: Fprint(2, "Usage: mk [-f file] [-n] [-a] [-e] [-t] [-k] [-i] [-d[egp]] [targets ...]\n");
192: Exit();
193: }
194:
195: char *
196: Malloc(n)
197: {
198: register char *s;
199:
200: if(s = malloc(n))
201: return(s);
202: Fprint(2, "mk: cannot alloc %d bytes\n", n);
203: Exit();
204: return((char *)0); /* shut cyntax up */
205: }
206:
207: Exit()
208: {
209: while(wait((int *)0) >= 0)
210: ;
211: exit(1);
212: }
213:
214: char *
215: strndup(s, n)
216: char *s;
217: {
218: register char *goo;
219:
220: goo = Malloc(n);
221: memcpy(goo, s, n);
222: return(goo);
223: }
224:
225: initenv()
226: {
227: extern char **environ;
228: register char **p, *s, *ss;
229:
230: for(p = environ; *p; p++){
231: s = shname(*p);
232: switch(*s)
233: {
234: case '=':
235: *s = 0;
236: ss = strdup(s+1);
237: symlook(strdup(*p), S_VAR, ss)->value = ss;
238: *s = '=';
239: break;
240: case 0:
241: ss = strdup("");
242: symlook(strdup(*p), S_VAR, ss)->value = ss;
243: break;
244: }
245: }
246: }
247:
248: assert(s, n)
249: char *s;
250: {
251: if(!n){
252: Fprint(2, "mk: Assertion ``%s'' failed.\n", s);
253: Exit();
254: }
255: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.