about summary refs log tree commit diff
path: root/pkgs/development/interpreters/clojurescript/lumo/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/interpreters/clojurescript/lumo/default.nix')
-rw-r--r--pkgs/development/interpreters/clojurescript/lumo/default.nix231
1 files changed, 131 insertions, 100 deletions
diff --git a/pkgs/development/interpreters/clojurescript/lumo/default.nix b/pkgs/development/interpreters/clojurescript/lumo/default.nix
index 0e9d81d5e959..d6252a7506aa 100644
--- a/pkgs/development/interpreters/clojurescript/lumo/default.nix
+++ b/pkgs/development/interpreters/clojurescript/lumo/default.nix
@@ -1,18 +1,30 @@
-{ stdenv, lib, fetchurl, clojure,
-  nodejs, jre, unzip,  nodePackages,
-  python, openssl, pkgs }:
-
-let # packageJSON=./package.json;
-    version = "1.9.0";
-    nodeVersion = "10.9.0";
-    nodeSources = fetchurl {
-      url="https://nodejs.org/dist/v${nodeVersion}/node-v${nodeVersion}.tar.gz";
-      sha256="0wgawq3wzw07pir73bxz13dggcc1fj0538y7y69n3cc0a2kiplqy";
-    };
-    lumo-internal-classpath = "LUMO__INTERNAL__CLASSPATH";
+{ stdenv
+, lib
+, fetchurl
+, clojure
+, gnutar
+, nodejs
+, jre
+, unzip
+, nodePackages
+, xcbuild
+, python
+, openssl
+, pkgs
+, fetchgit
+, darwin
+}:
+let
+  version = "1.10.1";
+  nodeVersion = "11.13.0";
+  nodeSources = fetchurl {
+    url = "https://nodejs.org/dist/v${nodeVersion}/node-v${nodeVersion}.tar.gz";
+    sha256 = "1cjzjbshxnysxkvbf41p3m8298cnhs9kfvdczgvvvlp6w16x4aac";
+  };
+  lumo-internal-classpath = "LUMO__INTERNAL__CLASSPATH";
 
-    # as found in cljs/snapshot/lumo/repl.cljs
-    requireDeps = '' \
+  # as found in cljs/snapshot/lumo/repl.cljs
+  requireDeps = '' \
       cljs.analyzer \
       cljs.compiler \
       cljs.env \
@@ -50,104 +62,125 @@ let # packageJSON=./package.json;
       lumo.js-deps \
       lumo.common '';
 
