diff options
| author | Eduardo Julian | 2020-08-29 01:06:42 -0400 | 
|---|---|---|
| committer | Eduardo Julian | 2020-08-29 01:06:42 -0400 | 
| commit | b1f0014dd9080c6643ecd73db5233fbdff032419 (patch) | |
| tree | 63650a451b0974a5654b06bf4f33dae7deceef54 /stdlib/source/program/aedifex/command/build.lux | |
| parent | a5a15c191c43a660bb0c8e78e93d097e27966177 (diff) | |
Test programs + auti build/test.
Diffstat (limited to 'stdlib/source/program/aedifex/command/build.lux')
| -rw-r--r-- | stdlib/source/program/aedifex/command/build.lux | 146 | 
1 files changed, 146 insertions, 0 deletions
diff --git a/stdlib/source/program/aedifex/command/build.lux b/stdlib/source/program/aedifex/command/build.lux new file mode 100644 index 000000000..0e5d1e229 --- /dev/null +++ b/stdlib/source/program/aedifex/command/build.lux @@ -0,0 +1,146 @@ +(.module: +  [lux (#- Name) +   ["." host (#+ import:)] +   [abstract +    [monad (#+ do)]] +   [control +    ["." try (#+ Try)] +    ["." exception (#+ exception:)] +    ["." io (#+ IO)] +    [concurrency +     ["." promise ("#@." monad)]]] +   [data +    ["." product] +    ["." maybe] +    ["." text ("#@." equivalence) +     ["%" format (#+ format)]] +    [collection +     ["." list ("#@." functor)] +     ["." dictionary]]] +   [world +    ["." file (#+ Path)]]] +  ["." /// #_ +   ["#" project] +   ["#." action] +   ["#." command (#+ Command)] +   ["#." local] +   ["#." artifact (#+ Group Name Artifact)] +   ["#." dependency (#+ Dependency Resolution)] +   ["#." shell]]) + +(type: Finder +  (-> Resolution (Maybe Dependency))) + +(def: (dependency-finder group name) +  (-> Group Name Finder) +  (|>> dictionary.entries +       (list.search (function (_ [dependency package]) +                      (if (and (text@= group (get@ [#///dependency.artifact #///artifact.group] dependency)) +                               (text@= name (get@ [#///dependency.artifact #///artifact.name] dependency))) +                        (#.Some dependency) +                        #.None))))) + +(def: lux-group +  Group +  "com.github.luxlang") + +(template [<name> <finder>] +  [(def: <finder> +     Finder +     (..dependency-finder ..lux-group <name>))] + +  ["lux-jvm" jvm-compiler] +  ["lux-js" js-compiler] +  ) + +(exception: #export no-available-compiler) +(exception: #export no-specified-program) + +(type: #export Compiler +  (#JVM Artifact) +  (#JS Artifact)) + +(def: (remove-dependency dependency) +  (-> Dependency (-> Resolution Resolution)) +  (|>> dictionary.entries +       (list.filter (|>> product.left (is? dependency) not)) +       (dictionary.from-list ///dependency.hash))) + +(def: (compiler resolution) +  (-> Resolution (Try [Resolution Compiler])) +  (case [(..jvm-compiler resolution) +         (..js-compiler resolution)] +    [(#.Some dependency) _] +    (#try.Success [(..remove-dependency dependency resolution) +                   (#JVM (get@ #///dependency.artifact dependency))]) +     +    [_ (#.Some dependency)] +    (#try.Success [(..remove-dependency dependency resolution) +                   (#JS (get@ #///dependency.artifact dependency))]) + +    _ +    (exception.throw ..no-available-compiler []))) + +(def: libraries +  (-> Resolution (List Path)) +  (|>> dictionary.keys +       (list.filter (|>> (get@ #///dependency.type) (text@= ///dependency.lux-library))) +       (list@map (|>> (get@ #///dependency.artifact) (///local.path file.system))))) + +(import: #long java/lang/String) + +## https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html +(import: #long java/lang/System +  (#static getProperty [java/lang/String] #io #? java/lang/String)) + +(def: #export working-directory +  (IO (Try Text)) +  (do io.monad +    [?value (java/lang/System::getProperty "user.dir")] +    (wrap (#try.Success (maybe.default "~" ?value))))) + +(def: (singular-parameter name value) +  (-> Text Text Text) +  (format name " " value)) + +(def: (plural-parameter name values) +  (-> Text (List Text) Text) +  (|> values (list@map (|>> (format name " "))) (text.join-with " "))) + +(def: #export (do! project) +  (Command [Compiler +            Path]) +  (case (get@ #///.program project) +    (#.Some program) +    (do ///action.monad +      [cache (///local.all-cached (file.async file.system) +                                  (get@ #///.dependencies project) +                                  ///dependency.empty) +       resolution (promise.future +                   (///dependency.resolve-all (get@ #///.repositories project) +                                              (get@ #///.dependencies project) +                                              cache)) +       _ (///local.cache-all (file.async file.system) +                             resolution) +       [resolution compiler] (promise@wrap (..compiler resolution)) +       working-directory (promise.future ..working-directory) +       #let [libraries (..libraries resolution) +             [prefix output] (case compiler +                               (#JVM artifact) [(format "java -jar " (///local.path file.system artifact)) +                                                "program.jar"] +                               (#JS artifact) [(format "node --stack_size=8192 " (///local.path file.system artifact)) +                                               "program.js"]) +             cache-directory (format working-directory (:: file.system separator) (get@ #///.target project)) +             command (format prefix " build" +                             " " (..plural-parameter "--library" libraries) +                             " " (..plural-parameter "--source" (get@ #///.sources project)) +                             " " (..singular-parameter "--target" cache-directory) +                             " " (..singular-parameter "--module" program))] +       #let [_ (log! "[BUILD STARTED]")] +       outcome (///shell.execute command working-directory) +       #let [_ (log! "[BUILD ENDED]")]] +      (wrap [compiler +             (format cache-directory (:: file.system separator) output)])) + +    #.None +    (promise@wrap (exception.throw ..no-specified-program []))))  | 
