fbtenv.sh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #!/bin/sh
  2. # shellcheck disable=SC2034,SC2016,SC2086
  3. # public variables
  4. DEFAULT_SCRIPT_PATH="$(pwd -P)";
  5. SCRIPT_PATH="${SCRIPT_PATH:-$DEFAULT_SCRIPT_PATH}";
  6. FBT_TOOLCHAIN_VERSION="${FBT_TOOLCHAIN_VERSION:-"8"}";
  7. FBT_TOOLCHAIN_PATH="${FBT_TOOLCHAIN_PATH:-$SCRIPT_PATH}";
  8. fbtenv_check_sourced()
  9. {
  10. case "${ZSH_EVAL_CONTEXT:-""}" in *:file:*)
  11. return 0;;
  12. esac
  13. case ${0##*/} in dash|-dash|bash|-bash|ksh|-ksh|sh|-sh|*.sh|fbt)
  14. return 0;;
  15. esac
  16. echo "Running this script manually is wrong, please source it";
  17. echo "Example:";
  18. printf "\tsource scripts/toolchain/fbtenv.sh\n";
  19. return 1;
  20. }
  21. fbtenv_check_script_path()
  22. {
  23. if [ ! -x "$SCRIPT_PATH/fbt" ]; then
  24. echo "Please source this script being into flipperzero-firmware root directory, or specify 'SCRIPT_PATH' manually";
  25. echo "Example:";
  26. printf "\tSCRIPT_PATH=lang/c/flipperzero-firmware source lang/c/flipperzero-firmware/scripts/fbtenv.sh\n";
  27. echo "If current directory is right, type 'unset SCRIPT_PATH' and try again"
  28. return 1;
  29. fi
  30. return 0;
  31. }
  32. fbtenv_get_kernel_type()
  33. {
  34. SYS_TYPE="$(uname -s)";
  35. ARCH_TYPE="$(uname -m)";
  36. if [ "$ARCH_TYPE" != "x86_64" ] && [ "$SYS_TYPE" != "Darwin" ]; then
  37. echo "Now we provide toolchain only for x86_64 arhitecture, sorry..";
  38. return 1;
  39. fi
  40. if [ "$SYS_TYPE" = "Darwin" ]; then
  41. fbtenv_check_rosetta || return 1;
  42. TOOLCHAIN_ARCH_DIR="$FBT_TOOLCHAIN_PATH/toolchain/x86_64-darwin";
  43. TOOLCHAIN_URL="https://update.flipperzero.one/builds/toolchain/gcc-arm-none-eabi-10.3-x86_64-darwin-flipper-$FBT_TOOLCHAIN_VERSION.tar.gz";
  44. elif [ "$SYS_TYPE" = "Linux" ]; then
  45. TOOLCHAIN_ARCH_DIR="$FBT_TOOLCHAIN_PATH/toolchain/x86_64-linux";
  46. TOOLCHAIN_URL="https://update.flipperzero.one/builds/toolchain/gcc-arm-none-eabi-10.3-x86_64-linux-flipper-$FBT_TOOLCHAIN_VERSION.tar.gz";
  47. elif echo "$SYS_TYPE" | grep -q "MINGW"; then
  48. echo "In MinGW shell use \"fbt.cmd\" instead of \"fbt\"";
  49. return 1;
  50. else
  51. echo "Your system is not recognized. Sorry.. Please report us your configuration.";
  52. return 1;
  53. fi
  54. return 0;
  55. }
  56. fbtenv_check_rosetta()
  57. {
  58. if [ "$ARCH_TYPE" = "arm64" ]; then
  59. if ! /usr/bin/pgrep -q oahd; then
  60. echo "Flipper Zero Toolchain needs Rosetta2 to run under Apple Silicon";
  61. echo "Please instal it by typing 'softwareupdate --install-rosetta --agree-to-license'";
  62. return 1;
  63. fi
  64. fi
  65. return 0;
  66. }
  67. fbtenv_check_tar()
  68. {
  69. printf "Checking tar..";
  70. if ! tar --version > /dev/null 2>&1; then
  71. echo "no";
  72. return 1;
  73. fi
  74. echo "yes";
  75. return 0;
  76. }
  77. fbtenv_check_downloaded_toolchain()
  78. {
  79. printf "Checking downloaded toolchain tgz..";
  80. if [ ! -f "$FBT_TOOLCHAIN_PATH/toolchain/$TOOLCHAIN_TAR" ]; then
  81. echo "no";
  82. return 1;
  83. fi
  84. echo "yes";
  85. return 0;
  86. }
  87. fbtenv_download_toolchain_tar()
  88. {
  89. echo "Downloading toolchain:";
  90. mkdir -p "$FBT_TOOLCHAIN_PATH/toolchain" || return 1;
  91. "$DOWNLOADER" $DOWNLOADER_ARGS "$FBT_TOOLCHAIN_PATH/toolchain/$TOOLCHAIN_TAR" "$TOOLCHAIN_URL" || return 1;
  92. echo "done";
  93. return 0;
  94. }
  95. fbtenv_remove_old_tooclhain()
  96. {
  97. printf "Removing old toolchain (if exist)..";
  98. rm -rf "${TOOLCHAIN_ARCH_DIR}";
  99. echo "done";
  100. }
  101. fbtenv_show_unpack_percentage()
  102. {
  103. LINE=0;
  104. while read -r line; do
  105. LINE=$(( LINE + 1 ));
  106. if [ $(( LINE % 300 )) -eq 0 ]; then
  107. printf "#";
  108. fi
  109. done
  110. echo " 100.0%";
  111. }
  112. fbtenv_unpack_toolchain()
  113. {
  114. echo "Unpacking toolchain:";
  115. tar -xvf "$FBT_TOOLCHAIN_PATH/toolchain/$TOOLCHAIN_TAR" -C "$FBT_TOOLCHAIN_PATH/toolchain" 2>&1 | fbtenv_show_unpack_percentage;
  116. mkdir -p "$FBT_TOOLCHAIN_PATH/toolchain" || return 1;
  117. mv "$FBT_TOOLCHAIN_PATH/toolchain/$TOOLCHAIN_DIR" "$TOOLCHAIN_ARCH_DIR" || return 1;
  118. echo "done";
  119. return 0;
  120. }
  121. fbtenv_clearing()
  122. {
  123. printf "Clearing..";
  124. rm -rf "${FBT_TOOLCHAIN_PATH:?}/toolchain/$TOOLCHAIN_TAR";
  125. echo "done";
  126. return 0;
  127. }
  128. fbtenv_curl_wget_check()
  129. {
  130. printf "Checking curl..";
  131. if ! curl --version > /dev/null 2>&1; then
  132. echo "no";
  133. printf "Checking wget..";
  134. if ! wget --version > /dev/null 2>&1; then
  135. echo "no";
  136. echo "No curl or wget found in your PATH";
  137. echo "Please provide it or download this file:";
  138. echo;
  139. echo "$TOOLCHAIN_URL";
  140. echo;
  141. echo "And place in $FBT_TOOLCHAIN_PATH/toolchain/ dir mannualy";
  142. return 1;
  143. fi
  144. echo "yes"
  145. DOWNLOADER="wget";
  146. DOWNLOADER_ARGS="--show-progress --progress=bar:force -qO";
  147. return 0;
  148. fi
  149. echo "yes"
  150. DOWNLOADER="curl";
  151. DOWNLOADER_ARGS="--progress-bar -SLo";
  152. return 0;
  153. }
  154. fbtenv_check_download_toolchain()
  155. {
  156. if [ ! -d "$TOOLCHAIN_ARCH_DIR" ]; then
  157. fbtenv_download_toolchain || return 1;
  158. elif [ ! -f "$TOOLCHAIN_ARCH_DIR/VERSION" ]; then
  159. fbtenv_download_toolchain || return 1;
  160. elif [ "$(cat "$TOOLCHAIN_ARCH_DIR/VERSION")" -ne "$FBT_TOOLCHAIN_VERSION" ]; then
  161. fbtenv_download_toolchain || return 1;
  162. fi
  163. return 0;
  164. }
  165. fbtenv_download_toolchain()
  166. {
  167. fbtenv_check_tar || return 1;
  168. TOOLCHAIN_TAR="$(basename "$TOOLCHAIN_URL")";
  169. TOOLCHAIN_DIR="$(echo "$TOOLCHAIN_TAR" | sed "s/-$FBT_TOOLCHAIN_VERSION.tar.gz//g")";
  170. if ! fbtenv_check_downloaded_toolchain; then
  171. fbtenv_curl_wget_check || return 1;
  172. fbtenv_download_toolchain_tar;
  173. fi
  174. fbtenv_remove_old_tooclhain;
  175. fbtenv_unpack_toolchain || { fbtenv_clearing && return 1; };
  176. fbtenv_clearing;
  177. return 0;
  178. }
  179. fbtenv_main()
  180. {
  181. fbtenv_check_sourced || return 1;
  182. fbtenv_check_script_path || return 1;
  183. fbtenv_get_kernel_type || return 1;
  184. fbtenv_check_download_toolchain || return 1;
  185. PS1="[FBT]${PS1-}";
  186. PATH="$TOOLCHAIN_ARCH_DIR/python/bin:$PATH";
  187. PATH="$TOOLCHAIN_ARCH_DIR/bin:$PATH";
  188. PATH="$TOOLCHAIN_ARCH_DIR/protobuf/bin:$PATH";
  189. PATH="$TOOLCHAIN_ARCH_DIR/openocd/bin:$PATH";
  190. }
  191. fbtenv_main;