summary refs log tree commit diff
path: root/pkgs/stdenv/generic/setup.sh
blob: 4f1485f224bf708f85bbeab639484e0829266f0c (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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
set -e

test -z $NIX_GCC && NIX_GCC=@gcc@


# Set up the initial path.
PATH=
for i in $NIX_GCC @initialPath@; do
    PATH=$PATH${PATH:+:}$i/bin
done

if test "$NIX_DEBUG" = "1"; then
    echo "Initial path: $PATH"
fi


# Execute the pre-hook.
export SHELL=@shell@
param1=@param1@
param2=@param2@
param3=@param3@
param4=@param4@
param5=@param5@
if test -n "@preHook@"; then
    . @preHook@
fi


# Check that the pre-hook initialised SHELL.
if test -z "$SHELL"; then echo "SHELL not set"; exit 1; fi


# Hack: run gcc's setup hook.
envHooks=()
if test -f $NIX_GCC/nix-support/setup-hook; then
    . $NIX_GCC/nix-support/setup-hook
fi

    
# Recursively find all build inputs.
findInputs()
{
    local pkg=$1

    case $pkgs in
        *\ $pkg\ *)
            return 0
            ;;
    esac
    
    pkgs="$pkgs $pkg "

    if test -f $pkg/nix-support/setup-hook; then
        . $pkg/nix-support/setup-hook
    fi
    
    if test -f $pkg/nix-support/propagated-build-inputs; then
        for i in $(cat $pkg/nix-support/propagated-build-inputs); do
            findInputs $i
        done
    fi
}

pkgs=""
if test -n "$buildinputs"; then
    buildInputs="$buildinputs" # compatibility
fi
for i in $buildInputs $propagatedBuildInputs; do
    findInputs $i
done


# Set the relevant environment variables to point to the build inputs
# found above.
addToEnv()
{
    local pkg=$1

    if test -d $1/bin; then
        export _PATH=$_PATH${_PATH:+:}$1/bin
    fi

    for i in "${envHooks[@]}"; do
        $i $pkg
    done
}

for i in $pkgs; do
    addToEnv $i
done


# Add the output as an rpath.
if test "$NIX_NO_SELF_RPATH" != "1"; then
    export NIX_LDFLAGS="-rpath $out/lib $NIX_LDFLAGS"
fi


# Strip debug information by default.
export NIX_STRIP_DEBUG=1
export NIX_CFLAGS_STRIP="-g0 -Wl,-s"


# Do we know where the store is?  This is required for purity checking.
if test -z "$NIX_STORE"; then
    echo "Error: you have an old version of Nix that does not set the" \
        "NIX_STORE variable.  Please upgrade." >&2
    exit 1
fi


# We also need to know the root of the build directory for purity checking.
if test -z "$NIX_BUILD_TOP"; then
    echo "Error: you have an old version of Nix that does not set the" \
        "NIX_BUILD_TOP variable.  Please upgrade." >&2
    exit 1
fi


# Set the TZ (timezone) environment variable, otherwise commands like
# `date' will complain (e.g., `Tue Mar 9 10:01:47 Local time zone must
# be set--see zic manual page 2004').
export TZ=UTC


# Execute the post-hook.
if test -n "@postHook@"; then
    . @postHook@
fi

PATH=$_PATH${_PATH:+:}$PATH
if test "$NIX_DEBUG" = "1"; then
    echo "Final path: $PATH"
fi


######################################################################
# What follows is the generic builder.


nestingLevel=0

startNest() {
    nestingLevel=$(($nestingLevel + 1))
    echo -en "\e[$1p"
}

stopNest() {
    nestingLevel=$(($nestingLevel - 1))
    echo -en "\e[q"
}

header() {
    startNest "$2"
    echo "$1"
}

# Make sure that even when we exit abnormally, the original nesting
# level is properly restored.
closeNest() {
    while test $nestingLevel -gt 0; do
        stopNest
    done
}

trap "closeNest" EXIT


# Utility function: return the base name of the given path, with the
# prefix `HASH-' removed, if present.
stripHash() {
    strippedName=$(basename $1);
    if echo "$strippedName" | grep -q '^[a-f0-9]\{32\}-'; then
        strippedName=$(echo "$strippedName" | cut -c34-)
    fi
}


