yann@217: #!/bin/bash yann@217: yann@217: # This script will populate the root directory with libs from the sysroot. yann@217: # (C) 2007 Yann E. MORIN yann@217: # Licensed under the GPL v2 yann@217: yann@217: CT_READELF="@@CT_READELF@@" yann@217: CT_SYSROOT_DIR="@@CT_SYSROOT_DIR@@" yann@217: yann@217: myname=$(basename "$0") yann@217: yann@217: doHelp() { yann@217: cat <<_EOF_ yann@217: $myname [ -f ] < -s source_root > < -d destination_root > yann@217: yann@217: -f force execution: if destination directory already exists, yann@217: it will be removed first. yann@217: yann@217: -s dir yann@217: use 'dir' as the un-populated (source) root directory yann@217: yann@217: -d dir yann@217: use 'dir' as the place to put the populated root directory yann@217: yann@217: -v Be verbose yann@217: _EOF_ yann@217: } yann@217: yann@217: CT_FORCE=no yann@217: CT_ROOT_SRC_DIR= yann@217: CT_ROOT_DST_DIR= yann@217: CT_ECHO=true yann@217: while getopts ":fs:d:vh" CT_OPT; do yann@217: case "${CT_OPT}" in yann@217: f) CT_FORCE=yes;; yann@217: s) CT_ROOT_SRC_DIR="${OPTARG}";; yann@217: d) CT_ROOT_DST_DIR="${OPTARG}";; yann@217: v) CT_ECHO=echo;; yann@217: h) doHelp yann@217: exit 0 yann@217: ;; yann@217: :) echo "$myname: \"-${OPTARG}\" takes exactly one argument." yann@217: exit 1 yann@217: ;; yann@217: ?) echo "$myname: unknown option \"-${OPTARG}\"." yann@217: exit 1 yann@217: ;; yann@217: esac yann@217: done yann@217: yann@217: # Sanity checks yann@217: if [ -z "${CT_ROOT_SRC_DIR}" -o -z "${CT_ROOT_DST_DIR}" ]; then yann@217: doHelp yann@217: exit 1 yann@217: fi yann@217: if [ ! -d "${CT_ROOT_SRC_DIR}" ]; then yann@217: echo "$myname: \"${CT_ROOT_SRC_DIR}\": no such file or directory" yann@217: exit 1 yann@217: fi yann@217: if [ -d "${CT_ROOT_DST_DIR}" -a "${CT_FORCE}" != "yes" ]; then yann@217: echo "$myname: \"${CT_ROOT_DST_DIR}\": already exists" yann@217: exit 1 yann@217: fi yann@217: src_inode=$(ls -di "${CT_ROOT_SRC_DIR}") yann@217: dst_inode=$(ls -di "${CT_ROOT_DST_DIR}" 2>/dev/null) yann@217: if [ "${src_inode}" = "${dst_inode}" ]; then yann@217: echo "$myname: source and destination are the same!" yann@217: exit 1 yann@217: fi yann@217: yann@217: # Get rid of potentially older destination directory yann@217: if [ -d "${CT_ROOT_DST_DIR}" ]; then yann@217: mv "${CT_ROOT_DST_DIR}" "${CT_ROOT_DST_DIR}.$$" yann@217: nohup rm -rf "${CT_ROOT_DST_DIR}.$$" >/dev/null 2>&1 & yann@217: fi yann@217: yann@217: # Create the working copy yann@217: mkdir -p "${CT_ROOT_DST_DIR}" yann@217: yann@217: # Make all path absolute yann@217: case "${CT_ROOT_SRC_DIR}" in yann@217: /*) ;; yann@217: *) CT_ROOT_SRC_DIR=$(cd "${CT_ROOT_SRC_DIR}"; pwd) yann@217: esac yann@217: case "${CT_ROOT_DST_DIR}" in yann@217: /*) ;; yann@217: *) CT_ROOT_DST_DIR=$(cd "${CT_ROOT_DST_DIR}"; pwd) yann@217: esac yann@217: yann@217: cd "${CT_ROOT_SRC_DIR}" yann@217: tar cf - . |(cd "${CT_ROOT_DST_DIR}"; tar xf -) yann@217: yann@217: # Parse the working copy for executables and libraries yann@217: cd "${CT_ROOT_DST_DIR}" yann@217: still_needed=1 yann@217: while [ ${still_needed} -eq 1 ]; do yann@217: ${CT_ECHO} "Looping..." yann@217: still_needed=0 yann@217: for f in $(find . -type f -exec file {} \; |egrep ': ELF [[:digit:]]+-bit .SB (executable|shared object),' |cut -d ":" -f 1); do yann@217: ${CT_ECHO} "Scanning \"${f}\"" yann@217: for libname in $("${CT_READELF}" -d "${f}" |egrep '(NEEDED)' |sed -r -e 's,.+\[(.+)\] *$,\1,;'); do yann@217: ${CT_ECHO} " searching for \"${libname}\"" yann@217: if [ -e "${CT_ROOT_DST_DIR}/lib/${libname}" \ yann@217: -o -e "${CT_ROOT_DST_DIR}/usr/lib/${libname}" ]; then yann@217: ${CT_ECHO} " already present" yann@217: continue yann@217: fi yann@217: for dir in . usr ..; do yann@217: ${CT_ECHO} -n " trying in \"${dir}\"" yann@217: tgt_dir="${dir}" yann@217: [ "${tgt_dir}" = ".." ] && tgt_dir="usr" yann@217: libfile="${CT_SYSROOT_DIR}/${dir}/lib/${libname}" yann@217: ${CT_ECHO} ": \"${libfile}\"" yann@217: if [ -e "${libfile}" ]; then yann@217: mkdir -p "${CT_ROOT_DST_DIR}/${dir}/lib" yann@217: ${CT_ECHO} " installing \"${tgt_dir}/lib/${libname}\"" yann@217: cp "${libfile}" "${CT_ROOT_DST_DIR}/${tgt_dir}/lib/${libname}" yann@217: still_needed=1 yann@217: break yann@217: fi yann@217: done yann@217: done yann@217: done yann@217: done