From 2d28753c4c835a1a476c69e6bb6dd71b13d110ae Mon Sep 17 00:00:00 2001 From: Profpatsch Date: Mon, 14 Oct 2019 17:11:48 +0200 Subject: [PATCH] execline: provide tools to execlineb via execline wrapper Introduces the `execlineb-with-builtins` flag, which when true (default) will add all execline builtins to the PATH of `execlineb`. This is usually what users expect. If the flag is set to `false`, the unpatched execline derivation is returned instead. --- pkgs/tools/misc/execline/default.nix | 109 ++++++++++++++++++++------- 1 file changed, 82 insertions(+), 27 deletions(-) diff --git a/pkgs/tools/misc/execline/default.nix b/pkgs/tools/misc/execline/default.nix index 05c186d7640..14aeb26748e 100644 --- a/pkgs/tools/misc/execline/default.nix +++ b/pkgs/tools/misc/execline/default.nix @@ -1,35 +1,90 @@ -{ skawarePackages }: +{ lib, skawarePackages +# for execlineb-with-builtins +, coreutils, gnugrep, writeScriptBin, runCommand +# 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"; - - description = "A small scripting language, to be used in place of a shell in non-interactive scripts"; - +let outputs = [ "bin" "lib" "dev" "doc" "out" ]; - # 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" - ]; + execline = + buildPackage { + pname = "execline"; + version = "2.5.1.0"; + sha256 = "0xr6yb50wm6amj1wc7jmxyv7hvlx2ypbnww1vc288j275625d9xi"; - postInstall = '' - # remove all execline executables from build directory - rm $(find -type f -mindepth 1 -maxdepth 1 -executable) - rm libexecline.* + description = "A small scripting language, to be used in place of a shell in non-interactive scripts"; - mv doc $doc/share/doc/execline/html - mv examples $doc/share/doc/execline/examples - ''; + 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.* + + 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. + execlineb-with-builtins-drv = + let eldir = "${execline}/bin"; + in writeScriptBin "execlineb" '' + #!${eldir}/execlineb -s0 + # appends the execlineb bin dir to PATH if not yet in PATH + ${eldir}/define eldir ${eldir} + ''${eldir}/ifelse + { + # since this is nix, we can grep for the execline drv hash in PATH + # to see whether it’s already in there + ''${eldir}/pipeline + { ${coreutils}/bin/printenv PATH } + ${gnugrep}/bin/grep --quiet "${eldir}" + } + # it’s there already + { ''${eldir}/execlineb $@ } + # not there yet, add it + ''${eldir}/importas oldpath PATH + ''${eldir}/export PATH "''${eldir}:''${oldpath}" + ''${eldir}/execlineb $@ + ''; + + # 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