summaryrefslogtreecommitdiff
path: root/stage2-glibc-fix-specs
blob: 62af02bcaf33b614e02491fe593e73079d4de836 (plain)
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
#!/bin/sh

# Fix up GCC to handle the sysroot containing glibc being in a different
# location for each chunk build.
#
# For headers, it's enough to pass -B in the CPPFLAGS. This would work for
# the startup files (crt*.o) as well, except where libtool is involved (in
# which case it strips -B out of your LDFLAGS before calling GCC). We get
# around this by making GCC locate them relative to the environment variable
# STAGE2_SYSROOT, which we can then set along with CPPFLAGS in each stage 2
# chunk build.
#
# We also force the use of the program loader at PREFIX/lib/ld.so instead
# of its usual home in /lib or /lib64, which is necessary for the output of
# stage 2 to work as a chroot when building stage 3.

set -eu

sysroot="$(dirname "$(pwd)")"
specs_dir="$(dirname $($TARGET_STAGE1-gcc --print-libgcc-file-name))"
target_specs_dir="$DESTDIR/${specs_dir#$sysroot}"
mkdir -p "$target_specs_dir"

$TARGET_STAGE1-gcc -dumpspecs |
    sed -e "s@[gMS]\?crt[1in].o%s@%:getenv(STAGE2_SYSROOT $PREFIX/lib/&)@g" \
        -e "s@/lib\(64\)\?/ld@$PREFIX/lib/ld@g" \
    > "$target_specs_dir/specs-for-sysroot"

# NASTY HACK #
# We create a symlink to the actual specs here, so that later the
# symlink can be replaced with a dangling link.
#
# This is necessary as we need to have gcc use its internal specs,
# which can differ to the specs generated by `gcc -dumpspecs`.
#
# The dangling symlink will not make it onto the final system, just
# like all other bootstrap only components.
ln -s specs-for-sysroot "$target_specs_dir/specs"