2 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3 * See the copyright notice in the ACK home directory, in the file "Copyright".
5 * Author: Ceriel J.H. Jacobs
8 /* M A I N P R O G R A M */
10 /* stripped down version from the one in the Modula-2 compiler */
12 /* $Id: main.c,v 1.16 1995/12/04 15:20:46 ceriel Exp $ */
21 #include "tokenname.h"
23 int state; /* either IMPLEMENTATION or PROGRAM */
27 struct file_list *CurrentArg;
28 extern int err_occurred;
30 extern char *strrindex();
31 extern char *strcpy(), *strcat();
38 char *p = strrindex(s, '.');
52 p = strrindex(fn, '/');
53 while (p && *(p + 1) == '\0') { /* remove trailing /'s */
55 p = strrindex(fn, '/');
59 register char **d = DEFPATH;
62 while (*d && strcmp(*d, fn) != 0) d++;
67 fn = Salloc(fn, (unsigned) (p - &fn[0] + 1));
74 static struct file_list *arglist;
77 #define M2COMPILER "m2"
81 char *compiler = M2COMPILER;
88 extern struct tokenname tkidf[];
89 extern char *getwdir();
93 DEFPATH = (char **) Malloc(10 * sizeof(char *));
100 DoOption((*argv++) + 1);
102 Add(&arglist, *argv, getwdir(*argv), 1);
110 for (i = 1; i < nDEF; i++) {
111 if (DEFPATH[i]) print(" -I%s", DEFPATH[i]);
113 print("\nM2FLAGS = %s\nMOD = %s\nSUFFIX = %s\nLIBS = %s\n", mflags, compiler, suff, llibs ? llibs : "");
125 static struct file_list *p;
126 register struct file_list *f;
130 p = (struct file_list *)Malloc(50*sizeof(struct file_list));
142 Add(parglist, f, d, copy)
144 struct file_list **parglist;
146 register struct file_list *a, *b = 0;
150 f_walk(*parglist, a) {
151 if (strcmp(f_filename(a), f) == 0) break;
157 a->a_filename = Salloc(f, (unsigned) (strlen(f)+1));
163 if (! b) *parglist = a;
170 register struct file_list *a;
174 if (!f_notfound(a) && ! InsertFile(f_filename(a), DEFPATH, &fn)) {
176 Gerror("Could not find %s", f_filename(a));
181 a->a_dir = WorkingDir = getwdir(FileName);
187 register struct file_list *a;
190 register char *p = strrindex(f_filename(a), '.');
193 DEFPATH[0] = f_dir(a);
194 if ( p && strcmp(p, ".def") == 0) {
201 else if (p && strcmp(p, ".mod") == 0) {
208 else fatal("No Modula-2 file: %s", f_filename(a));
215 fatal("out of memory");
221 /* Try to find a file with basename "name" and extension ".def",
222 in the directories mentioned in "DEFPATH".
227 if (strcmp(name, "SYSTEM") != 0 && ! is_library_dir(WorkingDir)) {
228 strncpy(buf, name, 10);
229 buf[10] = '\0'; /* maximum length */
231 Add(&arglist, buf, WorkingDir, 1);
239 register struct file_list *arg;
242 f_walk(arglist, arg) {
243 char *fn = f_filename(arg);
244 char *dotspot = strrindex(fn, '.');
246 if (dotspot && strcmp(dotspot, ".mod") == 0) {
247 register struct idf *id = f_idf(arg);
249 if (! f_notfound(arg) && id) {
250 if (id->id_type == PROGRAM) {
261 f_walk(arglist, arg) {
262 char *fn = f_filename(arg);
263 char *dotspot = strrindex(fn, '.');
265 if (dotspot && strcmp(dotspot, ".mod") == 0) {
266 register struct idf *id = f_idf(arg);
268 if (! f_notfound(arg) && id) {
269 if (id->id_type == PROGRAM) {
271 print("%s_o_files ", fn);
281 register struct idf *id;
283 register struct lnk *m;
285 if (id->id_ddependson || id->id_mdependson) return;
286 if (id->id_def) Add(&(id->id_mdependson), id->id_def, id->id_dir, 0);
287 for (m = id->id_defimports; m; m = m->lnk_next) {
288 register struct idf *iid = m->lnk_imp;
290 Add(&(id->id_mdependson), iid->id_def, iid->id_dir, 0);
291 if (Add(&(id->id_ddependson), iid->id_def, iid->id_dir, 0)) {
292 register struct file_list *p;
295 f_walk(iid->id_ddependson, p) {
296 Add(&(id->id_ddependson), f_filename(p),
298 Add(&(id->id_mdependson), f_filename(p),
303 for (m = id->id_modimports; m; m = m->lnk_next) {
304 register struct idf *iid = m->lnk_imp;
306 if (Add(&(id->id_mdependson), iid->id_def, iid->id_dir, 0)) {
307 register struct file_list *p;
310 f_walk(iid->id_ddependson, p) {
311 Add(&(id->id_mdependson), f_filename(p),
320 register struct file_list *arg;
322 static char buf[512];
323 char *dotp = strrindex(f_filename(arg), '.');
327 if (strcmp(f_dir(arg), ".") != 0) {
328 strcpy(buf, f_dir(arg));
333 strcat(buf, f_filename(arg));
334 if (dotp) *dotp = '.';
335 strcat(buf, ".$(SUFFIX)");
340 register struct file_list *a;
342 char *f = f_filename(a);
345 if (strcmp(d, ".") == 0 || *f == '/' || *f == '.') {
348 else print("%s/%s", d, f);
353 register struct file_list *arg;
355 f_walk(arglist, arg) {
356 char *dotspot = strrindex(f_filename(arg), '.');
358 if (dotspot && strcmp(dotspot, ".mod") == 0) {
359 register struct idf *id = f_idf(arg);
361 if (! f_notfound(arg) && id) {
362 char *obj = object(arg);
363 register struct file_list *a;
365 print("%s: \\\n\t", obj);
367 f_walk(id->id_mdependson, a) {
368 if (*(f_filename(a))) /* ??? */ {
373 print("\n\t$(MOD) -c $(M2FLAGS) $(IFLAGS) ");
382 register struct idf *id;
385 register struct lnk *m;
386 register struct file_list *p;
388 id->id_mdependson = 0;
390 if (id->id_type == PROGRAM) {
391 Add(&(id->id_mdependson), f_filename(a), f_dir(a), 0);
394 if (strlen(id->id_text) >= 10) id->id_text[10] = 0;
395 Add(&(id->id_mdependson), id->id_text, id->id_dir, 0);
397 for (m = id->id_modimports; m; m = m->lnk_next) {
398 register struct idf *iid = m->lnk_imp;
400 if (Add(&(id->id_mdependson), iid->id_text, iid->id_dir, 0)) {
401 if (iid->id_def) prog_dep(iid);
402 f_walk(iid->id_mdependson, p) {
403 Add(&(id->id_mdependson), f_filename(p),
413 register struct file_list *a;
416 char *dotp = strrindex(f_filename(a), '.');
418 if (dotp && strcmp(dotp, ".mod") == 0 && ! f_notfound(a)) {
420 if (strcmp(f_filename(a), n) == 0) {
431 register struct idf *id;
434 register struct file_list *p;
436 print("\nOBS_%s =", id->id_text);
437 f_walk(id->id_mdependson, p) {
438 if (module_in_arglist(f_filename(p)) || ! f_dir(p)) {
439 print(" \\\n\t%s", object(p));
442 print("\n\nOBS2_%s =", id->id_text);
443 f_walk(id->id_mdependson, p) {
444 if (module_in_arglist(f_filename(p)) || ! f_dir(p)) {
447 else if (! is_library_dir(f_dir(p))) {
448 print(" \\\n\t%s/%s", f_dir(p), object(p));
452 print("%s_o_files:\t$(OBS_%s)\n\n", basename(f_filename(a)), id->id_text);
453 print("%s:\t$(OBS_%s) $(OBS2_%s)\n", basename(f_filename(a)), id->id_text, id->id_text);
454 print("\t$(MOD) -o %s $(M2FLAGS) $(OBS_%s) $(OBS2_%s) $(LIBS)\n", basename(f_filename(a)), id->id_text, id->id_text);
459 register struct file_list *a;
462 char *dotspot = strrindex(f_filename(a), '.');
464 if (dotspot && strcmp(dotspot, ".mod") == 0) {
465 register struct idf *id = f_idf(a);
467 if (! f_notfound(a) && id && id->id_type == PROGRAM) {
471 /* *dotspot = '.'; */