summary refs log tree commit diff
path: root/pkgs/build-support/setup-hooks/scatter_output.sh
blob: f2a501c55e4fa2bbce805825b57f6e6379b3cdd0 (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
preFixupPhases+=" scatter_files"
preDistPhases+=" propagate_bin_input"

SCATTER_BIN_DEFAULT=${SCATTER_BIN_DEFAULT:-"/lib/*.so* /bin/*"}
SCATTER_DOC_DEFAULT=${SCATTER_DOC_DEFAULT:-"/share/man/* /share/doc/*"}


scatter_files() {
    save_nullglob=$(shopt -p nullglob)
    for o in $outputs; do
	[[ "$o" == "out" ]] && continue
	v=files_${o}
	
	#if files_'output' isn't set in derivative, use defualts for some
	[[ ${!v} ]] || {
            case $o in
		bin)
		    v=SCATTER_BIN_DEFAULT
		    ;;
		doc)
		    v=SCATTER_DOC_DEFAULT
		    ;;
		*)
		    continue
		    ;;
	    esac
        }

	# prepend each path with $out
	paths=$out${!v// \// $out/}
        shopt -s nullglob
	for f in $paths; do
	    shopt -u nullglob
	    dist=${!o}${f#$out}
	    mkdir -p $(dirname $dist)
	    cp -pr $f $dist
	    # remove source, not forgetting to clean empty dirs
	    rm -r $f
	    rmdir --ignore-fail-on-non-empty $(dirname $f)
	done
	find ${!o} -type f -exec $SHELL -c 'patchelf --set-rpath $(patchelf --print-rpath {} 2>/dev/null):'${!o}'/lib {} 2>/dev/null && patchelf --shrink-rpath {}' \;
    done
    eval $save_nullglob
}

propagate_bin_input() {
    if [[ -n ${bin:-} ]]; then
	mkdir -p $out/nix-support
	echo $bin >> $out/nix-support/propagated-native-build-inputs 
    fi

    if [[ -n ${bin:-} && -n ${doc:-} ]]; then
	mkdir -p $bin/nix-support
	echo $doc >> $bin/nix-support/propagated-user-env-packages
    fi
}