scripts/populate.in
changeset 1180 734db80cc9b9
parent 1097 b46a557b33c9
child 1190 15908c920549
     1.1 --- a/scripts/populate.in	Thu Dec 11 18:16:54 2008 +0000
     1.2 +++ b/scripts/populate.in	Sat Jan 31 17:38:26 2009 +0000
     1.3 @@ -1,16 +1,21 @@
     1.4 -#!/bin/bash
     1.5 -
     1.6 +#!@@CT_bash@@
     1.7  # This script will populate the root directory with libs from the sysroot.
     1.8  # (C) 2007 Yann E. MORIN
     1.9  # Licensed under the GPL v2
    1.10 +set -e
    1.11  
    1.12  # Detect where the toolchain is:
    1.13 -BIN_DIR="$(cd "$(dirname "$0")"; pwd)"
    1.14 -CT_READELF="${BIN_DIR}/@@CT_TARGET@@-readelf"
    1.15 -CT_SYSROOT_DIR="${BIN_DIR}/../@@CT_TARGET@@/sys-root"
    1.16 +CT_PREFIX_DIR="$(cd "$(dirname "$0")/.."; pwd)"
    1.17 +CT_BIN_DIR="${CT_PREFIX_DIR}/bin"
    1.18 +CT_READELF="${CT_BIN_DIR}/@@CT_TARGET@@-readelf"
    1.19 +CT_LIB_DIR="${CT_PREFIX_DIR}/lib"
    1.20 +CT_SYSROOT_DIR="$(cd "${CT_BIN_DIR}/../@@CT_TARGET@@/sys-root"; pwd)"
    1.21  
    1.22  myname=$(basename "$0")
    1.23  
    1.24 +# Parse the tools' paths configuration
    1.25 +. "${CT_LIB_DIR}/paths.mk"
    1.26 +
    1.27  doHelp() {
    1.28      cat <<_EOF_
    1.29  NAME
    1.30 @@ -63,6 +68,7 @@
    1.31  CT_LIB_FILE=
    1.32  CT_FORCE=no
    1.33  CT_ECHO=true
    1.34 +OPTIND=1
    1.35  while getopts ":s:d:l:L:fvh" CT_OPT; do
    1.36      case "${CT_OPT}" in
    1.37          s)  CT_ROOT_SRC_DIR="${OPTARG}";;
    1.38 @@ -110,10 +116,7 @@
    1.39  fi
    1.40  
    1.41  # Get rid of potentially older destination directory
    1.42 -if [ -d "${CT_ROOT_DST_DIR}" ]; then
    1.43 -    mv "${CT_ROOT_DST_DIR}" "${CT_ROOT_DST_DIR}.$$"
    1.44 -    setsid nohup rm -rf "${CT_ROOT_DST_DIR}.$$" >/dev/null 2>&1 &
    1.45 -fi
    1.46 +rm -rf "${CT_ROOT_DST_DIR}"
    1.47  
    1.48  # Create the working copy
    1.49  mkdir -p "${CT_ROOT_DST_DIR}"
    1.50 @@ -122,6 +125,7 @@
    1.51  CT_ROOT_SRC_DIR=$(cd "${CT_ROOT_SRC_DIR}"; pwd)
    1.52  CT_ROOT_DST_DIR=$(cd "${CT_ROOT_DST_DIR}"; pwd)
    1.53  
    1.54 +# Populate the destination directory with files form the source directory
    1.55  pushd "${CT_ROOT_SRC_DIR}" >/dev/null
    1.56  tar cf - . |(cd "${CT_ROOT_DST_DIR}"; tar xf -)
    1.57  popd >/dev/null
    1.58 @@ -131,30 +135,42 @@
    1.59  # returns: 0 if library was found and added, !0 otherwise
    1.60  do_add_lib() {
    1.61      local libname="$1"
    1.62 -    local ret=1
    1.63      local true_libname
    1.64 -    for dir in . usr; do
    1.65 +    local dir
    1.66 +    for dir in lib usr/lib; do
    1.67          ${CT_ECHO} -n "    trying in '${dir}'"
    1.68 -        libfile="${CT_SYSROOT_DIR}/${dir}/lib/${libname}"
    1.69 +        libfile="${CT_SYSROOT_DIR}/${dir}/${libname}"
    1.70          ${CT_ECHO} ": '${libfile}'"
    1.71          if [ -e "${libfile}" ]; then
    1.72 -            mkdir -p "${dir}/lib"
    1.73 -            true_libname=$("${CT_READELF}" -d "${libfile}" |egrep "SONAME" |sed -r -e 's,.+\[(.+)\] *$,\1,;')
    1.74 -            ${CT_ECHO} "      installing as '${dir}/lib/${true_libname}'"
    1.75 -            cat "${libfile}" >"${dir}/lib/${true_libname}"
    1.76 -            ret=0
    1.77 +            mkdir -p "${dir}"
    1.78 +            true_libname=$("${CT_READELF}" -d "${libfile}"          \
    1.79 +                           |"${grep}" "Library soname:"             \
    1.80 +                           |"${sed}" -r -e 's,.+\[(.+)\] *$,\1,;'   \
    1.81 +                          )
    1.82 +            ${CT_ECHO} "      installing as '${dir}/${true_libname}'"
    1.83 +            "${install}" -m 0644 "${libfile}" "${dir}/${true_libname}"
    1.84 +            return 0
    1.85              break
    1.86          fi
    1.87      done
    1.88 -    return ${ret}
    1.89 +    return 1
    1.90  }
    1.91  
    1.92  # First of, copy the forced libraries into the working copy
    1.93  if [ -n "${CT_LIB_FILE}" ]; then
    1.94 -    lib_list=$(sed -r -e ':loop; s/#.*//; s/[[:space:]]+//g; s/([^:])$/\1:/; /$/N; s/\n//; tloop;' "${CT_LIB_FILE}")
    1.95 -    CT_LIB_LIST=$(echo "${CT_LIB_LIST}:${lib_list}" |sed -r -e 's/:+/:/g; s/^:+//; s/:+$//;')
    1.96 +    lib_list=$("${sed}" -r -e ':loop; s/#.*//;'         \
    1.97 +                           -e 's/[[:space:]]+//g;'      \
    1.98 +                           -e 's/([^:])$/\1:/;'         \
    1.99 +                           -e '/$/N; s/\n//; tloop;'    \
   1.100 +                        "${CT_LIB_FILE}"
   1.101 +              )
   1.102 +    CT_LIB_LIST=$(echo "${CT_LIB_LIST}:${lib_list}"             \
   1.103 +                  |"${sed}" -r -e 's/:+/:/g; s/^:+//; s/:+$//;' \
   1.104 +                 )
   1.105  fi
   1.106 -CT_LIB_LIST="${CT_LIB_LIST//:/ }"
   1.107 +CT_LIB_LIST=$(echo "${CT_LIB_LIST}:${lib_list}"             \
   1.108 +              |"${sed}" -r -e 's/^:+//; s/:+$//; s/:+/ /g;' \
   1.109 +             )
   1.110  ${CT_ECHO} "Installing forced libraries..."
   1.111  pushd "${CT_ROOT_DST_DIR}" >/dev/null
   1.112  for name in ${CT_LIB_LIST}; do
   1.113 @@ -180,9 +196,15 @@
   1.114  while [ ${still_needed} -eq 1 ]; do
   1.115      ${CT_ECHO} "Looping..."
   1.116      still_needed=0
   1.117 -    for f in $(find . -type f -exec file {} \; |egrep ': ELF [[:digit:]]+-bit .SB (executable|shared object),' |cut -d ":" -f 1); do
   1.118 +    for f in $(find . -type f -exec file {} \;                                              \
   1.119 +               |"${grep}" -E ': ELF [[:digit:]]+-bit (L|M)SB (executable|shared object),'   \
   1.120 +               |cut -d ":" -f 1                                                             \
   1.121 +              ); do
   1.122          ${CT_ECHO} "Scanning '${f}'"
   1.123 -        for libname in $("${CT_READELF}" -d "${f}" |egrep '(NEEDED)' |sed -r -e 's,.+\[(.+)\] *$,\1,;'); do
   1.124 +        for libname in $("${CT_READELF}" -d "${f}"                              \
   1.125 +                         |"${grep}" -E '\(NEEDED\)[[:space:]]+Shared library:'  \
   1.126 +                         |"${sed}" -r -e 's,.+\[(.+)\] *$,\1,;'                 \
   1.127 +                        ); do
   1.128              ${CT_ECHO} "  searching for '${libname}'"
   1.129              if [    -e "lib/${libname}"     \
   1.130                   -o -e "usr/lib/${libname}" ]; then