aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/icecc-create-env/icecc-create-env-native/icecc-create-env
blob: 7e4dbc414e788d2c16fc94d3d5db322deadf1f15 (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
#! /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