tools/populate.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Sep 23 14:48:10 2008 +0000 (2008-09-23)
changeset 872 fd4bf138f08f
parent 755 c2212f59e1cf
child 910 9db42913e2ae
permissions -rw-r--r--
Bart De VOS pointed out that removing absolute paths from the libc linker scripts is plainly wrong.
It dates from dawn ages of the original crosstool code, and is not well explained. At that time, binutils might not understand the sysroot stuff, and it was necessary to remove absolute paths in that case.

/trunk/scripts/build/libc/glibc.sh | 14 2 12 0 ++------------
1 file changed, 2 insertions(+), 12 deletions(-)
yann@217
     1
#!/bin/bash
yann@217
     2
yann@217
     3
# This script will populate the root directory with libs from the sysroot.
yann@217
     4
# (C) 2007 Yann E. MORIN
yann@217
     5
# Licensed under the GPL v2
yann@217
     6
yann@755
     7
# Detect where the toolchain is:
yann@770
     8
BIN_DIR="$(cd "$(dirname "$0")"; pwd)"
yann@755
     9
CT_READELF="${BIN_DIR}/@@CT_TARGET@@-readelf"
yann@755
    10
CT_SYSROOT_DIR="${BIN_DIR}/../@@CT_TARGET@@/sys-root"
yann@217
    11
yann@217
    12
myname=$(basename "$0")
yann@217
    13
yann@217
    14
doHelp() {
yann@217
    15
    cat <<_EOF_
yann@253
    16
$myname [-f] [-v] -s source_root -d destination_root
yann@217
    17
yann@217
    18
    -s dir
yann@217
    19
        use 'dir' as the un-populated (source) root directory
yann@217
    20
yann@217
    21
    -d dir
yann@217
    22
        use 'dir' as the place to put the populated root directory
yann@217
    23
yann@258
    24
    -f  force execution: if destination directory already exists,
yann@258
    25
        it will be removed first.
yann@258
    26
yann@217
    27
    -v  Be verbose
yann@217
    28
_EOF_
yann@217
    29
}
yann@217
    30
yann@217
    31
CT_ROOT_SRC_DIR=
yann@217
    32
CT_ROOT_DST_DIR=
yann@259
    33
CT_FORCE=no
yann@217
    34
CT_ECHO=true
yann@259
    35
while getopts ":s:d:fvh" CT_OPT; do
yann@217
    36
    case "${CT_OPT}" in
yann@217
    37
        s)  CT_ROOT_SRC_DIR="${OPTARG}";;
yann@217
    38
        d)  CT_ROOT_DST_DIR="${OPTARG}";;
yann@259
    39
        f)  CT_FORCE=y;;
yann@217
    40
        v)  CT_ECHO=echo;;
yann@217
    41
        h)  doHelp
yann@217
    42
            exit 0
yann@217
    43
            ;;
yann@523
    44
        :)  echo "$myname: '-${OPTARG}' takes exactly one argument."
yann@217
    45
            exit 1
yann@217
    46
            ;;
yann@523
    47
        ?)  echo "$myname: unknown option '-${OPTARG}'."
yann@217
    48
            exit 1
yann@217
    49
            ;;
yann@217
    50
    esac
yann@217
    51
done
yann@217
    52
yann@217
    53
# Sanity checks
yann@217
    54
if [ -z "${CT_ROOT_SRC_DIR}" -o -z "${CT_ROOT_DST_DIR}" ]; then
yann@217
    55
    doHelp
yann@217
    56
    exit 1
yann@217
    57
fi
yann@217
    58
if [ ! -d "${CT_ROOT_SRC_DIR}" ]; then
yann@523
    59
    echo "$myname: '${CT_ROOT_SRC_DIR}': no such file or directory"
yann@217
    60
    exit 1
yann@217
    61
fi
yann@259
    62
if [ -d "${CT_ROOT_DST_DIR}" -a "${CT_FORCE}" != "y" ]; then
yann@523
    63
    echo "$myname: '${CT_ROOT_DST_DIR}': already exists"
yann@217
    64
    exit 1
yann@217
    65
fi
yann@217
    66
src_inode=$(ls -di "${CT_ROOT_SRC_DIR}")
yann@217
    67
dst_inode=$(ls -di "${CT_ROOT_DST_DIR}" 2>/dev/null)
yann@217
    68
if [ "${src_inode}" = "${dst_inode}" ]; then
yann@217
    69
    echo "$myname: source and destination are the same!"
yann@217
    70
    exit 1
yann@217
    71
fi
yann@217
    72
yann@217
    73
# Get rid of potentially older destination directory
yann@217
    74
if [ -d "${CT_ROOT_DST_DIR}" ]; then
yann@217
    75
    mv "${CT_ROOT_DST_DIR}" "${CT_ROOT_DST_DIR}.$$"
yann@320
    76
    setsid nohup rm -rf "${CT_ROOT_DST_DIR}.$$" >/dev/null 2>&1 &
yann@217
    77
fi
yann@217
    78
yann@217
    79
# Create the working copy
yann@217
    80
mkdir -p "${CT_ROOT_DST_DIR}"
yann@217
    81
yann@217
    82
# Make all path absolute
yann@253
    83
CT_ROOT_SRC_DIR=$(cd "${CT_ROOT_SRC_DIR}"; pwd)
yann@253
    84
CT_ROOT_DST_DIR=$(cd "${CT_ROOT_DST_DIR}"; pwd)
yann@217
    85
yann@217
    86
cd "${CT_ROOT_SRC_DIR}"
yann@217
    87
tar cf - . |(cd "${CT_ROOT_DST_DIR}"; tar xf -)
yann@217
    88
yann@217
    89
# Parse the working copy for executables and libraries
yann@217
    90
cd "${CT_ROOT_DST_DIR}"
yann@217
    91
still_needed=1
yann@217
    92
while [ ${still_needed} -eq 1 ]; do
yann@217
    93
    ${CT_ECHO} "Looping..."
yann@217
    94
    still_needed=0
yann@217
    95
    for f in $(find . -type f -exec file {} \; |egrep ': ELF [[:digit:]]+-bit .SB (executable|shared object),' |cut -d ":" -f 1); do
yann@523
    96
        ${CT_ECHO} "Scanning '${f}'"
yann@217
    97
        for libname in $("${CT_READELF}" -d "${f}" |egrep '(NEEDED)' |sed -r -e 's,.+\[(.+)\] *$,\1,;'); do
yann@523
    98
            ${CT_ECHO} "  searching for '${libname}'"
yann@259
    99
            if [    -e "lib/${libname}"     \
yann@259
   100
                 -o -e "usr/lib/${libname}" ]; then
yann@217
   101
                ${CT_ECHO} "    already present"
yann@217
   102
                continue
yann@217
   103
            fi
yann@688
   104
            for dir in . usr; do
yann@523
   105
                ${CT_ECHO} -n "    trying in '${dir}'"
yann@217
   106
                libfile="${CT_SYSROOT_DIR}/${dir}/lib/${libname}"
yann@523
   107
                ${CT_ECHO} ": '${libfile}'"
yann@217
   108
                if [ -e "${libfile}" ]; then
yann@259
   109
                    mkdir -p "${dir}/lib"
yann@688
   110
                    ${CT_ECHO} "      installing '${dir}/lib/${libname}'"
yann@688
   111
                    cp "${libfile}" "${dir}/lib/${libname}"
yann@217
   112
                    still_needed=1
yann@217
   113
                    break
yann@217
   114
                fi
yann@217
   115
            done
yann@217
   116
        done
yann@217
   117
    done
yann@217
   118
done