1 | /*************************************************************************
|
---|
2 | *
|
---|
3 | * m a k e : m a i n . c
|
---|
4 | *
|
---|
5 | *========================================================================
|
---|
6 | * Edition history
|
---|
7 | *
|
---|
8 | * # Date Comments By
|
---|
9 | * --- -------- ---------------------------------------------------- ---
|
---|
10 | * 1 ?? ??
|
---|
11 | * 2 01.07.89 strcmp(makefile,..) only if makefile a valid ptr. RAL
|
---|
12 | * 3 23.08.89 initname() added RAL
|
---|
13 | * 4 30.08.89 argument parsing impr., indention ch., macro fl. add.PSH,RAL
|
---|
14 | * 5 03.09.89 k-option added, initname -> init changed RAL
|
---|
15 | * 6 06.09.89 environment, MAKEFLAGS, e,d,a options added, RAL
|
---|
16 | * 7 09.09.89 tos support added, fatal args added, fopen makefile PHH,RAL
|
---|
17 | * 8 17.09.89 setoptions fixed for __STDC__ RAL
|
---|
18 | * ------------ Version 2.0 released ------------------------------- RAL
|
---|
19 | *
|
---|
20 | *************************************************************************/
|
---|
21 |
|
---|
22 | /*
|
---|
23 | * make:
|
---|
24 | *
|
---|
25 | * -a try to guess undefined ambiguous macros (*,<)
|
---|
26 | * -d print debugging info
|
---|
27 | * -e environment macro def. overwrite makefile def.
|
---|
28 | * -f makefile name
|
---|
29 | * -i ignore exit status
|
---|
30 | * -k continue on errors
|
---|
31 | * -n pretend to make
|
---|
32 | * -p print all macros & targets
|
---|
33 | * -q question up-to-dateness of target. Return exit status 1 if not
|
---|
34 | * -r don't not use inbuilt rules
|
---|
35 | * -s make silently
|
---|
36 | * -t touch files instead of making them
|
---|
37 | * -m Change memory requirements (EON only)
|
---|
38 | */
|
---|
39 |
|
---|
40 | #define EXTERN
|
---|
41 | #define INIT(x) = x
|
---|
42 | #define INITARRAY
|
---|
43 | #include "h.h"
|
---|
44 |
|
---|
45 | static char version[]= "2.0";
|
---|
46 |
|
---|
47 | static FILE *ifd; /* Input file desciptor */
|
---|
48 | static char *ptrmakeflags;
|
---|
49 |
|
---|
50 | /* There must be enough 'space' for all possible flags ! */
|
---|
51 | static char makeflags[] = "MAKEFLAGS= ";
|
---|
52 |
|
---|
53 | void main(argc, argv)
|
---|
54 | int argc;
|
---|
55 | char **argv;
|
---|
56 | {
|
---|
57 | register char *p; /* For argument processing */
|
---|
58 | int estat = 0; /* For question */
|
---|
59 | register struct name *np;
|
---|
60 | struct macro *mp;
|
---|
61 | int targc; /* temporary for multiple scans */
|
---|
62 | char **targv;
|
---|
63 | char **nargv; /* for removing items from argv */
|
---|
64 | char **envp; /* enivironment ptr */
|
---|
65 |
|
---|
66 |
|
---|
67 | ptrmakeflags = &makeflags[10];
|
---|
68 | myname = (argc-- < 1) ? "make" : *argv++;
|
---|
69 | #ifdef tos
|
---|
70 | myname = "Make";
|
---|
71 | #endif
|
---|
72 |
|
---|
73 | targc = argc;
|
---|
74 | targv = nargv = argv;
|
---|
75 | while (targc--) {
|
---|
76 | if((p = strchr(*targv, '=')) != (char *)NULL) {
|
---|
77 | *p = '\0';
|
---|
78 | mp = setmacro(*targv, p + 1);
|
---|
79 | mp->m_flag |= M_OVERRIDE;
|
---|
80 | --argc;
|
---|
81 | } else
|
---|
82 | *nargv++ = *targv;
|
---|
83 |
|
---|
84 | ++targv;
|
---|
85 | }
|
---|
86 |
|
---|
87 | targc = argc;
|
---|
88 | targv = nargv = argv;
|
---|
89 | while (targc--) {
|
---|
90 | if (**targv == '-') {
|
---|
91 | --argc;
|
---|
92 | p = *targv++;
|
---|
93 | while (*++p != '\0') {
|
---|
94 | switch(mylower(*p)) {
|
---|
95 | case 'f': /* Alternate file name */
|
---|
96 | if (*++p == '\0') {
|
---|
97 | --argc;
|
---|
98 | if (targc-- == 0)
|
---|
99 | usage();
|
---|
100 | p = *targv++;
|
---|
101 | }
|
---|
102 | makefile = p;
|
---|
103 | goto end_of_args;
|
---|
104 | #ifdef eon
|
---|
105 | case 'm': /* Change space requirements */
|
---|
106 | if (*++p == '\0') {
|
---|
107 | --argc;
|
---|
108 | if (targc-- <= 0)
|
---|
109 | usage();
|
---|
110 | p = *targv++;
|
---|
111 | }
|
---|
112 | memspace = atoi(p);
|
---|
113 | goto end_of_args;
|
---|
114 | #endif
|
---|
115 | default :
|
---|
116 | setoption(*p);
|
---|
117 | break;
|
---|
118 | }
|
---|
119 | }
|
---|
120 | end_of_args:;
|
---|
121 | } else
|
---|
122 | *nargv++ = *targv++;
|
---|
123 | }
|
---|
124 |
|
---|
125 | /* evaluate and update environment MAKEFLAGS */
|
---|
126 | if((p =getenv("MAKEFLAGS")) != (char *)0)
|
---|
127 | while(*p) setoption(*p++);
|
---|
128 | for( p = ptrmakeflags; !isspace((int)*p); p++) ;
|
---|
129 | *p = '\0';
|
---|
130 | putenv(makeflags);
|
---|
131 |
|
---|
132 |
|
---|
133 | #ifdef eon
|
---|
134 | if (initalloc(memspace) == 0xffff) /* Must get memory for alloc */
|
---|
135 | fatal("Cannot initalloc memory",(char *)0,0);
|
---|
136 | #endif
|
---|
137 |
|
---|
138 | if (makefile && strcmp(makefile, "-") == 0) /* use stdin as makefile */
|
---|
139 | ifd = stdin;
|
---|
140 | else if (!makefile) { /* If no file, then use default */
|
---|
141 | if ((ifd = fopen(makefile = DEFN1, "r")) == (FILE *)0) {
|
---|
142 | if (errno != MNOENT || !DEFN2)
|
---|
143 | fatal("Can't open %s: %s", DEFN1, errno);
|
---|
144 | else if ((ifd = fopen(makefile = DEFN2, "r")) == (FILE *)0)
|
---|
145 | fatal("Can't open %s: %s", DEFN2, errno);
|
---|
146 | }
|
---|
147 | }
|
---|
148 | else if ((ifd = fopen(makefile, "r")) == (FILE *)0)
|
---|
149 | fatal("Can't open %s: %s", makefile, errno);
|
---|
150 |
|
---|
151 | init();
|
---|
152 |
|
---|
153 | makerules();
|
---|
154 |
|
---|
155 | mp = setmacro("MAKE", myname);
|
---|
156 | mp->m_flag |= M_MAKE;
|
---|
157 | setmacro("$", "$");
|
---|
158 |
|
---|
159 | /* set environment macros */
|
---|
160 | envp = environ; /* get actual environment ptr. */
|
---|
161 | while (*envp) {
|
---|
162 | if((p = strchr(*envp, '=')) != (char *)NULL) {
|
---|
163 | *p = '\0';
|
---|
164 | mp = setmacro(*envp, p + 1);
|
---|
165 | *p = '=';
|
---|
166 | if (useenv) mp->m_flag |= M_OVERRIDE;
|
---|
167 | } else
|
---|
168 | fatal("invalid environment: %s",*envp,0);
|
---|
169 |
|
---|
170 | ++envp;
|
---|
171 | }
|
---|
172 |
|
---|
173 | input(ifd); /* Input all the gunga */
|
---|
174 | fclose(ifd); /* Finished with makefile */
|
---|
175 | lineno = 0; /* Any calls to error now print no line number */
|
---|
176 |
|
---|
177 | if (print)
|
---|
178 | prt(); /* Print out structures */
|
---|
179 |
|
---|
180 | np = newname(".SILENT");
|
---|
181 | if (np->n_flag & N_TARG) silent = TRUE;
|
---|
182 |
|
---|
183 | np = newname(".IGNORE");
|
---|
184 | if (np->n_flag & N_TARG) ignore = TRUE;
|
---|
185 |
|
---|
186 | precious();
|
---|
187 |
|
---|
188 | if (!firstname)
|
---|
189 | fatal("No targets defined",(char *)0,0);
|
---|
190 |
|
---|
191 | circh(); /* Check circles in target definitions */
|
---|
192 |
|
---|
193 | if (!argc)
|
---|
194 | estat = make(firstname, 0);
|
---|
195 | else
|
---|
196 | while (argc--) {
|
---|
197 | estat |= make(newname(*argv++), 0);
|
---|
198 | }
|
---|
199 |
|
---|
200 | if (quest)
|
---|
201 | exit(estat);
|
---|
202 | else
|
---|
203 | exit(0);
|
---|
204 | }
|
---|
205 |
|
---|
206 | #ifdef __STDC__
|
---|
207 | void setoption(char option)
|
---|
208 | #else
|
---|
209 | void setoption(option)
|
---|
210 | char option;
|
---|
211 | #endif
|
---|
212 | {
|
---|
213 | register char *c;
|
---|
214 |
|
---|
215 | option = mylower(option);
|
---|
216 | switch(option) {
|
---|
217 | case 'n': /* Pretend mode */
|
---|
218 | domake = FALSE;
|
---|
219 | break;
|
---|
220 | case 'i': /* Ignore fault mode */
|
---|
221 | ignore = TRUE;
|
---|
222 | break;
|
---|
223 | case 'k': /* Continue on errror */
|
---|
224 | conterr = TRUE;
|
---|
225 | break;
|
---|
226 | case 's': /* Silent about commands */
|
---|
227 | silent = TRUE;
|
---|
228 | break;
|
---|
229 | case 'p':
|
---|
230 | print = TRUE;
|
---|
231 | break;
|
---|
232 | case 'r':
|
---|
233 | rules = FALSE;
|
---|
234 | break;
|
---|
235 | case 't':
|
---|
236 | dotouch = TRUE;
|
---|
237 | break;
|
---|
238 | case 'q':
|
---|
239 | quest = TRUE;
|
---|
240 | break;
|
---|
241 | case 'e':
|
---|
242 | useenv = TRUE;
|
---|
243 | break;
|
---|
244 | case 'd':
|
---|
245 | dbginfo = TRUE;
|
---|
246 | break;
|
---|
247 | case 'a':
|
---|
248 | ambigmac = TRUE;
|
---|
249 | break;
|
---|
250 | default: /* Wrong option */
|
---|
251 | usage();
|
---|
252 | }
|
---|
253 | for( c = ptrmakeflags; !isspace((int)*c); c++)
|
---|
254 | if ( *c == option) return;
|
---|
255 | *c = option;
|
---|
256 | }
|
---|
257 |
|
---|
258 | void usage()
|
---|
259 | {
|
---|
260 | fprintf(stderr, "Syntax: %s [{options | macro=val | target}]\n", myname);
|
---|
261 | fprintf(stderr, "Function: maintaining computer programs V%s\n",version);
|
---|
262 | fprintf(stderr, "Options : -a : try to guess undefined ambiguous macros (*,<)\n");
|
---|
263 | fprintf(stderr, " -d : print debugging information\n");
|
---|
264 | fprintf(stderr, " -e : environment macro def. overwrite makefile def.\n");
|
---|
265 | fprintf(stderr, " -f filename : makefile name (default: makefile, Makefile)\n");
|
---|
266 | fprintf(stderr, " -i : ignore exit status of executed commands\n");
|
---|
267 | fprintf(stderr, " -k : continue with unrelated branches on errors\n");
|
---|
268 | fprintf(stderr, " -n : pretend to make\n");
|
---|
269 | fprintf(stderr, " -p : print all macros & targets\n");
|
---|
270 | fprintf(stderr, " -q : question up-to-dateness of target\n");
|
---|
271 | fprintf(stderr, " -r : don't use inbuilt rules\n");
|
---|
272 | fprintf(stderr, " -s : make silently\n");
|
---|
273 | fprintf(stderr, " -t : touch files instead of making them\n");
|
---|
274 | fprintf(stderr, "Environment: MAKEFLAGS\n");
|
---|
275 | exit(1);
|
---|
276 | }
|
---|
277 |
|
---|
278 |
|
---|
279 | void fatal(msg, a1, a2)
|
---|
280 | char *msg;
|
---|
281 | char *a1;
|
---|
282 | int a2;
|
---|
283 | {
|
---|
284 | fprintf(stderr, "%s: ", myname);
|
---|
285 | fprintf(stderr, msg, a1, strerror(a2));
|
---|
286 | fputc('\n', stderr);
|
---|
287 | exit(1);
|
---|
288 | }
|
---|