install-arduino-ide.sh 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #!/bin/bash
  2. #OSTYPE: 'linux-gnu', ARCH: 'x86_64' => linux64
  3. #OSTYPE: 'msys', ARCH: 'x86_64' => win32
  4. #OSTYPE: 'darwin18', ARCH: 'i386' => macos
  5. OSBITS=`arch`
  6. if [[ "$OSTYPE" == "linux"* ]]; then
  7. export OS_IS_LINUX="1"
  8. ARCHIVE_FORMAT="tar.xz"
  9. if [[ "$OSBITS" == "i686" ]]; then
  10. OS_NAME="linux32"
  11. elif [[ "$OSBITS" == "x86_64" ]]; then
  12. OS_NAME="linux64"
  13. elif [[ "$OSBITS" == "armv7l" || "$OSBITS" == "aarch64" ]]; then
  14. OS_NAME="linuxarm"
  15. else
  16. OS_NAME="$OSTYPE-$OSBITS"
  17. echo "Unknown OS '$OS_NAME'"
  18. exit 1
  19. fi
  20. elif [[ "$OSTYPE" == "darwin"* ]]; then
  21. export OS_IS_MACOS="1"
  22. ARCHIVE_FORMAT="zip"
  23. OS_NAME="macosx"
  24. elif [[ "$OSTYPE" == "cygwin" ]] || [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "win32" ]]; then
  25. export OS_IS_WINDOWS="1"
  26. ARCHIVE_FORMAT="zip"
  27. OS_NAME="windows"
  28. else
  29. OS_NAME="$OSTYPE-$OSBITS"
  30. echo "Unknown OS '$OS_NAME'"
  31. exit 1
  32. fi
  33. export OS_NAME
  34. ARDUINO_BUILD_DIR="$HOME/.arduino/build.tmp"
  35. ARDUINO_CACHE_DIR="$HOME/.arduino/cache.tmp"
  36. if [ "$OS_IS_MACOS" == "1" ]; then
  37. export ARDUINO_IDE_PATH="/Applications/Arduino.app/Contents/Java"
  38. export ARDUINO_USR_PATH="$HOME/Documents/Arduino"
  39. elif [ "$OS_IS_WINDOWS" == "1" ]; then
  40. export ARDUINO_IDE_PATH="$HOME/arduino_ide"
  41. export ARDUINO_USR_PATH="$HOME/Documents/Arduino"
  42. else
  43. export ARDUINO_IDE_PATH="$HOME/arduino_ide"
  44. export ARDUINO_USR_PATH="$HOME/Arduino"
  45. fi
  46. if [ ! -d "$ARDUINO_IDE_PATH" ]; then
  47. echo "Installing Arduino IDE on $OS_NAME ..."
  48. echo "Downloading 'arduino-nightly-$OS_NAME.$ARCHIVE_FORMAT' to 'arduino.$ARCHIVE_FORMAT' ..."
  49. if [ "$OS_IS_LINUX" == "1" ]; then
  50. wget -O "arduino.$ARCHIVE_FORMAT" "https://www.arduino.cc/download.php?f=/arduino-nightly-$OS_NAME.$ARCHIVE_FORMAT" > /dev/null 2>&1
  51. echo "Extracting 'arduino.$ARCHIVE_FORMAT' ..."
  52. tar xf "arduino.$ARCHIVE_FORMAT" > /dev/null
  53. mv arduino-nightly "$ARDUINO_IDE_PATH"
  54. else
  55. curl -o "arduino.$ARCHIVE_FORMAT" -L "https://www.arduino.cc/download.php?f=/arduino-nightly-$OS_NAME.$ARCHIVE_FORMAT" > /dev/null 2>&1
  56. echo "Extracting 'arduino.$ARCHIVE_FORMAT' ..."
  57. unzip "arduino.$ARCHIVE_FORMAT" > /dev/null
  58. if [ "$OS_IS_MACOS" == "1" ]; then
  59. mv "Arduino.app" "/Applications/Arduino.app"
  60. else
  61. mv arduino-nightly "$ARDUINO_IDE_PATH"
  62. fi
  63. fi
  64. rm -rf "arduino.$ARCHIVE_FORMAT"
  65. mkdir -p "$ARDUINO_USR_PATH/libraries"
  66. mkdir -p "$ARDUINO_USR_PATH/hardware"
  67. echo "Arduino IDE Installed in '$ARDUINO_IDE_PATH'"
  68. echo ""
  69. fi
  70. function build_sketch(){ # build_sketch <fqbn> <path-to-ino> <build-flags> [extra-options]
  71. if [ "$#" -lt 2 ]; then
  72. echo "ERROR: Illegal number of parameters"
  73. echo "USAGE: build_sketch <fqbn> <path-to-ino> <build-flags> [extra-options]"
  74. return 1
  75. fi
  76. local fqbn="$1"
  77. local sketch="$2"
  78. local build_flags="$3"
  79. local xtra_opts="$4"
  80. local win_opts=""
  81. if [ "$OS_IS_WINDOWS" == "1" ]; then
  82. local ctags_version=`ls "$ARDUINO_IDE_PATH/tools-builder/ctags/"`
  83. local preprocessor_version=`ls "$ARDUINO_IDE_PATH/tools-builder/arduino-preprocessor/"`
  84. win_opts="-prefs=runtime.tools.ctags.path=$ARDUINO_IDE_PATH/tools-builder/ctags/$ctags_version -prefs=runtime.tools.arduino-preprocessor.path=$ARDUINO_IDE_PATH/tools-builder/arduino-preprocessor/$preprocessor_version"
  85. fi
  86. echo ""
  87. echo "Compiling '"$(basename "$sketch")"' ..."
  88. mkdir -p "$ARDUINO_BUILD_DIR"
  89. mkdir -p "$ARDUINO_CACHE_DIR"
  90. $ARDUINO_IDE_PATH/arduino-builder -compile -logger=human -core-api-version=10810 \
  91. -fqbn=$fqbn \
  92. -warnings="all" \
  93. -tools "$ARDUINO_IDE_PATH/tools-builder" \
  94. -tools "$ARDUINO_IDE_PATH/tools" \
  95. -built-in-libraries "$ARDUINO_IDE_PATH/libraries" \
  96. -hardware "$ARDUINO_IDE_PATH/hardware" \
  97. -hardware "$ARDUINO_USR_PATH/hardware" \
  98. -libraries "$ARDUINO_USR_PATH/libraries" \
  99. -build-cache "$ARDUINO_CACHE_DIR" \
  100. -build-path "$ARDUINO_BUILD_DIR" \
  101. -prefs=compiler.cpp.extra_flags="$build_flags" \
  102. $win_opts $xtra_opts "$sketch"
  103. }
  104. function count_sketches() # count_sketches <examples-path>
  105. {
  106. local examples="$1"
  107. rm -rf sketches.txt
  108. if [ ! -d "$examples" ]; then
  109. touch sketches.txt
  110. return 0
  111. fi
  112. local sketches=$(find $examples -name *.ino)
  113. local sketchnum=0
  114. for sketch in $sketches; do
  115. local sketchdir=$(dirname $sketch)
  116. local sketchdirname=$(basename $sketchdir)
  117. local sketchname=$(basename $sketch)
  118. if [[ "${sketchdirname}.ino" != "$sketchname" ]]; then
  119. continue
  120. fi;
  121. if [[ -f "$sketchdir/.test.skip" ]]; then
  122. continue
  123. fi
  124. echo $sketch >> sketches.txt
  125. sketchnum=$(($sketchnum + 1))
  126. done
  127. return $sketchnum
  128. }
  129. function build_sketches() # build_sketches <fqbn> <examples-path> <chunk> <total-chunks> [extra-options]
  130. {
  131. local fqbn=$1
  132. local examples=$2
  133. local chunk_idex=$3
  134. local chunks_num=$4
  135. local xtra_opts=$5
  136. if [ "$#" -lt 2 ]; then
  137. echo "ERROR: Illegal number of parameters"
  138. echo "USAGE: build_sketches <fqbn> <examples-path> [<chunk> <total-chunks>] [extra-options]"
  139. return 1
  140. fi
  141. if [ "$#" -lt 4 ]; then
  142. chunk_idex="0"
  143. chunks_num="1"
  144. xtra_opts=$3
  145. fi
  146. if [ "$chunks_num" -le 0 ]; then
  147. echo "ERROR: Chunks count must be positive number"
  148. return 1
  149. fi
  150. if [ "$chunk_idex" -ge "$chunks_num" ]; then
  151. echo "ERROR: Chunk index must be less than chunks count"
  152. return 1
  153. fi
  154. set +e
  155. count_sketches "$examples"
  156. local sketchcount=$?
  157. set -e
  158. local sketches=$(cat sketches.txt)
  159. rm -rf sketches.txt
  160. local chunk_size=$(( $sketchcount / $chunks_num ))
  161. local all_chunks=$(( $chunks_num * $chunk_size ))
  162. if [ "$all_chunks" -lt "$sketchcount" ]; then
  163. chunk_size=$(( $chunk_size + 1 ))
  164. fi
  165. local start_index=$(( $chunk_idex * $chunk_size ))
  166. if [ "$sketchcount" -le "$start_index" ]; then
  167. echo "Skipping job"
  168. return 0
  169. fi
  170. local end_index=$(( $(( $chunk_idex + 1 )) * $chunk_size ))
  171. if [ "$end_index" -gt "$sketchcount" ]; then
  172. end_index=$sketchcount
  173. fi
  174. local start_num=$(( $start_index + 1 ))
  175. echo "Found $sketchcount Sketches";
  176. echo "Chunk Count : $chunks_num"
  177. echo "Chunk Size : $chunk_size"
  178. echo "Start Sketch: $start_num"
  179. echo "End Sketch : $end_index"
  180. local sketchnum=0
  181. for sketch in $sketches; do
  182. local sketchdir=$(dirname $sketch)
  183. local sketchdirname=$(basename $sketchdir)
  184. local sketchname=$(basename $sketch)
  185. if [ "${sketchdirname}.ino" != "$sketchname" ] \
  186. || [ -f "$sketchdir/.test.skip" ]; then
  187. continue
  188. fi
  189. sketchnum=$(($sketchnum + 1))
  190. if [ "$sketchnum" -le "$start_index" ] \
  191. || [ "$sketchnum" -gt "$end_index" ]; then
  192. continue
  193. fi
  194. local sketchBuildFlags=""
  195. if [ -f "$sketchdir/.test.build_flags" ]; then
  196. while read line; do
  197. sketchBuildFlags="$sketchBuildFlags $line"
  198. done < "$sketchdir/.test.build_flags"
  199. fi
  200. build_sketch "$fqbn" "$sketch" "$sketchBuildFlags" "$xtra_opts"
  201. local result=$?
  202. if [ $result -ne 0 ]; then
  203. return $result
  204. fi
  205. done
  206. return 0
  207. }