diff options
Diffstat (limited to 'pkgs/build-support/setup-hooks')
7 files changed, 61 insertions, 26 deletions
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 c81a253b0de8..17b97b1082e9 100644 --- a/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix +++ b/pkgs/build-support/setup-hooks/make-binary-wrapper/default.nix @@ -11,8 +11,7 @@ makeSetupHook { name = "make-binary-wrapper-hook"; - - deps = [ dieHook ] + propagatedBuildInputs = [ dieHook ] # https://github.com/NixOS/nixpkgs/issues/148189 ++ lib.optional (stdenv.isDarwin && stdenv.isAarch64) cc; diff --git a/pkgs/build-support/setup-hooks/multiple-outputs.sh b/pkgs/build-support/setup-hooks/multiple-outputs.sh index 3a318933f138..8a62c57dbd07 100644 --- a/pkgs/build-support/setup-hooks/multiple-outputs.sh +++ b/pkgs/build-support/setup-hooks/multiple-outputs.sh @@ -13,13 +13,14 @@ postFixupHooks+=(_multioutPropagateDev) # specific to this function's use case, which is setting up the output variables. _assignFirst() { local varName="$1" + local _var local REMOVE=REMOVE # slightly hacky - we allow REMOVE (i.e. not a variable name) shift - for var in "$@"; do - if [ -n "${!var-}" ]; then eval "${varName}"="${var}"; return; fi + for _var in "$@"; do + if [ -n "${!_var-}" ]; then eval "${varName}"="${_var}"; return; fi done echo - echo "error: _assignFirst: could not find a non-empty variable to assign to ${varName}." + echo "error: _assignFirst: could not find a non-empty variable whose name to assign to ${varName}." echo " The following variables were all unset or empty:" echo " $*" if [ -z "${out:-}" ]; then @@ -138,9 +139,9 @@ moveToOutput() { # remove empty directories, printing iff at least one gets removed local srcParent="$(readlink -m "$srcPath/..")" - if rmdir "$srcParent"; then + if [ -n "$(find "$srcParent" -maxdepth 0 -type d -empty 2>/dev/null)" ]; then echo "Removing empty $srcParent/ and (possibly) its parents" - rmdir -p --ignore-fail-on-non-empty "$(readlink -m "$srcParent/..")" \ + rmdir -p --ignore-fail-on-non-empty "$srcParent" \ 2> /dev/null || true # doesn't ignore failure for some reason fi done diff --git a/pkgs/build-support/setup-hooks/patch-shebangs.sh b/pkgs/build-support/setup-hooks/patch-shebangs.sh index a26113abea88..9a48440debec 100644 --- a/pkgs/build-support/setup-hooks/patch-shebangs.sh +++ b/pkgs/build-support/setup-hooks/patch-shebangs.sh @@ -62,15 +62,21 @@ patchShebangs() { fi if [[ "$oldPath" == *"/bin/env" ]]; then + if [[ $arg0 == "-S" ]]; then + arg0=${args%% *} + args=${args#* } + newPath="$(PATH="${!pathName}" command -v "env" || true)" + args="-S $(PATH="${!pathName}" command -v "$arg0" || true) $args" + # Check for unsupported 'env' functionality: - # - options: something starting with a '-' + # - options: something starting with a '-' besides '-S' # - environment variables: foo=bar - if [[ $arg0 == "-"* || $arg0 == *"="* ]]; then + elif [[ $arg0 == "-"* || $arg0 == *"="* ]]; then echo "$f: unsupported interpreter directive \"$oldInterpreterLine\" (set dontPatchShebangs=1 and handle shebang patching yourself)" >&2 exit 1 + else + newPath="$(PATH="${!pathName}" command -v "$arg0" || true)" fi - - newPath="$(PATH="${!pathName}" command -v "$arg0" || true)" else if [[ -z $oldPath ]]; then # If no interpreter is specified linux will use /bin/sh. Set diff --git a/pkgs/build-support/setup-hooks/reproducible-builds.sh b/pkgs/build-support/setup-hooks/reproducible-builds.sh index 7b52f84df67b..5e27ce8a25fe 100644 --- a/pkgs/build-support/setup-hooks/reproducible-builds.sh +++ b/pkgs/build-support/setup-hooks/reproducible-builds.sh @@ -3,7 +3,8 @@ # derivation and not easily collide with other builds. # We also truncate the hash so that it cannot cause reference cycles. NIX_CFLAGS_COMPILE="${NIX_CFLAGS_COMPILE:-} -frandom-seed=$( - outbase="${out##*/}" + randSeed=${NIX_OUTPATH_USED_AS_RANDOM_SEED:-$out} + outbase="${randSeed##*/}" randomseed="${outbase:0:10}" echo $randomseed )" diff --git a/pkgs/build-support/setup-hooks/separate-debug-info.sh b/pkgs/build-support/setup-hooks/separate-debug-info.sh index 3c8c9c294c3e..ca651b4393a1 100644 --- a/pkgs/build-support/setup-hooks/separate-debug-info.sh +++ b/pkgs/build-support/setup-hooks/separate-debug-info.sh @@ -11,6 +11,9 @@ _separateDebugInfo() { local dst="${debug:-$out}" if [ "$prefix" = "$dst" ]; then return 0; fi + # in case there is nothing to strip, don't fail the build + mkdir -p "$dst" + dst="$dst/lib/debug/.build-id" # Find executables and dynamic libraries. diff --git a/pkgs/build-support/setup-hooks/wrap-gapps-hook/default.nix b/pkgs/build-support/setup-hooks/wrap-gapps-hook/default.nix index 5ef613838856..3c5199be3132 100644 --- a/pkgs/build-support/setup-hooks/wrap-gapps-hook/default.nix +++ b/pkgs/build-support/setup-hooks/wrap-gapps-hook/default.nix @@ -9,33 +9,41 @@ , dconf , callPackage , wrapGAppsHook -, writeTextFile +, targetPackages }: makeSetupHook { name = "wrap-gapps-hook"; - deps = lib.optionals (!stdenv.isDarwin) [ - # It is highly probable that a program will use GSettings, - # at minimum through GTK file chooser dialogue. - # Let’s add a GIO module for “dconf” GSettings backend - # to avoid falling back to “memory” backend. This is - # required for GSettings-based settings to be persisted. - # Unfortunately, it also requires the user to have dconf - # D-Bus service enabled globally (e.g. through a NixOS module). - dconf.lib + propagatedBuildInputs = [ + # We use the wrapProgram function. + makeWrapper ] ++ lib.optionals isGraphical [ # TODO: remove this, packages should depend on GTK explicitly. gtk3 + librsvg + ]; + + # depsTargetTargetPropagated will essentially be buildInputs when wrapGAppsHook is placed into nativeBuildInputs + # the librsvg and gtk3 above should be removed but kept to not break anything that implicitly depended on its binaries + depsTargetTargetPropagated = assert (lib.assertMsg (!targetPackages ? raw) "wrapGAppsHook must be in nativeBuildInputs"); lib.optionals isGraphical [ # librsvg provides a module for gdk-pixbuf to allow rendering # SVG icons. Most icon themes are SVG-based and so are some # graphics in GTK (e.g. cross for closing window in window title bar) # so it is pretty much required for applications using GTK. librsvg - ] ++ [ - # We use the wrapProgram function. - makeWrapper + # TODO: remove this, packages should depend on GTK explicitly. + gtk3 + ] ++ lib.optionals (!stdenv.isDarwin) [ + # It is highly probable that a program will use GSettings, + # at minimum through GTK file chooser dialogue. + # Let’s add a GIO module for “dconf” GSettings backend + # to avoid falling back to “memory” backend. This is + # required for GSettings-based settings to be persisted. + # Unfortunately, it also requires the user to have dconf + # D-Bus service enabled globally (e.g. through a NixOS module). + dconf.lib ]; passthru = { tests = let @@ -50,6 +58,7 @@ makeSetupHook { src = sample-project; + strictDeps = true; nativeBuildInputs = [ wrapGAppsHook ]; installFlags = [ "bin-foo" "libexec-bar" ]; @@ -65,12 +74,23 @@ makeSetupHook { '' ); + basic-contains-gdk-pixbuf = let + tested = basic; + in testLib.runTest "basic-contains-gdk-pixbuf" ( + testLib.skip stdenv.isDarwin '' + ${expectSomeLineContainingYInFileXToMentionZ "${tested}/bin/foo" "GDK_PIXBUF_MODULE_FILE" "${lib.getLib librsvg}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache"} + ${expectSomeLineContainingYInFileXToMentionZ "${tested}/libexec/bar" "GDK_PIXBUF_MODULE_FILE" "${lib.getLib librsvg}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache"} + '' + ); + # Simple derivation containing a gobject-introspection typelib. typelib-Mahjong = stdenv.mkDerivation { name = "typelib-Mahjong"; src = sample-project; + strictDeps = true; + installFlags = [ "typelib-Mahjong" ]; }; @@ -80,6 +100,7 @@ makeSetupHook { src = sample-project; + strictDeps = true; nativeBuildInputs = [ gobject-introspection wrapGAppsHook @@ -111,6 +132,8 @@ makeSetupHook { src = sample-project; + strictDeps = true; + makeFlags = [ "LIBDIR=${placeholder "lib"}/lib" ]; @@ -124,6 +147,7 @@ makeSetupHook { src = sample-project; + strictDeps = true; nativeBuildInputs = [ gobject-introspection wrapGAppsHook @@ -154,6 +178,7 @@ makeSetupHook { src = sample-project; + strictDeps = true; nativeBuildInputs = [ gobject-introspection wrapGAppsHook diff --git a/pkgs/build-support/setup-hooks/wrap-gapps-hook/tests/lib.nix b/pkgs/build-support/setup-hooks/wrap-gapps-hook/tests/lib.nix index 42866c3419dd..59fa9de24f9d 100644 --- a/pkgs/build-support/setup-hooks/wrap-gapps-hook/tests/lib.nix +++ b/pkgs/build-support/setup-hooks/wrap-gapps-hook/tests/lib.nix @@ -1,7 +1,7 @@ { lib, runCommand }: rec { - runTest = name: body: runCommand name { } '' + runTest = name: body: runCommand name { strictDeps = true; } '' set -o errexit ${body} touch $out |