about summary refs log tree commit diff
path: root/nixpkgs/pkgs/tools/misc/execline/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/tools/misc/execline/default.nix')
-rw-r--r--nixpkgs/pkgs/tools/misc/execline/default.nix111
1 files changed, 77 insertions, 34 deletions
diff --git a/nixpkgs/pkgs/tools/misc/execline/default.nix b/nixpkgs/pkgs/tools/misc/execline/default.nix
index 5a967ea20959..d06798e5d6dd 100644
--- a/nixpkgs/pkgs/tools/misc/execline/default.nix
+++ b/nixpkgs/pkgs/tools/misc/execline/default.nix
@@ -1,42 +1,85 @@
-{ skawarePackages, makeWrapper }:
+{ lib, skawarePackages
+# for execlineb-with-builtins
+, coreutils, gnugrep, writeScriptBin, runCommand, runCommandCC
+# Whether to wrap bin/execlineb to have the execline tools on its PATH.
+, execlineb-with-builtins ? true
+}:
 
 with skawarePackages;
 
-buildPackage {
-  pname = "execline";
-  version = "2.5.1.0";
-  sha256 = "0xr6yb50wm6amj1wc7jmxyv7hvlx2ypbnww1vc288j275625d9xi";
+let
+  outputs = [ "bin" "lib" "dev" "doc" "out" ];
 
-  description = "A small scripting language, to be used in place of a shell in non-interactive scripts";
+  execline =
+    buildPackage {
+      pname = "execline";
+      version = "2.5.3.0";
+      sha256 = "0czdrv9m8mnx94nf28dafij6z03k4mbhbs6hccfaardfd5l5q805";
 
-  outputs = [ "bin" "lib" "dev" "doc" "out" ];
+      description = "A small scripting language, to be used in place of a shell in non-interactive scripts";
+
+      inherit outputs;
+
+      # TODO: nsss support
+      configureFlags = [
+        "--libdir=\${lib}/lib"
+        "--dynlibdir=\${lib}/lib"
+        "--bindir=\${bin}/bin"
+        "--includedir=\${dev}/include"
+        "--with-sysdeps=${skalibs.lib}/lib/skalibs/sysdeps"
+        "--with-include=${skalibs.dev}/include"
+        "--with-lib=${skalibs.lib}/lib"
+        "--with-dynlib=${skalibs.lib}/lib"
+      ];
+
+      postInstall = ''
+        # remove all execline executables from build directory
+        rm $(find -type f -mindepth 1 -maxdepth 1 -executable)
+        rm libexecline.*
 
-  setupHooks = [ makeWrapper ];
-
-  # TODO: nsss support
-  configureFlags = [
-    "--libdir=\${lib}/lib"
-    "--dynlibdir=\${lib}/lib"
-    "--bindir=\${bin}/bin"
-    "--includedir=\${dev}/include"
-    "--with-sysdeps=${skalibs.lib}/lib/skalibs/sysdeps"
-    "--with-include=${skalibs.dev}/include"
-    "--with-lib=${skalibs.lib}/lib"
-    "--with-dynlib=${skalibs.lib}/lib"
-  ];
-
-  postInstall = ''
-    # remove all execline executables from build directory
-    rm $(find -type f -mindepth 1 -maxdepth 1 -executable)
-    rm libexecline.*
-
-    mv doc $doc/share/doc/execline/html
-    mv examples $doc/share/doc/execline/examples
-
-    # finally, add all tools to PATH so they are available
-    # from within execlineb scripts by default
-    wrapProgram $bin/bin/execlineb \
-      --suffix PATH : $bin/bin
+        mv doc $doc/share/doc/execline/html
+        mv examples $doc/share/doc/execline/examples
+      '';
+
+    };
+
+  # A wrapper around execlineb, which provides all execline
+  # tools on `execlineb`’s PATH.
+  # It is implemented as a C script, because on non-Linux,
+  # nested shebang lines are not supported.
+  execlineb-with-builtins-drv = runCommandCC "execlineb" {} ''
+    mkdir -p $out/bin
+    cc \
+      -O \
+      -Wall -Wpedantic \
+      -D 'EXECLINEB_PATH()="${execline}/bin/execlineb"' \
+      -D 'EXECLINE_BIN_PATH()="${execline}/bin"' \
+      -I "${skalibs.dev}/include" \
+      -L "${skalibs.lib}/lib" \
+      -l"skarnet" \
+      -o "$out/bin/execlineb" \
+      ${./execlineb-wrapper.c}
   '';
 
-}
+
+  # the original execline package, with bin/execlineb overwritten
+  execline-with-builtins = runCommand "my-execline"
+    (execline.drvAttrs // {
+      preferLocalBuild = true;
+      allowSubstitutes = false;
+    })
+    # copy every output and just overwrite the execlineb binary in $bin
+    ''
+      ${lib.concatMapStringsSep "\n"
+        (output: ''
+          cp -r ${execline.${output}} "''$${output}"
+          chmod --recursive +w "''$${output}"
+        '')
+        outputs}
+      install ${execlineb-with-builtins-drv}/bin/execlineb $bin/bin/execlineb
+    '';
+
+in
+  if execlineb-with-builtins
+  then execline-with-builtins
+  else execline