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.
This commit is contained in:
Profpatsch 2019-10-14 17:11:48 +02:00
parent bbcdd01f6b
commit 2d28753c4c

View File

@ -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; with skawarePackages;
buildPackage { let
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";
outputs = [ "bin" "lib" "dev" "doc" "out" ]; outputs = [ "bin" "lib" "dev" "doc" "out" ];
# TODO: nsss support execline =
configureFlags = [ buildPackage {
"--libdir=\${lib}/lib" pname = "execline";
"--dynlibdir=\${lib}/lib" version = "2.5.1.0";
"--bindir=\${bin}/bin" sha256 = "0xr6yb50wm6amj1wc7jmxyv7hvlx2ypbnww1vc288j275625d9xi";
"--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 = '' description = "A small scripting language, to be used in place of a shell in non-interactive scripts";
# 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 inherit outputs;
mv examples $doc/share/doc/execline/examples
'';
} # 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 its already in there
''${eldir}/pipeline
{ ${coreutils}/bin/printenv PATH }
${gnugrep}/bin/grep --quiet "${eldir}"
}
# its 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