#!/bin/sh #***************************************************************************** # frobomind_make script # Copyright (c) 2014-2015, Kjeld Jensen <kjeld@frobomind.org> # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name FroboMind nor the # names of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #***************************************************************************** # This frobomind_make script allows making only the FroboMind components # (implemented as ROS packages) relevant for a given application. # # 2014-03-17 KJ First version # 2014-03-26 KJ A few optimizations, no functionality changed. # 2015-03-04 KJ Updated to support external projects #***************************************************************************** # find out where FroboMind is ROOT_FM=$(dirname $(readlink -f $0)) ROOT_SRC=$ROOT_FM/.. ROOT_WS=$ROOT_FM/../.. FILE_MAKE="fmMake.txt" # this function shows the help text show_help(){ echo "\nFroboMind make v2015-03-04" echo "Usage:" echo " frobomind_make [options] command" echo "Commands:" echo " all Make all FroboMind components" echo " list List all FroboMind components" echo " /frobomind/... Make FroboMind components listed in $FILE_MAKE in this directory" echo " clean Make clean" echo " cleanall Clean up everything (remove devel and build directories)" echo "Options:" echo " -i Do not ignore (other) components" echo "" } # this function adds a CATKIN_IGNORE file to all directories containing a package.xml file add_ignore_to_all_packages(){ cd $ROOT_FM PACKAGES=`find $ROOT_SRC -name "package.xml"` # find all directories with package.xml for LINE in $PACKAGES; do # for each directory echo > $(dirname $LINE)/CATKIN_IGNORE # add ignore file done } # this function lists all directories containing a package.xml file list_all_packages(){ cd $ROOT_FM PACKAGES=`find $ROOT_SRC -name "package.xml"` # find all directories with package.xml for LINE in $PACKAGES; do # for each directory echo $(dirname $LINE) done } # this function removes the CATKIN_IGNORE file from all directories containing a package.xml file remove_ignore_from_all_packages(){ cd $ROOT_FM PACKAGES=`find $ROOT_SRC -name "package.xml"` # find all directories with package.xml for LINE in $PACKAGES; do # for each directory FILE_IGNORE=$(dirname $LINE)/CATKIN_IGNORE if [ -e $FILE_IGNORE ]; then rm $FILE_IGNORE fi done } CMD="" APP="" IGNORE=0 # parse all command line arguments case $# in 0) show_help ;; *) while test $# -gt 0 ; do case $1 in all) CMD="all" shift ;; clean) CMD="clean" shift ;; cleanall) CMD="cleanall" shift ;; list) CMD="list" shift ;; -i) IGNORE=1 shift ;; *) CMD="app" APP="$1" shift ;; esac done esac # run the command defined by the user case $CMD in all) echo "Making all FroboMind components" remove_ignore_from_all_packages cd $ROOT_WS catkin_make ;; list) list_all_packages ;; app) APP_FIRST=`echo $APP | cut -c1-1)` case "$APP_FIRST" in /) ROOT_APP=$ROOT_SRC$APP if [ -d $ROOT_APP ]; then if [ -e $ROOT_APP/$FILE_MAKE ]; then echo "Making the FroboMind components listed in:" $APP/$FILE_MAKE if [ $IGNORE -eq 0 ]; then echo " Ignoring all other FroboMind components" add_ignore_to_all_packages fi # removing ignore files APP_PACKAGES=`cat $ROOT_APP/$FILE_MAKE` for LINE in $APP_PACKAGES; do # for each directory echo " Adding directory:" $LINE FILE_IGNORE=$ROOT_SRC$LINE/CATKIN_IGNORE if [ -e $FILE_IGNORE ]; then rm $FILE_IGNORE fi done cd $ROOT_WS catkin_make else echo $FILE_MAKE "does not exist in application directory:" $APP fi else echo "Application does not exist:" $APP fi ;; *) echo "No proper application defined:" $APP ;; esac ;; clean) echo "Make clean" echo "Removing ignore from all packages" remove_ignore_from_all_packages cd $ROOT_WS echo "Running catkin_make clean" pwd catkin_make clean #if [ $IGNORE -eq 0 ]; then # echo "Ignoring all packages" # add_ignore_to_all_packages #fi echo "completed" ;; cleanall) echo "Cleaning up everything" remove_ignore_from_all_packages if [ -d $ROOT_WS/devel ]; then rm -r $ROOT_WS/devel fi if [ -d $ROOT_WS/build ]; then rm -r $ROOT_WS/build fi if [ $IGNORE -eq 0 ]; then echo "Ignoring all packages" add_ignore_to_all_packages fi ;; esac