From 39503ad331f1c85002fe19456b871527c59218e2 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Tue, 18 Jan 2022 19:59:19 +0400 Subject: [PATCH] building almost done. --- src/unix/vpkEnv.Mod | 34 +++++++++++++++++++++++++++++++++- src/vpkInstaller.Mod | 36 +++++++++++++++++++++++++++++++++--- src/vpkJsonDepRetriever.Mod | 29 ++++++++++++++++++++++++++++- src/vpkSettings.Mod | 2 ++ 4 files changed, 96 insertions(+), 5 deletions(-) diff --git a/src/unix/vpkEnv.Mod b/src/unix/vpkEnv.Mod index e0a0f33..378b0c9 100644 --- a/src/unix/vpkEnv.Mod +++ b/src/unix/vpkEnv.Mod @@ -1,5 +1,5 @@ MODULE vpkEnv; -IMPORT Files, Platform, Strings, Out, vpkSettings, vpkFiles; +IMPORT Files, Platform, Strings, Out, vpkSettings, vpkFiles, StringList; VAR conf, confDir : ARRAY 256 OF CHAR; @@ -12,6 +12,11 @@ BEGIN END; END getHome; +PROCEDURE getGraphName*(VAR grname: ARRAY OF CHAR); +BEGIN + COPY (vpkSettings.graphName, grname); +END getGraphName; + PROCEDURE createIfNotThere*(VAR fileName: ARRAY OF CHAR); BEGIN IF ~vpkFiles.ExistsByName(fileName) THEN @@ -22,6 +27,23 @@ BEGIN END createIfNotThere; +PROCEDURE getSrcRelPath*(VAR depName, path0: ARRAY OF CHAR): StringList.pstring; +VAR + p: StringList.pstring; + len: INTEGER; +BEGIN + len := 9 + Strings.Length(depName) + Strings.Length(path0); + (* 5 chars are ../, /, /, plus a couple of chars *) + NEW(p, len); + COPY("../", p^); + Strings.Append(vpkSettings.vpkDepDir, p^); + Strings.Append("/", p^); + Strings.Append(depName, p^); + Strings.Append("/", p^); + Strings.Append(path0, p^); + RETURN p; +END getSrcRelPath; + PROCEDURE mkConfDirPath(home: ARRAY OF CHAR; VAR path: ARRAY OF CHAR); BEGIN confDir := home; @@ -59,6 +81,16 @@ BEGIN Strings.Append("/", path); END mkPkgDirPath; +PROCEDURE mkBldDirPath*(VAR prefix, builddir: ARRAY OF CHAR); +BEGIN + COPY(prefix, builddir); + createIfNotThere(builddir); + Strings.Append("/", builddir); + Strings.Append(vpkSettings.vpkBldDir, builddir); + createIfNotThere(builddir); + Strings.Append("/", builddir); +END mkBldDirPath; + PROCEDURE setConfFileName; VAR home: ARRAY 128 OF CHAR; diff --git a/src/vpkInstaller.Mod b/src/vpkInstaller.Mod index a346e49..fbfd6e6 100644 --- a/src/vpkInstaller.Mod +++ b/src/vpkInstaller.Mod @@ -1,5 +1,5 @@ MODULE vpkInstaller; -IMPORT Out, StringList, vpkResolver, vpkdepTree, vpkDot, vpkSettings, vpkJsonDepRetriever, vpkSyncer; +IMPORT Out, StringList, vpkResolver, vpkdepTree, vpkDot, vpkEnv, vpkJsonDepRetriever, vpkSyncer, Platform; PROCEDURE resolve*(VAR unit: ARRAY OF CHAR): vpkdepTree.TdepTree; VAR @@ -7,7 +7,9 @@ VAR lst: StringList.TStringList; dep: vpkdepTree.Tdep; i : LONGINT; + graphName : ARRAY 32 OF CHAR; BEGIN + vpkEnv.getGraphName(graphName); Out.Ln; Out.String("resolving dependencies..."); Out.Ln; tree := vpkResolver.resolve(unit, vpkJsonDepRetriever.getDeps); Out.String(" done! (:"); Out.Ln; Out.Ln; @@ -15,7 +17,7 @@ BEGIN Out.String("dependency graph:"); Out.Ln; Out.String("-----------------"); Out.Ln; StringList.DumpOut(lst); - lst.Dump(lst, vpkSettings.graphName); + lst.Dump(lst, graphName); Out.String("-----------------"); Out.Ln; Out.String("(use 'dot -Tpng deps.dot > deps.png' to get the graph image)"); Out.Ln; Out.Ln; Out.String("dependencies will be installed in the following order:"); Out.Ln; @@ -50,16 +52,44 @@ PROCEDURE build*(VAR package, prefix, tree: ARRAY OF CHAR); VAR depTree: vpkdepTree.TdepTree; dep: vpkdepTree.Tdep; - i: LONGINT; + i, j: LONGINT; URI: ARRAY 128 OF CHAR; typ: ARRAY 16 OF CHAR; + keys, values: StringList.TStringList; + k, v: StringList.pstring; + b: BOOLEAN; + builddir: ARRAY 512 OF CHAR; + cmd, srcPath: StringList.pstring; + chdirRes: INTEGER; BEGIN + vpkEnv.mkBldDirPath(prefix, builddir); + b := FALSE; depTree := resolve(package); i := 0; REPEAT dep := vpkdepTree.Get(depTree, i); vpkJsonDepRetriever.getURIandType(dep, URI, typ); vpkSyncer.fetch(dep.name^, URI, typ, prefix); + b := vpkJsonDepRetriever.getBuildInfo(dep, keys, values); + IF b THEN + j := 0; + REPEAT + k := keys.GetString(keys, j); + v := values.GetString(values, j); + Out.Int(j, 0); Out.String(": "); Out.String(k^); Out.Ln; + Out.Int(j, 0); Out.String(": "); Out.String(v^); Out.Ln; + chdirRes := Platform.Chdir(builddir); + IF chdirRes # 0 THEN + Out.String("failed to change directory to "); Out.String(builddir); Out.Ln; Out.String("this should never happen."); Out.Ln; HALT(66); + END; + srcPath := vpkEnv.getSrcRelPath(dep.name^, v^); + Out.String(srcPath^); Out.Ln; + INC(j) + UNTIL j = keys.Count - 1; + ELSE + Out.String("no build info found for the package: "); Out.String(dep.name^); Out.Ln; + HALT(67); + END; INC(i); UNTIL i = depTree.Count; END build; diff --git a/src/vpkJsonDepRetriever.Mod b/src/vpkJsonDepRetriever.Mod index 71176c3..7bcd1f0 100644 --- a/src/vpkJsonDepRetriever.Mod +++ b/src/vpkJsonDepRetriever.Mod @@ -1,6 +1,33 @@ MODULE vpkJsonDepRetriever; IMPORT Out, StringList, strutils, vpkJsonParser, vpkStorage, vpkSettings, vpkdepTree; +PROCEDURE getBuildInfo*(VAR d: vpkdepTree.Tdep; VAR k, v: StringList.TStringList): BOOLEAN; +VAR + p: strutils.pstring; + jsonRecord, build : vpkJsonParser.JsonTypePointer; + keys, values: StringList.TStringList; + b: BOOLEAN; +BEGIN + b := FALSE; + p := NIL; + vpkStorage.json2pstring(d.name^, p); + IF p # NIL THEN + jsonRecord := vpkJsonParser.Create(p^); + build := jsonRecord.GetNonTerminal(jsonRecord, vpkSettings.bldType); + IF build # NIL THEN + keys := NIL; values := NIL; + build.GetTerminalKeys(build, keys); + build.GetTerminalValues(build, values); + k := keys; v := values; + RETURN TRUE + ELSE + RETURN FALSE + END + ELSE + RETURN FALSE + END; +END getBuildInfo; + PROCEDURE getURIandType*(VAR d: vpkdepTree.Tdep; VAR URI: ARRAY OF CHAR; VAR type: ARRAY OF CHAR); VAR jsonRecord, remote: vpkJsonParser.JsonTypePointer; @@ -21,7 +48,7 @@ BEGIN i := 0; REPEAT k := keys.GetString(keys, i); - v := keys.GetString(values, i); + v := values.GetString(values, i); IF k^ = vpkSettings.rmtTypKey THEN COPY(v^, type) END; IF k^ = vpkSettings.rmtTreeKey THEN COPY(v^, URI) END; INC(i); diff --git a/src/vpkSettings.Mod b/src/vpkSettings.Mod index 91c6a42..26f7635 100644 --- a/src/vpkSettings.Mod +++ b/src/vpkSettings.Mod @@ -6,6 +6,7 @@ CONST vpkTreeDir* = "vipackTree"; vpkPkgDir* = "vpkLocal"; vpkDepDir* = "deps"; + vpkBldDir* = "build"; graphName* = "deps.dot"; @@ -16,6 +17,7 @@ CONST rmtTypHttpsVal* = "https"; rmtTypGemiVal* = "gemini"; rmtTreeKey* = "path"; + bldType* = "Build"; defTreeVal* = "https://github.com/vishaps/vipackTree"; confTreeVal* = defTreeVal; defTypVal* = rmtTypGitVal;