123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475 |
- /*
- * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
- * See the copyright notice in the ACK home directory, in the file "Copyright".
- *
- * Author: Ceriel J.H. Jacobs
- */
- /* M A I N P R O G R A M */
- /* stripped down version from the one in the Modula-2 compiler */
- /* $Id$ */
- #include <alloc.h>
- #include "input.h"
- #include "f_info.h"
- #include "idf.h"
- #include "LLlex.h"
- #include "Lpars.h"
- #include "tokenname.h"
- int state; /* either IMPLEMENTATION or PROGRAM */
- char *ProgName;
- char **DEFPATH;
- int nDEF, mDEF;
- struct file_list *CurrentArg;
- extern int err_occurred;
- extern int Roption;
- extern char *strrchr();
- extern char *strcpy(), *strcat();
- char *
- basename(s)
- char *s;
- {
- static char buf[256];
- char *p = strrchr(s, '.');
- if (p != 0) *p = 0;
- strcpy(buf, s);
- if (p != 0) *p = '.';
- return buf;
- }
- char *
- getwdir(fn)
- register char *fn;
- {
- register char *p;
- p = strrchr(fn, '/');
- while (p && *(p + 1) == '\0') { /* remove trailing /'s */
- *p = '\0';
- p = strrchr(fn, '/');
- }
- if (p) {
- register char **d = DEFPATH;
- *p = '\0';
- while (*d && strcmp(*d, fn) != 0) d++;
- if (*d) {
- *p = '/';
- return *d;
- }
- fn = Salloc(fn, (unsigned) (p - &fn[0] + 1));
- *p = '/';
- return fn;
- }
- return ".";
- }
- static struct file_list *arglist;
- #ifndef M2COMPILER
- #define M2COMPILER "m2"
- #endif
- char *mflags = "";
- char *compiler = M2COMPILER;
- char *suff = "o";
- char *llibs = 0;
- main(argc, argv)
- register char **argv;
- {
- extern struct tokenname tkidf[];
- extern char *getwdir();
- int i;
- ProgName = *argv++;
- DEFPATH = (char **) Malloc(10 * sizeof(char *));
- DEFPATH[1] = 0;
- mDEF = 10;
- nDEF = 2;
- while (--argc > 0) {
- if (**argv == '-')
- DoOption((*argv++) + 1);
- else {
- Add(&arglist, *argv, getwdir(*argv), 1);
- argv++;
- }
- }
- init_idf();
- reserve(tkidf);
- print("IFLAGS =");
- for (i = 1; i < nDEF; i++) {
- if (DEFPATH[i]) print(" -I%s", DEFPATH[i]);
- }
- print("\nM2FLAGS = %s\nMOD = %s\nSUFFIX = %s\nLIBS = %s\n", mflags, compiler, suff, llibs ? llibs : "");
- init_lib();
- ProcessArgs();
- find_dependencies();
- print_dep();
- programs();
- exit(err_occurred);
- }
- struct file_list *
- new_file_list()
- {
- static struct file_list *p;
- register struct file_list *f;
- static int cnt;
- if (--cnt < 0) {
- p = (struct file_list *)Malloc(50*sizeof(struct file_list));
- cnt = 49;
- }
- f = p++;
- f->a_filename = 0;
- f->a_dir = 0;
- f->a_next = 0;
- f->a_idf = 0;
- f->a_notfound = 0;
- return f;
- }
- Add(parglist, f, d, copy)
- char *f, *d;
- struct file_list **parglist;
- {
- register struct file_list *a, *b = 0;
- if (f == 0) return;
- f_walk(*parglist, a) {
- if (strcmp(f_filename(a), f) == 0) break;
- b = a;
- }
- if (a) return 0;
- a = new_file_list();
- if (copy) {
- a->a_filename = Salloc(f, (unsigned) (strlen(f)+1));
- }
- else {
- a->a_filename = f;
- }
- a->a_dir = d;
- if (! b) *parglist = a;
- else b->a_next = a;
- return 1;
- }
- int
- openfile(a)
- register struct file_list *a;
- {
- char *fn;
- if (!f_notfound(a) && ! InsertFile(f_filename(a), DEFPATH, &fn)) {
- a->a_notfound = 1;
- Gerror("Could not find %s", f_filename(a));
- return 0;
- }
- FileName = fn;
- LineNumber = 1;
- a->a_dir = WorkingDir = getwdir(FileName);
- return 1;
- }
- ProcessArgs()
- {
- register struct file_list *a;
- f_walk(arglist, a) {
- register char *p = strrchr(f_filename(a), '.');
- CurrentArg = a;
- DEFPATH[0] = f_dir(a);
- if ( p && strcmp(p, ".def") == 0) {
- ForeignFlag = 0;
- if (! openfile(a)) {
- continue;
- }
- DefModule();
- }
- else if (p && strcmp(p, ".mod") == 0) {
- if (! openfile(a)) {
- *p = 0; /* ??? */
- continue;
- }
- CompUnit();
- }
- else fatal("No Modula-2 file: %s", f_filename(a));
- }
- }
- void
- No_Mem()
- {
- fatal("out of memory");
- }
- AddToList(name, ext)
- char *name, *ext;
- {
- /* Try to find a file with basename "name" and extension ".def",
- in the directories mentioned in "DEFPATH".
- */
- char buf[15];
- char *strncpy();
- if (strcmp(name, "SYSTEM") != 0 && ! is_library_dir(WorkingDir)) {
- strncpy(buf, name, 10);
- buf[10] = '\0'; /* maximum length */
- strcat(buf, ext);
- Add(&arglist, buf, WorkingDir, 1);
- return 1;
- }
- return 0;
- }
- find_dependencies()
- {
- register struct file_list *arg;
- print("\nall:\t");
- f_walk(arglist, arg) {
- char *fn = f_filename(arg);
- char *dotspot = strrchr(fn, '.');
- if (dotspot && strcmp(dotspot, ".mod") == 0) {
- register struct idf *id = f_idf(arg);
- if (! f_notfound(arg) && id) {
- if (id->id_type == PROGRAM) {
- *dotspot = 0;
- print("%s ", fn);
- *dotspot = '.';
- }
- file_dep(id);
- }
- }
- }
- print("\n\n");
- print("objects:\t");
- f_walk(arglist, arg) {
- char *fn = f_filename(arg);
- char *dotspot = strrchr(fn, '.');
- if (dotspot && strcmp(dotspot, ".mod") == 0) {
- register struct idf *id = f_idf(arg);
- if (! f_notfound(arg) && id) {
- if (id->id_type == PROGRAM) {
- *dotspot = 0;
- print("%s_o_files ", fn);
- *dotspot = '.';
- }
- }
- }
- }
- print("\n\n\n");
- }
- file_dep(id)
- register struct idf *id;
- {
- register struct lnk *m;
- if (id->id_ddependson || id->id_mdependson) return;
- if (id->id_def) Add(&(id->id_mdependson), id->id_def, id->id_dir, 0);
- for (m = id->id_defimports; m; m = m->lnk_next) {
- register struct idf *iid = m->lnk_imp;
- Add(&(id->id_mdependson), iid->id_def, iid->id_dir, 0);
- if (Add(&(id->id_ddependson), iid->id_def, iid->id_dir, 0)) {
- register struct file_list *p;
- file_dep(iid);
- f_walk(iid->id_ddependson, p) {
- Add(&(id->id_ddependson), f_filename(p),
- f_dir(p), 0);
- Add(&(id->id_mdependson), f_filename(p),
- f_dir(p), 0);
- }
- }
- }
- for (m = id->id_modimports; m; m = m->lnk_next) {
- register struct idf *iid = m->lnk_imp;
- if (Add(&(id->id_mdependson), iid->id_def, iid->id_dir, 0)) {
- register struct file_list *p;
- file_dep(iid);
- f_walk(iid->id_ddependson, p) {
- Add(&(id->id_mdependson), f_filename(p),
- f_dir(p), 0);
- }
- }
- }
- }
- char *
- object(arg)
- register struct file_list *arg;
- {
- static char buf[512];
- char *dotp = strrchr(f_filename(arg), '.');
- buf[0] = 0;
- /*
- if (strcmp(f_dir(arg), ".") != 0) {
- strcpy(buf, f_dir(arg));
- strcat(buf, "/");
- }
- */
- if (dotp) *dotp = 0;
- strcat(buf, f_filename(arg));
- if (dotp) *dotp = '.';
- strcat(buf, ".$(SUFFIX)");
- return buf;
- }
- pr_arg(a)
- register struct file_list *a;
- {
- char *f = f_filename(a);
- char *d = f_dir(a);
- if (strcmp(d, ".") == 0 || *f == '/' || *f == '.') {
- print(f);
- }
- else print("%s/%s", d, f);
- }
- print_dep()
- {
- register struct file_list *arg;
- f_walk(arglist, arg) {
- char *dotspot = strrchr(f_filename(arg), '.');
- if (dotspot && strcmp(dotspot, ".mod") == 0) {
- register struct idf *id = f_idf(arg);
- if (! f_notfound(arg) && id) {
- char *obj = object(arg);
- register struct file_list *a;
- print("%s: \\\n\t", obj);
- pr_arg(arg);
- f_walk(id->id_mdependson, a) {
- if (*(f_filename(a))) /* ??? */ {
- print(" \\\n\t");
- pr_arg(a);
- }
- }
- print("\n\t$(MOD) -c $(M2FLAGS) $(IFLAGS) ");
- pr_arg(arg);
- print("\n");
- }
- }
- }
- }
- prog_dep(id, a)
- register struct idf *id;
- struct file_list *a;
- {
- register struct lnk *m;
- register struct file_list *p;
- id->id_mdependson = 0;
- id->id_def = 0;
- if (id->id_type == PROGRAM) {
- Add(&(id->id_mdependson), f_filename(a), f_dir(a), 0);
- }
- else {
- if (strlen(id->id_text) >= 10) id->id_text[10] = 0;
- Add(&(id->id_mdependson), id->id_text, id->id_dir, 0);
- }
- for (m = id->id_modimports; m; m = m->lnk_next) {
- register struct idf *iid = m->lnk_imp;
- if (Add(&(id->id_mdependson), iid->id_text, iid->id_dir, 0)) {
- if (iid->id_def) prog_dep(iid);
- f_walk(iid->id_mdependson, p) {
- Add(&(id->id_mdependson), f_filename(p),
- f_dir(p), 0);
- }
- }
- }
- }
- module_in_arglist(n)
- char *n;
- {
- register struct file_list *a;
- f_walk(arglist, a) {
- char *dotp = strrchr(f_filename(a), '.');
- if (dotp && strcmp(dotp, ".mod") == 0 && ! f_notfound(a)) {
- *dotp = 0;
- if (strcmp(f_filename(a), n) == 0) {
- *dotp = '.';
- return 1;
- }
- *dotp = '.';
- }
- }
- return 0;
- }
- pr_prog_dep(id, a)
- register struct idf *id;
- struct file_list *a;
- {
- register struct file_list *p;
- print("\nOBS_%s =", id->id_text);
- f_walk(id->id_mdependson, p) {
- if (module_in_arglist(f_filename(p)) || ! f_dir(p)) {
- print(" \\\n\t%s", object(p));
- }
- }
- print("\n\nOBS2_%s =", id->id_text);
- f_walk(id->id_mdependson, p) {
- if (module_in_arglist(f_filename(p)) || ! f_dir(p)) {
- /* nothing */
- }
- else if (! is_library_dir(f_dir(p))) {
- print(" \\\n\t%s/%s", f_dir(p), object(p));
- }
- }
- print("\n\n");
- print("%s_o_files:\t$(OBS_%s)\n\n", basename(f_filename(a)), id->id_text);
- print("%s:\t$(OBS_%s) $(OBS2_%s)\n", basename(f_filename(a)), id->id_text, id->id_text);
- print("\t$(MOD) -o %s $(M2FLAGS) $(OBS_%s) $(OBS2_%s) $(LIBS)\n", basename(f_filename(a)), id->id_text, id->id_text);
- }
- programs()
- {
- register struct file_list *a;
- f_walk(arglist, a) {
- char *dotspot = strrchr(f_filename(a), '.');
- if (dotspot && strcmp(dotspot, ".mod") == 0) {
- register struct idf *id = f_idf(a);
- if (! f_notfound(a) && id && id->id_type == PROGRAM) {
- prog_dep(id, a);
- /* *dotspot = 0; */
- pr_prog_dep(id, a);
- /* *dotspot = '.'; */
- }
- }
- }
- }
|