From: ceriel Date: Tue, 6 Sep 1988 11:28:16 +0000 (+0000) Subject: Extended to handle user libraries X-Git-Tag: release-5-5~2869 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=575d4f5223c94a554d90010cc0d1b3e98bd29129;p=ack.git Extended to handle user libraries --- diff --git a/lang/m2/m2mm/file_list.h b/lang/m2/m2mm/file_list.h index 0e1aff17e..f4204cc1b 100644 --- a/lang/m2/m2mm/file_list.h +++ b/lang/m2/m2mm/file_list.h @@ -12,6 +12,7 @@ struct file_list { char *a_dir; /* directory in which it resides */ struct idf *a_idf; /* its idf-structure */ struct file_list *a_next; /* next in list */ + char a_notfound; /* could not open ... */ }; #define f_walk(list, ctrl) \ @@ -20,3 +21,4 @@ struct file_list { #define f_filename(a) ((a)->a_filename) #define f_idf(a) ((a)->a_idf) #define f_dir(a) ((a)->a_dir) +#define f_notfound(a) ((a)->a_notfound) diff --git a/lang/m2/m2mm/lib.c b/lang/m2/m2mm/lib.c index b47157315..04c648513 100644 --- a/lang/m2/m2mm/lib.c +++ b/lang/m2/m2mm/lib.c @@ -10,9 +10,17 @@ /* $Header$ */ #include +#include +#include "main.h" static char lib_dir[128] = EM_DIR; +static struct liblist { + int libno; + struct liblist *libnext; +} *lblist; + +int is_library_dir(d) char *d; { @@ -20,7 +28,13 @@ is_library_dir(d) "system" definition modules. Return 1 if it is, 0 otherwise. */ - return strcmp(lib_dir, d) == 0; + register struct liblist *p = lblist; + + while (p) { + if (! strcmp(DEFPATH[p->libno], d)) return 1; + p = p->libnext; + } + return 0; } init_lib() @@ -28,5 +42,15 @@ init_lib() extern char *strcat(); strcat(lib_dir, "/lib/m2"); - AddInclDir(lib_dir); + AddLibDir(lib_dir); +} + +set_libdir(n) +{ + register struct liblist *p = + (struct liblist *) Malloc(sizeof(struct liblist)); + + p->libnext = lblist; + p->libno = n; + lblist = p; } diff --git a/lang/m2/m2mm/m2mm.1 b/lang/m2/m2mm/m2mm.1 index 861b92c04..c2a90b100 100644 --- a/lang/m2/m2mm/m2mm.1 +++ b/lang/m2/m2mm/m2mm.1 @@ -3,7 +3,7 @@ .SH NAME m2mm \- Modula-2 makefile generator .SH SYNOPSIS -\fBm2mm\fP [ \fB-I\fPdir \fB-M\fPflags \fB-C\fPcompiler \fB-S\fPsuffix ] file ... +\fBm2mm\fP [ \fB-I\fPdir \fB-L\fPdir \fB-l\fPlibrary \fB-M\fPflags \fB-C\fPcompiler \fB-S\fPsuffix ] file ... .SH DESCRIPTION .I M2mm is a makefile generator and fast syntax checker for Modula-2 programs. @@ -17,7 +17,7 @@ Using .IR make (1) without an argument will make all these programs. .PP -In the makefile, the variables \fBMOD\fP, \fBM2FLAGS\fP, \fBIFLAGS\fP, and +In the makefile, the variables \fBMOD\fP, \fBM2FLAGS\fP, \fBIFLAGS\fP, \fBLIBS\fP, and \fBSUFFIX\fP will be defined. The generated rules have the following form: .DS @@ -30,11 +30,21 @@ recognizes the following options: Add \fIdir\fP to the list of directories where definition modules are looked for. Also add the flag to \fBIFLAGS\fP. The default value for \fBIFLAGS\fP is empty. +.IP \fB-L\fP\fIdir\fP +Add \fIdir\fP to the list of directories where definition modules are +looked for. Also add the corresponding \fB-I\fP flag to \fBIFLAGS\fP. +The difference with the \fB-I\fP flag is, that the \fB-L\fP directories are considered +interfaces to libraries, and thus no rules are generated using or creating +object files for modules found in these directories. Instead, the user is +expected to add a library to the \fBLIBS\fP macro, using the \fB-l\fP flag. .IP \fB-M\fP\fIflags\fP Set \fBM2FLAGS\fP to \fIflags\fP. .IP \fB-C\fP\fIcompiler\fP Set \fBMOD\fP to \fIcompiler\fP. The default value for \fBMOD\fP is "ack" (for the time being). +.IP \fB-l\fP\fIlibrary\fP +Add \fIlibrary\fP to the \fBLIBS\fP macro. This macro is initially empty, +and is passed to the loader. .IP \fB-S\fPsuffix Set \fBSUFFIX\fP to \fIsuffix\fP. The default suffix is "o". diff --git a/lang/m2/m2mm/main.c b/lang/m2/m2mm/main.c index e93760f92..fd008c4bb 100644 --- a/lang/m2/m2mm/main.c +++ b/lang/m2/m2mm/main.c @@ -76,6 +76,7 @@ static struct file_list *arglist; char *mflags = ""; char *compiler = "ack"; char *suff = "o"; +char *llibs = 0; main(argc, argv) register char **argv; @@ -104,7 +105,7 @@ main(argc, argv) for (i = 1; i < nDEF; i++) { print(" -I%s", DEFPATH[i]); } - print("\nM2FLAGS = %s\nMOD = %s\nSUFFIX = %s\n", mflags, compiler, suff); + print("\nM2FLAGS = %s\nMOD = %s\nSUFFIX = %s\nLIBS = %s\n", mflags, compiler, suff, llibs ? llibs : ""); init_lib(); ProcessArgs(); find_dependencies(); @@ -157,18 +158,10 @@ openfile(a) register struct file_list *a; { char *fn; - register struct file_list *p, *prev = 0; - if (! InsertFile(f_filename(a), DEFPATH, &fn)) { + if (!f_notfound(a) && ! InsertFile(f_filename(a), DEFPATH, &fn)) { + a->a_notfound = 1; Gerror("Could not find %s", f_filename(a)); - f_walk(arglist, p) { - if (p == a) { - if (! prev) arglist = p->a_next; - else prev->a_next = a->a_next; - break; - } - prev = p; - } return 0; } FileName = fn; @@ -240,7 +233,7 @@ find_dependencies() if (dotspot && strcmp(dotspot, ".mod") == 0) { register struct idf *id = f_idf(arg); - if (id) { + if (! f_notfound(arg) && id) { if (id->id_type == PROGRAM) { *dotspot = 0; print("%s ", fn); @@ -331,7 +324,7 @@ print_dep() if (dotspot && strcmp(dotspot, ".mod") == 0) { register struct idf *id = f_idf(arg); - if (id) { + if (! f_notfound(arg) && id) { char *obj = object(arg); register struct file_list *a; @@ -388,7 +381,7 @@ module_in_arglist(n) f_walk(arglist, a) { char *dotp = strrindex(f_filename(a), '.'); - if (dotp && strcmp(dotp, ".mod") == 0) { + if (dotp && strcmp(dotp, ".mod") == 0 && ! f_notfound(a)) { *dotp = 0; if (strcmp(f_filename(a), n) == 0) { *dotp = '.'; @@ -417,14 +410,14 @@ pr_prog_dep(id, a) if (module_in_arglist(f_filename(p)) || ! f_dir(p)) { /* nothing */ } - else if (! is_library_dir(f_dir(p))) { + else if (! is_library_dir(f_dir(p))) { print(" \\\n\t%s/%s", f_dir(p), object(p)); } } print("\n\n"); print("o_files:\t$(OBS_%s)\n\n", id->id_text); print("%s:\t$(OBS_%s) $(OBS2_%s)\n", basename(f_filename(a)), id->id_text, id->id_text); - print("\t$(MOD) -.mod -o %s $(M2FLAGS) $(OBS_%s) $(OBS2_%s)\n", basename(f_filename(a)), id->id_text, id->id_text); + print("\t$(MOD) -.mod -o %s $(M2FLAGS) $(OBS_%s) $(OBS2_%s) $(LIBS)\n", basename(f_filename(a)), id->id_text, id->id_text); } programs() @@ -437,7 +430,7 @@ programs() if (dotspot && strcmp(dotspot, ".mod") == 0) { register struct idf *id = f_idf(a); - if (id && id->id_type == PROGRAM) { + if (! f_notfound(a) && id && id->id_type == PROGRAM) { prog_dep(id, a); /* *dotspot = 0; */ pr_prog_dep(id, a); diff --git a/lang/m2/m2mm/options.c b/lang/m2/m2mm/options.c index d157f78b3..9b4cdd3f3 100644 --- a/lang/m2/m2mm/options.c +++ b/lang/m2/m2mm/options.c @@ -22,9 +22,14 @@ DoOption(text) extern char *mflags; extern char *suff; extern char *compiler; + extern char *llibs; switch(*text++) { + case 'L' : + AddLibDir(text); + break; + case 'I' : AddInclDir(text); break; @@ -41,6 +46,22 @@ DoOption(text) suff = text; break; + case 'l': + { static unsigned int liblen = 0; + unsigned int len = strlen(text) + 4; + + if (liblen) { + llibs = Realloc(llibs, liblen += len); + } + else { + llibs = Malloc(liblen = len); + *llibs = '\0'; + } + strcat(llibs,"\\\n\t"); + strcat(llibs, text); + } + break; + default: Gerror("Unrecognized option: -%s", text-1); break; @@ -72,3 +93,12 @@ AddInclDir(text) new = tmp; } } + +AddLibDir(text) + char *text; +{ + if (*text) { + set_libdir(ndirs); + AddInclDir(text); + } +}