about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/compilers/factor-lang
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/factor-lang')
-rw-r--r--nixpkgs/pkgs/development/compilers/factor-lang/adjust-paths-in-unit-tests.patch31
-rw-r--r--nixpkgs/pkgs/development/compilers/factor-lang/default.nix105
-rw-r--r--nixpkgs/pkgs/development/compilers/factor-lang/factor98.nix218
-rw-r--r--nixpkgs/pkgs/development/compilers/factor-lang/fuel-dir.patch20
-rw-r--r--nixpkgs/pkgs/development/compilers/factor-lang/scope.nix16
5 files changed, 265 insertions, 125 deletions
diff --git a/nixpkgs/pkgs/development/compilers/factor-lang/adjust-paths-in-unit-tests.patch b/nixpkgs/pkgs/development/compilers/factor-lang/adjust-paths-in-unit-tests.patch
new file mode 100644
index 000000000000..068d7c09b686
--- /dev/null
+++ b/nixpkgs/pkgs/development/compilers/factor-lang/adjust-paths-in-unit-tests.patch
@@ -0,0 +1,31 @@
+From da8a4b9c1094a568f443c525ca1ce11f686be1bc Mon Sep 17 00:00:00 2001
+From: timor <timor.dd@googlemail.com>
+Date: Thu, 8 Aug 2019 14:13:09 +0200
+Subject: [PATCH] adjust unit test for finding executables in path for NixOS
+
+---
+ basis/io/standard-paths/unix/unix-tests.factor | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/basis/io/standard-paths/unix/unix-tests.factor b/basis/io/standard-paths/unix/unix-tests.factor
+index 986c0564d2..f0772fdcc9 100644
+--- a/basis/io/standard-paths/unix/unix-tests.factor
++++ b/basis/io/standard-paths/unix/unix-tests.factor
+@@ -5,12 +5,12 @@ sequences tools.test ;
+ 
+ { f } [ "" find-in-path ] unit-test
+ { t } [
+-    "ls" find-in-path { "/bin/ls" "/usr/bin/ls" } member?
++    "ls" find-in-path not not
+ ] unit-test
+ 
+ { t } [
+     "/sbin:" "PATH" os-env append "PATH" [
+         "ps" find-in-path
+-        { "/bin/ps" "/sbin/ps" "/usr/bin/ps" } member?
++        not not
+     ] with-os-env
+ ] unit-test
+-- 
+2.19.2
+
diff --git a/nixpkgs/pkgs/development/compilers/factor-lang/default.nix b/nixpkgs/pkgs/development/compilers/factor-lang/default.nix
deleted file mode 100644
index 4ce55b5ca25c..000000000000
--- a/nixpkgs/pkgs/development/compilers/factor-lang/default.nix
+++ /dev/null
@@ -1,105 +0,0 @@
-{ lib, stdenv, fetchurl, glib, git,
-  rlwrap, curl, pkg-config, perl, makeWrapper, tzdata, ncurses,
-  pango, cairo, gtk2, gdk-pixbuf, gtkglext,
-  mesa, xorg, openssl, unzip }:
-
-stdenv.mkDerivation rec {
-  pname = "factor-lang";
-  version = "0.98";
-  rev = "7999e72aecc3c5bc4019d43dc4697f49678cc3b4";
-
-  src = fetchurl {
-    url = "https://downloads.factorcode.org/releases/0.98/factor-src-0.98.zip";
-    sha256 = "01ip9mbnar4sv60d2wcwfz62qaamdvbykxw3gbhzqa25z36vi3ri";
-  };
-
-  patches = [
-    ./staging-command-line-0.98-pre.patch
-    ./workdir-0.98-pre.patch
-    ./fuel-dir.patch
-  ];
-
-  nativeBuildInputs = [ makeWrapper unzip ];
-  buildInputs = with xorg; [ git rlwrap curl pkg-config perl
-    libX11 pango cairo gtk2 gdk-pixbuf gtkglext
-    mesa libXmu libXt libICE libSM openssl ];
-
-  buildPhase = ''
-    sed -ie '4i GIT_LABEL = heads/master-${rev}' GNUmakefile
-    make linux-x86-64
-    # De-memoize xdg-* functions, otherwise they break the image.
-    sed -ie 's/^MEMO:/:/' basis/xdg/xdg.factor
-  '';
-
-  installPhase = ''
-    mkdir -p $out/bin $out/lib/factor
-    # The released image has library path info embedded, so we
-    # first have to recreate the boot image with Nix paths, and
-    # then use it to build the Nix release image.
-    cp boot.unix-x86.64.image $out/lib/factor/factor.image
-
-    cp -r basis core extra $out/lib/factor
-
-    # Factor uses XDG_CACHE_HOME for cache during compilation.
-    # We can't have that. So set it to $TMPDIR/.cache
-    export XDG_CACHE_HOME=$TMPDIR/.cache && mkdir -p $XDG_CACHE_HOME
-
-    # There is no ld.so.cache in NixOS so we construct one
-    # out of known libraries. The side effect is that find-lib
-    # will work only on the known libraries. There does not seem
-    # to be a generic solution here.
-    find $(echo ${lib.makeLibraryPath (with xorg; [
-        glib libX11 pango cairo gtk2 gdk-pixbuf gtkglext
-        mesa libXmu libXt libICE libSM ])} | sed -e 's#:# #g') -name \*.so.\* > $TMPDIR/so.lst
-
-    (echo $(cat $TMPDIR/so.lst | wc -l) "libs found in cache \`/etc/ld.so.cache'";
-    for l in $(<$TMPDIR/so.lst);
-    do
-      echo "	$(basename $l) (libc6,x86-64) => $l";
-    done)> $out/lib/factor/ld.so.cache
-
-    sed -ie "s#/sbin/ldconfig -p#cat $out/lib/factor/ld.so.cache#g" \
-      $out/lib/factor/basis/alien/libraries/finder/linux/linux.factor
-
-    sed -ie 's#/usr/share/zoneinfo/#${tzdata}/share/zoneinfo/#g' \
-      $out/lib/factor/extra/tzinfo/tzinfo.factor
-
-    sed -ie 's#/usr/share/terminfo#${ncurses.out}/share/terminfo#g' \
-      $out/lib/factor/extra/terminfo/terminfo.factor
-
-    cp ./factor $out/bin
-    wrapProgram $out/bin/factor --prefix LD_LIBRARY_PATH : \
-      "${lib.makeLibraryPath (with xorg; [ glib
-        libX11 pango cairo gtk2 gdk-pixbuf gtkglext
-        mesa libXmu libXt libICE libSM openssl])}"
-
-    sed -ie 's#/bin/.factor-wrapped#/lib/factor/factor#g' $out/bin/factor
-    mv $out/bin/.factor-wrapped $out/lib/factor/factor
-
-    # build full factor image from boot image
-    (cd $out/bin && ./factor  -script -e='"unix-x86.64" USING: system bootstrap.image memory ; make-image save 0 exit' )
-
-    # make a new bootstrap image
-    (cd $out/bin && ./factor  -script -e='"unix-x86.64" USING: system tools.deploy.backend ; make-boot-image 0 exit' )
-
-    # rebuild final full factor image to include all patched sources
-    (cd $out/lib/factor && ./factor -i=boot.unix-x86.64.image)
-
-    # install fuel mode for emacs
-    mkdir -p $out/share/emacs/site-lisp
-    # update default paths in factor-listener.el for fuel mode
-    substituteInPlace misc/fuel/fuel-listener.el \
-      --subst-var-by fuel_factor_root_dir $out/lib/factor \
-      --subst-var-by fuel_listener_factor_binary $out/bin/factor
-    cp misc/fuel/*.el $out/share/emacs/site-lisp/
-  '';
-
-  meta = with lib; {
-    homepage = "https://factorcode.org";
-    license = licenses.bsd2;
-    description = "A concatenative, stack-based programming language";
-
-    maintainers = [ maintainers.vrthra maintainers.spacefrogg ];
-    platforms = [ "x86_64-linux" ];
-  };
-}
diff --git a/nixpkgs/pkgs/development/compilers/factor-lang/factor98.nix b/nixpkgs/pkgs/development/compilers/factor-lang/factor98.nix
new file mode 100644
index 000000000000..f9b593398259
--- /dev/null
+++ b/nixpkgs/pkgs/development/compilers/factor-lang/factor98.nix
@@ -0,0 +1,218 @@
+{ lib
+, stdenv
+, cairo
+, curl
+, fetchurl
+, freealut
+, gdk-pixbuf
+, git
+, glib
+, gnome2
+, graphviz
+, gtk2-x11
+, interpreter
+, libGL
+, libGLU
+, libogg
+, librsvg
+, libvorbis
+, makeWrapper
+, ncurses
+, openal
+, openssl
+, pango
+, pcre
+, runCommand
+, runtimeShell
+, tzdata
+, udis86
+, unzip
+, writeScriptBin
+, zlib
+}:
+let
+  runtimeLibs = [
+    cairo
+    freealut
+    gdk-pixbuf
+    glib
+    gnome2.gtkglext
+    graphviz
+    gtk2-x11
+    libGL
+    libGLU
+    libogg
+    libvorbis
+    openal
+    openssl
+    pango
+    pcre
+    udis86
+    zlib
+  ];
+
+  wrapFactorScript = { from, to ? false, runtimeLibs }: ''
+    # Set Gdk pixbuf loaders file to the one from the build dependencies here
+    unset GDK_PIXBUF_MODULE_FILE
+    # Defined in gdk-pixbuf setup hook
+    findGdkPixbufLoaders "${librsvg}"
+
+    ${if to then "makeWrapper ${from} ${to}" else "wrapProgram ${from}"} \
+      --set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE" \
+      --argv0 factor \
+      --prefix LD_LIBRARY_PATH : /run/opengl-driver/lib:${lib.makeLibraryPath runtimeLibs} \
+      --prefix PATH : ${lib.makeBinPath [ graphviz ]}
+  '';
+
+  wrapFactor = runtimeLibs:
+    runCommand (lib.appendToName "with-libs" interpreter).name
+      {
+        nativeBuildInputs = [ makeWrapper ];
+        buildInputs = [ gdk-pixbuf ];
+        passthru.runtimeLibs = runtimeLibs ++ interpreter.runtimeLibs;
+      }
+      (wrapFactorScript {
+        from = "${interpreter}/lib/factor/.factor.wrapped";
+        to = "$out/bin/factor";
+        runtimeLibs = (runtimeLibs ++ interpreter.runtimeLibs);
+      });
+
+  # Development helper for use in nix shell
+  wrapLocalFactor = writeScriptBin "wrapFactor" ''
+    #!${runtimeShell}
+    ${wrapFactorScript { from = "./factor"; inherit runtimeLibs; }}
+    ln -sf factor.image .factor-wrapped.image
+  '';
+  rev = "7999e72aecc3c5bc4019d43dc4697f49678cc3b4";
+  version = "0.98";
+
+in
+stdenv.mkDerivation {
+  pname = "factor-lang";
+  inherit version;
+
+  src = fetchurl {
+    url = "https://downloads.factorcode.org/releases/${version}/factor-src-${version}.zip";
+    sha256 = "01ip9mbnar4sv60d2wcwfz62qaamdvbykxw3gbhzqa25z36vi3ri";
+  };
+
+  patches = [
+    ./staging-command-line-0.98-pre.patch
+    ./workdir-0.98-pre.patch
+    ./adjust-paths-in-unit-tests.patch
+  ];
+
+  nativeBuildInputs = [ git makeWrapper curl unzip wrapLocalFactor ];
+  buildInputs = runtimeLibs;
+
+  postPatch = ''
+    sed -ie '4i GIT_LABEL = heads/master-${rev}' GNUmakefile
+
+    # There is no ld.so.cache in NixOS so we patch out calls to that completely.
+    # This should work as long as no application code relies on `find-library*`
+    # to return a match, which currently is the case and also a justified assumption.
+
+    sed -ie "s#/sbin/ldconfig -p#cat $out/lib/factor/ld.so.cache#g" \
+      basis/alien/libraries/finder/linux/linux.factor
+
+    # Some other hard-coded paths to fix:
+    sed -i 's#/usr/share/zoneinfo/#${tzdata}/share/zoneinfo/#g' \
+      extra/tzinfo/tzinfo.factor
+
+    sed -i 's#/usr/share/terminfo#${ncurses.out}/share/terminfo#g' \
+      extra/terminfo/terminfo.factor
+
+    # De-memoize xdg-* functions, otherwise they break the image.
+    sed -ie 's/^MEMO:/:/' basis/xdg/xdg.factor
+
+    # update default paths in factor-listener.el for fuel mode
+    substituteInPlace misc/fuel/fuel-listener.el \
+      --replace '(defcustom fuel-factor-root-dir nil' "(defcustom fuel-factor-root-dir \"$out/lib/factor\""
+  '';
+
+  buildPhase = ''
+    runHook preBuild
+    # Necessary here, because ld.so.cache is needed in its final location during rebuild.
+    mkdir -p $out/bin $out/lib/factor
+    patchShebangs ./build.sh
+    # Factor uses XDG_CACHE_HOME for cache during compilation.
+    # We can't have that. So, set it to $TMPDIR/.cache
+    export XDG_CACHE_HOME=$TMPDIR/.cache && mkdir -p $XDG_CACHE_HOME
+
+    # There is no ld.so.cache in NixOS so we construct one
+    # out of known libraries. The side effect is that find-lib
+    # will work only on the known libraries. There does not seem
+    # to be a generic solution here.
+    find $(echo ${lib.makeLibraryPath runtimeLibs} | sed -e 's#:# #g') -name \*.so.\* > $TMPDIR/so.lst
+    (echo $(cat $TMPDIR/so.lst | wc -l) "libs found in cache \`/etc/ld.so.cache'";
+      for l in $(<$TMPDIR/so.lst); do
+        echo " $(basename $l) (libc6,x86-64) => $l";
+      done)> $out/lib/factor/ld.so.cache
+
+    make -j$NIX_BUILD_CORES linux-x86-64
+    ./build.sh bootstrap
+    runHook postBuild
+  '';
+
+  # For now, the check phase runs, but should always return 0. This way the logs
+  # contain the test failures until all unit tests are fixed. Then, it should
+  # return 1 if any test failures have occured.
+  doCheck = false;
+  checkPhase = ''
+    runHook preCheck
+    set +e
+    ./factor -e='USING: tools.test zealot.factor sequences namespaces formatting ;
+      zealot-core-vocabs "compiler" suffix [ test ] each :test-failures
+      test-failures get length "Number of failed Tests: %d\n" printf'
+    [ $? -eq 0 ] || {
+      mkdir -p "$out/nix-support"
+      touch "$out/nix-support/failed"
+    }
+    set -e
+    runHook postCheck
+  '';
+
+  installPhase = ''
+    runHook preInstall
+    cp -r factor factor.image LICENSE.txt README.md basis core extra misc $out/lib/factor
+
+    # Create a wrapper in bin/ and lib/factor/
+    ${wrapFactorScript { from = "$out/lib/factor/factor"; inherit runtimeLibs; }}
+    mv $out/lib/factor/factor.image $out/lib/factor/.factor-wrapped.image
+    cp $out/lib/factor/factor $out/bin/
+
+    # Emacs fuel expects the image being named `factor.image` in the factor base dir
+    ln -s $out/lib/factor/.factor-wrapped.image $out/lib/factor/factor.image
+
+    # install fuel mode for emacs
+    mkdir -p $out/share/emacs/site-lisp
+    ln -s $out/lib/factor/misc/fuel/*.el $out/share/emacs/site-lisp/
+    runHook postInstall
+  '';
+
+  passthru = {
+    inherit runtimeLibs wrapFactorScript;
+    withLibs = wrapFactor;
+  };
+
+  meta = with lib; {
+    homepage = "https://factorcode.org/";
+    description = "A concatenative, stack-based programming language";
+    longDescription = ''
+      The Factor programming language is a concatenative, stack-based
+      programming language with high-level features including dynamic types,
+      extensible syntax, macros, and garbage collection. On a practical side,
+      Factor has a full-featured library, supports many different platforms, and
+      has been extensively documented.
+
+      The implementation is fully compiled for performance, while still
+      supporting interactive development. Factor applications are portable
+      between all common platforms. Factor can deploy stand-alone applications
+      on all platforms. Full source code for the Factor project is available
+      under a BSD license.
+    '';
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ vrthra spacefrogg ];
+    platforms = lib.intersectLists platforms.x86_64 platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/compilers/factor-lang/fuel-dir.patch b/nixpkgs/pkgs/development/compilers/factor-lang/fuel-dir.patch
deleted file mode 100644
index 8f45b0372469..000000000000
--- a/nixpkgs/pkgs/development/compilers/factor-lang/fuel-dir.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-diff --git a/misc/fuel/fuel-listener.el b/misc/fuel/fuel-listener.el
-index 2d1b182a75..bf2e573425 100644
---- a/misc/fuel/fuel-listener.el
-+++ b/misc/fuel/fuel-listener.el
-@@ -30,13 +30,13 @@
-   "Interacting with a Factor listener inside Emacs."
-   :group 'fuel)
- 
--(defcustom fuel-factor-root-dir nil
-+(defcustom fuel-factor-root-dir "@fuel_factor_root_dir@"
-   "Full path to the factor root directory when starting a listener."
-   :type 'directory
-   :group 'fuel-listener)
- 
- ;;; Is factor.com still valid on Windows...?
--(defcustom fuel-listener-factor-binary nil
-+(defcustom fuel-listener-factor-binary "@fuel_listener_factor_binary@"
-   "Full path to the factor executable to use when starting a listener."
-   :type '(file :must-match t)
-   :group 'fuel-listener)
diff --git a/nixpkgs/pkgs/development/compilers/factor-lang/scope.nix b/nixpkgs/pkgs/development/compilers/factor-lang/scope.nix
new file mode 100644
index 000000000000..02f0f8896341
--- /dev/null
+++ b/nixpkgs/pkgs/development/compilers/factor-lang/scope.nix
@@ -0,0 +1,16 @@
+{ lib, pkgs
+, overrides ? (self: super: {})}:
+
+let
+  inside = (self:
+  let callPackage = pkgs.newScope self;
+  in rec {
+    interpreter = callPackage ./factor98.nix { inherit (pkgs) stdenv; };
+
+    # Convenience access for using the returned attribute the same way as the
+    # interpreter derivation. Takes a list of runtime libraries as its only
+    # argument.
+    inherit (self.interpreter) withLibs;
+  });
+  extensible-self = lib.makeExtensible (lib.extends overrides inside);
+in extensible-self