summary refs log tree commit diff
path: root/pkgs/development/interpreters/lua-5/wrap.sh
blob: 545a0ae271c4e14d9e3ab9a8ba35c1178093a176 (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
# Inspired by python/wrapper.nix
# Wrapper around wrapLuaProgramsIn, below. The $luaPath
# variable is passed in from the buildLuarocksPackage function.
set -e

wrapLuaPrograms() {
    wrapLuaProgramsIn "$out/bin" "$out $luaPath"
}

# Builds environment variables like LUA_PATH and PATH walking through closure
# of dependencies.
buildLuaPath() {
    local luaPath="$1"
    local path

    # Create an empty table of paths (see doc on loadFromPropagatedInputs
    # for how this is used). Build up the program_PATH and program_LUA_PATH
    # variables.
    declare -A luaPathsSeen=()
    program_PATH=
    luaPathsSeen["@lua@"]=1
    addToSearchPath program_PATH @lua@/bin
    for path in $luaPath; do
        addToLuaPath "$path"
    done
}


# with an executable shell script which will set some environment variables
# and then call into the original binary (which has been given a .wrapped suffix).
# luaPath is a list of directories
wrapLuaProgramsIn() {
    local dir="$1"
    local luaPath="$2"
    local f

    buildLuaPath "$luaPath"

    if [ ! -d "$dir" ]; then
        nix_debug "$dir not a directory"
        return
    fi

    nix_debug "wrapping programs in [$dir]"

    # Find all regular files in the output directory that are executable.
    find "$dir" -type f -perm -0100 -print0 | while read -d "" f; do
        # Rewrite "#! .../env lua" to "#! /nix/store/.../lua".
        # Strip suffix, like "3" or "2.7m" -- we don't have any choice on which
        # Lua to use besides one with this hook anyway.
        if head -n1 "$f" | grep -q '#!.*/env.*\(lua\)'; then
            sed -i "$f" -e "1 s^.*/env[ ]*\(lua\)[^ ]*^#! @executable@^"
        fi

        # wrapProgram creates the executable shell script described
        # above. The script will set LUA_(C)PATH and PATH variables!
        # (see pkgs/build-support/setup-hooks/make-wrapper.sh)
        local -a wrap_args=("$f"
            --prefix PATH ':' "$program_PATH"
            --prefix LUA_PATH ';' "$NIX_LUA_PATH"
            --prefix LUA_CPATH ';' "$NIX_LUA_CPATH"
        )

        # Add any additional arguments provided by makeWrapperArgs
        # argument to buildLuaPackage.
        # makeWrapperArgs
        local -a user_args="($makeWrapperArgs)"
        local -a wrapProgramArgs=("${wrap_args[@]}" "${user_args[@]}")

        # see setup-hooks/make-wrapper.sh
        wrapProgram "${wrapProgramArgs[@]}"

    done
}

# Adds the lib and bin directories to the LUA_PATH and PATH variables,
# respectively. Recurses on any paths declared in
# `propagated-native-build-inputs`, while avoiding duplicating paths by
# flagging the directories it has visited in `luaPathsSeen`.
loadFromPropagatedInputs() {
    local dir="$1"
    # Stop if we've already visited here.
    if [ -n "${luaPathsSeen[$dir]}" ]; then
        return;
    fi
    luaPathsSeen[$dir]=1

    addToLuaPath "$dir"
    addToSearchPath program_PATH $dir/bin

    # Inspect the propagated inputs (if they exist) and recur on them.
    local prop="$dir/nix-support/propagated-native-build-inputs"
    if [ -e "$prop" ]; then
        local new_path
        for new_path in $(cat $prop); do
            loadFromPropagatedInputs "$new_path"
        done
    fi
}