makeBinaryWrapper: add extractCmd

A small shell script that can be used to extract a binary wrapper's
makeCWrapper call from its embedded docstring, without depending on
makeBinaryWrapper.
This commit is contained in:
Naïm Favier 2022-05-11 22:00:24 +02:00
parent 2ae69114a1
commit 88369997e1
No known key found for this signature in database
GPG Key ID: 49B07322580B7EE2
3 changed files with 12 additions and 5 deletions

View File

@ -1,4 +1,4 @@
{ stdenv, lib, makeDesktopItem, makeWrapper, lndir, config
{ stdenv, lib, makeDesktopItem, makeWrapper, makeBinaryWrapper, lndir, config
, fetchurl, zip, unzip, jq, xdg-utils, writeText
## various stuff that can be plugged in
@ -229,7 +229,7 @@ let
# Symbolic link: wrap the link's target.
oldExe="$(readlink -v --canonicalize-existing "$executablePath")"
rm "$executablePath"
elif wrapperCmd=$(strings -dw "$executablePath" | sed -n '/^makeCWrapper/,/^$/ p'); [[ $wrapperCmd ]]; then
elif wrapperCmd=$(${makeBinaryWrapper.extractCmd} "$executablePath"); [[ $wrapperCmd ]]; then
# If the executable is a binary wrapper, we need to update its target to
# point to $out, but we can't just edit the binary in-place because of length
# issues. So we extract the command used to create the wrapper and add the

View File

@ -3,6 +3,7 @@
, darwin
, makeSetupHook
, dieHook
, writeShellScript
, tests
, cc ? stdenv.cc
, sanitizers ? []
@ -18,6 +19,11 @@ makeSetupHook {
san = lib.escapeShellArgs (map (s: "-fsanitize=${s}") sanitizers);
in "${cc}/bin/cc ${san}";
# Extract the function call used to create a binary wrapper from its embedded docstring
passthru.extractCmd = writeShellScript "extract-binary-wrapper-cmd" ''
strings -dw "$1" | sed -n '/^makeCWrapper/,/^$/ p'
'';
passthru.tests = tests.makeBinaryWrapper;
};
} ./make-binary-wrapper.sh

View File

@ -311,8 +311,9 @@ void set_env_suffix(char *env, char *sep, char *suffix) {
"
}
# Embed a C string which shows up as readable text in the compiled binary wrapper
# documentationString ARGS
# Embed a C string which shows up as readable text in the compiled binary wrapper,
# giving instructions for recreating the wrapper.
# Keep in sync with makeBinaryWrapper.extractCmd
docstring() {
printf '%s' "const char * DOCSTRING = \"$(escapeStringLiteral "
@ -333,7 +334,7 @@ makeCWrapper $(formatArgs "$@")
# formatArgs EXECUTABLE ARGS
formatArgs() {
printf '%s' "$1"
printf '%s' "${1@Q}"
shift
while [ $# -gt 0 ]; do
case "$1" in