Revision 316a2b34 compiler/GCC/gccsetup.sh
compiler/GCC/gccsetup.sh | ||
---|---|---|
309 | 309 |
printf " Print this help text.\n" |
310 | 310 |
printf " -i, --install\n" |
311 | 311 |
printf " Install another version.\n" |
312 |
printf " -u, --uninstall\n" |
|
313 |
printf " Unistall a version.\n" |
|
312 | 314 |
printf " -c, --change\n" |
313 | 315 |
printf " Change the default version.\n" |
314 | 316 |
printf " -q, --quit\n" |
... | ... | |
320 | 322 |
### detect installed versions ################################################## |
321 | 323 |
# Detect all installed version of arm-none-eabi-gcc, if any. |
322 | 324 |
# |
323 |
# usage: detectInstalledVersions <binarray> <current> |
|
325 |
# usage: detectInstalledVersions <binarray> <current> [<current_idx>]
|
|
324 | 326 |
# arguments: <binarray> |
325 | 327 |
# Array variable to store all detected binary paths to. |
326 | 328 |
# <current> |
327 | 329 |
# Variable to store the currently active binary to. |
330 |
# <current_idx> |
|
331 |
# Index of the curretly selected version in the output array (<binarray>). |
|
328 | 332 |
# return: n/a |
329 | 333 |
# |
330 | 334 |
function detectInstalledVersions { |
... | ... | |
341 | 345 |
armgcc_commanddir=$(dirname $armgcc_command) |
342 | 346 |
armgcc_currentbin=$armgcc_command |
343 | 347 |
while [ -L $armgcc_currentbin ]; do |
344 |
armgcc_currentbin=$(readlink $armgcc_currentbin) |
|
348 |
# differentiate between relative and absolute paths |
|
349 |
if [[ $(readlink $armgcc_currentbin) = /* ]]; then |
|
350 |
armgcc_currentbin=$(readlink $armgcc_currentbin) |
|
351 |
else |
|
352 |
armgcc_currentbin=$(realpath $(dirname $armgcc_currentbin)/$(readlink $armgcc_currentbin)) |
|
353 |
fi |
|
345 | 354 |
done |
346 | 355 |
# the installation location is assumed to be two directories up |
347 |
armgcc_installdir=$(realpath $(dirname ${armgcc_currentbin})/../../)
|
|
356 |
armgcc_installdir=$(realpath $(dirname ${armgcc_currentbin})/../..) |
|
348 | 357 |
# list all detected instalations |
349 | 358 |
for dir in $(ls -d ${armgcc_installdir}/*/); do |
350 | 359 |
if [ -f ${dir}/bin/arm-none-eabi-gcc ]; then |
... | ... | |
352 | 361 |
armgcc_bincnt=$((armgcc_bincnt + 1)) |
353 | 362 |
fi |
354 | 363 |
done |
355 |
fi |
|
356 | 364 |
|
357 |
eval "$1=(${armgcc_bins[*]})" |
|
358 |
eval $2="$armgcc_currentbin" |
|
365 |
# set the output variables |
|
366 |
eval "$1=(${armgcc_bins[*]})" |
|
367 |
eval $2="$armgcc_currentbin" |
|
368 |
if [ -n "$3" ]; then |
|
369 |
for (( bin=0; bin<${#armgcc_bins[@]}; ++bin )); do |
|
370 |
if [ ${armgcc_bins[bin]} = "$armgcc_currentbin" ]; then |
|
371 |
eval $3=$bin |
|
372 |
fi |
|
373 |
done |
|
374 |
fi |
|
375 |
else |
|
376 |
eval "$1=()" |
|
377 |
eval $2="" |
|
378 |
if [ -n "$3" ]; then |
|
379 |
eval $3="" |
|
380 |
fi |
|
381 |
fi |
|
359 | 382 |
} |
360 | 383 |
|
361 | 384 |
### install new version ######################################################## |
... | ... | |
401 | 424 |
# read download URL form user |
402 | 425 |
printLog "read installation url from user\n" |
403 | 426 |
local armgcc_downloadurl="" |
404 |
while [[ "$armgcc_downloadurl" != *".tar.bz2" ]]; do
|
|
427 |
while [ -z "$armgcc_downloadurl" ]; do
|
|
405 | 428 |
read -p "Download link for the installation file: " -e armgcc_downloadurl |
429 |
if [ -z "$armgcc_downloadurl" ]; then |
|
430 |
printWarning "installation aborted by user\n" |
|
431 |
return 1 |
|
432 |
fi |
|
406 | 433 |
if [[ $armgcc_downloadurl != *".tar.bz2" ]]; then |
407 | 434 |
printWarning "please specify a .tar.bz2 file\n" |
435 |
armgcc_downloadurl="" |
|
436 |
fi |
|
437 |
if [ ! wget --spider $armgcc_downloadurl 2>/dev/null ]; then |
|
438 |
printWarning "$armgcc_downloadurl can not be reached\n" |
|
439 |
armgcc_downloadurl="" |
|
408 | 440 |
fi |
409 | 441 |
done |
410 | 442 |
printLog "user selected $armgcc_downloadurl\n" |
... | ... | |
512 | 544 |
# don't do anything if the line is already present |
513 | 545 |
local bashrc_entrylines=$(grep -x -n "$bashrc_entry" $bashrc_file | cut -f1 -d:) # string of line numbers |
514 | 546 |
bashrc_entrylines=(${bashrc_entrylines//"\n"/" "}) # array of line numbers |
515 |
printf "$bashrc_entrylines\n" |
|
516 | 547 |
if [[ ${#bashrc_entrylines[@]} = 0 ]]; then |
517 | 548 |
# insert the entry before the closing identifier |
518 | 549 |
sed -i "${bashrc_idlines[1]}"'i'"$bashrc_entry" $bashrc_file |
... | ... | |
560 | 591 |
return 0 |
561 | 592 |
} |
562 | 593 |
|
594 |
### uninstall a version ######################################################## |
|
595 |
# Select an installed version and uninstall it from the system. |
|
596 |
# |
|
597 |
# usage: uninstallVersion <versions> <current_idx> <linkdir> |
|
598 |
# arguments: <version> |
|
599 |
# Array of available versions (full path to binary). |
|
600 |
# <current_idx> |
|
601 |
# Index of the currently selected version in the array. |
|
602 |
# <linkdir> |
|
603 |
# Path where to delete old links. |
|
604 |
# return: 0 |
|
605 |
# No error or warning occurred. |
|
606 |
# 1 |
|
607 |
# Warning: Installation aborted by user. |
|
608 |
# -1 |
|
609 |
# Error: An exception occurred. |
|
610 |
# |
|
611 |
function uninstallVersion { |
|
612 |
local versions=("${!1}") |
|
613 |
local current_idx="$2" |
|
614 |
local linkdir="$3" |
|
615 |
|
|
616 |
# check whether at least two installations were detected |
|
617 |
if [ ${#versions[@]} -eq 0 ]; then |
|
618 |
printError "no installation detected\n" |
|
619 |
return -1 |
|
620 |
else |
|
621 |
# print all available versions |
|
622 |
printInfo "choose the installation to uninstall to or type 'A' to abort:\n" |
|
623 |
for (( cnt=0; cnt<${#versions[@]}; ++cnt )); do |
|
624 |
if [ $cnt -eq $current_idx ]; then |
|
625 |
printf "*%3u: %s\n" $(($cnt + 1)) ${versions[$cnt]} |
|
626 |
else |
|
627 |
printf " %3u: %s\n" $(($cnt + 1)) ${versions[$cnt]} |
|
628 |
fi |
|
629 |
done |
|
630 |
|
|
631 |
# read user selection |
|
632 |
printLog "read user slection\n" |
|
633 |
local userinput="" |
|
634 |
while [ -z $userinput ] ; do |
|
635 |
read -p "your selection: " -e userinput |
|
636 |
printLog "user selection: $userinput\n" |
|
637 |
if [[ ! "$userinput" =~ ^[0-9]+$ ]] || [ ! "$userinput" -gt 0 ] || [ ! "$userinput" -le ${#versions[@]} ] && [[ ! "$userinput" =~ ^[Aa]$ ]]; then |
|
638 |
printWarning "Please enter an integer between 1 and ${#versions[@]} or 'A' to abort.\n" |
|
639 |
userinput="" |
|
640 |
fi |
|
641 |
if [ ${#versions[@]} -gt 1 ] && [ $((userinput - 1)) -eq $current_idx ]; then |
|
642 |
printWarning "Unable to uninstall currently selected version (as long as there are others).\n" |
|
643 |
userinput="" |
|
644 |
fi |
|
645 |
done |
|
646 |
|
|
647 |
if [[ "$userinput" =~ ^[Aa]$ ]]; then |
|
648 |
printWarning "aborted by user\n" |
|
649 |
return 1 |
|
650 |
else |
|
651 |
local idx=$((userinput - 1)) |
|
652 |
printf "\n" |
|
653 |
# prompt selected and aks user for confirmation |
|
654 |
printInfo "${versions[$idx]} will be removed. Continue? [y/n]\n" |
|
655 |
readUserInput "YyNn" userinput |
|
656 |
case "$userinput" in |
|
657 |
Y|y) |
|
658 |
;; |
|
659 |
N|n) |
|
660 |
printWarning "uninstallation process aborted by user\n" |
|
661 |
return 1 |
|
662 |
;; |
|
663 |
*) # sanity check (exit with error) |
|
664 |
printError "invalid option: $userinput\n" |
|
665 |
return -1 |
|
666 |
;; |
|
667 |
esac |
|
668 |
# find and delete any links pointing to the version to be deleted |
|
669 |
for link in `find $linkdir -maxdepth 1 -type l`; do |
|
670 |
local l=$link |
|
671 |
# follow the link to the actual binary |
|
672 |
while [ -L $l ]; do |
|
673 |
# differentiate between relative and absolute paths |
|
674 |
if [[ $(readlink $l) = /* ]]; then |
|
675 |
l=$(readlink $l) |
|
676 |
else |
|
677 |
l=$(realpath $(dirname $l)/$(readlink $l)) |
|
678 |
fi |
|
679 |
done |
|
680 |
# delete the link if it points to the version to be uninstalled |
|
681 |
if [ $(dirname $l) == $(dirname ${versions[$idx]}) ]; then |
|
682 |
rm $link |
|
683 |
fi |
|
684 |
done |
|
685 |
# delete the version directory (assumed to be one directory up) |
|
686 |
rm -rf $(realpath $(dirname ${versions[$idx]})/..) |
|
687 |
printInfo "${versions[$idx]} has been removed.\n" |
|
688 |
fi |
|
689 |
fi |
|
690 |
|
|
691 |
return 0 |
|
692 |
} |
|
693 |
|
|
563 | 694 |
### change default version ##################################################### |
564 | 695 |
# Change the default arm-none-eabi-gcc version. |
565 | 696 |
# |
566 |
# usage: installNewVersion <versions> <linkdir>
|
|
697 |
# usage: changeDefaultVersion <versions> <linkdir>
|
|
567 | 698 |
# argumenst: <versions> |
568 | 699 |
# Array of available versions (full path to binary). |
569 | 700 |
# <linkdir> |
... | ... | |
669 | 800 |
# detect installed versions and inform user |
670 | 801 |
local installedversions=() |
671 | 802 |
local currentversion="" |
672 |
detectInstalledVersions installedversions currentversion |
|
803 |
local currentversionidx="n/a" |
|
804 |
detectInstalledVersions installedversions currentversion currentversionidx |
|
673 | 805 |
case "${#installedversions[@]}" in |
674 | 806 |
0) |
675 | 807 |
printInfo "no installation has been detected\n";; |
... | ... | |
694 | 826 |
case "$1" in |
695 | 827 |
-h|--help) # already handled; ignore |
696 | 828 |
shift 1;; |
697 |
-i|--init)
|
|
829 |
-i|--install)
|
|
698 | 830 |
if [ -z "$currentversion" ]; then |
699 | 831 |
installNewVersion |
700 | 832 |
else |
701 |
installNewVersion --install=$(realpath $(dirname "$currentversion")/../../) --link=$(realpath $(dirname "$currentversion")/../../) |
|
833 |
installNewVersion --install=$(realpath $(dirname $currentversion)/../..) --link=$(realpath $(dirname $currentversion)/../..) |
|
834 |
fi |
|
835 |
detectInstalledVersions installedversions currentversion currentversionidx |
|
836 |
printf "\n"; shift 1;; |
|
837 |
-u|--uninstall) |
|
838 |
if [ ! -z "$currentversion" ]; then |
|
839 |
uninstallVersion installedversions[@] $currentversionidx $(realpath $(dirname $currentversion)/../..) |
|
840 |
detectInstalledVersions installedversions currentversion currentversionidx |
|
841 |
else |
|
842 |
printError "no installation detected\n" |
|
702 | 843 |
fi |
703 | 844 |
printf "\n"; shift 1;; |
704 | 845 |
-c|--change) |
705 |
changeDefaultVersion installedversions[@] $(realpath $(dirname "$currentversion")/../../); printf "\n"; shift 1;; |
|
846 |
if [ ! -z "$currentversion" ]; then |
|
847 |
changeDefaultVersion installedversions[@] $(realpath $(dirname $currentversion)/../..) |
|
848 |
else |
|
849 |
printError "no installation detected\n" |
|
850 |
fi |
|
851 |
printf "\n"; shift 1;; |
|
706 | 852 |
-q|--quit) |
707 | 853 |
quitScript; shift 1;; |
708 | 854 |
--log=*|--LOG=*) # already handled; ignore |
... | ... | |
726 | 872 |
printInfo "GCC setup main menu\n" |
727 | 873 |
printf "Please select one of the following actions:\n" |
728 | 874 |
printf " [I] - install another version\n" |
875 |
printf " [U] - uninstall a version\n" |
|
729 | 876 |
printf " [C] - change default version\n" |
730 | 877 |
printf " [Q] - quit this setup\n" |
731 | 878 |
local userinput="" |
732 |
readUserInput "IiCcQq" userinput |
|
879 |
readUserInput "IiUuCcQq" userinput
|
|
733 | 880 |
printf "\n" |
734 | 881 |
|
735 | 882 |
# evaluate user selection |
... | ... | |
738 | 885 |
if [ -z "$currentversion" ]; then |
739 | 886 |
installNewVersion |
740 | 887 |
else |
741 |
installNewVersion --install=$(realpath $(dirname "$currentversion")/../../) --link=$(realpath $(dirname "$currentversion")/../../) |
|
888 |
installNewVersion --install=$(realpath $(dirname $currentversion)/../..) --link=$(realpath $(dirname $currentversion)/../..) |
|
889 |
fi |
|
890 |
detectInstalledVersions installedversions currentversion currentversionidx |
|
891 |
printf "\n";; |
|
892 |
U|u) |
|
893 |
if [ ! -z "$currentversion" ]; then |
|
894 |
uninstallVersion installedversions[@] $currentversionidx $(realpath $(dirname $currentversion)/../..) |
|
895 |
detectInstalledVersions installedversions currentversion currentversionidx |
|
896 |
else |
|
897 |
printError "no installation detected\n" |
|
742 | 898 |
fi |
743 | 899 |
printf "\n";; |
744 | 900 |
C|c) |
745 |
changeDefaultVersion installedversions[@] $(realpath $(dirname "$currentversion")/../../); printf "\n";; |
|
901 |
if [ ! -z "$currentversion" ]; then |
|
902 |
changeDefaultVersion installedversions[@] $(realpath $(dirname $currentversion)/../..) |
|
903 |
else |
|
904 |
printError "no installation detected\n" |
|
905 |
fi |
|
906 |
printf "\n";; |
|
746 | 907 |
Q|q) |
747 | 908 |
quitScript;; |
748 | 909 |
*) # sanity check (exit with error) |
Also available in: Unified diff