Revision cacd990c tools/ide/QtCreator/QtCreatorSetup.sh
tools/ide/QtCreator/QtCreatorSetup.sh | ||
---|---|---|
62 | 62 |
# |
63 | 63 |
function printHelp { |
64 | 64 |
printInfo "printing help text\n" |
65 |
printf "usage: $(basename ${BASH_SOURCE[0]}) [-h|--help] [--module=<module>] [-a|--all] [-c|--clean] [-w|--wipe] [-q|--quit] [--log=<file>]\n" |
|
65 |
printf "usage: $(basename ${BASH_SOURCE[0]}) [-h|--help] [-m|--module=<module>] [-a|--all] [-c|--clean] [-w|--wipe] [-q|--quit] [--log=<file>]\n"
|
|
66 | 66 |
printf "\n" |
67 | 67 |
printf "options: -h, --help\n" |
68 | 68 |
printf " Print this help text.\n" |
69 |
printf " --module=<module>\n"
|
|
69 |
printf " -m, --module <module>\n"
|
|
70 | 70 |
printf " Create project for a single module.\n" |
71 | 71 |
printf " -a, --all\n" |
72 | 72 |
printf " Create projects for all modules.\n" |
... | ... | |
108 | 108 |
# -1 |
109 | 109 |
# Error: Command 'arm-none-eabi-gcc' not found. |
110 | 110 |
# -2 |
111 |
# Error: include directory could not be resolved |
|
111 |
# Error: include directory could not be resolved.
|
|
112 | 112 |
# |
113 | 113 |
function retrieveGccIncludeDir { |
114 | 114 |
# retrieve binary path or link |
... | ... | |
325 | 325 |
fi |
326 | 326 |
|
327 | 327 |
# change to project directory |
328 |
local amiroosrootdir=$(realpath $(dirname ${BASH_SOURCE[0]})/../../..) |
|
329 | 328 |
cd "$projectdir" |
330 | 329 |
|
331 | 330 |
# run make, but only run the GCC preprocessor and produce no binaries |
332 | 331 |
local sourcefiles=() |
333 | 332 |
local sourcefile="" |
334 |
local parse_state="WAIT_FOR_INCLUDE_OR_COMPILE" |
|
333 |
local parse_state="WAIT_FOR_INCLUDE_COMPILE_MAKE" |
|
334 |
local makedirs=() |
|
335 | 335 |
# capture all output from make and GCC and append the return value of make as last line |
336 | 336 |
printInfo "processing project (this may take a while)...\n" |
337 |
local rawout=$(make --directory ${amiroosrootdir}/modules/${module} --always-make USE_OPT="-v -E -H" USE_VERBOSE_COMPILE="no" OUTFILES="" 2>&1 && echo $?)
|
|
337 |
local rawout=$(make --directory ${modulesdir}/${module} --always-make USE_OPT="-v -E -H" USE_VERBOSE_COMPILE="no" OUTFILES="" 2>&1 && echo $?)
|
|
338 | 338 |
# check whether the make call was successfull |
339 | 339 |
if [[ $(echo "${rawout}" | tail -n 1) != "0" ]]; then |
340 | 340 |
printError "executing 'make' in module directory failed\n" |
... | ... | |
342 | 342 |
return -3 |
343 | 343 |
else |
344 | 344 |
# cleanup |
345 |
make --directory ${amiroosrootdir}/modules/${module} clean &>/dev/null
|
|
345 |
make --directory ${modulesdir}/${module} clean &>/dev/null
|
|
346 | 346 |
fi |
347 | 347 |
# extract file names from raw output |
348 | 348 |
IFS=$'\n'; rawout=($rawout); unset IFS |
349 | 349 |
for line in "${rawout[@]}"; do |
350 | 350 |
case $parse_state in |
351 |
WAIT_FOR_INCLUDE_OR_COMPILE)
|
|
352 |
# lines stating included files look like:
|
|
351 |
WAIT_FOR_INCLUDE_COMPILE_MAKE)
|
|
352 |
# lines stating include files look like: |
|
353 | 353 |
# ... <../relative/path/to/file> |
354 | 354 |
if [[ "$line" =~ ^\.+[[:blank:]].+\..+$ ]]; then |
355 | 355 |
sourcefile=${line##* } |
356 | 356 |
if [[ ! "$sourcefile" =~ ^/ ]]; then |
357 |
sourcefile=$(realpath ${amiroosrootdir}/modules/${module}/${sourcefile})
|
|
357 |
sourcefile=$(realpath ${makedirs[-1]}/${sourcefile})
|
|
358 | 358 |
fi |
359 | 359 |
sourcefiles[${#sourcefiles[@]}]="$sourcefile" |
360 | 360 |
# whenever the next source file is processed, a message appears like: |
361 |
# Compining <filnemame>
|
|
361 |
# Compiling <filename>
|
|
362 | 362 |
elif [[ "$line" =~ ^Compiling[[:blank:]](.+\..+)$ ]]; then |
363 | 363 |
printf "." |
364 | 364 |
sourcefile=${BASH_REMATCH[1]} |
365 | 365 |
parse_state="WAIT_FOR_COMPILERCALL" |
366 |
# if make is called again in another directory, a message appears like: |
|
367 |
# make[1]: Entering directory 'directory' |
|
368 |
elif [[ "$line" =~ ^make(\[[0-9]+\])?:\ Entering\ directory\ \'.+\'$ ]]; then |
|
369 |
makedirs+=($(echo "$line" | (cut -d "'" -f 2))) |
|
370 |
# if make is leaving a directory, a message appears like: |
|
371 |
# make[1]: Leaving directory 'directory' |
|
372 |
elif [[ "$line" =~ ^make(\[[0-9]+\])?:\ Leaving\ directory\ \'.+\'$ ]]; then |
|
373 |
unset makedirs[-1] |
|
366 | 374 |
fi;; |
367 | 375 |
WAIT_FOR_COMPILERCALL) |
368 | 376 |
# wait for the actual call of the compiler to retrieve the full path to the source file |
369 | 377 |
if [[ "$line" == *${sourcefile}* ]]; then |
370 | 378 |
line="${line%%${sourcefile}*}${sourcefile}" |
371 |
sourcefile=$(realpath ${amiroosrootdir}/modules/${module}/${line##* }) |
|
379 |
line="${line##* }" |
|
380 |
if [[ "$line" =~ ^/ ]]; then |
|
381 |
# aboslute path |
|
382 |
sourcefile=$line |
|
383 |
else |
|
384 |
# relative path |
|
385 |
sourcefile=$(realpath ${makedirs[-1]}/${line##* }) |
|
386 |
fi |
|
372 | 387 |
sourcefiles[${#sourcefiles[@]}]="$sourcefile" |
373 |
parse_state="WAIT_FOR_INCLUDE_OR_COMPILE"
|
|
388 |
parse_state="WAIT_FOR_INCLUDE_COMPILE_MAKE"
|
|
374 | 389 |
fi;; |
375 | 390 |
esac |
376 | 391 |
done |
... | ... | |
387 | 402 |
# sort and remove duplicates |
388 | 403 |
IFS=$'\n'; includes=($(sort --unique <<< "${includes[*]}")); unset IFS |
389 | 404 |
|
390 |
# generate the .files file, containing all source files
|
|
405 |
# generate the .incldues file, containing all include paths
|
|
391 | 406 |
echo "" > ${projectdir}/${module}.includes |
392 | 407 |
for inc in ${includes[*]}; do |
393 | 408 |
echo "$inc" >> ${projectdir}/${module}.includes |
394 | 409 |
done |
395 |
# generate the .incldues file, containing all include paths
|
|
410 |
# generate the .files file, containing all source files
|
|
396 | 411 |
echo "" > ${projectdir}/${module}.files |
397 | 412 |
for source in ${sourcefiles[*]}; do |
398 | 413 |
# skip GCC files |
... | ... | |
448 | 463 |
# |
449 | 464 |
function createAllProjects { |
450 | 465 |
local modules=("${!1}") |
451 |
local projectdir="" |
|
466 |
local projectsdir=""
|
|
452 | 467 |
local gccincludedir="" |
453 | 468 |
local outvar="" |
454 | 469 |
local gccoutvar="" |
... | ... | |
459 | 474 |
if ( parseIsOption $1 ); then |
460 | 475 |
case "$1" in |
461 | 476 |
-p=*|--path=*) |
462 |
projectdir=$(realpath "${1#*=}"); shift 1;; |
|
477 |
projectsdir=$(realpath "${1#*=}"); shift 1;;
|
|
463 | 478 |
-p|--path) |
464 |
projectdir=$(realpath "$2"); shift 2;; |
|
479 |
projectsdir=$(realpath "$2"); shift 2;;
|
|
465 | 480 |
--gcc=*) |
466 | 481 |
gccincludedir=$(realpath "${1#*=}"); shift 1;; |
467 | 482 |
--gcc) |
... | ... | |
490 | 505 |
fi |
491 | 506 |
|
492 | 507 |
# read absolute project directory if required |
493 |
if [ -z "$projectdir" ]; then |
|
494 |
getProjectDir projectdir |
|
508 |
if [ -z "$projectsdir" ]; then
|
|
509 |
getProjectDir projectsdir
|
|
495 | 510 |
fi |
496 | 511 |
|
497 | 512 |
# check for existing project files |
498 |
local projectfiles=()
|
|
513 |
local projectfiles=""
|
|
499 | 514 |
for module in ${modules[@]}; do |
500 |
local pfiles="$(find ${projectdir} -maxdepth 1 -type f | grep -E "${module}\.(includes|files|config|creator)$")" |
|
501 |
IFS=$'\n'; pfiles=($pfiles); unset IFS |
|
502 |
projectfiles=( ${projectfiles[*]} ${pfiles[*]} ) |
|
515 |
projectfiles+="$(find ${projectsdir} -maxdepth 1 -type f | grep -E "${module}\.(includes|files|config|creator)$")" |
|
503 | 516 |
done |
517 |
IFS=$'\n'; projectfiles=($projectfiles); unset IFS |
|
504 | 518 |
if [ ! -z "${projectfiles[*]}" ]; then |
505 | 519 |
printWarning "The following files will be removed:\n" |
506 | 520 |
for pfile in ${projectfiles[@]}; do |
... | ... | |
541 | 555 |
if [ $retval != 0 ]; then |
542 | 556 |
printf "\n" |
543 | 557 |
fi |
544 |
createModuleProject modules[@] --module="$module" --path="$projectdir" --gcc="$gccincludedir" |
|
558 |
createModuleProject modules[@] --module="$module" --path="$projectsdir" --gcc="$gccincludedir"
|
|
545 | 559 |
retval=$? |
546 | 560 |
done |
547 | 561 |
|
... | ... | |
636 | 650 |
} |
637 | 651 |
|
638 | 652 |
### main function of this script ############################################### |
639 |
# Creates, deletes and wipes QtCreator project files for the three AMiRo base modules.
|
|
653 |
# Creates, deletes and wipes QtCreator project files for any module supported by AMiRo-OS.
|
|
640 | 654 |
# |
641 | 655 |
# usage: see function printHelp |
642 | 656 |
# arguments: see function printHelp |
Also available in: Unified diff