summary refs log tree commit diff
path: root/pkgs/build-support/gcc-cross-wrapper/gcc-wrapper.sh
blob: 98baafb4878d9aa75c50b972b7ed639e62ef1db2 (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
#! @shell@ -e

if test -n "$NIX_GCC_WRAPPER_START_HOOK"; then
    source "$NIX_GCC_WRAPPER_START_HOOK"
fi

if test -z "$NIX_CROSS_GLIBC_FLAGS_SET"; then
    source @out@/nix-support/add-flags
fi

source @out@/nix-support/utils


# Figure out if linker flags should be passed.  GCC prints annoying
# warnings when they are not needed.
dontLink=0
if test "$*" = "-v" -o -z "$*"; then
    dontLink=1
else
    for i in "$@"; do
        if test "$i" = "-c"; then
            dontLink=1
        elif test "$i" = "-S"; then
            dontLink=1
        elif test "$i" = "-E"; then
            dontLink=1
        elif test "$i" = "-E"; then
            dontLink=1
        elif test "$i" = "-M"; then
            dontLink=1
        elif test "$i" = "-MM"; then
            dontLink=1
        fi
    done
fi


# Optionally filter out paths not refering to the store.
params=("$@")
if test "$NIX_ENFORCE_PURITY" = "1" -a -n "$NIX_STORE"; then
    rest=()
    n=0
    while test $n -lt ${#params[*]}; do
        p=${params[n]}
        p2=${params[$((n+1))]}
        if test "${p:0:3}" = "-L/" && badPath "${p:2}"; then
            skip $p
        elif test "$p" = "-L" && badPath "$p2"; then
            n=$((n + 1)); skip $p2
        elif test "${p:0:3}" = "-I/" && badPath "${p:2}"; then
            skip $p
        elif test "$p" = "-I" && badPath "$p2"; then
            n=$((n + 1)); skip $p2
        elif test "$p" = "-isystem" && badPath "$p2"; then
            n=$((n + 1)); skip $p2
        else
            rest=("${rest[@]}" "$p")
        fi
        n=$((n + 1))
    done
    params=("${rest[@]}")
fi


# Add the flags for the C compiler proper.
extraAfter=($NIX_CROSS_CFLAGS_COMPILE)
extraBefore=()

if test "$dontLink" != "1"; then

    # Add the flags that should only be passed to the compiler when
    # linking.
    extraAfter=(${extraAfter[@]} $NIX_CROSS_CFLAGS_LINK)

    # Add the flags that should be passed to the linker (and prevent
    # `ld-wrapper' from adding NIX_CROSS_LDFLAGS again).
    for i in $NIX_CROSS_LDFLAGS_BEFORE; do
        if test "${i:0:3}" = "-L/"; then
            extraBefore=(${extraBefore[@]} "$i")
        else
            extraBefore=(${extraBefore[@]} "-Wl,$i")
        fi
    done
    for i in $NIX_CROSS_LDFLAGS; do
        if test "${i:0:3}" = "-L/"; then
            extraAfter=(${extraAfter[@]} "$i")
        else
            extraAfter=(${extraAfter[@]} "-Wl,$i")
        fi
    done
    export NIX_CROSS_LDFLAGS_SET=1

    if test "$NIX_STRIP_DEBUG" = "1"; then
        # Add executable-stripping flags.
        extraAfter=(${extraAfter[@]} $NIX_CFLAGS_STRIP)
    fi
fi

# Optionally print debug info.
if test "$NIX_DEBUG" = "1"; then
  echo "original flags to @gccProg@:" >&2
  for i in "${params[@]}"; do
      echo "  $i" >&2
  done
  echo "extraBefore flags to @gccProg@:" >&2
  for i in ${extraBefore[@]}; do
      echo "  $i" >&2
  done
  echo "extraAfter flags to @gccProg@:" >&2
  for i in ${extraAfter[@]}; do
      echo "  $i" >&2
  done
fi

if test -n "$NIX_GCC_WRAPPER_EXEC_HOOK"; then
    source "$NIX_GCC_WRAPPER_EXEC_HOOK"
fi

# We want gcc to call the wrapper linker, not that of binutils.
export PATH="@ldPath@:$PATH"

# Call the real `gcc'.  Filter out warnings from stderr about unused
# `-B' flags, since they confuse some programs.  Deep bash magic to
# apply grep to stderr (by swapping stdin/stderr twice).
if test -z "$NIX_GCC_NEEDS_GREP"; then
    @gccProg@ ${extraBefore[@]} "${params[@]}" ${extraAfter[@]}
else
    (@gccProg@ ${extraBefore[@]} "${params[@]}" ${extraAfter[@]} 3>&2 2>&1 1>&3- \
        | (grep -v 'file path prefix' || true); exit ${PIPESTATUS[0]}) 3>&2 2>&1 1>&3-
    exit $?
fi