-    compileClojurescript = (simple: ''
-      (require '[cljs.build.api :as cljs])
-      (cljs/build \"src/cljs/snapshot\"
-        {:optimizations      ${if simple then ":simple" else ":none"}
-         :main               'lumo.core
-         :cache-analysis     true
-         :source-map         false
-         :dump-core          false
-         :static-fns         true
-         :optimize-constants false
-         :npm-deps           false
-         :verbose            true
-         :closure-defines    {'cljs.core/*target*       \"nodejs\"
-                              'lumo.core/*lumo-version* \"${version}\"}
-         :compiler-stats     true
-         :process-shim       false
-         :fn-invoke-direct   true
-         :parallel-build     false
-         :browser-repl       false
-         :target             :nodejs
-         :hashbang           false
-         ;; :libs               [ \"src/cljs/bundled\" \"src/js\" ]
-         :output-dir         ${if simple
-                                    then ''\"cljstmp\"''
-                                  else ''\"target\"''}
-         :output-to          ${if simple
-                                    then ''\"cljstmp/main.js\"''
-                                  else ''\"target/deleteme.js\"'' }})
-    '');
+  compileClojurescript = (simple: ''
+    (require '[cljs.build.api :as cljs])
+    (cljs/build \"src/cljs/snapshot\"
+      {:optimizations      ${if simple then ":simple" else ":none"}
+       :main               'lumo.core
+       :cache-analysis     true
+       :source-map         false
+       :dump-core          false
+       :static-fns         true
+       :optimize-constants false
+       :npm-deps           false
+       :verbose            true
+       :closure-defines    {'cljs.core/*target*       \"nodejs\"
+                            'lumo.core/*lumo-version* \"${version}\"}
+       :compiler-stats     true
+       :process-shim       false
+       :fn-invoke-direct   true
+       :parallel-build     false
+       :browser-repl       false
+       :target             :nodejs
+       :hashbang           false
+       ;; :libs               [ \"src/cljs/bundled\" \"src/js\" ]
+       :output-dir         ${if simple
+  then ''\"cljstmp\"''
+  else ''\"target\"''}
+       :output-to          ${if simple
+  then ''\"cljstmp/main.js\"''
+  else ''\"target/deleteme.js\"'' }})
+  ''
+  );
 
 
-    cacheToJsons = ''
-      (import [java.io ByteArrayOutputStream FileInputStream])
-      (require '[cognitect.transit :as transit]
-               '[clojure.edn :as edn]
-               '[clojure.string :as str])
+  cacheToJsons = ''
+    (import [java.io ByteArrayOutputStream FileInputStream])
+    (require '[cognitect.transit :as transit]
+             '[clojure.edn :as edn]
+             '[clojure.string :as str])
 
-      (defn write-transit-json [cache]
-        (let [out (ByteArrayOutputStream. 1000000)
-              writer (transit/writer out :json)]
-          (transit/write writer cache)
-          (.toString out)))
+    (defn write-transit-json [cache]
+      (let [out (ByteArrayOutputStream. 1000000)
+            writer (transit/writer out :json)]
+        (transit/write writer cache)
+        (.toString out)))
 
-      (defn process-caches []
-        (let [cache-aot-path      \"target/cljs/core.cljs.cache.aot.edn\"
-              cache-aot-edn       (edn/read-string (slurp cache-aot-path))
-              cache-macros-path   \"target/cljs/core\$macros.cljc.cache.json\"
-              cache-macros-stream (FileInputStream. cache-macros-path)
-              cache-macros-edn    (transit/read (transit/reader cache-macros-stream :json))
-              caches              [[cache-aot-path cache-aot-edn]
-                                   [cache-macros-path cache-macros-edn]]]
-          (doseq [[path cache-edn] caches]
-            (doseq [key (keys cache-edn)]
-              (let [out-path (str/replace path #\"(\.json|\.edn)\$\"
-                               (str \".\" (munge key) \".json\"))
-                    tr-json  (write-transit-json (key cache-edn))]
-                (spit out-path tr-json))))))
+    (defn process-caches []
+      (let [cache-aot-path      \"target/cljs/core.cljs.cache.aot.edn\"
+            cache-aot-edn       (edn/read-string (slurp cache-aot-path))
+            cache-macros-path   \"target/cljs/core\$macros.cljc.cache.json\"
+            cache-macros-stream (FileInputStream. cache-macros-path)
+            cache-macros-edn    (transit/read (transit/reader cache-macros-stream :json))
+            caches              [[cache-aot-path cache-aot-edn]
+                                 [cache-macros-path cache-macros-edn]]]
+        (doseq [[path cache-edn] caches]
+          (doseq [key (keys cache-edn)]
+            (let [out-path (str/replace path #\"(\.json|\.edn)\$\"
+                             (str \".\" (munge key) \".json\"))
+                  tr-json  (write-transit-json (key cache-edn))]
+              (spit out-path tr-json))))))
 
-      (process-caches)
-    '';
+    (process-caches)
+  '';
 
-    trimMainJsEnd = ''
-      (let [string (slurp \"target/main.js\")]
-        (spit \"target/main.js\"
-          (subs string  0 (.indexOf string \"cljs.nodejs={};\"))))
-    '';
+  trimMainJsEnd = ''
+    (let [string (slurp \"target/main.js\")]
+      (spit \"target/main.js\"
+        (subs string  0 (.indexOf string \"cljs.nodejs={};\"))))
+  '';
 
 
-    cljdeps   = import ./deps.nix { inherit pkgs; };
-    classp    = cljdeps.makeClasspaths {
-                  extraClasspaths=["src/js" "src/cljs/bundled" "src/cljs/snapshot"];
-                };
-    
+  cljdeps = import ./deps.nix { inherit pkgs; };
+  classp = cljdeps.makeClasspaths {
+    extraClasspaths = [ "src/js" "src/cljs/bundled" "src/cljs/snapshot" ];
+  };
 
-    getJarPath = jarName: (lib.findFirst (p: p.name == jarName) null cljdeps.packages).path.jar;
 
-in stdenv.mkDerivation {
+  getJarPath = jarName: (lib.findFirst (p: p.name == jarName) null cljdeps.packages).path.jar;
+in
+stdenv.mkDerivation {
   inherit version;
   pname = "lumo";
 
-  src = fetchurl {
-    url    = "https://github.com/anmonteiro/lumo/archive/${version}.tar.gz";
-    sha256 = "1mr3zjslznhv7y3mzvg1pmmvzn10d6di26izz4x8p4nfnshacwgw";
+  src = fetchgit {
+    url = "https://github.com/anmonteiro/lumo.git";
+    rev = "${version}";
+    sha256 = "12agi6bacqic2wq6q3l28283badzamspajmajzqm7fbdl2aq1a4p";
   };
 
+  buildInputs = [
+    nodejs
+    clojure
+    jre
+    unzip
+    python
+    openssl
+    gnutar
+    nodePackages."lumo-build-deps-../interpreters/clojurescript/lumo"
+  ]
+  ++ lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [
+    ApplicationServices
+    xcbuild
+  ]
+  );
 
-  buildInputs = [ nodejs clojure jre unzip python openssl
-                  nodePackages."lumo-build-deps-../interpreters/clojurescript/lumo" ];
+  patches = [ ./no_mangle.patch ./mkdir_promise.patch ];
+
+  postPatch = ''
+    substituteInPlace $NIX_BUILD_TOP/lumo/vendor/nexe/exe.js \
+      --replace 'glob.sync(dir + "/*")' 'glob.sync(dir + "/../*")'
+  '';
 
   buildPhase = ''
-    # Copy over lumo-build-deps environment
+       # Copy over lumo-build-deps environment
     rm yarn.lock
     cp -rf ${nodePackages."lumo-build-deps-../interpreters/clojurescript/lumo"}/lib/node_modules/lumo-build-deps/* ./
 
     # configure clojure-cli
     mkdir ./.cpcache
     export CLJ_CONFIG=`pwd`
-    export CLJ_CACHE=`pwd`/.cpcache 
+    export CLJ_CACHE=`pwd`/.cpcache
 
     # require more namespaces for cljs-bundle
     sed -i "s!ns lumo.core! \
@@ -155,7 +188,7 @@ in stdenv.mkDerivation {
                (:require ${requireDeps}) \
                (:require-macros [clojure.template :as temp] \
                                 [cljs.test :as test])!g" \
-              ./src/cljs/snapshot/lumo/core.cljs          
+              ./src/cljs/snapshot/lumo/core.cljs
 
     # Step 1: compile clojurescript with :none and :simple
     ${clojure}/bin/clojure -Scp ${classp} -e "${compileClojurescript true}"
@@ -204,7 +237,7 @@ in stdenv.mkDerivation {
     # Step 3: generate munged cache jsons
     ${clojure}/bin/clojure -Scp ${classp} -e "${cacheToJsons}"
     rm  ./target/cljs/core\$macros\.cljc\.cache\.json
-    
+
 
     # Step 4: Bunde javascript
     NODE_ENV=production node scripts/bundle.js
@@ -215,21 +248,20 @@ in stdenv.mkDerivation {
 
     # Step 6: Package executeable 1st time
     # fetch node sources and copy to palce that nexe will find
-    mkdir -p tmp/${nodeVersion}
-    cp ${nodeSources} tmp/${nodeVersion}/node-${nodeVersion}.tar.gz
-    tar -C ./tmp/${nodeVersion} -xf ${nodeSources}
-    mv ./tmp/${nodeVersion}/node-v${nodeVersion}/* ./tmp/${nodeVersion}/
+    mkdir -p tmp/node/${nodeVersion}
+    cp ${nodeSources} tmp/node/${nodeVersion}/node-${nodeVersion}.tar.gz
+    tar -C ./tmp/node/${nodeVersion} -xf ${nodeSources} --warning=no-unknown-keyword
+    mv ./tmp/node/${nodeVersion}/node-v${nodeVersion}/* ./tmp/node/${nodeVersion}/
     rm -rf ${lumo-internal-classpath}
-    mv target ${lumo-internal-classpath}
+    cp -rf target ${lumo-internal-classpath}
     node scripts/package.js ${nodeVersion}
-    rm -rf ${lumo-internal-classpath}
+    rm -rf target
+    mv ${lumo-internal-classpath} target
 
     # Step 7: AOT Macros
     sh scripts/aot-bundle-macros.sh
 
     # Step 8: Package executeable 2nd time
-    rm -rf ${lumo-internal-classpath}
-    mv target ${lumo-internal-classpath}
     node scripts/package.js ${nodeVersion}
   '';
 
@@ -250,7 +282,6 @@ in stdenv.mkDerivation {
     homepage = https://github.com/anmonteiro/lumo;
     license = stdenv.lib.licenses.epl10;
     maintainers = [ stdenv.lib.maintainers.hlolli ];
-    platforms = stdenv.lib.platforms.linux;
+    platforms = stdenv.lib.platforms.linux ++ stdenv.lib.platforms.darwin;
   };
 }
-