1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
|
#! /usr/bin/env bash
# icecc -- A simple distributed compiler system
#
# Copyright (C) 2004 by the Icecream Authors
# GPL
target_files=
is_darwin=0
if test `uname` = Darwin; then
is_darwin=1
fi
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"
if test "$name" = "$path"; then
toadd=$path
fi
is_contained "$toadd" && return
echo "adding file $toadd"
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
elif test "$is_darwin" = 1; then
for lib in `otool -L "$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
}
# backward compat
if test "$1" = "--respect-path"; then
shift
fi
added_gcc=$1
shift
added_gxx=$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++
add_file /usr/bin/as
if test "$is_darwin" = 1; then
# add dynamic linker
add_file /usr/lib/dyld
real_file=`/usr/bin/gcc --version | head -n 1 2>&1 | cut -d" " -f1`
add_file /usr/bin/$real_file
real_file=`/usr/bin/g++ --version | head -n 1 2>&1 | cut -d" " -f1`
add_file /usr/bin/$real_file
real_file=`/usr/bin/as -micha -- < /dev/null 2>&1 | cut -d: -f1`
add_file $real_file
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 "$specfile" != "specs" && test -e "$specfile"; then
add_file "$specfile"
fi
plugin_name=liblto_plugin.so
plugin=`$added_gcc -print-prog-name=$plugin_name`
if test -n "$plugin" && test "$plugin" != "$plugin_name" && test -e "$plugin"; then
add_file "$plugin" "$plugin"
fi
# for ldconfig -r to work, ld.so.conf must not contain relative paths
# in include directives. Make them absolute.
tmp_ld_so_conf=`mktemp /tmp/icecc_ld_so_confXXXXXX`
while read directive path; do
if [ "$directive" = "include" -a "${path:0:1}" != "/" ]; then
path="/etc/$path"
fi
echo "$directive $path"
done </etc/ld.so.conf >$tmp_ld_so_conf
add_file $tmp_ld_so_conf /etc/ld.so.conf
tempdir=`mktemp -d /tmp/iceccenvXXXXXX`
# special case for weird multilib setups
for dir in /lib /lib64 /usr/lib /usr/lib64; do
test -L $dir && cp -p $dir $tempdir$dir
done
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
if test -x /sbin/ldconfig; then
mkdir -p $tempdir/var/cache/ldconfig
/sbin/ldconfig -r $tempdir
new_target_files="$new_target_files etc/ld.so.cache"
fi
md5sum=NONE
for file in /usr/bin/md5sum /bin/md5 /usr/bin/md5 /sbin/md5; do
if test -x $file; then
md5sum=$file
break
fi
done
# now sort the files in order to make the md5sums independent
# of ordering
target_files=`for i in $new_target_files; do echo $i; done | sort`
md5=`for i in $target_files; do $md5sum $tempdir/$i; done | sed -e 's/ .*$//' | $md5sum | sed -e 's/ .*$//'` || {
echo "Couldn't compute MD5 sum."
exit 2
}
echo "creating $md5.tar.gz"
mydir=`pwd`
cd $tempdir
tar -czhf "$mydir/$md5".tar.gz $target_files || {
echo "Couldn't create archive"
exit 3
}
cd ..
rm -rf $tempdir
rm -f $tmp_ld_so_conf
|