andrewm@58: #!/bin/bash
andrewm@58: #
andrewm@58: # This script compiles a BeagleRT project on the BeagleBone Black and
andrewm@58: # optionally runs it. Pass a directory path in the first argument. 
andrewm@58: # The source files in this directory are copied to the board and compiled.
andrewm@58: 
andrewm@58: BBB_ADDRESS="root@192.168.7.2"
andrewm@58: BBB_PATH="~/BeagleRT"
andrewm@58: RUN_PROJECT=1
andrewm@60: COMMAND_ARGS=
andrewm@90: RUN_IN_FOREGROUND=0
andrewm@90: RUN_WITHOUT_SCREEN=0
andrewm@58: 
andrewm@58: function usage
andrewm@58: {
andrewm@58:     THIS_SCRIPT=`basename "$0"`
andrewm@90:     echo "Usage: $THIS_SCRIPT [-b path-on-beaglebone] [-c command-line-args] [-nfF] <directory-with-source-files>"
andrewm@58:     echo "
andrewm@58:     This script copies a directory of source files to the BeagleBone, compiles
andrewm@58:     and runs it. The BeagleRT core files should have first been copied over
andrewm@58:     using the setup_board.sh script supplied with BeagleRT.
andrewm@58: 
andrewm@58:     The source directory should contain at least one .c, .cpp or .S file.
andrewm@58:     If the argument -n is passed, the output will not be run after compiling.
andrewm@58:     The argument -b will change the local path on the BeagleBone where the
andrewm@60:     BeagleRT files are found. The -c option passes command-line arguments to
andrewm@90:     the BeagleRT program; enclose the argument string in quotes.
andrewm@90: 	
andrewm@90:     The -f argument runs the project in the foreground of the current terminal,
andrewm@90:     within a screen session that can be detached later. The -F argument runs
andrewm@90: 	the project in the foreground of the current terminal, without screen, so
andrewm@90: 	the output can be piped to another destination."
andrewm@58: }
andrewm@58: 
andrewm@58: OPTIND=1
andrewm@58: 
andrewm@90: while getopts "b:c:nfFh" opt; do
andrewm@58:     case $opt in
andrewm@58:         b)            BBB_PATH=$OPTARG
andrewm@58:                       ;;
andrewm@60:         c)            COMMAND_ARGS=$OPTARG
andrewm@60:                       ;;
andrewm@90: 		f)            RUN_IN_FOREGROUND=1
andrewm@90: 			          ;;
andrewm@90: 		F)            RUN_WITHOUT_SCREEN=1
andrewm@90: 			  		  ;;
andrewm@58:         n)    	      RUN_PROJECT=0
andrewm@58:                       ;;
andrewm@58:         h|\?)         usage
andrewm@58:                       exit 1
andrewm@58:     esac
andrewm@58: done
andrewm@58: 
andrewm@58: shift $((OPTIND-1))
andrewm@58: 
andrewm@58: # Check that we have a directory containing at least one source file
andrewm@58: # as an argument
giuliomoro@64: 
andrewm@58: if [ -z "$1" ]
andrewm@58: then
andrewm@58:     usage
andrewm@58:     exit
andrewm@58: fi
andrewm@58: 
giuliomoro@64: FIND_STRING="find $* -maxdepth 10000 -type f "
giuliomoro@64: 
giuliomoro@64: C_FILES=$($FIND_STRING -name "*.c")
giuliomoro@64: CPP_FILES=$($FIND_STRING -name "*.cpp")
giuliomoro@64: ASM_FILES=$($FIND_STRING -name "*.S")
andrewm@58: 
andrewm@58: if [[ -z $C_FILES ]] && [[ -z $CPP_FILES ]] && [[ -z $ASM_FILES ]]
andrewm@58: then
andrewm@58:     echo "Please provide a directory containing .c, .cpp or .S files."
andrewm@58: #    echo "Usage: $THIS_SCRIPT [directory-with-source-files]"
andrewm@58:     usage
andrewm@58:     exit
andrewm@58: fi
andrewm@58: 
andrewm@58: # Stop BeagleRT and clean out old source files
andrewm@58: echo "Stopping BeagleRT and removing old source files..."
giuliomoro@85: ssh -t -t $BBB_ADDRESS "screen -X -S BeagleRT quit &>/dev/null; pkill BeagleRT ; make sourceclean -C $BBB_PATH"
giuliomoro@64: 
giuliomoro@64: #concatenate arguments to form path.
giuliomoro@64: BBB_SOURCE_PATH= #initially empty, will be filled with input arguments
giuliomoro@64: for i in "$@" #parse input arguments
giuliomoro@64: do
giuliomoro@64:   if [ -d "$1" ] #check if the path is a folder
giuliomoro@64:   then #if it is, include all of its files
giuliomoro@64:     BBB_SOURCE_PATH+=" ${1}/* "
giuliomoro@64:   else
giuliomoro@64:     BBB_SOURCE_PATH+=" $1 "
giuliomoro@64:   fi
giuliomoro@64:   shift
giuliomoro@64:   # Copy new souce files to the board
giuliomoro@64: done
andrewm@58: 
andrewm@58: # Copy new source files to the board
andrewm@58: echo "Copying new source files to BeagleBone..."
giuliomoro@64: scp $BBB_SOURCE_PATH "$BBB_ADDRESS:$BBB_PATH/source/"
giuliomoro@64: 
giuliomoro@64: if [ $? -ne 0 ]
giuliomoro@64: then
giuliomoro@64: 	echo "Error while copying files"
giuliomoro@64: 	exit
giuliomoro@64: fi
andrewm@58: 
andrewm@58: # Make new BeagleRT executable and run
andrewm@58: if [ $RUN_PROJECT -eq 0 ]
andrewm@58: then
andrewm@58:     echo "Building project..."
andrewm@58:     ssh $BBB_ADDRESS "make all -C $BBB_PATH"
andrewm@58: else
andrewm@58:     echo "Building and running project..."
andrewm@90: 	
andrewm@90: 	if [ $RUN_WITHOUT_SCREEN -ne 0 ]
andrewm@90: 	then
andrewm@90: 		ssh -t $BBB_ADDRESS "make all -C $BBB_PATH && $BBB_PATH/BeagleRT $COMMAND_ARGS"	
andrewm@90: 	elif [ $RUN_IN_FOREGROUND -eq 0 ]
andrewm@90: 	then
andrewm@90: 	    ssh $BBB_ADDRESS "make all -C $BBB_PATH && screen -S BeagleRT -d -m $BBB_PATH/BeagleRT $COMMAND_ARGS"
andrewm@90: 	else
andrewm@90: 	    ssh -t $BBB_ADDRESS "make all -C $BBB_PATH && screen -S BeagleRT $BBB_PATH/BeagleRT $COMMAND_ARGS"
andrewm@90: 	fi
andrewm@58: fi