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 {"alpha", "7c", "7l", "7", "7.out"},
20 {"386", "8c", "8l", "8", "8.out"},
21 {"power64", "9c", "9l", "9", "9.out"},
22 {"sparc", "kc", "kl", "k", "k.out"},
23 {"power", "qc", "ql", "q", "q.out"},
24 {"mips", "vc", "vl", "v", "v.out"},
28 Nobjs = (sizeof objtype)/(sizeof objtype[0]),
33 char *strings[Maxlist];
37 List srcs, objs, cpp, cc, ld, ldargs;
38 int cflag, vflag, Eflag, Pflag;
39 char *allos = "01245678kqv";
41 void append(List *, char *);
42 char *changeext(char *, char *);
43 void doexec(char *, List *);
44 void dopipe(char *, List *, char *, List *);
46 Objtype *findoty(void);
47 void printlist(List *);
50 main(int argc, char *argv[])
53 char *s, *suf, *ccpath;
55 int i, cppn, ccn, oflag;
61 append(&cpp, "-D__STDC__=1"); /* ANSI says so */
62 append(&cpp, "-N"); /* turn off standard includes */
68 append(&cpp, smprint("-%c", ARGC()));
74 append(&objs, smprint("/%s/lib/ape/lib%s.a", ot->name, ARGF()));
80 fatal("no -o argument");
89 append(&cc, smprint("-%c", ARGC()));
92 append(&cc, smprint("-s%s", ARGF()));
97 append(&cpp, smprint("-%c%s", ARGC(), ARGF()));
101 append(&ldargs, "-v");
112 append(&ldargs, "-p");
115 /* hacky look inside ARGBEGIN insides, to see if we have -aa */
124 fprint(2, "pcc: flag -%c ignored\n", ARGC());
129 suf = utfrrune(s, '.');
132 if(strcmp(suf, "c") == 0) {
134 append(&objs, changeext(s, ot->o));
135 } else if(strcmp(suf, ot->o) == 0 ||
136 strcmp(suf, "o") == 0 ||
137 strcmp(suf, "a") == 0 ||
138 (suf[0] == 'a' && strcmp(suf+1, ot->o) == 0)) {
140 } else if(utfrune(allos, suf[0]) != 0) {
141 fprint(2, "pcc: argument %s ignored: wrong architecture\n",
148 fatal("no files to compile or load");
149 ccpath = smprint("/bin/%s", ot->cc);
150 append(&cpp, smprint("-I/%s/include/ape", ot->name));
151 append(&cpp, "-I/sys/include/ape");
154 for(i = 0; i < srcs.n; i++) {
155 append(&cpp, srcs.strings[i]);
157 append(&cpp, changeext(objs.strings[i], "i"));
159 doexec("/bin/cpp", &cpp);
165 append(&cc, changeext(srcs.strings[i], ot->o));
166 dopipe("/bin/cpp", &cpp, ccpath, &cc);
174 for(i = 0; i < ldargs.n; i++)
175 append(&ld, ldargs.strings[i]);
176 for(i = 0; i < objs.n; i++)
177 append(&ld, objs.strings[i]);
178 append(&ld, smprint("/%s/lib/ape/libap.a", ot->name));
179 doexec(smprint("/bin/%s", ot->ld), &ld);
181 /* prevent removal of a library */
182 if(strstr(objs.strings[0], ".a") == 0)
183 remove(objs.strings[0]);
191 append(List *l, char *s)
193 if(l->n >= Maxlist-1)
194 fatal("too many arguments");
195 l->strings[l->n++] = s;
196 l->strings[l->n] = 0;
200 doexec(char *c, List *a)
210 fatal("fork failed");
213 fatal("exec failed");
217 fatal("wait failed");
219 fatal(smprint("%s: %s", a->strings[0], w->msg));
224 dopipe(char *c1, List *a1, char *c2, List *a2)
237 fatal("pipe failed");
238 switch((pid1 = fork())) {
240 fatal("fork failed");
245 exec(c2, a2->strings);
246 fatal("exec failed");
250 fatal("fork failed");
256 exec(c1, a1->strings);
257 fatal("exec failed");
261 for(got = 0; got < 2; got++) {
264 fatal("wait failed");
266 fatal(smprint("%s: %s",
267 (w->pid == pid1) ? a1->strings[0] : a2->strings[0], w->msg));
278 o = getenv("objtype");
280 fatal("no $objtype in environment");
281 for(oty = objtype; oty < &objtype[Nobjs]; oty++)
282 if(strcmp(o, oty->name) == 0)
284 fatal("unknown $objtype");
285 return 0; /* shut compiler up */
291 fprint(2, "pcc: %s\n", msg);
295 /* src ends in .something; return copy of basename with .ext added */
297 changeext(char *src, char *ext)
301 b = utfrrune(src, '/');
306 e = utfrrune(src, '.');
310 ans = smprint("%s.%s", b, ext);
320 for(i = 0; i < l->n; i++) {
321 fprint(2, "%s", l->strings[i]);