xref: /OK3568_Linux_fs/yocto/poky/meta/files/toolchain-shar-extract.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/sh
2*4882a593Smuzhiyun
3*4882a593Smuzhiyunexport LC_ALL=en_US.UTF-8
4*4882a593Smuzhiyun#Make sure at least one python is installed
5*4882a593SmuzhiyunINIT_PYTHON=$(which python3 2>/dev/null )
6*4882a593Smuzhiyun[ -z "$INIT_PYTHON" ] && INIT_PYTHON=$(which python2 2>/dev/null)
7*4882a593Smuzhiyun[ -z "$INIT_PYTHON" ] && echo "Error: The SDK needs a python installed" && exit 1
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun# Remove invalid PATH elements first (maybe from a previously setup toolchain now deleted
10*4882a593SmuzhiyunPATH=`$INIT_PYTHON -c 'import os; print(":".join(e for e in os.environ["PATH"].split(":") if os.path.exists(e)))'`
11*4882a593Smuzhiyun
12*4882a593Smuzhiyuntweakpath () {
13*4882a593Smuzhiyun    case ":${PATH}:" in
14*4882a593Smuzhiyun        *:"$1":*)
15*4882a593Smuzhiyun            ;;
16*4882a593Smuzhiyun        *)
17*4882a593Smuzhiyun            PATH=$PATH:$1
18*4882a593Smuzhiyun    esac
19*4882a593Smuzhiyun}
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun# Some systems don't have /usr/sbin or /sbin in the cleaned environment PATH but we make need it
22*4882a593Smuzhiyun# for the system's host tooling checks
23*4882a593Smuzhiyuntweakpath /usr/sbin
24*4882a593Smuzhiyuntweakpath /sbin
25*4882a593Smuzhiyun
26*4882a593SmuzhiyunINST_ARCH=$(uname -m | sed -e "s/i[3-6]86/ix86/" -e "s/x86[-_]64/x86_64/")
27*4882a593SmuzhiyunSDK_ARCH=$(echo @SDK_ARCH@ | sed -e "s/i[3-6]86/ix86/" -e "s/x86[-_]64/x86_64/")
28*4882a593Smuzhiyun
29*4882a593SmuzhiyunINST_GCC_VER=$(gcc --version 2>/dev/null | sed -ne 's/.* \([0-9]\+\.[0-9]\+\)\.[0-9]\+.*/\1/p')
30*4882a593SmuzhiyunSDK_GCC_VER='@SDK_GCC_VER@'
31*4882a593Smuzhiyun
32*4882a593Smuzhiyunverlte () {
33*4882a593Smuzhiyun	[  "$1" = "`printf "$1\n$2" | sort -V | head -n1`" ]
34*4882a593Smuzhiyun}
35*4882a593Smuzhiyun
36*4882a593Smuzhiyunverlt() {
37*4882a593Smuzhiyun	[ "$1" = "$2" ] && return 1 || verlte $1 $2
38*4882a593Smuzhiyun}
39*4882a593Smuzhiyun
40*4882a593Smuzhiyunverlt `uname -r` @OLDEST_KERNEL@
41*4882a593Smuzhiyunif [ $? = 0 ]; then
42*4882a593Smuzhiyun	echo "Error: The SDK needs a kernel > @OLDEST_KERNEL@"
43*4882a593Smuzhiyun	exit 1
44*4882a593Smuzhiyunfi
45*4882a593Smuzhiyun
46*4882a593Smuzhiyunif [ "$INST_ARCH" != "$SDK_ARCH" ]; then
47*4882a593Smuzhiyun	# Allow for installation of ix86 SDK on x86_64 host
48*4882a593Smuzhiyun	if [ "$INST_ARCH" != x86_64 -o "$SDK_ARCH" != ix86 ]; then
49*4882a593Smuzhiyun		echo "Error: Incompatible SDK installer! Your host is $INST_ARCH and this SDK was built for $SDK_ARCH hosts."
50*4882a593Smuzhiyun		exit 1
51*4882a593Smuzhiyun	fi
52*4882a593Smuzhiyunfi
53*4882a593Smuzhiyun
54*4882a593Smuzhiyunif ! xz -V > /dev/null 2>&1; then
55*4882a593Smuzhiyun	echo "Error: xz is required for installation of this SDK, please install it first"
56*4882a593Smuzhiyun	exit 1
57*4882a593Smuzhiyunfi
58*4882a593Smuzhiyun
59*4882a593SmuzhiyunSDK_BUILD_PATH="@SDKPATH@"
60*4882a593SmuzhiyunDEFAULT_INSTALL_DIR="@SDKPATHINSTALL@"
61*4882a593SmuzhiyunSUDO_EXEC=""
62*4882a593SmuzhiyunEXTRA_TAR_OPTIONS=""
63*4882a593Smuzhiyuntarget_sdk_dir=""
64*4882a593Smuzhiyunanswer=""
65*4882a593Smuzhiyunrelocate=1
66*4882a593Smuzhiyunsavescripts=0
67*4882a593Smuzhiyunverbose=0
68*4882a593Smuzhiyunpublish=0
69*4882a593Smuzhiyunlistcontents=0
70*4882a593Smuzhiyunwhile getopts ":yd:npDRSl" OPT; do
71*4882a593Smuzhiyun	case $OPT in
72*4882a593Smuzhiyun	y)
73*4882a593Smuzhiyun		answer="Y"
74*4882a593Smuzhiyun		;;
75*4882a593Smuzhiyun	d)
76*4882a593Smuzhiyun		target_sdk_dir=$OPTARG
77*4882a593Smuzhiyun		;;
78*4882a593Smuzhiyun	n)
79*4882a593Smuzhiyun		prepare_buildsystem="no"
80*4882a593Smuzhiyun		;;
81*4882a593Smuzhiyun	p)
82*4882a593Smuzhiyun		prepare_buildsystem="no"
83*4882a593Smuzhiyun		publish=1
84*4882a593Smuzhiyun		;;
85*4882a593Smuzhiyun	D)
86*4882a593Smuzhiyun		verbose=1
87*4882a593Smuzhiyun		;;
88*4882a593Smuzhiyun	R)
89*4882a593Smuzhiyun		relocate=0
90*4882a593Smuzhiyun		savescripts=1
91*4882a593Smuzhiyun		;;
92*4882a593Smuzhiyun	S)
93*4882a593Smuzhiyun		savescripts=1
94*4882a593Smuzhiyun		;;
95*4882a593Smuzhiyun	l)
96*4882a593Smuzhiyun		listcontents=1
97*4882a593Smuzhiyun		;;
98*4882a593Smuzhiyun	*)
99*4882a593Smuzhiyun		echo "Usage: $(basename "$0") [-y] [-d <dir>]"
100*4882a593Smuzhiyun		echo "  -y         Automatic yes to all prompts"
101*4882a593Smuzhiyun		echo "  -d <dir>   Install the SDK to <dir>"
102*4882a593Smuzhiyun		echo "======== Extensible SDK only options ============"
103*4882a593Smuzhiyun		echo "  -n         Do not prepare the build system"
104*4882a593Smuzhiyun		echo "  -p         Publish mode (implies -n)"
105*4882a593Smuzhiyun		echo "======== Advanced DEBUGGING ONLY OPTIONS ========"
106*4882a593Smuzhiyun		echo "  -S         Save relocation scripts"
107*4882a593Smuzhiyun		echo "  -R         Do not relocate executables"
108*4882a593Smuzhiyun		echo "  -D         use set -x to see what is going on"
109*4882a593Smuzhiyun		echo "  -l         list files that will be extracted"
110*4882a593Smuzhiyun		exit 1
111*4882a593Smuzhiyun		;;
112*4882a593Smuzhiyun	esac
113*4882a593Smuzhiyundone
114*4882a593Smuzhiyun
115*4882a593Smuzhiyunpayload_offset=$(($(grep -na -m1 "^MARKER:$" "$0"|cut -d':' -f1) + 1))
116*4882a593Smuzhiyunif [ "$listcontents" = "1" ] ; then
117*4882a593Smuzhiyun    if [ @SDK_ARCHIVE_TYPE@ = "zip" ]; then
118*4882a593Smuzhiyun        tail -n +$payload_offset "$0" > sdk.zip
119*4882a593Smuzhiyun        if unzip -l sdk.zip;then
120*4882a593Smuzhiyun            rm sdk.zip
121*4882a593Smuzhiyun        else
122*4882a593Smuzhiyun            rm sdk.zip && exit 1
123*4882a593Smuzhiyun        fi
124*4882a593Smuzhiyun    else
125*4882a593Smuzhiyun        tail -n +$payload_offset "$0"| tar tvJ || exit 1
126*4882a593Smuzhiyun    fi
127*4882a593Smuzhiyun    exit
128*4882a593Smuzhiyunfi
129*4882a593Smuzhiyun
130*4882a593Smuzhiyuntitlestr="@SDK_TITLE@ installer version @SDK_VERSION@"
131*4882a593Smuzhiyunprintf "%s\n" "$titlestr"
132*4882a593Smuzhiyunprintf "%${#titlestr}s\n" | tr " " "="
133*4882a593Smuzhiyun
134*4882a593Smuzhiyunif [ $verbose = 1 ] ; then
135*4882a593Smuzhiyun	set -x
136*4882a593Smuzhiyunfi
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun@SDK_PRE_INSTALL_COMMAND@
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun# SDK_EXTENSIBLE is exposed from the SDK_PRE_INSTALL_COMMAND above
141*4882a593Smuzhiyunif [ "$SDK_EXTENSIBLE" = "1" ]; then
142*4882a593Smuzhiyun	DEFAULT_INSTALL_DIR="@SDKEXTPATH@"
143*4882a593Smuzhiyun	if [ "$INST_GCC_VER" = '4.8' -a "$SDK_GCC_VER" = '4.9' ] || [ "$INST_GCC_VER" = '4.8' -a "$SDK_GCC_VER" = '' ] || \
144*4882a593Smuzhiyun		[ "$INST_GCC_VER" = '4.9' -a "$SDK_GCC_VER" = '' ]; then
145*4882a593Smuzhiyun		echo "Error: Incompatible SDK installer! Your host gcc version is $INST_GCC_VER and this SDK was built by gcc higher version."
146*4882a593Smuzhiyun		exit 1
147*4882a593Smuzhiyun	fi
148*4882a593Smuzhiyunfi
149*4882a593Smuzhiyun
150*4882a593Smuzhiyunif [ "$target_sdk_dir" = "" ]; then
151*4882a593Smuzhiyun	if [ "$answer" = "Y" ]; then
152*4882a593Smuzhiyun		target_sdk_dir="$DEFAULT_INSTALL_DIR"
153*4882a593Smuzhiyun	else
154*4882a593Smuzhiyun		read -p "Enter target directory for SDK (default: $DEFAULT_INSTALL_DIR): " target_sdk_dir
155*4882a593Smuzhiyun		[ "$target_sdk_dir" = "" ] && target_sdk_dir=$DEFAULT_INSTALL_DIR
156*4882a593Smuzhiyun	fi
157*4882a593Smuzhiyunfi
158*4882a593Smuzhiyun
159*4882a593Smuzhiyuneval target_sdk_dir=$(echo "$target_sdk_dir"|sed 's/ /\\ /g')
160*4882a593Smuzhiyunif [ -d "$target_sdk_dir" ]; then
161*4882a593Smuzhiyun	target_sdk_dir=$(cd "$target_sdk_dir"; pwd)
162*4882a593Smuzhiyunelse
163*4882a593Smuzhiyun	target_sdk_dir=$(readlink -m "$target_sdk_dir")
164*4882a593Smuzhiyunfi
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun# limit the length for target_sdk_dir, ensure the relocation behaviour in relocate_sdk.py has right result.
167*4882a593Smuzhiyunif [ ${#target_sdk_dir} -gt 2048 ]; then
168*4882a593Smuzhiyun	echo "Error: The target directory path is too long!!!"
169*4882a593Smuzhiyun	exit 1
170*4882a593Smuzhiyunfi
171*4882a593Smuzhiyun
172*4882a593Smuzhiyunif [ "$SDK_EXTENSIBLE" = "1" ]; then
173*4882a593Smuzhiyun	# We're going to be running the build system, additional restrictions apply
174*4882a593Smuzhiyun	if echo "$target_sdk_dir" | grep -q '[+\ @$]'; then
175*4882a593Smuzhiyun		echo "The target directory path ($target_sdk_dir) contains illegal" \
176*4882a593Smuzhiyun		     "characters such as spaces, @, \$ or +. Abort!"
177*4882a593Smuzhiyun		exit 1
178*4882a593Smuzhiyun	fi
179*4882a593Smuzhiyun	# The build system doesn't work well with /tmp on NFS
180*4882a593Smuzhiyun	fs_dev_path="$target_sdk_dir"
181*4882a593Smuzhiyun	while [ ! -d "$fs_dev_path" ] ; do
182*4882a593Smuzhiyun		fs_dev_path=`dirname $fs_dev_path`
183*4882a593Smuzhiyun        done
184*4882a593Smuzhiyun	fs_dev_type=`stat -f -c '%t' "$fs_dev_path"`
185*4882a593Smuzhiyun	if [ "$fsdevtype" = "6969" ] ; then
186*4882a593Smuzhiyun		echo "The target directory path $target_sdk_dir is on NFS, this is not possible. Abort!"
187*4882a593Smuzhiyun		exit 1
188*4882a593Smuzhiyun	fi
189*4882a593Smuzhiyunelse
190*4882a593Smuzhiyun	if [ -n "$(echo $target_sdk_dir|grep ' ')" ]; then
191*4882a593Smuzhiyun		echo "The target directory path ($target_sdk_dir) contains spaces. Abort!"
192*4882a593Smuzhiyun		exit 1
193*4882a593Smuzhiyun	fi
194*4882a593Smuzhiyunfi
195*4882a593Smuzhiyun
196*4882a593Smuzhiyunif [ -e "$target_sdk_dir/environment-setup-@REAL_MULTIMACH_TARGET_SYS@" ]; then
197*4882a593Smuzhiyun	echo "The directory \"$target_sdk_dir\" already contains a SDK for this architecture."
198*4882a593Smuzhiyun	printf "If you continue, existing files will be overwritten! Proceed [y/N]? "
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun	default_answer="n"
201*4882a593Smuzhiyunelse
202*4882a593Smuzhiyun	printf "You are about to install the SDK to \"$target_sdk_dir\". Proceed [Y/n]? "
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun	default_answer="y"
205*4882a593Smuzhiyunfi
206*4882a593Smuzhiyun
207*4882a593Smuzhiyunif [ "$answer" = "" ]; then
208*4882a593Smuzhiyun	read answer
209*4882a593Smuzhiyun	[ "$answer" = "" ] && answer="$default_answer"
210*4882a593Smuzhiyunelse
211*4882a593Smuzhiyun	echo $answer
212*4882a593Smuzhiyunfi
213*4882a593Smuzhiyun
214*4882a593Smuzhiyunif [ "$answer" != "Y" -a "$answer" != "y" ]; then
215*4882a593Smuzhiyun	echo "Installation aborted!"
216*4882a593Smuzhiyun	exit 1
217*4882a593Smuzhiyunfi
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun# Try to create the directory (this will not succeed if user doesn't have rights)
220*4882a593Smuzhiyunmkdir -p $target_sdk_dir >/dev/null 2>&1
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun# if don't have the right to access dir, gain by sudo
223*4882a593Smuzhiyunif [ ! -x $target_sdk_dir -o ! -w $target_sdk_dir -o ! -r $target_sdk_dir ]; then
224*4882a593Smuzhiyun	if [ "$SDK_EXTENSIBLE" = "1" ]; then
225*4882a593Smuzhiyun		echo "Unable to access \"$target_sdk_dir\", will not attempt to use" \
226*4882a593Smuzhiyun		     "sudo as as extensible SDK cannot be used as root."
227*4882a593Smuzhiyun		exit 1
228*4882a593Smuzhiyun	fi
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun	SUDO_EXEC=$(which "sudo")
231*4882a593Smuzhiyun	if [ -z $SUDO_EXEC ]; then
232*4882a593Smuzhiyun		echo "No command 'sudo' found, please install sudo first. Abort!"
233*4882a593Smuzhiyun		exit 1
234*4882a593Smuzhiyun	fi
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun	# test sudo could gain root right
237*4882a593Smuzhiyun	$SUDO_EXEC pwd >/dev/null 2>&1
238*4882a593Smuzhiyun	[ $? -ne 0 ] && echo "Sorry, you are not allowed to execute as root." && exit 1
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun	# now that we have sudo rights, create the directory
241*4882a593Smuzhiyun	$SUDO_EXEC mkdir -p $target_sdk_dir >/dev/null 2>&1
242*4882a593Smuzhiyunfi
243*4882a593Smuzhiyun
244*4882a593Smuzhiyunprintf "Extracting SDK..."
245*4882a593Smuzhiyunif [ @SDK_ARCHIVE_TYPE@ = "zip" ]; then
246*4882a593Smuzhiyun    tail -n +$payload_offset "$0" > sdk.zip
247*4882a593Smuzhiyun    if $SUDO_EXEC unzip $EXTRA_TAR_OPTIONS sdk.zip -d $target_sdk_dir;then
248*4882a593Smuzhiyun        rm sdk.zip
249*4882a593Smuzhiyun    else
250*4882a593Smuzhiyun        rm sdk.zip && exit 1
251*4882a593Smuzhiyun    fi
252*4882a593Smuzhiyunelse
253*4882a593Smuzhiyun    tail -n +$payload_offset "$0"| $SUDO_EXEC tar mxJ -C $target_sdk_dir --checkpoint=.2500 $EXTRA_TAR_OPTIONS || exit 1
254*4882a593Smuzhiyunfi
255*4882a593Smuzhiyunecho "done"
256*4882a593Smuzhiyun
257*4882a593Smuzhiyunprintf "Setting it up..."
258*4882a593Smuzhiyun# fix environment paths
259*4882a593Smuzhiyunreal_env_setup_script=""
260*4882a593Smuzhiyunfor env_setup_script in `ls $target_sdk_dir/environment-setup-*`; do
261*4882a593Smuzhiyun	if grep -q 'OECORE_NATIVE_SYSROOT=' $env_setup_script; then
262*4882a593Smuzhiyun		# Handle custom env setup scripts that are only named
263*4882a593Smuzhiyun		# environment-setup-* so that they have relocation
264*4882a593Smuzhiyun		# applied - what we want beyond here is the main one
265*4882a593Smuzhiyun		# rather than the one that simply sorts last
266*4882a593Smuzhiyun		real_env_setup_script="$env_setup_script"
267*4882a593Smuzhiyun	fi
268*4882a593Smuzhiyun	$SUDO_EXEC sed -e "s:@SDKPATH@:$target_sdk_dir:g" -i $env_setup_script
269*4882a593Smuzhiyundone
270*4882a593Smuzhiyunif [ -n "$real_env_setup_script" ] ; then
271*4882a593Smuzhiyun	env_setup_script="$real_env_setup_script"
272*4882a593Smuzhiyunfi
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun@SDK_POST_INSTALL_COMMAND@
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun# delete the relocating script, so that user is forced to re-run the installer
277*4882a593Smuzhiyun# if he/she wants another location for the sdk
278*4882a593Smuzhiyunif [ $savescripts = 0 ] ; then
279*4882a593Smuzhiyun	$SUDO_EXEC rm -f ${env_setup_script%/*}/relocate_sdk.py ${env_setup_script%/*}/relocate_sdk.sh
280*4882a593Smuzhiyunfi
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun# Execute post-relocation script
283*4882a593Smuzhiyunpost_relocate="$target_sdk_dir/post-relocate-setup.sh"
284*4882a593Smuzhiyunif [ -e "$post_relocate" ]; then
285*4882a593Smuzhiyun	$SUDO_EXEC sed -e "s:@SDKPATH@:$target_sdk_dir:g" -i $post_relocate
286*4882a593Smuzhiyun	$SUDO_EXEC /bin/sh $post_relocate "$target_sdk_dir" "@SDKPATH@"
287*4882a593Smuzhiyun	$SUDO_EXEC rm -f $post_relocate
288*4882a593Smuzhiyunfi
289*4882a593Smuzhiyun
290*4882a593Smuzhiyunecho "SDK has been successfully set up and is ready to be used."
291*4882a593Smuzhiyunecho "Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g."
292*4882a593Smuzhiyunfor env_setup_script in `ls $target_sdk_dir/environment-setup-*`; do
293*4882a593Smuzhiyun	echo " \$ . $env_setup_script"
294*4882a593Smuzhiyundone
295*4882a593Smuzhiyun
296*4882a593Smuzhiyunexit 0
297*4882a593Smuzhiyun
298*4882a593SmuzhiyunMARKER:
299