summaryrefslogtreecommitdiff
path: root/stdenv_prefix/prehook.sh
blob: c5474dc2655a950ad76e4bd0989455e2086eac5d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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=}
  : ${installFlags=}
  installFlags="${installFlags//$oldout/$out}"
  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}"
    installFlags="${installFlags//$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)