summaryrefslogtreecommitdiff
path: root/client/icecc-create-env
blob: e99338c22b7dc58b41a8d4592664f924a24744f2 (plain)
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