diff --git a/pkgs/lib/customisation.nix b/pkgs/lib/customisation.nix index e6a26958ae2..334c8036627 100644 --- a/pkgs/lib/customisation.nix +++ b/pkgs/lib/customisation.nix @@ -1,4 +1,7 @@ -let lib = import ./default.nix; in +let lib = import ./default.nix; + inherit (builtins) getAttr attrNames isFunction; + +in rec { @@ -31,7 +34,10 @@ rec { overrideDerivation = drv: f: let # Filter out special attributes. - attrs = removeAttrs drv ["meta" "passthru" "outPath" "drvPath" "hostDrv" "buildDrv" "type" "override" "deepOverride" "origArgs"]; + drop = ["meta" "passthru" "outPath" "drvPath" "hostDrv" "buildDrv" "type" "override" "deepOverride" "origArgs"] + # also drop functions such as .merge .override etc + ++ lib.filter (n: isFunction (getAttr n drv)) (attrNames drv); + attrs = removeAttrs drv drop; newDrv = derivation (attrs // (f drv)); in newDrv // { meta = if drv ? meta then drv.meta else {}; diff --git a/pkgs/misc/misc.nix b/pkgs/misc/misc.nix index fc8ab43d52f..3e4e94fbc78 100644 --- a/pkgs/misc/misc.nix +++ b/pkgs/misc/misc.nix @@ -1,6 +1,6 @@ { pkgs, stdenv } : -let inherit (pkgs) stdenv runCommand perl; +let inherit (pkgs) stdenv runCommand perl lib; in @@ -106,4 +106,30 @@ in echo "''${PATH}" > $target/PATH ''; }; + + + # build a debug version of a package + debugVersion = pkg: lib.overrideDerivation pkg (attrs: { + + prePhases = ["preHook"] ++ lib.optionals (pkgs ? prePhases) pkgs.prePhases; + + dontStrip = true; + + NIX_STRIP_DEBUG=0; + CFLAGS="-ggdb -O0"; + CXXFLAGS="-ggdb -O0"; + + preHook = '' + s=$out/src + mkdir -p $s; cd $s; + export TMP=$s + export TEMP=$s + + for var in CFLAGS CXXFLAGS NIX_CFLAGS_COMPILE; do + declare -x "$var=''${!var} -ggdb -O0" + done + echo "file should tell that executable has not been strippee" + ''; + + }); }