DEADSOFTWARE

cpmake: fix open source out of any subsystem
[cpc.git] / src / generic / Dsw / Mod / MakeMain.cp
index b88795d846777093012fcf5ba61934780c18ff28..ad0ead7eb2d123284edf9388fa1e50b62c15026d 100644 (file)
@@ -123,6 +123,11 @@ MODULE DswMakeMain;
     END
   END Define;
 
+  PROCEDURE DefineNew (IN n: ARRAY OF CHAR);
+  BEGIN
+    Define(n, FALSE);
+  END DefineNew;
+
   PROCEDURE AddModule (IN n: ARRAY OF CHAR; selectors: Selector; dir: DevCPM.Directory);
     VAR i, res: INTEGER; m: Module;
   BEGIN
@@ -253,11 +258,13 @@ MODULE DswMakeMain;
     END
   END ParseArgs;
 
-  PROCEDURE ReadDefines;
-    VAR loc: Files.Locator; name: Files.Name; m: DswDocuments.Model; r: DswDocuments.Reader; i, res: INTEGER;
+  PROCEDURE ReadLines (loc: Files.Locator; IN name: Files.Name; p: PROCEDURE (IN s: ARRAY OF CHAR));
+    VAR s: Name; m: DswDocuments.Model; r: DswDocuments.Reader; i, res: INTEGER;
   BEGIN
-    loc := Files.dir.This(base).This(target);
-    DswDocuments.Open(loc, "defines", m, res);
+    ASSERT(loc # NIL, 20);
+    ASSERT(name # "", 21);
+    ASSERT(p # NIL, 22);
+    DswDocuments.Open(loc, name, m, res);
     IF res = 0 THEN
       r := m.NewReader(NIL);
       r.SetPos(0);
@@ -265,13 +272,14 @@ MODULE DswMakeMain;
       WHILE ~r.eot DO
         i := 0;
         WHILE ~r.eot & (r.char <= 20X) DO r.Read END;
-        WHILE ~r.eot & (r.char > 20X) DO name[i] := r.char; r.Read; INC(i) END;
-        IF i # 0 THEN name[i] := 0X; Define(name, FALSE) END
+        WHILE ~r.eot & (r.char > 20X) DO s[i] := r.char; r.Read; INC(i) END;
+        IF i # 0 THEN s[i] := 0X; p(s) END
       END
     END
-  END ReadDefines;
+  END ReadLines;
 
   PROCEDURE CheckParams;
+    VAR loc: Files.Locator;
   BEGIN
     IF (exe # NIL) & (exe^ = "") THEN
       Error("specified empty file name for exe", "", "", 0)
@@ -282,7 +290,9 @@ MODULE DswMakeMain;
     IF base^ = "" THEN
       Error("specified empty path to cpmake rules", "", "", 0)
     END;
-    ReadDefines
+    loc := Files.dir.This(base).This(target);
+    ReadLines(loc, "defines", DefineNew);
+    ReadLines(loc, "libs", AddLib)
   END CheckParams;
 
   (* --------- loader --------- *)
@@ -422,33 +432,37 @@ MODULE DswMakeMain;
     Kernel.FastCollect
   END CheckModule;
 
-  PROCEDURE MakePath (IN dir, name: Files.Name; IN type: Files.Type; OUT path: Files.Name);
+  PROCEDURE GetModText (IN base, sub, name: Files.Name; OUT path: Files.Name; OUT text: DswDocuments.Model);
+    VAR res: INTEGER; loc: Files.Locator;
   BEGIN
     ASSERT(name # "", 21);
-    IF dir = "" THEN path := modDir + "/" + name
-    ELSE path := dir + "/" + modDir + "/" + name
+    IF sub = "" THEN
+      loc := Files.dir.This(base);
+      IF base = "" THEN path := name
+      ELSE path := base + "/" + name
+      END
+    ELSE
+      loc := Files.dir.This(base).This(sub).This(modDir);
+      IF base = "" THEN path := sub + "/" + modDir + "/" + name
+      ELSE path := base + "/" + sub + "/" + modDir + "/" + name
+      END
     END;
-    Kernel.MakeFileName(path, type)
-  END MakePath;
+    DswDocuments.Open(loc, name, text, res)
+  END GetModText;
 
-  PROCEDURE Open (loc: Files.Locator; IN sub, name: Files.Name; OUT path: Files.Name; OUT text: DswDocuments.Model);
-    VAR res: INTEGER;
+  PROCEDURE Open (IN base, sub, name: Files.Name; OUT path: Files.Name; OUT text: DswDocuments.Model);
+    VAR cp, odc: Files.Name;
   BEGIN
-    ASSERT(loc # NIL, 20);
-    ASSERT(name # "", 21);
-    (* !!! use Kernel.MakeFileName instead ".ext" concat !!! *)
-    MakePath(sub, name, "cp", path);
-    DswDocuments.Open(loc, name + ".cp", text, res);
+    ASSERT(name # "", 20);
+    Files.dir.GetFileName(name, "cp", cp); (* !!! *)
+    GetModText(base, sub, cp, path, text);
     IF text = NIL THEN
-      MakePath(sub, name, "odc", path);
-      DswDocuments.Open(loc, name + ".odc", text, res);
+      Files.dir.GetFileName(name, "odc", odc); (* !!! *)
+      GetModText(base, sub, odc, path, text);
       IF (text = NIL) & (sub = "") THEN
-        MakePath(sysDir, name, "cp", path);
-        loc := Files.dir.This(sysDir).This(modDir);
-        DswDocuments.Open(loc, name + ".cp", text, res);
+        GetModText(base, sysDir, cp, path, text);
         IF text = NIL THEN
-          MakePath(sysDir, name, "odc", path);
-          DswDocuments.Open(loc, name + ".odc", text, res);
+          GetModText(base, sysDir, odc, path, text);
           IF text = NIL THEN
             path := ""
           END
@@ -459,17 +473,18 @@ MODULE DswMakeMain;
 
   PROCEDURE GetSource (IN modName: ARRAY OF CHAR; list: DevCPM.Directory; OUT path: Files.Name; OUT s: String);
     VAR
-      sub, name: Files.Name; loc: Files.Locator; base: DevCPM.Directory; 
-      text: DswDocuments.Model; r: DswDocuments.Reader; i, res: INTEGER;
+      sub, name: Files.Name;
+      base: DevCPM.Directory;
+      text: DswDocuments.Model;
+      r: DswDocuments.Reader;
+      i, res: INTEGER;
   BEGIN
     s := NIL; path := ""; base := list;
     Kernel.SplitName(modName, sub, name);
-    loc := Files.dir.This(sub).This(modDir);
-    Open(loc, sub, name, path, text);
+    Open("", sub, name, path, text);
     WHILE (text = NIL) & (base # NIL) DO
       ASSERT(base.legacy, 100);
-      loc := Files.dir.This(base.path).This(sub).This(modDir);
-      Open(loc, sub, name, path, text);
+      Open(base.path, sub, name, path, text);
       base := base.next
     END;
     IF text # NIL THEN
@@ -532,7 +547,7 @@ MODULE DswMakeMain;
         CheckModule(m, src, ok);
         IF ~ok THEN INC(err) END
       ELSE
-        Error("unable to open module ^1", m.name$, "", 0)
+        Error("unable to open module ^0", m.name$, "", 0)
       END;
       INC(i)
     END;