author | "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr> |
Tue Sep 23 14:48:10 2008 +0000 (2008-09-23) | |
changeset 872 | fd4bf138f08f |
parent 755 | c2212f59e1cf |
child 910 | 9db42913e2ae |
permissions | -rw-r--r-- |
yann@217 | 1 |
#!/bin/bash |
yann@217 | 2 |
|
yann@217 | 3 |
# This script will populate the root directory with libs from the sysroot. |
yann@217 | 4 |
# (C) 2007 Yann E. MORIN |
yann@217 | 5 |
# Licensed under the GPL v2 |
yann@217 | 6 |
|
yann@755 | 7 |
# Detect where the toolchain is: |
yann@770 | 8 |
BIN_DIR="$(cd "$(dirname "$0")"; pwd)" |
yann@755 | 9 |
CT_READELF="${BIN_DIR}/@@CT_TARGET@@-readelf" |
yann@755 | 10 |
CT_SYSROOT_DIR="${BIN_DIR}/../@@CT_TARGET@@/sys-root" |
yann@217 | 11 |
|
yann@217 | 12 |
myname=$(basename "$0") |
yann@217 | 13 |
|
yann@217 | 14 |
doHelp() { |
yann@217 | 15 |
cat <<_EOF_ |
yann@253 | 16 |
$myname [-f] [-v] -s source_root -d destination_root |
yann@217 | 17 |
|
yann@217 | 18 |
-s dir |
yann@217 | 19 |
use 'dir' as the un-populated (source) root directory |
yann@217 | 20 |
|
yann@217 | 21 |
-d dir |
yann@217 | 22 |
use 'dir' as the place to put the populated root directory |
yann@217 | 23 |
|
yann@258 | 24 |
-f force execution: if destination directory already exists, |
yann@258 | 25 |
it will be removed first. |
yann@258 | 26 |
|
yann@217 | 27 |
-v Be verbose |
yann@217 | 28 |
_EOF_ |
yann@217 | 29 |
} |
yann@217 | 30 |
|
yann@217 | 31 |
CT_ROOT_SRC_DIR= |
yann@217 | 32 |
CT_ROOT_DST_DIR= |
yann@259 | 33 |
CT_FORCE=no |
yann@217 | 34 |
CT_ECHO=true |
yann@259 | 35 |
while getopts ":s:d:fvh" CT_OPT; do |
yann@217 | 36 |
case "${CT_OPT}" in |
yann@217 | 37 |
s) CT_ROOT_SRC_DIR="${OPTARG}";; |
yann@217 | 38 |
d) CT_ROOT_DST_DIR="${OPTARG}";; |
yann@259 | 39 |
f) CT_FORCE=y;; |
yann@217 | 40 |
v) CT_ECHO=echo;; |
yann@217 | 41 |
h) doHelp |
yann@217 | 42 |
exit 0 |
yann@217 | 43 |
;; |
yann@523 | 44 |
:) echo "$myname: '-${OPTARG}' takes exactly one argument." |
yann@217 | 45 |
exit 1 |
yann@217 | 46 |
;; |
yann@523 | 47 |
?) echo "$myname: unknown option '-${OPTARG}'." |
yann@217 | 48 |
exit 1 |
yann@217 | 49 |
;; |
yann@217 | 50 |
esac |
yann@217 | 51 |
done |
yann@217 | 52 |
|
yann@217 | 53 |
# Sanity checks |
yann@217 | 54 |
if [ -z "${CT_ROOT_SRC_DIR}" -o -z "${CT_ROOT_DST_DIR}" ]; then |
yann@217 | 55 |
doHelp |
yann@217 | 56 |
exit 1 |
yann@217 | 57 |
fi |
yann@217 | 58 |
if [ ! -d "${CT_ROOT_SRC_DIR}" ]; then |
yann@523 | 59 |
echo "$myname: '${CT_ROOT_SRC_DIR}': no such file or directory" |
yann@217 | 60 |
exit 1 |
yann@217 | 61 |
fi |
yann@259 | 62 |
if [ -d "${CT_ROOT_DST_DIR}" -a "${CT_FORCE}" != "y" ]; then |
yann@523 | 63 |
echo "$myname: '${CT_ROOT_DST_DIR}': already exists" |
yann@217 | 64 |
exit 1 |
yann@217 | 65 |
fi |
yann@217 | 66 |
src_inode=$(ls -di "${CT_ROOT_SRC_DIR}") |
yann@217 | 67 |
dst_inode=$(ls -di "${CT_ROOT_DST_DIR}" 2>/dev/null) |
yann@217 | 68 |
if [ "${src_inode}" = "${dst_inode}" ]; then |
yann@217 | 69 |
echo "$myname: source and destination are the same!" |
yann@217 | 70 |
exit 1 |
yann@217 | 71 |
fi |
yann@217 | 72 |
|
yann@217 | 73 |
# Get rid of potentially older destination directory |
yann@217 | 74 |
if [ -d "${CT_ROOT_DST_DIR}" ]; then |
yann@217 | 75 |
mv "${CT_ROOT_DST_DIR}" "${CT_ROOT_DST_DIR}.$$" |
yann@320 | 76 |
setsid nohup rm -rf "${CT_ROOT_DST_DIR}.$$" >/dev/null 2>&1 & |
yann@217 | 77 |
fi |
yann@217 | 78 |
|
yann@217 | 79 |
# Create the working copy |
yann@217 | 80 |
mkdir -p "${CT_ROOT_DST_DIR}" |
yann@217 | 81 |
|
yann@217 | 82 |
# Make all path absolute |
yann@253 | 83 |
CT_ROOT_SRC_DIR=$(cd "${CT_ROOT_SRC_DIR}"; pwd) |
yann@253 | 84 |
CT_ROOT_DST_DIR=$(cd "${CT_ROOT_DST_DIR}"; pwd) |
yann@217 | 85 |
|
yann@217 | 86 |
cd "${CT_ROOT_SRC_DIR}" |
yann@217 | 87 |
tar cf - . |(cd "${CT_ROOT_DST_DIR}"; tar xf -) |
yann@217 | 88 |
|
yann@217 | 89 |
# Parse the working copy for executables and libraries |
yann@217 | 90 |
cd "${CT_ROOT_DST_DIR}" |
yann@217 | 91 |
still_needed=1 |
yann@217 | 92 |
while [ ${still_needed} -eq 1 ]; do |
yann@217 | 93 |
${CT_ECHO} "Looping..." |
yann@217 | 94 |
still_needed=0 |
yann@217 | 95 |
for f in $(find . -type f -exec file {} \; |egrep ': ELF [[:digit:]]+-bit .SB (executable|shared object),' |cut -d ":" -f 1); do |
yann@523 | 96 |
${CT_ECHO} "Scanning '${f}'" |
yann@217 | 97 |
for libname in $("${CT_READELF}" -d "${f}" |egrep '(NEEDED)' |sed -r -e 's,.+\[(.+)\] *$,\1,;'); do |
yann@523 | 98 |
${CT_ECHO} " searching for '${libname}'" |
yann@259 | 99 |
if [ -e "lib/${libname}" \ |
yann@259 | 100 |
-o -e "usr/lib/${libname}" ]; then |
yann@217 | 101 |
${CT_ECHO} " already present" |
yann@217 | 102 |
continue |
yann@217 | 103 |
fi |
yann@688 | 104 |
for dir in . usr; do |
yann@523 | 105 |
${CT_ECHO} -n " trying in '${dir}'" |
yann@217 | 106 |
libfile="${CT_SYSROOT_DIR}/${dir}/lib/${libname}" |
yann@523 | 107 |
${CT_ECHO} ": '${libfile}'" |
yann@217 | 108 |
if [ -e "${libfile}" ]; then |
yann@259 | 109 |
mkdir -p "${dir}/lib" |
yann@688 | 110 |
${CT_ECHO} " installing '${dir}/lib/${libname}'" |
yann@688 | 111 |
cp "${libfile}" "${dir}/lib/${libname}" |
yann@217 | 112 |
still_needed=1 |
yann@217 | 113 |
break |
yann@217 | 114 |
fi |
yann@217 | 115 |
done |
yann@217 | 116 |
done |
yann@217 | 117 |
done |
yann@217 | 118 |
done |