From a5a15c191c43a660bb0c8e78e93d097e27966177 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Fri, 28 Aug 2020 00:06:26 -0400 Subject: Build programs. --- stdlib/source/program/aedifex/build.lux | 144 ++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 stdlib/source/program/aedifex/build.lux (limited to 'stdlib/source/program/aedifex/build.lux') diff --git a/stdlib/source/program/aedifex/build.lux b/stdlib/source/program/aedifex/build.lux new file mode 100644 index 000000000..74f64cb59 --- /dev/null +++ b/stdlib/source/program/aedifex/build.lux @@ -0,0 +1,144 @@ +(.module: + [lux (#- Name) + ["." host (#+ import:)] + [abstract + [monad (#+ Monad do)]] + [control + ["." try (#+ Try)] + ["." exception (#+ exception:)] + ["." io (#+ IO)] + [concurrency + ["." promise (#+ Promise) ("#@." monad)]]] + [data + ["." product] + ["." maybe] + ["." text ("#@." equivalence) + ["%" format (#+ format)]] + [collection + ["." list ("#@." functor)] + ["." dictionary]]] + [world + ["." file (#+ Path)]]] + ["." // #_ + ["#" project] + ["#." action (#+ Action)] + ["#." local] + ["#." artifact (#+ Group Name Artifact)] + ["#." dependency (#+ Dependency Resolution)] + ["#." shell]]) + +(type: #export (Command a) + (-> //.Project (Action a))) + +(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 [ ] + [(def: + Finder + (..dependency-finder ..lux-group ))] + + ["lux-jvm" jvm-compiler] + ["lux-js" js-compiler] + ) + +(exception: #export no-available-compiler) +(exception: #export no-specified-program) + +(type: 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: 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 Any) + (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 (case compiler + (#JVM artifact) (format "java -jar " (//local.path file.system artifact)) + (#JS artifact) (format "node --stack_size=8192 " (//local.path file.system artifact))) + 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 END]")]] + (wrap [])) + + #.None + (promise@wrap (exception.throw ..no-specified-program [])))) -- cgit v1.2.3