unpackFile() {
    local file=$1
    local cmd

    case $file in
        *.tar) cmd="tar xvf $file";;
        *.tar.gz | *.tgz | *.tar.Z) cmd="tar xvfz $file";;
        *.tar.bz2 | *.tbz2) cmd="tar xvfj $file";;
        *.zip) cmd="unzip $file";;
        *)
            if test -d "$file"; then
                stripHash $file
                cmd="cp -prvd $file $strippedName"
            else
                if test -n "$findUnpacker"; then
                    $findUnpacker $1;
                fi
                if test -z "$unpackCmd"; then
                    echo "source archive $file has unknown type"
                    exit 1
                fi
                cmd=$unpackCmd
            fi
            ;;
    esac

    header "unpacking source archive $file (using $cmd)" 3
    $cmd
    stopNest
}


unpackW() {
    if test -n "$unpackPhase"; then
        $unpackPhase
        return
    fi

    if test -z "$srcs"; then
        if test -z "$src"; then
            echo 'variable $src or $srcs should point to the source'
            exit 1
        fi
        srcs="$src"
    fi

    # To determine the source directory created by unpacking the
    # source archives, we record the contents of the current
    # directory, then look below which directory got added.  Yeah,
    # it's rather hacky.
    local dirsBefore=""
    for i in *; do
        if test -d "$i"; then
            dirsBefore="$dirsBefore $i "
        fi
    done

    # Unpack all source archives.
    for i in $srcs; do
        unpackFile $i
    done

    # Find the source directory.
    if test -n "$setSourceRoot"; then
        $setSourceRoot
    else
        sourceRoot=
        for i in *; do
            if test -d "$i"; then
                case $dirsBefore in
                    *\ $i\ *)
                        ;;
                    *)
                        if test -n "$sourceRoot"; then
                            echo "unpacker produced multiple directories"
                            exit 1
                        fi
                        sourceRoot=$i
                        ;;
                esac
            fi
        done
    fi

    if test -z "$sourceRoot"; then
        echo "unpacker appears to have produced no directories"
        exit 1
    fi

    echo "source root is $sourceRoot"

    if test -n "$postUnpack"; then
        $postUnpack
    fi
}


unpackPhase() {
    header "unpacking sources"
    unpackW
    stopNest
}


patchW() {
    if test -n "$patchPhase"; then
        $patchPhase
        return
    fi

    for i in $patches; do
        header "applying patch $i" 3
        patch -p1 < $i
        stopNest
    done
}


patchPhase() {
    if test -z "$patchPhase" -a -z "$patches"; then return; fi
    header "patching sources"
    patchW
    stopNest
}


fixLibtool() {
    sed 's^eval sys_lib_.*search_path=.*^^' < $1 > $1.tmp
    mv $1.tmp $1
}


configureW() {
    if test -n "$configurePhase"; then
        $configurePhase
        stopNest
        return
    fi

    if test -n "$preConfigure"; then
        $preConfigure
    fi

    if test -z "$configureScript"; then
        configureScript=./configure
    fi
    
    if ! test -x $configureScript; then
        echo "no configure script, doing nothing"
        return
    fi

    if test -z "$dontFixLibtool" -a -f ./ltmain.sh; then
        for i in $(find . -name "ltmain.sh"); do
            echo "fixing libtool script $i"
            fixLibtool $i
        done
    fi

    if test -z "$dontAddPrefix"; then
        configureFlags="--prefix=$out $configureFlags"
    fi

    echo "configure flags: $configureFlags"
    $configureScript $configureFlags

    if test -n "$postConfigure"; then
        $postConfigure
    fi
}


configurePhase() {
    header "configuring"
    configureW
    stopNest
}


buildW() {
    if test -n "$buildPhase"; then
        $buildPhase
        return
    fi

    if test -z "$dontMake"; then
        echo "make flags: $makeFlags"
        make $makeFlags
    fi
}


buildPhase() {
    header "building"
    buildW
    stopNest
}


installW() {
    if test -n "$installPhase"; then
        $installPhase
        return
    fi
    
    if test -n "$preInstall"; then
        $preInstall
    fi

    if ! test -x "$out"; then mkdir "$out"; fi
    
    if test -z "$dontMakeInstall"; then
        echo "install flags: $installFlags"
        make install $installFlags
    fi

    if test -z "$dontStrip" -a "$NIX_STRIP_DEBUG" = 1; then
        find "$out" -name "*.a" -exec echo stripping {} \; -exec strip -S {} \;
    fi

    if test -n "$propagatedBuildInputs"; then
        if ! test -x "$out/nix-support"; then mkdir "$out/nix-support"; fi
        echo "$propagatedBuildInputs" > "$out/nix-support/propagated-build-inputs"
    fi

    if test -n "$postInstall"; then
        $postInstall
    fi
}


installPhase() {
    header "installing"
    installW
    stopNest
}


genericBuild() {
    header "building $out"
    unpackPhase
    cd $sourceRoot
    patchPhase
    configurePhase
    buildPhase
    installPhase
    stopNest
}