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