amiro-blt / ide / QtCreator / QtCreatorSetup.sh @ 6feb961b
History | View | Annotate | Download (19.175 KB)
1 |
################################################################################ |
---|---|
2 |
# AMiRo-OS is an operating system designed for the Autonomous Mini Robot # |
3 |
# (AMiRo) platform. # |
4 |
# Copyright (C) 2016..2017 Thomas Schöpping et al. # |
5 |
# # |
6 |
# This program is free software: you can redistribute it and/or modify # |
7 |
# it under the terms of the GNU General Public License as published by # |
8 |
# the Free Software Foundation, either version 3 of the License, or # |
9 |
# (at your option) any later version. # |
10 |
# # |
11 |
# This program is distributed in the hope that it will be useful, # |
12 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of # |
13 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # |
14 |
# GNU General Public License for more details. # |
15 |
# # |
16 |
# You should have received a copy of the GNU General Public License # |
17 |
# along with this program. If not, see <http://www.gnu.org/licenses/>. # |
18 |
# # |
19 |
# This research/work was supported by the Cluster of Excellence Cognitive # |
20 |
# Interaction Technology 'CITEC' (EXC 277) at Bielefeld University, which is # |
21 |
# funded by the German Research Foundation (DFG). # |
22 |
################################################################################ |
23 |
|
24 |
#!/bin/bash |
25 |
|
26 |
################################################################################ |
27 |
### HELPER FUNCTIONS ### |
28 |
################################################################################ |
29 |
|
30 |
#------------------------------------------------------------------------------- |
31 |
# toAbsolutePath $1 [$2] |
32 |
# |
33 |
# Makes a given path absolute and either echos the result or stores it in the |
34 |
# specified variable. |
35 |
# arguments: |
36 |
# $1: the path to be converted |
37 |
# $2: a variable to store the resulting path [optiional] |
38 |
function toAbsolutePath { |
39 |
# the path that shall be converted if required |
40 |
TARGET_PATH=$1 |
41 |
|
42 |
# store the path where the script was called from |
43 |
ORIGIN_PATH="${PWD}/" |
44 |
|
45 |
# check, whether the target is a directory or not |
46 |
if [ -d $TARGET_PATH ]; then |
47 |
cd $TARGET_PATH |
48 |
# special case: the target is the root directory |
49 |
if [ $TARGET_PATH = "/" ]; then |
50 |
ABSOLUTE_PATH="${PWD}" |
51 |
else |
52 |
ABSOLUTE_PATH="${PWD}/" |
53 |
fi |
54 |
else |
55 |
cd $(dirname $TARGET_PATH) |
56 |
ABSOLUTE_PATH="${PWD}/$(basename $TARGET_PATH)" |
57 |
fi |
58 |
cd $ORIGIN_PATH |
59 |
|
60 |
# return the result |
61 |
if [ $# -gt 1 ]; then |
62 |
eval $2="$ABSOLUTE_PATH" |
63 |
else |
64 |
echo $ABSOLUTE_PATH |
65 |
fi |
66 |
|
67 |
# cleanup |
68 |
unset TARGET_PATH |
69 |
unset ORIGIN_PATH |
70 |
unset ABSOLUTE_PATH |
71 |
} |
72 |
#------------------------------------------------------------------------------- |
73 |
|
74 |
#------------------------------------------------------------------------------- |
75 |
# getRelativePath $1 $2 [$3] |
76 |
# |
77 |
# Computes the relative path from one to another location. |
78 |
# The result is then either stored in a specified variable, or just echoed. |
79 |
# arguments: |
80 |
# $1: the path to start from |
81 |
# If this is not a directory, only the path will be used |
82 |
# $2: the target location |
83 |
# $3: a variable to store the resulting path [optional] |
84 |
function getRelativePath { |
85 |
# make start and target location absolute |
86 |
START_PATH=$(toAbsolutePath $1) |
87 |
if [ ! -d $START_PATH ]; then |
88 |
START_PATH="$(dirname $START_PATH)/" |
89 |
fi |
90 |
TARGET_PATH=$(toAbsolutePath $2) |
91 |
|
92 |
# initialize the common prefix and the relative path from START_PATH to TARGET_PATH |
93 |
COMMON_PREFIX=$START_PATH |
94 |
RELATIVE_PATH="./" |
95 |
# while the common prefix is no substring of the target path |
96 |
while [ "${TARGET_PATH#$COMMON_PREFIX}" == "$TARGET_PATH" ]; do |
97 |
read |
98 |
# reduce the common prefix and record the relative path |
99 |
COMMON_PREFIX="$(dirname $COMMON_PREFIX)/" |
100 |
RELATIVE_PATH="../$RELATIVE_PATH" |
101 |
# special case: if only root is the common prefix, remove the just appended '/' |
102 |
if [ $COMMON_PREFIX == "//" ]; then |
103 |
COMMON_PREFIX="/" |
104 |
fi |
105 |
done |
106 |
|
107 |
# if the relative path is more than just the current directory, cut off the trailing './' |
108 |
if [ ! $RELATIVE_PATH == "./" ]; then |
109 |
RELATIVE_PATH=${RELATIVE_PATH::-2} |
110 |
fi |
111 |
|
112 |
# compute the unique part of the target path |
113 |
UNIQUE_POSTFIX=${TARGET_PATH#$COMMON_PREFIX} |
114 |
|
115 |
# append the unique postfix to the relative path |
116 |
RELATIVE_PATH=$RELATIVE_PATH$UNIQUE_POSTFIX |
117 |
|
118 |
# return the result |
119 |
if [ $# -gt 2 ]; then |
120 |
eval $3="$RELATIVE_PATH" |
121 |
else |
122 |
echo $RELATIVE_PATH |
123 |
fi |
124 |
|
125 |
# clean up |
126 |
unset START_PATH |
127 |
unset TARGET_PATH |
128 |
unset COMMON_PREFIX |
129 |
unset RELATIVE_PATH |
130 |
unset UNIQUE_POSTFIX |
131 |
} |
132 |
#------------------------------------------------------------------------------- |
133 |
|
134 |
|
135 |
|
136 |
############################################################################### |
137 |
### INITIALIZATION ### |
138 |
############################################################################### |
139 |
|
140 |
# ignore case when comparing strings |
141 |
shopt -s nocasematch |
142 |
|
143 |
# detect what exactly should be done |
144 |
NOINFO_FLAG="NOINFO" |
145 |
HELP_FLAG="HELP" |
146 |
CLEAN_FLAG="CLEAN" |
147 |
WIPE_FLAG="WIPE" |
148 |
LIGHTRING_FLAG="LR" |
149 |
POWERMANAGEMENT_FLAG="PM" |
150 |
DIWHEELDRIVE_FLAG="DWD" |
151 |
|
152 |
# start with an empty array |
153 |
ARG_LIST=() |
154 |
# try to interpret all given arguments |
155 |
for ARG in "$@"; do |
156 |
case $ARG in |
157 |
"no_info") |
158 |
ARG_LIST+=( "$NOINFO_FLAG" ) |
159 |
;; |
160 |
"help") |
161 |
ARG_LIST+=( "$HELP_FLAG" ) |
162 |
;; |
163 |
"clean") |
164 |
ARG_LIST+=( "$CLEAN_FLAG" ) |
165 |
;; |
166 |
"wipe") |
167 |
ARG_LIST+=( "$WIPE_FLAG" ) |
168 |
;; |
169 |
"all") |
170 |
ARG_LIST+=( "$LIGHTRING_FLAG" "$POWERMANAGEMENT_FLAG" "$DIWHEELDRIVE_FLAG" ) |
171 |
;; |
172 |
"LightRing"|"LR") |
173 |
ARG_LIST+=( "$LIGHTRING_FLAG" ) |
174 |
;; |
175 |
"PowerManagement"|"PM") |
176 |
ARG_LIST+=( "$POWERMANAGEMENT_FLAG" ) |
177 |
;; |
178 |
"DiWheelDrive"|"DWD") |
179 |
ARG_LIST+=( "$DIWHEELDRIVE_FLAG" ) |
180 |
;; |
181 |
esac |
182 |
done |
183 |
|
184 |
# evaluate if a help text shall be printed and which further actions to take |
185 |
PRINT_INFO=true |
186 |
PRINT_HELP=false |
187 |
ACTION_REQUESTED=false |
188 |
for ARG in ${ARG_LIST[@]}; do |
189 |
case $ARG in |
190 |
$NOINFO_FLAG) |
191 |
PRINT_INFO=false |
192 |
;; |
193 |
$HELP_FLAG) |
194 |
PRINT_HELP=true |
195 |
;; |
196 |
$CLEAN_FLAG|$WIPE_FLAG|$LIGHTRING_FLAG|$POWERMANAGEMENT_FLAG|$DIWHEELDRIVE_FLAG) |
197 |
ACTION_REQUESTED=true |
198 |
;; |
199 |
*) |
200 |
PRINT_HELP=true |
201 |
;; |
202 |
esac |
203 |
done |
204 |
|
205 |
# print the info prompt |
206 |
if [[ $PRINT_INFO = true ]]; then |
207 |
|
208 |
############################################################################## |
209 |
### PRINT INFO ### |
210 |
############################################################################## |
211 |
|
212 |
printf "######################################################################\n" |
213 |
printf "# #\n" |
214 |
printf "# Welcome to the AMiRo-BLT QtCreator IDE setup #\n" |
215 |
printf "# #\n" |
216 |
printf "######################################################################\n" |
217 |
printf "# #\n" |
218 |
printf "# Copyright (c) 2016..2017 Thomas Schöpping #\n" |
219 |
printf "# #\n" |
220 |
printf "# This is free software; see the source for copying conditions. #\n" |
221 |
printf "# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR #\n" |
222 |
printf "# A PARTICULAR PURPOSE. The development of this software was #\n" |
223 |
printf "# supported by the Excellence Cluster EXC 227 Cognitive Interaction #\n" |
224 |
printf "# Technology. The Excellence Cluster EXC 227 is a grant of the #\n" |
225 |
printf "# Deutsche Forschungsgemeinschaft (DFG) in the context of the German #\n" |
226 |
printf "# Excellence Initiative. #\n" |
227 |
printf "# #\n" |
228 |
printf "######################################################################\n" |
229 |
printf "\n" |
230 |
fi |
231 |
|
232 |
# print setup header |
233 |
printf "QtCreator projects setup\n" |
234 |
printf "========================\n" |
235 |
printf "\n" |
236 |
|
237 |
# print the help text |
238 |
if [[ ${#ARG_LIST[@]} == 0 || |
239 |
(${#ARG_LIST[@]} == 1 && ${ARG_LIST[0]} == "$NOINFO_FLAG") || |
240 |
$PRINT_HELP = true ]]; then |
241 |
|
242 |
############################################################################## |
243 |
### PRINT HELP ### |
244 |
############################################################################## |
245 |
|
246 |
printf "The following commands are available: \n" |
247 |
printf " \n" |
248 |
printf " help - Prints this help text. \n" |
249 |
printf " clean - Deletes all files created by this script. \n" |
250 |
printf " wipe - Deletes the .user files, created by QtCreator. \n" |
251 |
printf " LightRing - Creates a project for the LightRing module. \n" |
252 |
printf " PowerManagement - Creates a project for the PowerManagement module. \n" |
253 |
printf " DiWheelDrive - Creates a project for the DiWheelDrive module. \n" |
254 |
printf " all - Creates all three projects. \n" |
255 |
printf " \n" |
256 |
printf "Any of these commands can be combined, e.g. \n" |
257 |
printf " $> ./setup.sh PowerManagement DiWheelDrive \n" |
258 |
printf "will create two projects. \n" |
259 |
printf "\n" |
260 |
printf "Note that this script does not create a project for the SerialBoot \n" |
261 |
printf "application. Since it uses CMAKE, QtCreator can import it directly. \n" |
262 |
|
263 |
fi |
264 |
|
265 |
# execute action |
266 |
if [ $ACTION_REQUESTED = true ]; then |
267 |
|
268 |
############################################################################## |
269 |
### CONFIGURATION ### |
270 |
############################################################################## |
271 |
|
272 |
# the current user dir |
273 |
USER_DIR="${PWD}/" |
274 |
|
275 |
# the directory containing this script file |
276 |
toAbsolutePath $(dirname ${BASH_SOURCE[0]}) SCRIPT_DIR |
277 |
|
278 |
# the root directory of the project |
279 |
toAbsolutePath ${SCRIPT_DIR}../.. PROJECT_ROOT_PATH |
280 |
|
281 |
# the relative path where all project files shall be generated |
282 |
read -p "path where to create/delete the project files: " -i "$PROJECT_ROOT_PATH" -e QTCREATOR_FILES_PATH |
283 |
toAbsolutePath $QTCREATOR_FILES_PATH QTCREATOR_FILES_PATH |
284 |
|
285 |
# the include path for GCC specific headers |
286 |
ARM_NONE_EABI_GCC_BIN=$(which arm-none-eabi-gcc) |
287 |
while [ -L $ARM_NONE_EABI_GCC_BIN ]; do |
288 |
ARM_NONE_EABI_GCC_BIN=$(readlink $ARM_NONE_EABI_GCC_BIN) |
289 |
done |
290 |
toAbsolutePath "$(dirname $ARM_NONE_EABI_GCC_BIN)/../arm-none-eabi/include/" ARM_NONE_EABI_GCC_INCLUDE_PATH |
291 |
|
292 |
# a common path for all projects |
293 |
COMMON_SOURCE_INCLUDE_PATH=${PROJECT_ROOT_PATH}Target/Source |
294 |
|
295 |
# the paths to the individual projects |
296 |
POWERMANAGEMENT_PROJECT_ROOT_PATH=${PROJECT_ROOT_PATH}Target/Demo/ARMCM4_STM32F405_Power_Management_GCC/Boot |
297 |
DIWHEELDRIVE_PROJECT_ROOT_PATH=${PROJECT_ROOT_PATH}Target/Demo/ARMCM3_STM32F103_DiWheelDrive_GCC/Boot |
298 |
LIGHTRING_PROJECT_ROOT_PATH=${PROJECT_ROOT_PATH}Target/Demo/ARMCM3_STM32F103_LightRing_GCC/Boot |
299 |
|
300 |
# the prefix names for the projects to be generated |
301 |
LIGHTRING_PROJECT_PREFIX="LightRing" |
302 |
POWERMANAGEMENT_PROJECT_PREFIX="PowerManagement" |
303 |
DIWHEELDRIVE_PROJECT_PREFIX="DiWheelDrive" |
304 |
|
305 |
printf "\n" |
306 |
|
307 |
############################################################################## |
308 |
### SETUP ### |
309 |
############################################################################## |
310 |
|
311 |
# move to the project root directory |
312 |
cd $QTCREATOR_FILES_PATH |
313 |
|
314 |
for ARG in ${ARG_LIST[@]}; do |
315 |
case $ARG in |
316 |
|
317 |
########################################################################## |
318 |
### CLEAN STEP ### |
319 |
########################################################################## |
320 |
|
321 |
$CLEAN_FLAG) |
322 |
printf "removing project files..." |
323 |
|
324 |
# remove all files |
325 |
rm ${LIGHTRING_PROJECT_PREFIX}.includes 2> /dev/null |
326 |
rm ${LIGHTRING_PROJECT_PREFIX}.files 2> /dev/null |
327 |
rm ${LIGHTRING_PROJECT_PREFIX}.config 2> /dev/null |
328 |
rm ${LIGHTRING_PROJECT_PREFIX}.creator 2> /dev/null |
329 |
|
330 |
rm ${POWERMANAGEMENT_PROJECT_PREFIX}.includes 2> /dev/null |
331 |
rm ${POWERMANAGEMENT_PROJECT_PREFIX}.files 2> /dev/null |
332 |
rm ${POWERMANAGEMENT_PROJECT_PREFIX}.config 2> /dev/null |
333 |
rm ${POWERMANAGEMENT_PROJECT_PREFIX}.creator 2> /dev/null |
334 |
|
335 |
rm ${DIWHEELDRIVE_PROJECT_PREFIX}.includes 2> /dev/null |
336 |
rm ${DIWHEELDRIVE_PROJECT_PREFIX}.files 2> /dev/null |
337 |
rm ${DIWHEELDRIVE_PROJECT_PREFIX}.config 2> /dev/null |
338 |
rm ${DIWHEELDRIVE_PROJECT_PREFIX}.creator 2> /dev/null |
339 |
|
340 |
printf "\tdone\n" |
341 |
;; |
342 |
|
343 |
########################################################################## |
344 |
### WIPE STEP ### |
345 |
########################################################################## |
346 |
|
347 |
$WIPE_FLAG) |
348 |
printf "removing .user project files..." |
349 |
|
350 |
# remove all user files |
351 |
rm ${POWERMANAGEMENT_PROJECT_PREFIX}.creator.user 2> /dev/null |
352 |
rm ${DIWHEELDRIVE_PROJECT_PREFIX}.creator.user 2> /dev/null |
353 |
rm ${LIGHTRING_PROJECT_PREFIX}.creator.user 2> /dev/null |
354 |
|
355 |
printf "\tdone\n" |
356 |
;; |
357 |
|
358 |
########################################################################## |
359 |
### LIGHTRING SETUP ### |
360 |
########################################################################## |
361 |
|
362 |
$LIGHTRING_FLAG) |
363 |
printf "creating project files for ${LIGHTRING_PROJECT_PREFIX} (STM32F103RET6)..." |
364 |
|
365 |
# generate a file that contains all subdirectories as includes (but ignore hidden and documentation directories) |
366 |
find $ARM_NONE_EABI_GCC_INCLUDE_PATH -type d > ${LIGHTRING_PROJECT_PREFIX}.includes |
367 |
find $COMMON_SOURCE_INCLUDE_PATH -type d | grep -v "ARMCM4_STM32" >> ${LIGHTRING_PROJECT_PREFIX}.includes |
368 |
find $LIGHTRING_PROJECT_ROOT_PATH -type d | grep -v "uip\|fatfs\|ethernetlib\|cmd\|ide" >> ${LIGHTRING_PROJECT_PREFIX}.includes |
369 |
|
370 |
# generate a file that specifies all files |
371 |
echo -n "" > ${LIGHTRING_PROJECT_PREFIX}.files |
372 |
for path in `cat ${LIGHTRING_PROJECT_PREFIX}.includes`; do |
373 |
find $path -maxdepth 1 -type f \( ! -iname ".*" \) | grep -v "/arm-none-eabi/" | grep -E ".*(\.h|\.c|\.x)$" >> ${LIGHTRING_PROJECT_PREFIX}.files |
374 |
done |
375 |
|
376 |
# generate a default project configuration file if none exists so far |
377 |
if [ ! -f ${LIGHTRING_PROJECT_PREFIX}.config ]; then |
378 |
echo -e "// Add predefined macros for your project here. For example:\n// #define YOUR_CONFIGURATION belongs here\n" > ${LIGHTRING_PROJECT_PREFIX}.config |
379 |
fi |
380 |
|
381 |
# generate a default .creator file if none exists so far |
382 |
if [ ! -f ${LIGHTRING_PROJECT_PREFIX}.creator ]; then |
383 |
echo -e "[general]\n" > ${LIGHTRING_PROJECT_PREFIX}.creator |
384 |
fi |
385 |
|
386 |
printf "\tdone\n" |
387 |
;; |
388 |
|
389 |
########################################################################## |
390 |
### POWERMANAGEMENT SETUP ### |
391 |
########################################################################## |
392 |
|
393 |
$POWERMANAGEMENT_FLAG) |
394 |
printf "creating project files for ${POWERMANAGEMENT_PROJECT_PREFIX} (STM32F405RGT6)..." |
395 |
|
396 |
# generate a file that contains all subdirectories as includes (but ignore hidden and documentation directories) |
397 |
find $ARM_NONE_EABI_GCC_INCLUDE_PATH -type d > ${POWERMANAGEMENT_PROJECT_PREFIX}.includes |
398 |
find $COMMON_SOURCE_INCLUDE_PATH -type d | grep -v "ARMCM3_STM32" >> ${POWERMANAGEMENT_PROJECT_PREFIX}.includes |
399 |
find $POWERMANAGEMENT_PROJECT_ROOT_PATH -type d | grep -v "uip\|fatfs\|ethernetlib\|cmd\|ide" >> ${POWERMANAGEMENT_PROJECT_PREFIX}.includes |
400 |
|
401 |
# generate a file that specifies all files |
402 |
echo -n "" > ${POWERMANAGEMENT_PROJECT_PREFIX}.files |
403 |
for path in `cat ${POWERMANAGEMENT_PROJECT_PREFIX}.includes`; do |
404 |
find $path -maxdepth 1 -type f \( ! -iname ".*" \) | grep -v "/arm-none-eabi/" | grep -E ".*(\.h|\.c|\.x)$" >> ${POWERMANAGEMENT_PROJECT_PREFIX}.files |
405 |
done |
406 |
|
407 |
# generate a default project configuration file if none exists so far |
408 |
if [ ! -f ${POWERMANAGEMENT_PROJECT_PREFIX}.config ]; then |
409 |
echo -e "// Add predefined macros for your project here. For example:\n// #define YOUR_CONFIGURATION belongs here\n" > ${POWERMANAGEMENT_PROJECT_PREFIX}.config |
410 |
fi |
411 |
|
412 |
# generate a default .creator file if none exists so far |
413 |
if [ ! -f ${POWERMANAGEMENT_PROJECT_PREFIX}.creator ]; then |
414 |
echo -e "[general]\n" > ${POWERMANAGEMENT_PROJECT_PREFIX}.creator |
415 |
fi |
416 |
|
417 |
printf "\tdone\n" |
418 |
;; |
419 |
|
420 |
########################################################################## |
421 |
### DIWHEELDRIVE SETUP ### |
422 |
########################################################################## |
423 |
|
424 |
$DIWHEELDRIVE_FLAG) |
425 |
printf "creating project files for ${DIWHEELDRIVE_PROJECT_PREFIX} (STM32F103RET6)..." |
426 |
|
427 |
# generate a file that contains all subdirectories as includes (but ignore hidden and documentation directories) |
428 |
find $ARM_NONE_EABI_GCC_INCLUDE_PATH -type d > ${DIWHEELDRIVE_PROJECT_PREFIX}.includes |
429 |
find $COMMON_SOURCE_INCLUDE_PATH -type d | grep -v "ARMCM4_STM32" >> ${DIWHEELDRIVE_PROJECT_PREFIX}.includes |
430 |
find $DIWHEELDRIVE_PROJECT_ROOT_PATH -type d | grep -v "uip\|fatfs\|ethernetlib\|cmd\|ide" >> ${DIWHEELDRIVE_PROJECT_PREFIX}.includes |
431 |
|
432 |
# generate a file that specifies all files |
433 |
echo -n "" > ${DIWHEELDRIVE_PROJECT_PREFIX}.files |
434 |
for path in `cat ${DIWHEELDRIVE_PROJECT_PREFIX}.includes`; do |
435 |
find $path -maxdepth 1 -type f \( ! -iname ".*" \) | grep -v "/arm-none-eabi/" | grep -E ".*(\.h|\.c|\.x)$" >> ${DIWHEELDRIVE_PROJECT_PREFIX}.files |
436 |
done |
437 |
|
438 |
# generate a default project configuration file if none exists so far |
439 |
if [ ! -f ${DIWHEELDRIVE_PROJECT_PREFIX}.config ]; then |
440 |
echo -e "// Add predefined macros for your project here. For example:\n// #define YOUR_CONFIGURATION belongs here\n" > ${DIWHEELDRIVE_PROJECT_PREFIX}.config |
441 |
fi |
442 |
|
443 |
# generate a default .creator file if none exists so far |
444 |
if [ ! -f ${DIWHEELDRIVE_PROJECT_PREFIX}.creator ]; then |
445 |
echo -e "[general]\n" > ${DIWHEELDRIVE_PROJECT_PREFIX}.creator |
446 |
fi |
447 |
|
448 |
printf "\tdone\n" |
449 |
;; |
450 |
|
451 |
esac |
452 |
done |
453 |
fi |
454 |
|
455 |
################################################################################ |
456 |
### OUTRO ### |
457 |
################################################################################ |
458 |
|