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@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@259: if [ -d "${CT_ROOT_DST_DIR}" -a "${CT_FORCE}" != "y" ]; 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@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@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@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@253: # Need to scan .. for libgcc_s et al. 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@259: mkdir -p "${dir}/lib" yann@217: ${CT_ECHO} " installing \"${tgt_dir}/lib/${libname}\"" yann@259: cp "${libfile}" "${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