Subversion Repositories ESP8266_P1_Meter

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
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
}