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@253: $myname [-f] [-v] -s source_root -d destination_root 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@258: -f force execution: if destination directory already exists, yann@258: it will be removed first. yann@258: yann@217: -v Be verbose yann@217: _EOF_ yann@217: } yann@217: yann@217: CT_ROOT_SRC_DIR= yann@217: CT_ROOT_DST_DIR= yann@259: CT_FORCE=no yann@217: CT_ECHO=true yann@259: while getopts ":s:d:fvh" CT_OPT; do yann@217: case "${CT_OPT}" in yann@217: s) CT_ROOT_SRC_DIR="${OPTARG}";; yann@217: d) CT_ROOT_DST_DIR="${OPTARG}";; yann@259: f) CT_FORCE=y;; yann@217: v) CT_ECHO=echo;; yann@217: h) doHelp yann@217: exit 0 yann@217: ;; yann@523: :) echo "$myname: '-${OPTARG}' takes exactly one argument." yann@217: exit 1 yann@217: ;; yann@523: ?) 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@523: echo "$myname: '${CT_ROOT_SRC_DIR}': no such file or directory" yann@217: exit 1 yann@217: fi yann@259: if [ -d "${CT_ROOT_DST_DIR}" -a "${CT_FORCE}" != "y" ]; then yann@523: 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@320: setsid 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@253: CT_ROOT_SRC_DIR=$(cd "${CT_ROOT_SRC_DIR}"; pwd) yann@253: CT_ROOT_DST_DIR=$(cd "${CT_ROOT_DST_DIR}"; pwd) 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@523: ${CT_ECHO} "Scanning '${f}'" yann@217: for libname in $("${CT_READELF}" -d "${f}" |egrep '(NEEDED)' |sed -r -e 's,.+\[(.+)\] *$,\1,;'); do yann@523: ${CT_ECHO} " searching for '${libname}'" yann@259: if [ -e "lib/${libname}" \ yann@259: -o -e "usr/lib/${libname}" ]; then yann@217: ${CT_ECHO} " already present" yann@217: continue yann@217: fi yann@688: for dir in . usr; do yann@523: ${CT_ECHO} -n " trying in '${dir}'" yann@217: libfile="${CT_SYSROOT_DIR}/${dir}/lib/${libname}" yann@523: ${CT_ECHO} ": '${libfile}'" yann@217: if [ -e "${libfile}" ]; then yann@259: mkdir -p "${dir}/lib" yann@688: ${CT_ECHO} " installing '${dir}/lib/${libname}'" yann@688: cp "${libfile}" "${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