Statistics
| Branch: | Tag: | Revision:

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