From ea68722b77353c95a1c1588a0d750e36254ea9ba Mon Sep 17 00:00:00 2001 From: Leandro Ostera Date: Mon, 17 Dec 2018 19:10:26 +0100 Subject: [PATCH 1/4] Package a library with its dependencies --- src/packager/packager.re | 185 +++++++++++---------------------------- 1 file changed, 53 insertions(+), 132 deletions(-) diff --git a/src/packager/packager.re b/src/packager/packager.re index 86fc82f..a74ba0f 100644 --- a/src/packager/packager.re +++ b/src/packager/packager.re @@ -1,145 +1,66 @@ -/** - * How this works? - * 1. Build a dependencies list of the current package in the correct loading order - * ocamlfind query PACKAGE_NAME -r -p-format -predicates byte - * 2. With that list of all packages. We can find cmi and cma files and building them one by one - * ocamlfind query PACKAGE_NAME -i-format -predicates byte - * ocamlfind query PACKAGE_NAME -a-format -predicates byte - * 3. There are some deduplication going on so we don't build the package twice - */ -open Utils; -let verbose = ref(false); -let output = ref(None); - -let execute = execute(~verbose); - -let usage = () => { - Format.eprintf("Usage: sketch [find packages] @."); - Format.eprintf(" --verbose@."); - Format.eprintf(" --output\t\t\tBuild output directory@."); - Format.eprintf(" --help\t\t\tDisplay usage@."); - exit(1); +let verbose = ref(true); + +module Ocamlfind = { + let cmas : string => string = name => { + Utils.execute( + ~verbose, + ["ocamlfind query", name, "-r -predicates byte -a-format"], + ); + }; + let cmis : string => string = name => { + Utils.execute( + ~verbose, + ["ocamlfind query", name, "-r -predicates byte -i-format"], + ); + }; }; -let rec scan_args = acc => - fun - | ["--verbose", ...xs] => { - verbose := true; - scan_args(acc, xs); - } - | ["--help" | "-h", ..._] => usage() - | ["--output", outputDir, ...xs] => { - output := Some(outputDir); - scan_args(acc, xs); - } - | [x, ...xs] => scan_args([x, ...acc], xs) - | [] => List.rev(acc); +module Ocamlc = { + let archive = (aFiles, output) => { + let cma = output++".cma"; + Utils.execute( + ~verbose, + ["ocamlc -a", aFiles, "-o", cma], + ) |> ignore; + cma + } +}; -let findDeps = name => - execute([ - "ocamlfind", - "query", - name, - "-r", - "-p-format", - "-predicates byte", - ]); -let findCmi = name => - execute(["ocamlfind", "query", name, "-i-format", "-predicates byte"]); -let findCma = name => - execute(["ocamlfind", "query", name, "-a-format", "-predicates byte"]); +module Jsoo = { + let lib = name => name ++ ".sketch.lib.js" -let buildLib = (~outputDir, packageName) => { - if (verbose^) { - Printf.printf("Building library with jsoo: %s\n", packageName); + let autoBootstrap = libName => { + Utils.execute( + ~verbose, + [" + echo \"sketch_private__"++libName++"(self);\"", + ">>", + lib(libName)]) |> ignore; }; - let safePkgName = toSafePackageName(packageName); - let funcName = "sketch__private__" ++ safePkgName; - let cmaPath = findCma(packageName); - switch (String.trim(cmaPath)) { - | "" => print_endline("Can't find cma file for package " ++ packageName) - | _ => - execute([ - "js_of_ocaml", - "--wrap-with-fun=" ++ funcName, - "--toplevel", - findCmi(packageName), - findCma(packageName), - "-o", - Filename.concat(outputDir, safePkgName ++ ".lib.sketch.js"), - ]) - |> ignore + let compile = (libName, archive, cmis) => { + Utils.execute( + ~verbose, + ["js_of_ocaml", + "--wrap-with-fun=sketch_private__"++libName, + "--toplevel", cmis, archive, "-o", lib(libName)] + ) |> ignore; }; }; -module SS = Set.Make(String); -module LibMap = Map.Make(String); - -/* - * These packages are for compatibility with OCaml - * But Sketch only supports OCaml > 4.06 - * So this will result in not found packages - */ - -let excludedPackages = SS.of_list(["uchar", "result", "bytes"]); +module Cli = { + let run = () => { + let libName = Array.get(Sys.argv, 1); + Printf.printf("Beginning build for \"%s\"...\n", libName); -module J = Json; + let cmas = Ocamlfind.cmas(libName); + let cmis = Ocamlfind.cmis(libName); + let bundle = Ocamlc.archive(cmas, libName); + Jsoo.compile(libName, bundle, cmis); + Jsoo.autoBootstrap(libName); -let build = (~outputDir, toplevelPkgs) => { - /* if (verbose^) { - Printf.printf("Building dependencies for: %s\n", toplevelPkg); - }; */ - let libsToBuild = ref(SS.empty); - let libsWithDependencies = - toplevelPkgs - |> List.fold_left( - (map: LibMap.t(list(string)), pkg) => { - let allDeps = - findDeps(pkg) - |> String.split_on_char('\n') - |> List.filter(name => name != "") - |> List.filter(name => !SS.mem(name, excludedPackages)); - - let _ = - allDeps - |> List.iter(name => libsToBuild := libsToBuild^ |> SS.add(name)); - - map |> LibMap.add(pkg, allDeps); - }, - LibMap.empty, - ); - - let _ = libsToBuild^ |> SS.iter(name => buildLib(~outputDir, name)); - let _ = - LibMap.fold( - (topName, libs, acc) => { - let libField = - J.Object([ - (topName, J.Array(libs |> List.map(name => J.String(name)))), - ]); - [libField, ...acc]; - }, - libsWithDependencies, - [], - ) - |> (list => J.Array(list)) - |> (json => J.stringify(json)) - |> writeFileSync(~path=Filename.concat(outputDir, "list.json")); - (); + Printf.printf("📦 Done!\n"); }; - -let _ = { - let args = List.tl(Array.to_list(Sys.argv)); - let args = scan_args([], args); - - let outputDir = - switch (output^) { - | None => Filename.concat(Sys.getcwd(), "packages") - | Some(output) => output - }; - mkdirp(outputDir); - - build(~outputDir, args); - print_endline("Done !"); }; + +Cli.run(); From a3d08185b0084bd219d82b1b3f247d5608d5ddff Mon Sep 17 00:00:00 2001 From: Leandro Ostera Date: Thu, 20 Dec 2018 18:53:21 +0100 Subject: [PATCH 2/4] Reformat --- src/packager/packager.re | 88 +++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 41 deletions(-) diff --git a/src/packager/packager.re b/src/packager/packager.re index a74ba0f..ce690e2 100644 --- a/src/packager/packager.re +++ b/src/packager/packager.re @@ -1,66 +1,72 @@ let verbose = ref(true); module Ocamlfind = { - let cmas : string => string = name => { - Utils.execute( - ~verbose, - ["ocamlfind query", name, "-r -predicates byte -a-format"], - ); - }; - let cmis : string => string = name => { - Utils.execute( - ~verbose, - ["ocamlfind query", name, "-r -predicates byte -i-format"], - ); - }; + let cmas: string => string = + name => + Utils.execute( + ~verbose, + ["ocamlfind query", name, "-r -predicates byte -a-format"], + ); + let cmis: string => string = + name => + Utils.execute( + ~verbose, + ["ocamlfind query", name, "-r -predicates byte -i-format"], + ); }; module Ocamlc = { let archive = (aFiles, output) => { - let cma = output++".cma"; - Utils.execute( - ~verbose, - ["ocamlc -a", aFiles, "-o", cma], - ) |> ignore; - cma - } + let cma = output ++ ".cma"; + Utils.execute(~verbose, ["ocamlc -a", aFiles, "-o", cma]) |> ignore; + cma; + }; }; module Jsoo = { - let lib = name => name ++ ".sketch.lib.js" + let lib = name => name ++ ".sketch.lib.js"; - let autoBootstrap = libName => { + let autoBootstrap = libName => Utils.execute( ~verbose, - [" - echo \"sketch_private__"++libName++"(self);\"", - ">>", - lib(libName)]) |> ignore; - }; + [ + " + echo \"sketch_private__" ++ libName ++ "(self);\"", + ">>", + lib(libName), + ], + ) + |> ignore; - let compile = (libName, archive, cmis) => { + let compile = (libName, archive, cmis) => Utils.execute( ~verbose, - ["js_of_ocaml", - "--wrap-with-fun=sketch_private__"++libName, - "--toplevel", cmis, archive, "-o", lib(libName)] - ) |> ignore; - }; + [ + "js_of_ocaml", + "--wrap-with-fun=sketch_private__" ++ libName, + "--toplevel", + cmis, + archive, + "-o", + lib(libName), + ], + ) + |> ignore; }; module Cli = { let run = () => { - let libName = Array.get(Sys.argv, 1); - Printf.printf("Beginning build for \"%s\"...\n", libName); + let libName = Sys.argv[1]; + Printf.printf("Beginning build for \"%s\"...\n", libName); - let cmas = Ocamlfind.cmas(libName); - let cmis = Ocamlfind.cmis(libName); - let bundle = Ocamlc.archive(cmas, libName); - Jsoo.compile(libName, bundle, cmis); - Jsoo.autoBootstrap(libName); + let cmas = Ocamlfind.cmas(libName); + let cmis = Ocamlfind.cmis(libName); + let bundle = Ocamlc.archive(cmas, libName); + Jsoo.compile(libName, bundle, cmis); + Jsoo.autoBootstrap(libName); - Printf.printf("📦 Done!\n"); -}; + Printf.printf("📦 Done!\n"); + }; }; Cli.run(); From b3669854d2a6657a22f73f10a365996a32a8b922 Mon Sep 17 00:00:00 2001 From: Leandro Ostera Date: Thu, 20 Dec 2018 19:00:06 +0100 Subject: [PATCH 3/4] Correct small weird newlines in command --- src/packager/packager.re | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/packager/packager.re b/src/packager/packager.re index ce690e2..0264b8d 100644 --- a/src/packager/packager.re +++ b/src/packager/packager.re @@ -30,8 +30,7 @@ module Jsoo = { Utils.execute( ~verbose, [ - " - echo \"sketch_private__" ++ libName ++ "(self);\"", + "echo \"sketch_private__" ++ libName ++ "(self);\"", ">>", lib(libName), ], From 89cb8e6b6082190e58543e31eb18331520bca6a9 Mon Sep 17 00:00:00 2001 From: Leandro Ostera Date: Thu, 20 Dec 2018 19:02:29 +0100 Subject: [PATCH 4/4] Small stylistic change --- src/packager/packager.re | 51 ++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/src/packager/packager.re b/src/packager/packager.re index 0264b8d..8055a45 100644 --- a/src/packager/packager.re +++ b/src/packager/packager.re @@ -1,24 +1,17 @@ let verbose = ref(true); +let exec = Utils.execute(~verbose); module Ocamlfind = { - let cmas: string => string = - name => - Utils.execute( - ~verbose, - ["ocamlfind query", name, "-r -predicates byte -a-format"], - ); - let cmis: string => string = - name => - Utils.execute( - ~verbose, - ["ocamlfind query", name, "-r -predicates byte -i-format"], - ); + let cmas = name => + ["ocamlfind query", name, "-r -predicates byte -a-format"] |> exec; + let cmis = name => + ["ocamlfind query", name, "-r -predicates byte -i-format"] |> exec; }; module Ocamlc = { let archive = (aFiles, output) => { let cma = output ++ ".cma"; - Utils.execute(~verbose, ["ocamlc -a", aFiles, "-o", cma]) |> ignore; + ["ocamlc -a", aFiles, "-o", cma] |> exec |> ignore; cma; }; }; @@ -27,29 +20,21 @@ module Jsoo = { let lib = name => name ++ ".sketch.lib.js"; let autoBootstrap = libName => - Utils.execute( - ~verbose, - [ - "echo \"sketch_private__" ++ libName ++ "(self);\"", - ">>", - lib(libName), - ], - ) + ["echo \"sketch_private__" ++ libName ++ "(self);\"", ">>", lib(libName)] + |> exec |> ignore; let compile = (libName, archive, cmis) => - Utils.execute( - ~verbose, - [ - "js_of_ocaml", - "--wrap-with-fun=sketch_private__" ++ libName, - "--toplevel", - cmis, - archive, - "-o", - lib(libName), - ], - ) + [ + "js_of_ocaml", + "--wrap-with-fun=sketch_private__" ++ libName, + "--toplevel", + cmis, + archive, + "-o", + lib(libName), + ] + |> exec |> ignore; };