execline: wrap unconditionally; strip

I don't think there's any situation in which an unwrapped execlineb is
useful -- if you want to use different versions of the execlineb tool
it'll still prefer ones in PATH.  At the same time, implementing the
wrapper in this way, as a series of two derivations, meant that we
didn't get stdenv goodness for the wrapper.  This meant that, for
example, the wrapper was not stripped, and so execline ended up with
runtime dependencies on gcc and the Linux headers.  I don't want to
have to reimplement this sort of stuff when it's already in stdenv,
and so it makes much more sense to create the wrapper in the
mkDerivation call, where all of stdenv's normal magic will find it.
This commit is contained in:
Alyssa Ross 2020-01-23 15:42:57 +00:00 committed by Profpatsch
parent d7f2bf70bd
commit 5e4c494636
2 changed files with 37 additions and 66 deletions

View File

@ -1,85 +1,49 @@
{ 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;
let
buildPackage {
pname = "execline";
version = "2.5.3.0";
sha256 = "0czdrv9m8mnx94nf28dafij6z03k4mbhbs6hccfaardfd5l5q805";
description = "A small scripting language, to be used in place of a shell in non-interactive scripts";
outputs = [ "bin" "lib" "dev" "doc" "out" ];
execline =
buildPackage {
pname = "execline";
version = "2.5.3.0";
sha256 = "0czdrv9m8mnx94nf28dafij6z03k4mbhbs6hccfaardfd5l5q805";
# 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"
];
description = "A small scripting language, to be used in place of a shell in non-interactive scripts";
postInstall = ''
# remove all execline executables from build directory
rm $(find -type f -mindepth 1 -maxdepth 1 -executable)
rm libexecline.*
inherit outputs;
mv doc $doc/share/doc/execline/html
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.
# 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
mv $bin/bin/execlineb $bin/bin/.execlineb-wrapped
cc \
-O \
-Wall -Wpedantic \
-D 'EXECLINEB_PATH()="${execline}/bin/execlineb"' \
-D 'EXECLINE_BIN_PATH()="${execline}/bin"' \
-D "EXECLINEB_PATH()=\"$bin/bin/.execlineb-wrapped\"" \
-D "EXECLINE_BIN_PATH()=\"$bin/bin\"" \
-I "${skalibs.dev}/include" \
-L "${skalibs.lib}/lib" \
-l"skarnet" \
-o "$out/bin/execlineb" \
-lskarnet \
-o "$bin/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
}

View File

@ -1,3 +1,10 @@
/*
* A wrapper around execlineb, which provides all execline
* tools on execlinebs PATH.
* It is implemented as a C program, because on non-Linux,
* nested shebang lines are not supported.
*/
#include <stdlib.h>
#include <string.h>