MAKEMAKE - a Modula2 prog to generate MAKEFILEs.
Steve Tynor
tynor at gitpyr.gatech.EDU
Thu Jan 8 14:43:32 AEST 1987
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Here's a Modula2 program to generate a MAKFILE for a collection of Modula2
modules. It was written in TDI Modula2 (on the Atari ST) but should easily
port to other compilers.
Happy Making.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
No problem is so formidable that you can't just walk away from it.
Steve Tynor
Georgia Instutute of Technology
...{akgua, allegra, amd, harpo, hplabs,
ihnp4, masscomp, ut-ngp, rlgvax, sb1,
uf-cgrl, unmvax, ut-sally} !gatech!gitpyr!tynor
----------------------------------------------------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# readme
# makefile
# makefore.def
# makelibr.def
# makepars.def
# makefore.mod
# makelibr.mod
# makemake.mod
# makepars.mod
# maketoke.mod
# This archive created: Wed Jan 7 23:35:08 1987
# By: Steve Tynor (Georgia Institute of Technology)
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'readme'" '(2949 characters)'
if test -f 'readme'
then
echo shar: "will not over-write existing file 'readme'"
else
sed 's/^ X//' << \SHAR_EOF > 'readme'
XMODULE MakeMake;
X
X (*
X * MAKEMAKE. Create a MAKEFILE for a MODULA-2 program.
X *
X * Written by Steve Tynor, 30 September 1986.
X * UUCP : tynor at gitpyr
X * USNAIL: 2550 Akers Mill Rd. T-2, Atlanta GA. 30339
X *
X * Permission is granted to distribute, copy and change this program as long
X * as this notice remains...
X *)
X
X (*
X * MAKEMAKE. Create a MAKEFILE for a MODULA-2 program.
X * Usage:
X * MAKEMAKE "main-module-modulename"
X *
X * Even though module dependencies are explicit in MODULA-2, it can still
X * be quite a chore to figure them out and create a MAKEFILE. This program
X * reads the text file associated with the module name given on the command
X * line and recursively checks dependencies for all imported files. It then
X * creates a MAKEFILE suitable for use with the Unix MAKE utility. If a
X * file is not found and is not a recognized library module, then the
X * MAKEFILE will include a comment:
X * ## File NOT Found ##
X * on the right hand side of the dependency.
X *
X * This program was written on the Atari ST using TDI Modula-2.
X *
X * BUGS:
X * the CommandLine module dies when a null command line is seen.
X * Unfortunately, I no longer have the source to the module, so I can't
X * fix it. This bug also seems to consider a command line consisting of
X * a single character as a reason for dieing.
X *
X * Suggestions for porting to another compiler:
X *
X * 1) module CommandLine is non-standard. It exports 2 procedures:
X * PROCEDURE GetArgument ( num : CARDINAL;
X * VAR filename : ARRAY OF CHAR);
X * PROCEDURE NumberOfArguments() : CARDINAL;
X * they do just what their names imply. (ie. like C's argv, argc)
X *
X * 2) the IMPLEMENTATION MODULE MakeLibraries will have to be edited to
X * reflect the standard library that your compiler knows about. List
X * any modules that you don't want included in your MAKEFILE. Library
X * modules are listed in the MAKEFILE, but are commented out.
X *
X * 3) the procedure ModulenameToFilename in MakeParse will have to be
X * modified so that it creates the correct filename for your machine.
X *
X * 4) if your MAKE program has default MODULA-2 rules, set the constant
X * MAKEHasModulaRules (in this module) to TRUE. This will prevent
X * MAKEMAKE from producing remake lines.
X *
X * 5) the procedure WriteFilename takes a parameter: extension. Trace
X * all the calls to this function and make sure the proper extentions
X * are used. in TDI Modula, '.DEF' = definition module text
X * '.MOD' = implementation module text
X * '.SYM' = symbol file (compiled DEF)
X * '.LNK' = symbol file (compiled MOD)
X *)
X
X
X
SHAR_EOF
if test 2949 -ne "`wc -c < 'readme'`"
then
echo shar: "error transmitting 'readme'" '(should have been 2949 characters)'
fi
fi
echo shar: "extracting 'makefile'" '(936 characters)'
if test -f 'makefile'
then
echo shar: "will not over-write existing file 'makefile'"
else
sed 's/^ X//' << \SHAR_EOF > 'makefile'
X
XMAKEMAKE.PRG : MakeLibr.LNK MakeToke.LNK MakePars.LNK MakeFore.LNK \
X CommandL.LNK MAKEMAKE.LNK
X C:\BIN\LNK.PRG MAKEMAKE.LNK
XMAKEMAKE.LNK : MAKEMAKE.MOD MakePars.SYM MakeFore.SYM CommandL.SYM
X #libs: Strings.SYM Streams.SYM ASCII.SYM InOut.SYM
X C:\BIN\MOD.PRG MAKEMAKE.MOD
XMakeLibr.LNK : MakeLibr.MOD MakeLibr.SYM
X #libs: Strings.SYM
X C:\BIN\MOD.PRG MakeLibr.MOD
XMakeLibr.SYM : MakeLibr.DEF
X C:\BIN\MOD.PRG MakeLibr.DEF
XMakeToke.LNK : MakeToke.MOD MakeToke.SYM
X #libs: Streams.SYM
X C:\BIN\MOD.PRG MakeToke.MOD
XMakeToke.SYM : MakeToke.DEF
X C:\BIN\MOD.PRG MakeToke.DEF
XMakePars.LNK : MakePars.MOD MakePars.SYM MakeLibr.SYM MakeFore.SYM \
X MakeToke.SYM
X #libs: Strings.SYM
X C:\BIN\MOD.PRG MakePars.MOD
XMakePars.SYM : MakePars.DEF
X C:\BIN\MOD.PRG MakePars.DEF
XMakeFore.LNK : MakeFore.MOD MakeFore.SYM
X #libs: Storage.SYM Strings.SYM
X C:\BIN\MOD.PRG MakeFore.MOD
XMakeFore.SYM : MakeFore.DEF
X C:\BIN\MOD.PRG MakeFore.DEF
SHAR_EOF
if test 936 -ne "`wc -c < 'makefile'`"
then
echo shar: "error transmitting 'makefile'" '(should have been 936 characters)'
fi
fi
echo shar: "extracting 'makefore.def'" '(1433 characters)'
if test -f 'makefore.def'
then
echo shar: "will not over-write existing file 'makefore.def'"
else
sed 's/^ X//' << \SHAR_EOF > 'makefore.def'
XDEFINITION MODULE MakeForest;
X
X (*
X * MAKEMAKE. Create a MAKEFILE for a MODULA-2 program.
X *
X * Written by Steve Tynor, 30 September 1986.
X * UUCP : tynor at gitpyr
X * USNAIL: 2550 Akers Mill Rd. T-2, Atlanta GA. 30339
X *
X * Permission is granted to distribute, copy and change this program as long
X * as this notice remains...
X *)
X
XTYPE
X String = ARRAY [0 .. 100] OF CHAR;
X
X FileDefinitionList = POINTER TO FileDefinitionRec;
X ImportList = POINTER TO ImportRec;
X
X FileDefinitionRec = RECORD
X filename : String;
X library : BOOLEAN; (* this file is a library module *)
X next : FileDefinitionList;
X imports : ImportList; (* points to linked list of imported files *)
X END; (* RECORD *)
X
X ImportRec = RECORD
X file : FileDefinitionList;
X next : ImportList;
X END; (* RECORD *)
X
XVAR
X FileForestEnd,
X FileForest : FileDefinitionList;
X
X (*----------------------------------------------------------------------*)
X PROCEDURE AddImport (VAR fileDefinition : FileDefinitionList;
X VAR fname : ARRAY OF CHAR);
X
X (*----------------------------------------------------------------------*)
X PROCEDURE AddFile (VAR fname : ARRAY OF CHAR;
X VAR fileDefinition : FileDefinitionList ) : BOOLEAN;
X (* returns TRUE if file added, FALSE if the file was already there *)
X
XEND MakeForest.
SHAR_EOF
if test 1433 -ne "`wc -c < 'makefore.def'`"
then
echo shar: "error transmitting 'makefore.def'" '(should have been 1433 characters)'
fi
fi
echo shar: "extracting 'makelibr.def'" '(469 characters)'
if test -f 'makelibr.def'
then
echo shar: "will not over-write existing file 'makelibr.def'"
else
sed 's/^ X//' << \SHAR_EOF > 'makelibr.def'
XDEFINITION MODULE MakeLibraries;
X
X (*
X * MAKEMAKE. Create a MAKEFILE for a MODULA-2 program.
X *
X * Written by Steve Tynor, 30 September 1986.
X * UUCP : tynor at gitpyr
X * USNAIL: 2550 Akers Mill Rd. T-2, Atlanta GA. 30339
X *
X * Permission is granted to distribute, copy and change this program as long
X * as this notice remains...
X *)
X
X PROCEDURE IsALibraryModule (VAR modulename : ARRAY OF CHAR) : BOOLEAN;
X
XEND MakeLibraries.
SHAR_EOF
if test 469 -ne "`wc -c < 'makelibr.def'`"
then
echo shar: "error transmitting 'makelibr.def'" '(should have been 469 characters)'
fi
fi
echo shar: "extracting 'makepars.def'" '(669 characters)'
if test -f 'makepars.def'
then
echo shar: "will not over-write existing file 'makepars.def'"
else
sed 's/^ X//' << \SHAR_EOF > 'makepars.def'
XDEFINITION MODULE MakeParse;
X
X (*
X * MAKEMAKE. Create a MAKEFILE for a MODULA-2 program.
X *
X * Written by Steve Tynor, 30 September 1986.
X * UUCP : tynor at gitpyr
X * USNAIL: 2550 Akers Mill Rd. T-2, Atlanta GA. 30339
X *
X * Permission is granted to distribute, copy and change this program as long
X * as this notice remains...
X *)
X
XTYPE
X FileType = (def, mod, main);
X
X (*----------------------------------------------------------------------*)
X PROCEDURE ParseModule (VAR modulename : ARRAY OF CHAR;
X type : FileType;
X VAR filename : ARRAY OF CHAR);
X
XEND MakeParse.
SHAR_EOF
if test 669 -ne "`wc -c < 'makepars.def'`"
then
echo shar: "error transmitting 'makepars.def'" '(should have been 669 characters)'
fi
fi
echo shar: "extracting 'makefore.mod'" '(2161 characters)'
if test -f 'makefore.mod'
then
echo shar: "will not over-write existing file 'makefore.mod'"
else
sed 's/^ X//' << \SHAR_EOF > 'makefore.mod'
XIMPLEMENTATION MODULE MakeForest;
X
X (*
X * MAKEMAKE. Create a MAKEFILE for a MODULA-2 program.
X *
X * Written by Steve Tynor, 30 September 1986.
X * UUCP : tynor at gitpyr
X * USNAIL: 2550 Akers Mill Rd. T-2, Atlanta GA. 30339
X *
X * Permission is granted to distribute, copy and change this program as long
X * as this notice remains...
X *)
X
XIMPORT Strings;
XFROM Storage IMPORT ALLOCATE;
X
X (*----------------------------------------------------------------------*)
X PROCEDURE FindFile (VAR fname : ARRAY OF CHAR;
X VAR fileDefinition : FileDefinitionList);
X VAR
X found : BOOLEAN;
X BEGIN
X fileDefinition := FileForest;
X found := FALSE;
X WHILE (fileDefinition <> NIL) AND (NOT found) DO
X found := Strings.Compare (fname, fileDefinition^.filename)
X = Strings.Equal;
X IF NOT found THEN
X fileDefinition := fileDefinition^.next;
X END; (* IF *)
X END; (* WHILE *)
X END FindFile;
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE AddFile (VAR fname : ARRAY OF CHAR;
X VAR fileDefinition : FileDefinitionList) : BOOLEAN;
X BEGIN
X FindFile (fname, fileDefinition);
X IF fileDefinition = NIL THEN
X NEW (fileDefinition);
X Strings.Assign (fileDefinition^.filename, fname);
X fileDefinition^.next := FileForest;
X fileDefinition^.imports := NIL;
X IF FileForest = NIL THEN
X FileForestEnd := fileDefinition;
X END; (* IF *)
X FileForest := fileDefinition;
X RETURN TRUE;
X ELSE
X RETURN FALSE;
X END; (* IF *)
X END AddFile;
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE AddImport (VAR fileDefinition : FileDefinitionList;
X VAR fname : ARRAY OF CHAR );
X VAR
X iPtr : ImportList;
X BEGIN
X NEW (iPtr);
X iPtr^.next := fileDefinition^.imports;
X fileDefinition^.imports := iPtr;
X IF AddFile (fname, iPtr^.file) THEN END;
X END AddImport;
X
X
XBEGIN
X FileForest := NIL;
X FileForestEnd := NIL;
XEND MakeForest.
SHAR_EOF
if test 2161 -ne "`wc -c < 'makefore.mod'`"
then
echo shar: "error transmitting 'makefore.mod'" '(should have been 2161 characters)'
fi
fi
echo shar: "extracting 'makelibr.mod'" '(3115 characters)'
if test -f 'makelibr.mod'
then
echo shar: "will not over-write existing file 'makelibr.mod'"
else
sed 's/^ X//' << \SHAR_EOF > 'makelibr.mod'
XIMPLEMENTATION MODULE MakeLibraries;
X
X (*
X * MAKEMAKE. Create a MAKEFILE for a MODULA-2 program.
X *
X * Written by Steve Tynor, 30 September 1986.
X * UUCP : tynor at gitpyr
X * USNAIL: 2550 Akers Mill Rd. T-2, Atlanta GA. 30339
X *
X * Permission is granted to distribute, copy and change this program as long
X * as this notice remains...
X *)
X
X (* NOTE: this module is implementation specific. Substitute the library
X * modules supplied by your compiler.
X *)
XIMPORT Strings;
X
XCONST
X NumLibraryModules = 41;
X
XVAR
X LibraryModule : ARRAY [1 .. NumLibraryModules] OF
X ARRAY [0 .. 20] OF CHAR;
X
X (*-----------------------------------------------------------------------*)
X PROCEDURE IsALibraryModule (VAR modulename : ARRAY OF CHAR) : BOOLEAN;
X (* binary search... *)
X VAR
X low, mid, high : CARDINAL;
X BEGIN
X low := 1;
X high := NumLibraryModules;
X WHILE low <= high DO
X mid := low + (high - low) DIV 2;
X CASE Strings.Compare (modulename, LibraryModule[mid]) OF
X Strings.Equal :
X RETURN TRUE;
X | Strings.Less :
X high := mid - 1;
X ELSE
X low := mid + 1;
X END; (* CASE *)
X END; (* WHILE *)
X RETURN FALSE;
X END IsALibraryModule;
X
XBEGIN
X (* NOTE: we're doing a binary search, so these must be in sorted order: *)
X
X (* TDI supplied libraries: *)
X LibraryModule [ 1] := 'AESApplications';
X LibraryModule [ 2] := 'AESEvents';
X LibraryModule [ 3] := 'AESForms';
X LibraryModule [ 4] := 'AESGraphics';
X LibraryModule [ 5] := 'AESMenus';
X LibraryModule [ 6] := 'AESObjects';
X LibraryModule [ 7] := 'AESResources';
X LibraryModule [ 8] := 'AESScraps';
X LibraryModule [ 9] := 'AESShells';
X LibraryModule [10] := 'AESWindows';
X LibraryModule [11] := 'ASCII';
X LibraryModule [12] := 'BIOS';
X LibraryModule [13] := 'Conversions';
X LibraryModule [14] := 'Display';
X LibraryModule [15] := 'FileSystem';
X LibraryModule [16] := 'GEMAESbase';
X LibraryModule [17] := 'GEMDOS';
X LibraryModule [18] := 'GEMError';
X LibraryModule [19] := 'GEMVDIbase';
X LibraryModule [20] := 'GEMX';
X LibraryModule [21] := 'InOut';
X LibraryModule [22] := 'Keyboard';
X LibraryModule [23] := 'LongInOut';
X LibraryModule [24] := 'M2Conversions';
X LibraryModule [25] := 'MathLib0';
X LibraryModule [26] := 'RealInOut';
X (* note : Strings.Compare thinks 'SY' < 'St'. (it just compares ASCII
X * values...) So this is not exactly alphabetical... just sorted
X * as Strings.Compare would...
X *)
X LibraryModule [27] := 'SYSTEM';
X LibraryModule [28] := 'Storage';
X LibraryModule [29] := 'Streams';
X LibraryModule [30] := 'Strings';
X LibraryModule [31] := 'TermBase';
X LibraryModule [32] := 'Terminal';
X LibraryModule [33] := 'TextIO';
X LibraryModule [34] := 'VDIAttribs';
X LibraryModule [35] := 'VDIControls';
X LibraryModule [36] := 'VDIEscapes';
X LibraryModule [37] := 'VDIInputs';
X LibraryModule [38] := 'VDIInquires';
X LibraryModule [39] := 'VDIOutputs';
X LibraryModule [40] := 'VDIRasters';
X LibraryModule [41] := 'XBIOS';
X
XEND MakeLibraries.
SHAR_EOF
if test 3115 -ne "`wc -c < 'makelibr.mod'`"
then
echo shar: "error transmitting 'makelibr.mod'" '(should have been 3115 characters)'
fi
fi
echo shar: "extracting 'makemake.mod'" '(9455 characters)'
if test -f 'makemake.mod'
then
echo shar: "will not over-write existing file 'makemake.mod'"
else
sed 's/^ X//' << \SHAR_EOF > 'makemake.mod'
XMODULE MakeMake;
X
X (*
X * MAKEMAKE. Create a MAKEFILE for a MODULA-2 program.
X *
X * Written by Steve Tynor, 30 September 1986.
X * UUCP : tynor at gitpyr
X * USNAIL: 2550 Akers Mill Rd. T-2, Atlanta GA. 30339
X *
X * Permission is granted to distribute, copy and change this program as long
X * as this notice remains...
X *)
X
X (*
X * MAKEMAKE. Create a MAKEFILE for a MODULA-2 program.
X * Usage:
X * MAKEMAKE "main-module-modulename"
X *
X * Even though module dependencies are explicit in MODULA-2, it can still
X * be quite a chore to figure them out and create a MAKEFILE. This program
X * reads the text file associated with the module name given on the command
X * line and recursively checks dependencies for all imported files. It then
X * creates a MAKEFILE suitable for use with the Unix MAKE utility. If a
X * file is not found and is not a recognized library module, then the
X * MAKEFILE will include a comment:
X * ## File NOT Found ##
X * on the right hand side of the dependency.
X *
X *
X * This program was written on the Atari ST using TDI Modula-2.
X *
X * BUGS:
X * the CommandLine module dies when a null command line is seen.
X * Unfortunately, I no longer have the source to the module, so I can't
X * fix it. This bug also seems to consider a command line consisting of
X * a single character as a reason for dieing.
X *
X * Suggestions for porting to another compiler:
X *
X * 1) module CommandLine is non-standard. It exports 2 procedures:
X * PROCEDURE GetArgument ( num : CARDINAL;
X * VAR filename : ARRAY OF CHAR);
X * PROCEDURE NumberOfArguments() : CARDINAL;
X * they do just what their names imply. (ie. like C's argv, argc)
X *
X * 2) the IMPLEMENTATION MODULE MakeLibraries will have to be edited to
X * reflect the standard library that your compiler knows about. List
X * any modules that you don't want included in your MAKEFILE. Library
X * modules are listed in the MAKEFILE, but are commented out.
X *
X * 3) the procedure ModulenameToFilename in MakeParse will have to be
X * modified so that it creates the correct filename for your machine.
X *
X * 4) if your MAKE program has default MODULA-2 rules, set the constant
X * MAKEHasModulaRules (in this module) to TRUE. This will prevent
X * MAKEMAKE from producing remake lines.
X *
X * 5) the procedure WriteFilename takes a parameter: extension. Trace
X * all the calls to this function and make sure the proper extentions
X * are used. in TDI Modula, '.DEF' = definition module text
X * '.MOD' = implementation module text
X * '.SYM' = symbol file (compiled DEF)
X * '.LNK' = symbol file (compiled MOD)
X *)
X
XIMPORT InOut;
XIMPORT CommandLine;
XIMPORT MakeForest;
XIMPORT MakeParse;
XIMPORT ASCII;
XIMPORT Streams;
XIMPORT Strings;
X
XCONST
X MAKEHasModulaRules = FALSE;
X CompilerPathname = 'C:\BIN\MOD.PRG ';
X LinkerPathname = 'C:\BIN\LNK.PRG ';
X
XVAR
X outputStream : Streams.Stream;
X
X (*----------------------------------------------------------------------*)
X PROCEDURE CloseOutput;
X VAR
X reply : INTEGER;
X BEGIN
X Streams.CloseStream (outputStream, reply);
X END CloseOutput;
X
X (*----------------------------------------------------------------------*)
X PROCEDURE OpenOutput (VAR filename : ARRAY OF CHAR) : BOOLEAN;
X VAR
X reply : INTEGER;
X BEGIN
X Streams.OpenStream (outputStream, filename, Streams.READWRITE, reply);
X RETURN reply = 0;
X END OpenOutput;
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE Write (ch : CHAR);
X BEGIN
X Streams.Write8Bit (outputStream, ch);
X END Write;
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE WriteString (VAR str : ARRAY OF CHAR);
X VAR
X c : CARDINAL;
X BEGIN
X c := 0;
X WHILE (c <= HIGH(str)) AND (str[c] <> 0C) DO
X Write(str[c]);
X INC(c);
X END; (* WHILE *)
X END WriteString;
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE WriteLn;
X BEGIN
X Write ( ASCII.CR );
X Write ( ASCII.LF );
X END WriteLn;
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE WriteMakefile;
X
X (*--------------------------------------------------------------------*)
X PROCEDURE WriteFileDependency (file : MakeForest.FileDefinitionList;
X VAR lhsExtention : ARRAY OF CHAR);
X VAR
X c : CARDINAL;
X iptr : MakeForest.ImportList;
X BEGIN
X IF file <> NIL THEN
X IF file^.filename[0] = '#' THEN
X RETURN;
X END; (* IF *)
X WriteFilename (file^.filename, lhsExtention);
X Write (ASCII.HT);
X WriteString (': ');
X WriteString (file^.filename);
X (* if this is a .LNK file, then don't forget the .SYM file: *)
X (* but don't do it for the main module! *)
X IF (file <> MakeForest.FileForestEnd) AND
X (Strings.Compare (lhsExtention, '.LNK') = Strings.Equal) THEN
X Write (' ');
X WriteFilename (file^.filename, '.SYM');
X c := 3;
X ELSE
X c := 2;
X END; (* IF *)
X iptr := file^.imports;
X WHILE iptr <> NIL DO
X IF NOT iptr^.file^.library THEN
X IF c > 4 THEN
X WriteString (' \');
X WriteLn;
X WriteString (' ');
X c := 0;
X END; (* IF *)
X Write (' ');
X WriteFilename (iptr^.file^.filename, '.SYM');
X INC (c);
X END; (* IF *)
X iptr := iptr^.next;
X END; (* WHILE *)
X
X iptr := file^.imports;
X c := 5; (* <-- force a WriteLn *)
X WHILE iptr <> NIL DO
X IF iptr^.file^.library THEN
X IF c > 4 THEN
X WriteLn;
X WriteString (' #libs: ');
X c := 0;
X END; (* IF *)
X Write (' ');
X WriteFilename (iptr^.file^.filename, '.SYM');
X INC (c);
X END; (* IF *)
X iptr := iptr^.next;
X END; (* WHILE *)
X
X WriteLn;
X IF NOT MAKEHasModulaRules THEN
X Write (ASCII.HT);
X WriteString (CompilerPathname);
X WriteString (file^.filename);
X WriteLn;
X END; (* IF *)
X END; (* IF *)
X END WriteFileDependency;
X
X (*--------------------------------------------------------------------*)
X PROCEDURE WriteAllLnkFiles;
X VAR
X c, dummy : CARDINAL;
X ptr : MakeForest.FileDefinitionList;
X BEGIN
X ptr := MakeForest.FileForest;
X c := 2;
X REPEAT
X IF Strings.Pos (ptr^.filename, '.MOD', 0, dummy) THEN
X IF NOT ptr^.library THEN
X WriteFilename (ptr^.filename, '.LNK');
X Write (' ');
X IF c > 4 THEN
X WriteString (' \');
X WriteLn;
X WriteString (' ');
X c := 0;
X END; (* IF *)
X INC (c);
X END; (* IF *)
X END; (* IF *)
X ptr := ptr^.next;
X UNTIL ptr = NIL;
X WriteLn;
X END WriteAllLnkFiles;
X
X (*--------------------------------------------------------------------*)
X PROCEDURE WriteFilename (VAR filename, extention : ARRAY OF CHAR);
X VAR
X c : CARDINAL;
X BEGIN
X c := 0;
X REPEAT
X Write (filename[c]);
X INC(c);
X UNTIL (c > HIGH (filename)) OR (filename[c] = '.');
X WriteString (extention);
X END WriteFilename;
X
X (*--------------------------------------------------------------------*)
X PROCEDURE WritePRGDependency (file : MakeForest.FileDefinitionList);
X BEGIN
X WriteLn;
X WriteFilename (file^.filename, '.PRG');
X Write (ASCII.HT); WriteString (': ');
X WriteAllLnkFiles;
X IF NOT MAKEHasModulaRules THEN
X Write (ASCII.HT); WriteString (LinkerPathname);
X WriteFilename (file^.filename, '.LNK');
X WriteLn;
X END; (* IF *)
X END WritePRGDependency;
X
X VAR
X ptr : MakeForest.FileDefinitionList;
X c : CARDINAL;
X BEGIN
X IF OpenOutput ('MAKEFILE') THEN
X (* print out the .PRG dependency first.... *)
X WritePRGDependency (MakeForest.FileForestEnd);
X WriteFileDependency (MakeForest.FileForestEnd, '.LNK');
X ptr := MakeForest.FileForest;
X WHILE ptr <> MakeForest.FileForestEnd DO
X IF NOT ptr^.library THEN
X IF Strings.Pos (ptr^.filename, '.MOD', 0, c) THEN
X WriteFileDependency (ptr, '.LNK');
X ELSE
X WriteFileDependency (ptr, '.SYM');
X END; (* IF *)
X END; (* IF *)
X ptr := ptr^.next;
X END; (* WHILE *)
X ELSE
X InOut.WriteString ('Error opening MAKEFILE');
X InOut.WriteLn;
X END; (* IF *)
X CloseOutput;
X END WriteMakefile;
X
XVAR
X modulename,
X filename : ARRAY [0 .. 132] OF CHAR;
X
XBEGIN
X IF CommandLine.NumberOfArguments() < 1 THEN
X InOut.WriteString ("Usage: MAKEMAKE main-module-modulename");
X InOut.WriteLn;
X ELSE
X CommandLine.GetArgument (1, filename);
X MakeParse.ParseModule (filename, MakeParse.main, filename);
X WriteMakefile;
X END; (* IF *)
XEND MakeMake.
SHAR_EOF
if test 9455 -ne "`wc -c < 'makemake.mod'`"
then
echo shar: "error transmitting 'makemake.mod'" '(should have been 9455 characters)'
fi
fi
echo shar: "extracting 'makepars.mod'" '(5161 characters)'
if test -f 'makepars.mod'
then
echo shar: "will not over-write existing file 'makepars.mod'"
else
sed 's/^ X//' << \SHAR_EOF > 'makepars.mod'
XIMPLEMENTATION MODULE MakeParse;
X
X (*
X * MAKEMAKE. Create a MAKEFILE for a MODULA-2 program.
X *
X * Written by Steve Tynor, 30 September 1986.
X * UUCP : tynor at gitpyr
X * USNAIL: 2550 Akers Mill Rd. T-2, Atlanta GA. 30339
X *
X * Permission is granted to distribute, copy and change this program as long
X * as this notice remains...
X *)
X
XIMPORT MakeToken;
XIMPORT MakeForest;
XIMPORT Strings;
XIMPORT MakeLibraries;
X
X (*----------------------------------------------------------------------*)
X PROCEDURE ModulenameToFilename (VAR modulename : ARRAY OF CHAR;
X defOrMod : FileType;
X VAR fname : ARRAY OF CHAR);
X CONST
X EOS = 0C;
X VAR
X c : CARDINAL;
X BEGIN
X c := 0;
X WHILE (c < HIGH (modulename)) AND (c < 8) AND (modulename[c] <> EOS) DO
X fname[c] := modulename[c];
X INC (c);
X END; (* WHILE *)
X fname[c] := '.';
X IF defOrMod = def THEN
X fname[c+1] := 'D'; fname[c+2] := 'E'; fname[c+3] := 'F';
X fname[c+4] := EOS;
X ELSE
X fname[c+1] := 'M'; fname[c+2] := 'O'; fname[c+3] := 'D';
X fname[c+4] := EOS;
X END; (* IF *)
X END ModulenameToFilename;
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE TerminatingToken(VAR token : ARRAY OF CHAR) : BOOLEAN;
X VAR
X temp : BOOLEAN;
X BEGIN
X (* had to split up due to compiler limitation... *)
X temp := (Strings.Compare (token, 'CONST') = Strings.Equal) OR
X (Strings.Compare (token, 'TYPE') = Strings.Equal) OR
X (Strings.Compare (token, 'VAR') = Strings.Equal) OR
X (Strings.Compare (token, 'MODULE') = Strings.Equal);
X RETURN temp OR
X (Strings.Compare (token, 'PROCEDURE') = Strings.Equal) OR
X (Strings.Compare (token, 'BEGIN') = Strings.Equal) OR
X (Strings.Compare (token, 'END') = Strings.Equal);
X END TerminatingToken;
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE ParseFROM ( fileDef : MakeForest.FileDefinitionList;
X VAR eof : BOOLEAN );
X VAR
X modulename, filename : ARRAY [0 .. 100] OF CHAR;
X BEGIN
X MakeToken.NextToken (modulename, eof);
X ParseModule (modulename, def, filename);
X MakeForest.AddImport (fileDef, filename);
X MakeToken.SkipTillSemicolon (eof);
X
X ParseModule (modulename, mod, filename);
X END ParseFROM;
X
X (*----------------------------------------------------------------------*)
X PROCEDURE ParseIMPORT ( fileDef : MakeForest.FileDefinitionList;
X VAR eof : BOOLEAN );
X VAR
X modulename, filename : ARRAY [0 .. 100] OF CHAR;
X BEGIN
X MakeToken.NextToken (modulename, eof);
X WHILE modulename[0] <> ';' DO
X ParseModule (modulename, def, filename);
X MakeForest.AddImport (fileDef, filename);
X
X ParseModule (modulename, mod, filename);
X MakeToken.NextToken (modulename, eof);
X END; (* WHILE *)
X END ParseIMPORT;
X
X (*----------------------------------------------------------------------*)
X PROCEDURE ParseModule (VAR modulename : ARRAY OF CHAR;
X type : FileType;
X VAR filename : ARRAY OF CHAR);
X VAR
X token : ARRAY [0 .. 132] OF CHAR;
X fileDef : MakeForest.FileDefinitionList;
X success,
X eof : BOOLEAN;
X
X BEGIN
X ModulenameToFilename (modulename, type, filename);
X
X IF MakeForest.AddFile (filename, fileDef) THEN
X MakeToken.OpenFile (filename, success);
X
X IF NOT success THEN
X IF MakeLibraries.IsALibraryModule (modulename) THEN
X fileDef^.library := TRUE;
X ELSE
X MakeForest.AddImport (fileDef, "## SOURCE FILE NOT FOUND ##");
X END; (* IF *)
X ELSE
X MakeToken.NextToken (token, eof);
X IF (type = def) AND NOT
X (Strings.Compare (token, 'DEFINITION') = Strings.Equal) THEN
X MakeForest.AddImport (fileDef,
X "## Expected a 'DEFINITION' module ##");
X ELSIF (type = mod) AND NOT
X (Strings.Compare (token, 'IMPLEMENTATION') = Strings.Equal) THEN
X MakeForest.AddImport (fileDef,
X "## Expected an 'IMPLEMENTATION' module ##");
X ELSIF (type = main) AND NOT
X (Strings.Compare (token, 'MODULE') = Strings.Equal) THEN
X MakeForest.AddImport (fileDef,
X "## Expected a 'MODULE' module ##");
X END; (* IF / ELSE / ENDIF *)
X MakeToken.SkipTillSemicolon (eof);
X token := ';';
X WHILE (NOT eof) AND (NOT TerminatingToken(token)) DO
X IF Strings.Compare (token, 'FROM') = Strings.Equal THEN
X ParseFROM (fileDef, eof);
X ELSIF Strings.Compare (token, 'IMPORT') = Strings.Equal THEN
X ParseIMPORT (fileDef, eof);
X END; (* IF *)
X MakeToken.NextToken (token, eof);
X END; (* WHILE *)
X END; (* IF file opened *)
X MakeToken.CloseFile;
X END; (* IF we need to check this one *)
X
X END ParseModule;
X
XEND MakeParse.
SHAR_EOF
if test 5161 -ne "`wc -c < 'makepars.mod'`"
then
echo shar: "error transmitting 'makepars.mod'" '(should have been 5161 characters)'
fi
fi
echo shar: "extracting 'maketoke.mod'" '(5757 characters)'
if test -f 'maketoke.mod'
then
echo shar: "will not over-write existing file 'maketoke.mod'"
else
sed 's/^ X//' << \SHAR_EOF > 'maketoke.mod'
XIMPLEMENTATION MODULE MakeToken;
X
X (*
X * MAKEMAKE. Create a MAKEFILE for a MODULA-2 program.
X *
X * Written by Steve Tynor, 30 September 1986.
X * UUCP : tynor at gitpyr
X * USNAIL: 2550 Akers Mill Rd. T-2, Atlanta GA. 30339
X *
X * Permission is granted to distribute, copy and change this program as long
X * as this notice remains...
X *)
X
XIMPORT Streams;
X
XVAR
X currentCh : CHAR;
X currentStream : Streams.Stream;
X
X (*======================================================================*)
X MODULE StreamStack;
X IMPORT Streams;
X EXPORT Pop, Push;
X
X CONST
X StackSize = 20;
X VAR
X StrStack : ARRAY [1 .. StackSize] OF Streams.Stream;
X CharStack : ARRAY [1 .. StackSize] OF CHAR;
X StackPtr : CARDINAL;
X
X (*--------------------------------------------------------------------*)
X PROCEDURE Push (str : Streams.Stream; ch : CHAR);
X BEGIN
X IF StackPtr + 1 <= StackSize THEN
X INC (StackPtr);
X StrStack [StackPtr] := str;
X CharStack[StackPtr] := ch;
X END; (* IF *)
X END Push;
X
X (*--------------------------------------------------------------------*)
X PROCEDURE Pop (VAR str : Streams.Stream; VAR ch : CHAR);
X BEGIN
X IF StackPtr > 0 THEN
X str := StrStack [StackPtr];
X ch := CharStack[StackPtr];
X DEC (StackPtr);
X END; (* IF *)
X END Pop;
X
X BEGIN
X StackPtr := 0;
X END StreamStack;
X (*======================================================================*)
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE OpenFile (VAR filename : ARRAY OF CHAR;
X VAR success : BOOLEAN);
X VAR
X result : INTEGER;
X BEGIN
X Push (currentStream, currentCh);
X Streams.OpenStream(currentStream, filename, Streams.READ, result);
X currentCh := ' ';
X success := result = 0;
X END OpenFile;
X
X (*----------------------------------------------------------------------*)
X PROCEDURE CloseFile;
X VAR
X result : INTEGER;
X BEGIN
X Streams.CloseStream(currentStream, result);
X Pop (currentStream, currentCh);
X END CloseFile;
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE SeparatingChar (ch : CHAR) : BOOLEAN;
X (* we're just worried about a subset of the real separating chars... *)
X BEGIN
X RETURN NOT (((ORD(ch) >= ORD('a')) AND (ORD(ch) <= ORD('z'))) OR
X ((ORD(ch) >= ORD('A')) AND (ORD(ch) <= ORD('Z'))) OR
X ((ORD(ch) >= ORD('0')) AND (ORD(ch) <= ORD('9'))));
X END SeparatingChar;
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE NextToken (VAR token : ARRAY OF CHAR;
X VAR eof : BOOLEAN);
X VAR
X c : CARDINAL;
X BEGIN
X c := 0;
X IF currentCh = ';' THEN
X token[0] := ';';
X token[1] := 0C;
X eof := Streams.EOS(currentStream);
X Streams.Read8Bit(currentStream, currentCh);
X RETURN;
X END; (* IF *)
X WHILE SeparatingChar (currentCh) DO
X Streams.Read8Bit(currentStream, currentCh);
X IF currentCh = ';' THEN
X token[0] := ';';
X token[1] := 0C;
X eof := Streams.EOS(currentStream);
X Streams.Read8Bit(currentStream, currentCh);
X RETURN;
X ELSIF currentCh = '(' THEN
X token[c] := currentCh;
X Streams.Read8Bit(currentStream, currentCh);
X IF currentCh = '*' THEN
X SkipComment;
X ELSE
X token[0] := '(';
X token[1] := currentCh;
X c := 2;
X END; (* IF *)
X END; (* IF *)
X END; (* WHILE *)
X REPEAT
X IF currentCh = '(' THEN
X token[c] := currentCh;
X Streams.Read8Bit(currentStream, currentCh);
X IF currentCh = '*' THEN
X IF c > 0 THEN
X token[c+1] := 0C;
X SkipComment;
X RETURN;
X ELSE
X SkipComment;
X END; (* IF *)
X END; (* IF *)
X END; (* IF *)
X token[c] := currentCh;
X INC (c);
X Streams.Read8Bit(currentStream, currentCh);
X UNTIL Streams.EOS(currentStream) OR
X (c > HIGH (token)) OR
X SeparatingChar (currentCh);
X token[c] := 0C;
X eof := Streams.EOS (currentStream);
X END NextToken;
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE SkipTillSemicolon (VAR eof : BOOLEAN);
X VAR
X ch : CHAR;
X BEGIN
X REPEAT
X IF (NOT Streams.EOS(currentStream)) AND (currentCh = '(') THEN
X Streams.Read8Bit(currentStream, currentCh);
X IF (NOT Streams.EOS (currentStream)) AND (currentCh = '*') THEN
X SkipComment;
X END; (* IF *)
X ELSE
X Streams.Read8Bit(currentStream, currentCh);
X END; (* IF *)
X UNTIL Streams.EOS (currentStream) OR (currentCh = ';');
X END SkipTillSemicolon;
X
X
X (*----------------------------------------------------------------------*)
X PROCEDURE SkipComment;
X VAR
X level : CARDINAL;
X done : BOOLEAN;
X BEGIN
X level := 1;
X Streams.Read8Bit(currentStream, currentCh);
X done := FALSE;
X REPEAT
X IF (NOT Streams.EOS(currentStream)) AND (currentCh = '*') THEN
X Streams.Read8Bit(currentStream, currentCh);
X IF (NOT Streams.EOS(currentStream)) AND (currentCh = ')') THEN
X DEC(level);
X done := level = 0;
X END; (* IF *)
X ELSIF (NOT Streams.EOS(currentStream)) AND (currentCh = '(') THEN
X Streams.Read8Bit(currentStream, currentCh);
X IF (NOT Streams.EOS (currentStream)) AND (currentCh = '*') THEN
X INC(level);
X END; (* IF *)
X ELSE
X Streams.Read8Bit(currentStream, currentCh);
X END; (* IF *)
X UNTIL Streams.EOS(currentStream) OR done;
X END SkipComment;
X
XBEGIN
X currentCh := ' ';
XEND MakeToken.
SHAR_EOF
if test 5757 -ne "`wc -c < 'maketoke.mod'`"
then
echo shar: "error transmitting 'maketoke.mod'" '(should have been 5757 characters)'
fi
fi
exit 0
# End of shell archive
More information about the Comp.sources.unix
mailing list