| #! /usr/bin/env bash |
| # icecc -- A simple distributed compiler system |
| # |
| # Copyright (C) 2004 by the Icecream Authors |
| # GPL |
| |
| target_files= |
| |
| is_contained () |
| { |
| case " $target_files " in |
| *" $1 "* ) return 0 ;; |
| *"=$1 "* ) return 0;; |
| * ) return 1 ;; |
| esac |
| } |
| |
| add_file () |
| { |
| local name="$1" |
| local path="$1"; |
| if test -n "$2"; then |
| name="$2" |
| fi |
| test -z "$name" && return |
| # ls -H isn't really the same as readlink, but |
| # readlink is not portable enough. |
| path=`ls -H $path` |
| toadd="$name=$path" |
| is_contained "$toadd" && return |
| if test -z "$silent"; then |
| echo "adding file $toadd" |
| fi |
| target_files="$target_files $toadd" |
| if test -x "$path"; then |
| # Only call ldd when it makes sense |
| if file -L "$path" | grep 'ELF' > /dev/null 2>&1; then |
| if ! file -L "$path" | grep 'static' > /dev/null 2>&1; then |
| # ldd now outputs ld as /lib/ld-linux.so.xx on current nptl based glibc |
| # this regexp parse the outputs like: |
| # ldd /usr/bin/gcc |
| # linux-gate.so.1 => (0xffffe000) |
| # libc.so.6 => /lib/tls/libc.so.6 (0xb7e81000) |
| # /lib/ld-linux.so.2 (0xb7fe8000) |
| # covering both situations ( with => and without ) |
| for lib in `ldd "$path" | sed -n 's,^[^/]*\(/[^ ]*\).*,\1,p'`; do |
| test -f "$lib" || continue |
| # Check wether the same library also exists in the parent directory, |
| # and prefer that on the assumption that it is a more generic one. |
| local baselib=`echo "$lib" | sed 's,\(/[^/]*\)/.*\(/[^/]*\)$,\1\2,'` |
| test -f "$baselib" && lib=$baselib |
| add_file "$lib" |
| done |
| fi |
| fi |
| fi |
| } |
| |
| # backward compat |
| if test "$1" = "--respect-path"; then |
| shift |
| fi |
| |
| #add a --silent switch to avoid "broken pipe" errors when calling this scipt from within OE |
| if test "$1" = "--silent"; then |
| silent=1 |
| shift |
| fi |
| |
| |
| added_gcc=$1 |
| shift |
| added_gxx=$1 |
| shift |
| added_as=$1 |
| shift |
| archive_name=$1 |
| |
| if test -z "$added_gcc" || test -z "$added_gxx" ; then |
| echo "usage: $0 <gcc_path> <g++_path>" |
| exit 1 |
| fi |
| |
| if ! test -x "$added_gcc" ; then |
| echo "'$added_gcc' is no executable." |
| exit 1 |
| fi |
| |
| if ! test -x "$added_gxx" ; then |
| echo "'$added_gcc' is no executable." |
| exit 1 |
| fi |
| |
| |
| |
| add_file $added_gcc /usr/bin/gcc |
| add_file $added_gxx /usr/bin/g++ |
| |
| if test -z "$added_as" ; then |
| add_file /usr/bin/as /usr/bin/as |
| else |
| if ! test -x "$added_as" ; then |
| echo "'$added_as' is no executable." |
| exit 1 |
| fi |
| |
| add_file $added_as /usr/bin/as |
| fi |
| |
| add_file `$added_gcc -print-prog-name=cc1` /usr/bin/cc1 |
| add_file `$added_gxx -print-prog-name=cc1plus` /usr/bin/cc1plus |
| specfile=`$added_gcc -print-file-name=specs` |
| if test -n "$specfile" && test -e "$specfile"; then |
| add_file "$specfile" |
| fi |
| |
| ltofile=`$added_gcc -print-prog-name=lto1` |
| pluginfile="${ltofile%lto1}liblto_plugin.so" |
| if test -r "$pluginfile" |
| then |
| add_file $pluginfile ${pluginfile#*usr} |
| add_file $pluginfile /usr${pluginfile#*usr} |
| fi |
| |
| tempdir=`mktemp -d /tmp/iceccenvXXXXXX` |
| new_target_files= |
| for i in $target_files; do |
| case $i in |
| *=/*) |
| target=`echo $i | cut -d= -f1` |
| path=`echo $i | cut -d= -f2` |
| ;; |
| *) |
| path=$i |
| target=$i |
| ;; |
| esac |
| mkdir -p $tempdir/`dirname $target` |
| cp -p $path $tempdir/$target |
| if test -f $tempdir/$target -a -x $tempdir/$target; then |
| strip -s $tempdir/$target 2>/dev/null |
| fi |
| target=`echo $target | cut -b2-` |
| new_target_files="$new_target_files $target" |
| done |
| |
| #sort the files |
| target_files=`for i in $new_target_files; do echo $i; done | sort` |
| |
| #test if an archive name was supplied |
| #if not use the md5 of all files as the archive name |
| if test -z "$archive_name"; then |
| md5sum=NONE |
| for file in /usr/bin/md5sum /bin/md5 /usr/bin/md5; do |
| if test -x $file; then |
| md5sum=$file |
| break |
| fi |
| done |
| |
| #calculate md5 and use it as the archive name |
| archive_name=`for i in $target_files; do test -f $tempdir/$i && $md5sum $tempdir/$i; done | sed -e 's/ .*$//' | $md5sum | sed -e 's/ .*$//'`.tar.gz || { |
| if test -z "$silent"; then |
| echo "Couldn't compute MD5 sum." |
| fi |
| exit 2 |
| } |
| mydir=`pwd` |
| else |
| mydir="`dirname "$archive_name"`" |
| |
| #check if we have a full path or only a filename |
| if test "$mydir" = "." ; then |
| mydir=`pwd` |
| else |
| mydir="" |
| fi |
| fi |
| |
| if test -z "$silent"; then |
| echo "creating $archive_name" |
| fi |
| |
| cd $tempdir |
| tar -czhf "$mydir/$archive_name" $target_files || { |
| if test -z "$silent"; then |
| echo "Couldn't create archive" |
| fi |
| exit 3 |
| } |
| cd .. |
| rm -rf $tempdir |