X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FConfig%2FNixies.git;a=blobdiff_plain;f=stdenv_prefix%2Fprehook.sh;fp=stdenv_prefix%2Fprehook.sh;h=db9a4d258bbd99372a9b817948abec9e342c6fbb;hp=0000000000000000000000000000000000000000;hb=b4e94e5ffeb834f96c5f3338c36b22fc13bd0cee;hpb=1cdd8f9cfc60dcda3fa38a0e52b03ddae91bd1b7 diff --git a/stdenv_prefix/prehook.sh b/stdenv_prefix/prehook.sh new file mode 100644 index 0000000..db9a4d2 --- /dev/null +++ b/stdenv_prefix/prehook.sh @@ -0,0 +1,98 @@ +count_chunks() { + elements="${1//[^\/]}" + echo $(( "${#elements}" )) +} + +oldout=$out +prefix_chunks=$(count_chunks $NIX_STORE) + +: ${storepath_length=${#NIX_STORE}} +: ${storepath_chunks=$prefix_chunks} + +if [ "$storepath_chunks" -lt $prefix_chunks ]; then + echo "Need to have at least as much path elements as the initial prefix" + exit 1 +fi + +min_length=$(( ${#NIX_STORE} + 2 * $storepath_chunks - 2 * $prefix_chunks )) +if [ "$storepath_length" -lt "$min_length" ]; then + echo "The storepath length needs to be at least the length of the prefix" + exit 1 +fi + +if [ "$storepath_chunks" -eq "$prefix_chunks" -a "$storepath_length" -gt "$min_length" ]; then + echo "You need at least one more chunk for a non-standard path length" + exit 1 +fi + +appendOut() { + chunk_prefix=$(for (( c=$prefix_chunks ; c < $storepath_chunks ; c++ )); do echo -n "/x"; done) + length_prefix=$(for (( c=$(( ${#NIX_STORE} + ${#chunk_prefix} )) ; c < $storepath_length ; c++ )); do echo -n "x"; done) + out="$out$chunk_prefix$length_prefix" + if [ -n $chunk_prefix -o -n $length_prefix ]; then + mkdir -p $(dirname $out) + fi + + : ${libc_path=} + : ${configureFlags=} + configureFlags="${configureFlags//$oldout/$out}" + if [ -n "$libc_path" ]; then + libc_oldpath=$libc_path/lib + libc_newpath=$(cat $libc_path/nix-support/new-out)/lib + configureFlags="${configureFlags//$libc_oldpath/$libc_newpath}" + fi +} + +addNixSupport() { + if [ ! -d $out ]; then + return + fi + mkdir -p $out/nix-support + echo $out > $out/nix-support/new-out +} + +overridePlaceholder() { +function _callImplicitHook { + local def="$1" + local hookName="$2" + if declare -F "$hookName" > /dev/null; then + "$hookName" + elif type -p "$hookName" > /dev/null; then + source "$hookName" + elif [ -n "${!hookName:-}" ]; then + content="${!hookName}" + eval "${content//$oldout/$out}" + else + return "$def" + fi +} +} + +preHooks+=(appendOut overridePlaceholder) + +restoreSingleFile() { + if [ "$out" != "$oldout" -a -f $out ]; then + cp -a $out ./file + rm -rf $oldout + cp -a ./file $oldout + fi +} + +addSymlinks() { + if [ "$out" != "$oldout" -a -d $out ]; then + ln -s $out/* $oldout/ + fi +} + +rename_generic_build() { +eval "$(echo "orig_genericBuild()"; declare -f genericBuild | tail -n +2)" +function genericBuild { + orig_genericBuild "$@" + restoreSingleFile + addSymlinks + addNixSupport +} +} + +exitHooks+=(restoreSingleFile addSymlinks addNixSupport) +postHooks+=(rename_generic_build)