1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/tools/populate.in Sun Jul 08 17:44:59 2007 +0000
1.3 @@ -0,0 +1,124 @@
1.4 +#!/bin/bash
1.5 +
1.6 +# This script will populate the root directory with libs from the sysroot.
1.7 +# (C) 2007 Yann E. MORIN
1.8 +# Licensed under the GPL v2
1.9 +
1.10 +CT_READELF="@@CT_READELF@@"
1.11 +CT_SYSROOT_DIR="@@CT_SYSROOT_DIR@@"
1.12 +
1.13 +myname=$(basename "$0")
1.14 +
1.15 +doHelp() {
1.16 + cat <<_EOF_
1.17 +$myname [ -f ] < -s source_root > < -d destination_root >
1.18 +
1.19 + -f force execution: if destination directory already exists,
1.20 + it will be removed first.
1.21 +
1.22 + -s dir
1.23 + use 'dir' as the un-populated (source) root directory
1.24 +
1.25 + -d dir
1.26 + use 'dir' as the place to put the populated root directory
1.27 +
1.28 + -v Be verbose
1.29 +_EOF_
1.30 +}
1.31 +
1.32 +CT_FORCE=no
1.33 +CT_ROOT_SRC_DIR=
1.34 +CT_ROOT_DST_DIR=
1.35 +CT_ECHO=true
1.36 +while getopts ":fs:d:vh" CT_OPT; do
1.37 + case "${CT_OPT}" in
1.38 + f) CT_FORCE=yes;;
1.39 + s) CT_ROOT_SRC_DIR="${OPTARG}";;
1.40 + d) CT_ROOT_DST_DIR="${OPTARG}";;
1.41 + v) CT_ECHO=echo;;
1.42 + h) doHelp
1.43 + exit 0
1.44 + ;;
1.45 + :) echo "$myname: \"-${OPTARG}\" takes exactly one argument."
1.46 + exit 1
1.47 + ;;
1.48 + ?) echo "$myname: unknown option \"-${OPTARG}\"."
1.49 + exit 1
1.50 + ;;
1.51 + esac
1.52 +done
1.53 +
1.54 +# Sanity checks
1.55 +if [ -z "${CT_ROOT_SRC_DIR}" -o -z "${CT_ROOT_DST_DIR}" ]; then
1.56 + doHelp
1.57 + exit 1
1.58 +fi
1.59 +if [ ! -d "${CT_ROOT_SRC_DIR}" ]; then
1.60 + echo "$myname: \"${CT_ROOT_SRC_DIR}\": no such file or directory"
1.61 + exit 1
1.62 +fi
1.63 +if [ -d "${CT_ROOT_DST_DIR}" -a "${CT_FORCE}" != "yes" ]; then
1.64 + echo "$myname: \"${CT_ROOT_DST_DIR}\": already exists"
1.65 + exit 1
1.66 +fi
1.67 +src_inode=$(ls -di "${CT_ROOT_SRC_DIR}")
1.68 +dst_inode=$(ls -di "${CT_ROOT_DST_DIR}" 2>/dev/null)
1.69 +if [ "${src_inode}" = "${dst_inode}" ]; then
1.70 + echo "$myname: source and destination are the same!"
1.71 + exit 1
1.72 +fi
1.73 +
1.74 +# Get rid of potentially older destination directory
1.75 +if [ -d "${CT_ROOT_DST_DIR}" ]; then
1.76 + mv "${CT_ROOT_DST_DIR}" "${CT_ROOT_DST_DIR}.$$"
1.77 + nohup rm -rf "${CT_ROOT_DST_DIR}.$$" >/dev/null 2>&1 &
1.78 +fi
1.79 +
1.80 +# Create the working copy
1.81 +mkdir -p "${CT_ROOT_DST_DIR}"
1.82 +
1.83 +# Make all path absolute
1.84 +case "${CT_ROOT_SRC_DIR}" in
1.85 + /*) ;;
1.86 + *) CT_ROOT_SRC_DIR=$(cd "${CT_ROOT_SRC_DIR}"; pwd)
1.87 +esac
1.88 +case "${CT_ROOT_DST_DIR}" in
1.89 + /*) ;;
1.90 + *) CT_ROOT_DST_DIR=$(cd "${CT_ROOT_DST_DIR}"; pwd)
1.91 +esac
1.92 +
1.93 +cd "${CT_ROOT_SRC_DIR}"
1.94 +tar cf - . |(cd "${CT_ROOT_DST_DIR}"; tar xf -)
1.95 +
1.96 +# Parse the working copy for executables and libraries
1.97 +cd "${CT_ROOT_DST_DIR}"
1.98 +still_needed=1
1.99 +while [ ${still_needed} -eq 1 ]; do
1.100 + ${CT_ECHO} "Looping..."
1.101 + still_needed=0
1.102 + for f in $(find . -type f -exec file {} \; |egrep ': ELF [[:digit:]]+-bit .SB (executable|shared object),' |cut -d ":" -f 1); do
1.103 + ${CT_ECHO} "Scanning \"${f}\""
1.104 + for libname in $("${CT_READELF}" -d "${f}" |egrep '(NEEDED)' |sed -r -e 's,.+\[(.+)\] *$,\1,;'); do
1.105 + ${CT_ECHO} " searching for \"${libname}\""
1.106 + if [ -e "${CT_ROOT_DST_DIR}/lib/${libname}" \
1.107 + -o -e "${CT_ROOT_DST_DIR}/usr/lib/${libname}" ]; then
1.108 + ${CT_ECHO} " already present"
1.109 + continue
1.110 + fi
1.111 + for dir in . usr ..; do
1.112 + ${CT_ECHO} -n " trying in \"${dir}\""
1.113 + tgt_dir="${dir}"
1.114 + [ "${tgt_dir}" = ".." ] && tgt_dir="usr"
1.115 + libfile="${CT_SYSROOT_DIR}/${dir}/lib/${libname}"
1.116 + ${CT_ECHO} ": \"${libfile}\""
1.117 + if [ -e "${libfile}" ]; then
1.118 + mkdir -p "${CT_ROOT_DST_DIR}/${dir}/lib"
1.119 + ${CT_ECHO} " installing \"${tgt_dir}/lib/${libname}\""
1.120 + cp "${libfile}" "${CT_ROOT_DST_DIR}/${tgt_dir}/lib/${libname}"
1.121 + still_needed=1
1.122 + break
1.123 + fi
1.124 + done
1.125 + done
1.126 + done
1.127 +done