summary refs log tree commit diff
path: root/pkgs
diff options
context:
space:
mode:
authorNaïm Favier <n@monade.li>2022-05-11 22:00:24 +0200
committerNaïm Favier <n@monade.li>2022-05-12 01:44:02 +0200
commit88369997e1db7e1819b7b940fc2740f188d6608d (patch)
treed05c589c2f01f53ec3f6f76e5d99e97505c56107 /pkgs
parent2ae69114a11c6a80a58abc6984fde8851ee8fe40 (diff)
downloadnixpkgs-88369997e1db7e1819b7b940fc2740f188d6608d.tar
nixpkgs-88369997e1db7e1819b7b940fc2740f188d6608d.tar.gz
nixpkgs-88369997e1db7e1819b7b940fc2740f188d6608d.tar.bz2
nixpkgs-88369997e1db7e1819b7b940fc2740f188d6608d.tar.lz
nixpkgs-88369997e1db7e1819b7b940fc2740f188d6608d.tar.xz
nixpkgs-88369997e1db7e1819b7b940fc2740f188d6608d.tar.zst
nixpkgs-88369997e1db7e1819b7b940fc2740f188d6608d.zip
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.
Diffstat (limited to 'pkgs')
-rw-r--r--pkgs/applications/networking/browsers/firefox/wrapper.nix4
-rw-r--r--pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix6
-rw-r--r--pkgs/build-support/setup-hooks/make-binary-wrapper/make-binary-wrapper.sh7
3 files changed, 12 insertions, 5 deletions
diff --git a/pkgs/applications/networking/browsers/firefox/wrapper.nix b/pkgs/applications/networking/browsers/firefox/wrapper.nix
index 3da36e520c3..43830158326 100644
--- a/pkgs/applications/networking/browsers/firefox/wrapper.nix
+++ b/pkgs/applications/networking/browsers/firefox/wrapper.nix
@@ -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
diff --git a/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix b/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix
index a78d52fb42c..318624011b7 100644
--- a/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix
+++ b/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix
@@ -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
diff --git a/pkgs/build-support/setup-hooks/make-binary-wrapper/make-binary-wrapper.sh b/pkgs/build-support/setup-hooks/make-binary-wrapper/make-binary-wrapper.sh
index ff3f1d3f0c7..6b8f5d60eb6 100644
--- a/pkgs/build-support/setup-hooks/make-binary-wrapper/make-binary-wrapper.sh
+++ b/pkgs/build-support/setup-hooks/make-binary-wrapper/make-binary-wrapper.sh
@@ -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