5 typedef struct Objtype {
14 {"spim", "0c", "0l", "0", "0.out"},
15 {"68000", "1c", "1l", "1", "1.out"},
16 {"68020", "2c", "2l", "2", "2.out"},
17 {"arm", "5c", "5l", "5", "5.out"},
18 {"amd64", "6c", "6l", "6", "6.out"},
19 {"386", "8c", "8l", "8", "8.out"},
20 {"power64", "9c", "9l", "9", "9.out"},
21 {"sparc", "kc", "kl", "k", "k.out"},
22 {"power", "qc", "ql", "q", "q.out"},
23 {"mips", "vc", "vl", "v", "v.out"},
27 Nobjs = (sizeof objtype)/(sizeof objtype[0]),
32 char *strings[Maxlist];
36 List srcs, objs, cpp, cc, ld, ldargs;
37 int cflag, vflag, Eflag, Pflag;
38 char *allos = "01245678kqv";
40 void append(List *, char *);
41 char *changeext(char *, char *);
42 void doexec(char *, List *);
43 void dopipe(char *, List *, char *, List *);
45 Objtype *findoty(void);
46 void printlist(List *);
49 main(int argc, char *argv[])
52 char *s, *suf, *ccpath;
54 int i, cppn, ccn, oflag;
60 append(&cpp, "-D__STDC__=1"); /* ANSI says so */
61 append(&cpp, "-N"); /* turn off standard includes */
67 append(&cpp, smprint("-%c", ARGC()));
73 append(&objs, smprint("/%s/lib/ape/lib%s.a", ot->name, ARGF()));
79 fatal("no -o argument");
88 append(&cc, smprint("-%c", ARGC()));
91 append(&cc, smprint("-s%s", ARGF()));
96 append(&cpp, smprint("-%c%s", ARGC(), ARGF()));
100 append(&ldargs, "-v");
111 append(&ldargs, "-p");
114 /* hacky look inside ARGBEGIN insides, to see if we have -aa */
123 fprint(2, "pcc: flag -%c ignored\n", ARGC());
128 suf = utfrrune(s, '.');
131 if(strcmp(suf, "c") == 0) {
133 append(&objs, changeext(s, ot->o));
134 } else if(strcmp(suf, ot->o) == 0 ||
135 strcmp(suf, "o") == 0 ||
136 strcmp(suf, "a") == 0 ||
137 (suf[0] == 'a' && strcmp(suf+1, ot->o) == 0)) {
139 } else if(utfrune(allos, suf[0]) != 0) {
140 fprint(2, "pcc: argument %s ignored: wrong architecture\n",
147 fatal("no files to compile or load");
148 ccpath = smprint("/bin/%s", ot->cc);
149 append(&cpp, smprint("-I/%s/include/ape", ot->name));
150 append(&cpp, "-I/sys/include/ape");
153 for(i = 0; i < srcs.n; i++) {
154 append(&cpp, srcs.strings[i]);
156 append(&cpp, changeext(objs.strings[i], "i"));
158 doexec("/bin/cpp", &cpp);
164 append(&cc, changeext(srcs.strings[i], ot->o));
165 dopipe("/bin/cpp", &cpp, ccpath, &cc);
173 for(i = 0; i < ldargs.n; i++)
174 append(&ld, ldargs.strings[i]);
175 for(i = 0; i < objs.n; i++)
176 append(&ld, objs.strings[i]);
177 append(&ld, smprint("/%s/lib/ape/libap.a", ot->name));
178 doexec(smprint("/bin/%s", ot->ld), &ld);
180 /* prevent removal of a library */
181 if(strstr(objs.strings[0], ".a") == 0)
182 remove(objs.strings[0]);
190 append(List *l, char *s)
192 if(l->n >= Maxlist-1)
193 fatal("too many arguments");
194 l->strings[l->n++] = s;
195 l->strings[l->n] = 0;
199 doexec(char *c, List *a)
209 fatal("fork failed");
212 fatal("exec failed");
216 fatal("wait failed");
218 fatal(smprint("%s: %s", a->strings[0], w->msg));
223 dopipe(char *c1, List *a1, char *c2, List *a2)
236 fatal("pipe failed");
237 switch((pid1 = fork())) {
239 fatal("fork failed");
244 exec(c2, a2->strings);
245 fatal("exec failed");
249 fatal("fork failed");
255 exec(c1, a1->strings);
256 fatal("exec failed");
260 for(got = 0; got < 2; got++) {
263 fatal("wait failed");
265 fatal(smprint("%s: %s",
266 (w->pid == pid1) ? a1->strings[0] : a2->strings[0], w->msg));
277 o = getenv("objtype");
279 fatal("no $objtype in environment");
280 for(oty = objtype; oty < &objtype[Nobjs]; oty++)
281 if(strcmp(o, oty->name) == 0)
283 fatal("unknown $objtype");
284 return 0; /* shut compiler up */
290 fprint(2, "pcc: %s\n", msg);
294 /* src ends in .something; return copy of basename with .ext added */
296 changeext(char *src, char *ext)
300 b = utfrrune(src, '/');
305 e = utfrrune(src, '.');
309 ans = smprint("%s.%s", b, ext);
319 for(i = 0; i < l->n; i++) {
320 fprint(2, "%s", l->strings[i]);