summary refs log tree commit diff
path: root/pkgs/development/interpreters/pixie
diff options
context:
space:
mode:
authorHerwig Hochleitner <herwig@bendlas.net>2015-11-16 20:53:39 +0100
committerHerwig Hochleitner <herwig@bendlas.net>2016-02-28 03:15:07 +0100
commit1c380842d10c7e0a5f385be3d095cddee8ab9da9 (patch)
treeeaa65ef190db3ce56e36d0f4caa3337de583885f /pkgs/development/interpreters/pixie
parent40c586b7ce2c559374df435f46d673baf711c543 (diff)
downloadnixlib-1c380842d10c7e0a5f385be3d095cddee8ab9da9.tar
nixlib-1c380842d10c7e0a5f385be3d095cddee8ab9da9.tar.gz
nixlib-1c380842d10c7e0a5f385be3d095cddee8ab9da9.tar.bz2
nixlib-1c380842d10c7e0a5f385be3d095cddee8ab9da9.tar.lz
nixlib-1c380842d10c7e0a5f385be3d095cddee8ab9da9.tar.xz
nixlib-1c380842d10c7e0a5f385be3d095cddee8ab9da9.tar.zst
nixlib-1c380842d10c7e0a5f385be3d095cddee8ab9da9.zip
pixie: init at 0-1333
This is the pixie language, a clojure-like lisp, utilizing the pypy vm
toolkit for JIT, GC and C bindings.
Diffstat (limited to 'pkgs/development/interpreters/pixie')
-rw-r--r--pkgs/development/interpreters/pixie/default.nix79
-rw-r--r--pkgs/development/interpreters/pixie/load_paths.patch25
2 files changed, 104 insertions, 0 deletions
diff --git a/pkgs/development/interpreters/pixie/default.nix b/pkgs/development/interpreters/pixie/default.nix
new file mode 100644
index 000000000000..85af751809c6
--- /dev/null
+++ b/pkgs/development/interpreters/pixie/default.nix
@@ -0,0 +1,79 @@
+{ stdenv, fetchgit, fetchurl, python, makeWrapper, pkgconfig, gcc,
+  pypy, libffi, libedit, libuv, boost, zlib,
+  variant ? "jit", buildWithPypy ? false }:
+
+let
+  commit-count = "1333";
+  common-flags = "--thread --gcrootfinder=shadowstack --continuation";
+  variants = {
+    jit = { flags = "--opt=jit"; target = "target.py"; };
+    jit-preload = { flags = "--opt=jit"; target = "target_preload.py"; };
+    no-jit = { flags = ""; target = "target.py"; };
+    no-jit-preload = { flags = ""; target = "target_preload.py"; };
+  };
+  pixie-src = fetchgit {
+    url = "https://github.com/pixie-lang/pixie.git";
+    rev = "36ce07e1cd85ca82eedadf366bef3bb57a627a2a";
+    sha256 = "1b3v99c0is33w029r15qvd0mkrc5n1mrvjjmfpcd9yvhvqb2vcjs";
+  };
+  pypy-tag = "81254";
+  pypy-src = fetchurl {
+    name = "pypy-src-${pypy-tag}";
+    url = "https://bitbucket.org/pypy/pypy/get/${pypy-tag}.tar.bz2";
+    sha256 = "1cs9xqs1rmzdcnwxxkbvy064s5cbp6vvzhn2jmyzh5kg4di1r3bn";
+  };
+  libs = [ libffi libedit libuv boost.dev boost.lib zlib ];
+  include-path = stdenv.lib.concatStringsSep ":"
+                   (map (p: "${p}/include") libs);
+  library-path = stdenv.lib.concatStringsSep ":"
+                   (map (p: "${p}/lib") libs);
+  bin-path = stdenv.lib.concatStringsSep ":"
+               (map (p: "${p}/bin") [ gcc ]);
+  build = {flags, target}: stdenv.mkDerivation rec {
+    name = "pixie-${version}";
+    version = "0-r${commit-count}-${variant}";
+    nativeBuildInputs = libs;
+    buildInputs = [ pkgconfig makeWrapper ];
+    PYTHON = if buildWithPypy
+      then "${pypy}/pypy-c/.pypy-c-wrapped"
+      else "${python}/bin/python";
+    unpackPhase = ''
+      cp -R ${pixie-src} pixie-src
+      mkdir pypy-src
+      (cd pypy-src
+       tar --strip-components=1 -xjf ${pypy-src})
+      chmod -R +w pypy-src pixie-src
+    '';
+    patchPhase = ''
+      (cd pixie-src
+       patch -p1 < ${./load_paths.patch}
+       libraryPaths='["${libuv}" "${libedit}" "${libffi}" "${boost.dev}" "${boost.lib}" "${zlib}"]'
+       export libraryPaths
+       substituteAllInPlace ./pixie/ffi-infer.pxi)
+    '';
+    buildPhase = ''(
+      PYTHONPATH="`pwd`/pypy-src:$PYTHONPATH";
+      RPYTHON="`pwd`/pypy-src/rpython/bin/rpython";
+      cd pixie-src
+      $PYTHON $RPYTHON ${common-flags} ${target}
+      export LD_LIBRARY_PATH="${library-path}:$LD_LIBRARY_PATH"
+      find pixie -name "*.pxi" -exec ./pixie-vm -c {} \;
+    )'';
+    installPhase = ''
+      mkdir -p $out/share $out/bin
+      cp pixie-src/pixie-vm $out/share/pixie-vm
+      cp -R pixie-src/pixie $out/share/pixie
+      makeWrapper $out/share/pixie-vm $out/bin/pxi \
+        --prefix LD_LIBRARY_PATH : ${library-path} \
+        --prefix C_INCLUDE_PATH : ${include-path} \
+        --prefix LIBRARY_PATH : ${library-path} \
+        --prefix PATH : ${bin-path}
+    '';
+    meta = {
+      description = "Pixie is a clojure-like lisp, built with the pypy vm toolkit.";
+      homepage = "https://github.com/pixie-lang/pixie";
+      license = stdenv.lib.licenses.lgpl3;
+      platforms = stdenv.lib.platforms.linux;
+    };
+  };
+in build (builtins.getAttr variant variants)
diff --git a/pkgs/development/interpreters/pixie/load_paths.patch b/pkgs/development/interpreters/pixie/load_paths.patch
new file mode 100644
index 000000000000..a36d280c5867
--- /dev/null
+++ b/pkgs/development/interpreters/pixie/load_paths.patch
@@ -0,0 +1,25 @@
+diff --git a/pixie/ffi-infer.pxi b/pixie/ffi-infer.pxi
+index 9f13ac7..74301c2 100644
+--- a/pixie/ffi-infer.pxi
++++ b/pixie/ffi-infer.pxi
+@@ -1,15 +1,12 @@
+ (ns pixie.ffi-infer
+   (:require [pixie.io-blocking :as io]))
+ 
++(defn -add-library-path [p]
++  (swap! load-paths conj (str p "/include"))
++  (swap! load-paths conj (str p "/lib")))
+ 
+-(defn -add-rel-path [rel]
+-  (swap! load-paths conj (str (first @load-paths) "/" rel)))
+-
+-(-add-rel-path "lib")
+-(-add-rel-path "include")
+-(-add-rel-path "../lib")
+-(-add-rel-path "../include")
+-
++(doseq [lp @libraryPaths@]
++  (-add-library-path lp))
+ 
+ (def *config* nil)
+ (set-dynamic! (var *config*))