From 34709f23d9f57252b527d013991c9c055d798d69 Mon Sep 17 00:00:00 2001 From: WXbet Date: Sun, 26 Jan 2020 20:32:22 +0100 Subject: [PATCH] enable multiselect in the "Cross Toolchain Template Menu" to support batched builds of cross toolchains (v0.8.0) optimization of temp path handling to support the execution of multiple instances of s3 correct path setting in config builder function fix library version detection beautifying details on some menus --- support/functions/_plugin_update_toolchain | 138 +++++++++++---------- 1 file changed, 73 insertions(+), 65 deletions(-) diff --git a/support/functions/_plugin_update_toolchain b/support/functions/_plugin_update_toolchain index af033ef..d64579f 100644 --- a/support/functions/_plugin_update_toolchain +++ b/support/functions/_plugin_update_toolchain @@ -1,11 +1,11 @@ #!/bin/bash -#simplebuild_plugin tcupdate (s3.TUP) 0.7.0 +#simplebuild_plugin tcupdate (s3.TUP) 0.8.0 tcupdate(){ clear && _check_bin; - pversion="0.7.0"; + pversion="0.8.0"; pname="s3.TUP"; pdesc="Plugin $pname v$pversion"; configname="$configdir/plugin_update_toolchain.config"; @@ -39,7 +39,6 @@ tcupdate(){ #check config _check_config; - IFS="#"; if [ "$1" == "-c" ] || [ "$1" == "--create" ];then _create_tc; bye; @@ -51,14 +50,16 @@ tcupdate(){ for i in "${INST_TCLIST[@]}";do if [ ! "$i" == "native" ];then source "$tccfgdir/$i"; - MENU_OPTIONS+="$_toolchainname#$_description#toolchain folder:"$tcdir/$i" | config file:"$tccfgdir/$i"#"; + MENU_OPTIONS+=("$_toolchainname" "$_description" "toolchain folder:$tcdir/$i | config file:$tccfgdir/$i"); counter; fi; done; fi; - [ $COUNT -eq 0 ] && MENU_OPTIONS+="#no toolchains found#no toolchains found#" && counter; + [ $COUNT -eq 0 ] && MENU_OPTIONS+=("" "no toolchains found" "no toolchains found") && counter; fi; - out=$("$gui" "$st_" "$bt_" "$title_ - $pdesc" "--item-help" "--help-tags" "--default-item" "$3" "--ok-label" "Update" "--cancel-label" "Create" "--help-button" "--help-label" "Exit" "--extra-button" "--extra-label" "Copy" "--title" "-[ Toolchain Menu ]-" --menu "\nSelect one of the installed tool chains that you want to update:\n " "${COUNT+10}" 0 0 ${MENU_OPTIONS}); + out=$("$gui" "$st_" "$bt_" "$title_ - \Z4$pdesc\Zn" "--colors" "--item-help" "--help-tags" "--default-item" "$3" "--ok-label" "Update" "--cancel-label" "Create" "--help-button" "--help-label" "Exit" "--extra-button" "--extra-label" "Copy" "--title" "-[ Toolchain Menu ]-" \ + --menu "\nSelect one of the installed tool chains that you want to update:\n " \ + "${COUNT+10}" 0 0 "${MENU_OPTIONS[@]}"); ret="$?" tc=$(echo "$out" | awk '{printf $1}'); @@ -112,10 +113,9 @@ tcupdate(){ cd "$tcdir/$tc/$_sysroot" fi; prefixdir="$PWD" - pkg=$(find * | grep -m1 "/pkgconfig") && pkgdir="$prefixdir/$pkg"; + pkg=$(find * | grep -m1 "/pkgconfig") && pkgdir="$prefixdir/$pkg" || pkgdir="$prefixdir"; #build menu items from config file - IFS=$OIFS; unset MENU_OPTIONS;COUNT=0;unset libs; for i in "${LIBS[@]}" do @@ -133,16 +133,16 @@ tcupdate(){ libexports="$i"_exports[@];libexports=("${!libexports}"); libconfigure="$i"_configure[@];libconfigure=("${!libconfigure}"); libmake="$i"_make[@];libmake=("${!libmake}"); - + MENU_OPTIONS+=("$i" "$libname $libversion $libversioncompare $(echo $libversioncurrent | sed -e 's/^$/ ---/g')" "$([ $libversioncurrent ] && echo "on" || echo "off")" "$([ $libname ] && echo "$libname $libversion: $liburl")");counter; # 0 key 1 desc 2 version 3 checkversion 4 checkfile 5 current version 6 url 7 tasks array lib=("$libkey" "$libname" "$libversion" "$libversioncheck" "$libcheck" "$libversioncurrent" "$liburl" "(${libtasks[*]@Q})"); libs+=("(${lib[*]@Q})"); done; - [ $COUNT -eq 0 ] && MENU_OPTIONS+="#no libraries found#no libraries found#" && counter; + [ $COUNT -eq 0 ] && MENU_OPTIONS+=("" "no libraries found" "no libraries found") && counter; - opts=$("$gui" "--item-help" "--help-tags" "$st_" "$bt_" "$title_ - $pdesc" "--default-item" "$3" "--ok-label" "Start" "--help-button" "--help-label" "Info" "--cancel-label" "$([ "$tc_menu" == "1" ] && echo "Back" || echo "Exit")" --title "-[ Library Update Menu - $tc ]-" "$cl_"\ + opts=$("$gui" "--item-help" "--help-tags" "$st_" "$bt_" "$title_ - \Z4$pdesc\Zn" "--colors" "--default-item" "$3" "--ok-label" "Start" "--help-button" "--help-label" "Info" "--cancel-label" "$([ "$tc_menu" == "1" ] && echo "Back" || echo "Exit")" "--title" "-[ Library Update Menu - \Z2$tc\Zn ]-" "$cl_"\ "\nSelect all libraries to update in toolchain's SYSROOT folder:\n$prefixdir\n\n library version NEW CURRENT" \ "${COUNT+12}" 70 0 "${MENU_OPTIONS[@]}"); @@ -159,29 +159,32 @@ tcupdate(){ bcd=$(cat "$configname" | grep ""$libkey"_tasks"); txt=$(echo -e "Toolchain: $tcdir/$tc\nCompiler: $compilername\nSysroot: $sr\nPrefix: $prefixdir\n$sp\n\nLibrary configuration:\n$txt\n\nBuild command:\n$(_replace_tokens "$(_tidy_tasks "$bcd" "$libkey")")"); tempfile=$(mktemp) && echo -e "$txt" > "$tempfile"; - "$gui" "$st_" "$nc_" "$bt_" "$title_ - $pdesc" "--textbox" "$tempfile" 30 80; + "$gui" "$st_" "$nc_" "$bt_" "$title_ - \Z4$pdesc\Zn" "--colors" "--textbox" "$tempfile" 30 80; rm "$tempfile" 2>/dev/null; tcupdate $tc $tc_menu $libkey; fi; #BUILD section + ts=$(date +%F)_$(date +%T); + tmpdir="/tmp/lib_source/$ts"; icount=$(echo $opts | wc -w);i=0; for o in $opts;do unset buildtasks; for l in "${libs[@]}";do declare -a lib="${l[*]}"; #populate libs array element [ ! "$o" == "${lib[0]}" ] && continue || ((i++)); - logfile="$ldir/$(date +%F)_$(date +%T)_update_toolchain_"$_toolchainname"_"${lib[1]}"_"${lib[2]}".log" - + logfile="$ldir/"$ts"_update_toolchain_"$_toolchainname"_"${lib[1]}"_"${lib[2]}".log" + #generate build command list declare -a libtasks="${lib[7]}"; #populate tasks array element for task in "${libtasks[@]}";do task=$(_replace_tokens "$task"); #replace tokens buildtasks+=("$task"); done - _build "($i/$icount) ${lib[1]}" $(_extract $(_dl "${lib[6]}")) "$logfile" "${buildtasks[@]}"; + _build "($i/$icount) $tc: library ${lib[1]} ${lib[2]}" $(_extract $(_dl "${lib[6]}" "${lib[1]} ${lib[2]}") "$tmpdir") "$logfile" "${buildtasks[@]}"; done; done; + [ -d "$tmpdir" ] && rm -r "$tmpdir"; #Reopen update menu if [ ${#opts} -gt 0 ];then @@ -214,61 +217,66 @@ _create_tc(){ desc=$(sed -n -e '/#toolchain template/ s/.*\: *//p' $t); [ ! "$desc" ] && desc="no description available"; [ -d "$tcdir/$t" ] && [ -f "$tccfgdir/$t" ] && color="\Z1" || color=""; - MENU_OPTIONS+="$t#$color$desc\Zn#template filename:"$cttpldir/$t"#"; + MENU_OPTIONS+=("$t" "$color$desc\Zn" "off" "template filename:$cttpldir/$t");counter; counter; done; fi; - [ $COUNT -eq 0 ] && MENU_OPTIONS+="#no templates found#no templates found#" && counter; + [ $COUNT -eq 0 ] && MENU_OPTIONS+=("" "no templates found" "no templates found") && counter; - opts=$("$gui" "$st_" "$bt_" "$title_ - $pdesc" "--colors" "--item-help" "--help-tags" "--default-item" "$3" "--ok-label" "Start" "--cancel-label" "Setup" "--help-button" "--help-label" "$([ $tc_menu ] && echo "Back" || echo "Exit")" "--title" "-[ Cross Toolchain Template Menu ]-" \ - --menu "\nSelect on of the templates to create the cross toolchain you want:\n\n\Z1NOTE: If you create a cross toolchain from a template with a red colored description, an existing one with the same name will be replaced without asking!\Zn" \ - "${COUNT+11}" 0 0 ${MENU_OPTIONS}); + opts=$("$gui" "$st_" "$bt_" "$title_ - \Z4$pdesc\Zn" "--colors" "--item-help" "--help-tags" "--default-item" "$3" "--ok-label" "Start" "--cancel-label" "Setup" "--help-button" "--help-label" "$([ $tc_menu ] && echo "Back" || echo "Exit")" "--title" "-[ Cross Toolchain Template Menu ]-" "$cl_"\ + "\nSelect on of the templates to create the cross toolchain you want:\n\n\Z1NOTE: If you create a cross toolchain from a template with a red colored description, an existing one with the same name will be replaced without asking!\Zn" \ + "${COUNT+11}" 0 0 "${MENU_OPTIONS[@]}"); ret="$?" - - tpl=$(echo "$opts" | awk '{printf $1}'); + case $ret in 0) #Start - Build cross toolchain if [ -f "$ctsrcdir/ct-ng" ]; then - if [ -f "$cttpldir/$tpl" ]; then - #logfile="$ldir/$(date +%F)_$(date +%T)_update_toolchain_crosstoolchain_"$tpl".log" + icount=$(echo $opts | wc -w);i=0; + for tpl in $opts;do + if [ -f "$cttpldir/$tpl" ]; then + logfile="$ldir/$(date +%F)_$(date +%T)_update_toolchain_crosstoolchain_"$tpl".log" && ((i++)); - #copy template and patching them - cp --no-preserve=mode,ownership -f "$cttpldir/$tpl" "$ctsrcdir/.config"; - #CT_LOCAL_TARBALLS_DIR aka cache folder for downloads - sed -i "s#.*CT_LOCAL_TARBALLS_DIR=.*#CT_LOCAL_TARBALLS_DIR=\"$dldir\"#g" "$ctsrcdir/.config"; - #CT_PREFIX_DIR aka folder that contains the final toolchain - sed -i "s#.*CT_PREFIX_DIR=.*#CT_PREFIX_DIR=\"$tcdir/$tpl\"#g" "$ctsrcdir/.config"; - #CT_PARALLEL_JOBS - sed -i "s#.*CT_PARALLEL_JOBS=.*#CT_PARALLEL_JOBS=$CTNG_PARALLEL_JOBS#g" "$ctsrcdir/.config"; - clear; + #copy template and patching them + cp --no-preserve=mode,ownership -f "$cttpldir/$tpl" "$ctsrcdir/.config"; + #CT_LOCAL_TARBALLS_DIR aka cache folder for downloads + sed -i "s#.*CT_LOCAL_TARBALLS_DIR=.*#CT_LOCAL_TARBALLS_DIR=\"$dldir\"#g" "$ctsrcdir/.config"; + #CT_PREFIX_DIR aka folder that contains the final toolchain + sed -i "s#.*CT_PREFIX_DIR=.*#CT_PREFIX_DIR=\"$tcdir/$tpl\"#g" "$ctsrcdir/.config"; + #CT_PARALLEL_JOBS aka parallel build job count + sed -i "s#.*CT_PARALLEL_JOBS=.*#CT_PARALLEL_JOBS=$CTNG_PARALLEL_JOBS#g" "$ctsrcdir/.config"; + clear; - #run build - bcl=$(printf '%s\n' "${CTNG_BUILD_tasks[@]}"); - sp=$(printf '%*s' 80 | tr ' ' '=') - echo -e "$sp\nbuild command list for cross toolchain $tpl (executed as user $CTNG_USER):\n$sp\ncd "$ctsrcdir"\n$(_replace_tokens "$bcl")\n$sp"; - sleep 2; - cd "$ctsrcdir"; - cmd="${CTNG_BUILD_tasks[@]}"; - sudo -u "$CTNG_USER" -H -- sh -c "$(_replace_tokens "$cmd")" 2>&1; - err=$(grep '\[ERROR\]' "$ctsrcdir/build.log" | wc -l) + #run build as $CTNG_USER + bcl=$(printf '%s\n' "${CTNG_BUILD_tasks[@]}"); + sp=$(printf '%*s' 80 | tr ' ' '=') + echo -e "$sp\nbuild ($i/$icount): command list for cross toolchain $tpl (executed as user $CTNG_USER):\n$sp\ncd "$ctsrcdir"\n$(_replace_tokens "$bcl")\n$sp"; + sleep 2; + cd "$ctsrcdir"; + cmd="${CTNG_BUILD_tasks[@]}"; + sudo -u "$CTNG_USER" -H -- sh -c "$(_replace_tokens "$cmd")" 2>&1; + err=$(grep '\[ERROR\]' "$ctsrcdir/build.log" | wc -l) - if [ ! $err -gt 0 ]; then - #get target from build.log - target=$(sed -n -e '/target = / s/.*\= *//p' "$ctsrcdir/build.log"); - - #compress toolchain - _compress "$dldir/Toolchain-$tpl.tar.xz" "$tcdir/$tpl" | "$gui" "$st_" --colors --title " -[ Compress cross toolchain $tpl... ]- " "$pb_" "$_lines" "$_cols"; + #save build.log in logs + cp -f "$ctsrcdir/build.log" "$logfile"; + + if [ ! $err -gt 0 ]; then + #get target from build.log + target=$(sed -n -e '/target = / s/.*\= *//p' "$ctsrcdir/build.log"); - #create toolchain.cfg - desc=$(sed -n -e '/#toolchain template/ s/.*\: *//p' "$cttpldir/$tpl"); - _create_toolchaincfg "$tcdir/$tpl" "$tpl" "$target" "$desc" "$dldir/Toolchain-$tpl.tar.xz"; + #compress toolchain + _compress "$dldir/Toolchain-$tpl.tar.xz" "$tcdir/$tpl" | "$gui" "$st_" "$bt_" "$title_ - \Z4$pdesc\Zn" "--colors" "--title" " -[ Compress cross toolchain $tpl... ]- " "$pb_" "$_lines" "$_cols"; + + #create toolchain.cfg + desc=$(sed -n -e '/#toolchain template/ s/.*\: *//p' "$cttpldir/$tpl"); + _create_toolchaincfg "$tcdir/$tpl" "$tpl" "$target" "$desc" "$dldir/Toolchain-$tpl.tar.xz"; + else + _paktc_timer 10; + fi; else - _paktc_timer; + [ "$tpl" == "" ] && echo -e "$r_l $txt_error:$y_l $tc$w_l Template $txt_n_installed""$rs_"; + sleep 2; fi; - else - [ "$tpl" == "" ] && echo -e "$r_l $txt_error:$y_l $tc$w_l Template $txt_n_installed""$rs_"; - sleep 2; - fi; + done; else echo -e "$r_l""CHECK -> crosstool-NG is not setup correctly. Please run 'Setup' from menu!\n""$re_"; _paktc_timer 10; @@ -302,8 +310,8 @@ _create_tc(){ cd "$ctsrcdir"; cmd="${CTNG_SETUP_tasks[@]}"; sudo -u "$CTNG_USER" -H -- sh -c "$(_replace_tokens "$cmd")" 2>&1; - ) | tee "$logfile" | "$gui" "$st_" --colors --title " -[ Setup crosstool-NG... ]- " "$pb_" "$_lines" "$_cols"; - _paktc_timer; + ) | tee "$logfile" | "$gui" "$st_" "$bt_" "$title_ - \Z4$pdesc\Zn" "--colors" "--title" " -[ Setup crosstool-NG... ]- " "$pb_" "$_lines" "$_cols"; + _paktc_timer 10; _create_tc;; 2) #Exit return;; @@ -324,7 +332,7 @@ _copy(){ #create toolchain.cfg source "$tccfgdir/$1" && target="${_compiler%?}" && desc="$_description"; _create_toolchaincfg "$tcdir/$1" "$newtc" "$target" "$desc" "$xzfile"; - ) | "$gui" "$st_" --colors --title " -[ Copy $1 to $newtc ... ]- " "$pb_" "$_lines" "$_cols"; + ) | "$gui" "$st_" "$bt_" "$title_ - \Z4$pdesc\Zn" "--colors" "--title" " -[ Copy $1 to $newtc ... ]- " "$pb_" "$_lines" "$_cols"; [ -f "$newtccfgfile" ] && echo "$newtc"; }; _build(){ @@ -344,7 +352,7 @@ _build(){ sleep 2; cd "$libsrcdir"; ( eval "${tasks[@]}" ) 2>&1 | tee -a "$lf" - ) | "$gui" "$st_" --colors --title " -[ Build $desc ... ]- " "$pb_" "$_lines" "$_cols";sleep 2; + ) | "$gui" "$st_" "$bt_" "$title_ - \Z4$pdesc\Zn" "--colors" "--title" " -[ Build $desc... ]- " "$pb_" "$_lines" "$_cols";sleep 2; #build error message error_on_build=$(grep -cw1 Error "$lf"); @@ -359,7 +367,7 @@ _dl(){ [ -d "$dldir/#tmp" ] && rm --recursive --force "$dldir/#tmp" mkdir --parents "$dldir/#tmp"; cd "$dldir/#tmp"; - wget --content-disposition "$1" 2>&1 | stdbuf -o0 awk '/[.] +[0-9][0-9]?[0-9]?%/ { print substr($0,63,3) }' | "$gui" "$st_" "$bt_" "$title_ - $pdesc" --title " -[ download ]- " --gauge " $txt_loading $fname $txt_wait" 6 74; + wget --content-disposition "$1" 2>&1 | stdbuf -o0 awk '/[.] +[0-9][0-9]?[0-9]?%/ { print substr($0,63,3) }' | "$gui" "$st_" "$bt_" "$title_ - \Z4$pdesc\Zn" "--colors" "--title" " -[ download $2 ]- " --gauge " $txt_loading $txt_wait" 6 74; if [ $? -eq 0 ];then fname="$(ls -t | head -n1)"; md5file="$fname.md5"; md5sum "$fname" > "$md5file"; @@ -379,8 +387,8 @@ _extract(){ local c e i; (($#)) || return; - - edir=/tmp/lib_source; + + edir="$2"; [ -d "$edir" ] && rm -r "$edir"; mkdir --parents "$edir"; @@ -410,7 +418,7 @@ _extract(){ cd "$edir"; BEFORE=(.*/ */); - command "${c[@]}" "$i" |"$gui" "$st_" --title " -[ $txt_extracting ]- " "$pb_" 20 74; + command "${c[@]}" "$i" |"$gui" "$st_" "$bt_" "$title_ - \Z4$pdesc\Zn" "--colors" "--title" " -[ $txt_extracting $i ]- " "$pb_" 20 74; ((e = e || $?)); AFTER=(.*/ */); @@ -563,7 +571,7 @@ _create_config(){ ctng_build_tasks=( "(\"./ct-ng build;\")" ); ctng_build_tasks_comment="#build command"; - ctng_setup_tasks=( "(\"git clone --progress \"\$CTNG_REPO_URL\" \"@CTNGSOURCE@\";\")" "(\"./bootstrap;\")" "(\"./configure --enable-local;\")" "(\"make;\")" "(\"touch \"@CTNGSOURCE@\.config\";\")" ); + ctng_setup_tasks=( "(\"git clone --progress \"\$CTNG_REPO_URL\" \"@CTNGSOURCE@\";\")" "(\"./bootstrap;\")" "(\"./configure --enable-local;\")" "(\"make;\")" "(\"touch \"@CTNGSOURCE@/.config\";\")" ); ctng_setup_tasks_comment="#setup command"; echo '#CROSS toolchain build settings' >"$configname";