#!/bin/bash -e
# Copyright 2012, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Creates and builds projects from a RenderScript testcase and a set of Java templates
HELP=no
VERBOSE=no
MINSDK=1
TARGET=1
NAME=""
OUT_DIR=
ACTIVITY=""
PACKAGE=""
SDK=""
TESTCASE_PATH=""
DRIVER=""
check_param ()
{
if [ -z "$2" ]; then
echo "ERROR: Missing parameter after option '$1'"
exit 1
fi
}
check_required_param()
{
if [ -z "$1" ]; then
echo "ERROR: Missing required parameter $2"
exit 1
fi
}
run ()
{
if [ "$VERBOSE" = "yes" ] ; then
echo "## COMMAND: $@"
fi
$@ 2>&1
}
process_template()
{
src=$1
dest=$2
sed -e "s/%ACTIVITY%/$3/g" -e "s/%PACKAGE%/$4/g" -e "s/%TESTCASE%/$5/g" -e "s/%MINSDK%/$6/g" < $src > $dest;
echo "processed $src ==> $dest"
}
while [ -n "$1" ]; do
opt="$1"
case "$opt" in
--help|-h|-\?)
HELP=yes
;;
--verbose|-v)
VERBOSE=yes
;;
--sdk)
check_param $1 $2
SDK="$2"
;;
--name)
check_param $1 $2
NAME="$2"
;;
--out)
check_param $1 $2
OUT_DIR="$2"
;;
--activity)
check_param $1 $2
ACTIVITY="$2"
;;
--package)
check_param $1 $2
PACKAGE="$2"
;;
--minsdk)
check_param $1 $2
MINSDK="$2"
;;
--target)
check_param $1 $2
TARGET="$2"
;;
--testcase)
check_param $1 $2
TESTCASE_PATH="$2"
;;
--driver)
check_param $1 $2
DRIVER="${2%/}"
;;
-*) # unknown options
echo "ERROR: Unknown option '$opt', use --help for list of valid ones."
exit 1
;;
*) # Simply record parameter
if [ -z "$PARAMETERS" ] ; then
PARAMETERS="$opt"
else
PARAMETERS="$PARAMETERS $opt"
fi
;;
esac
shift
done
if [ "$HELP" = "yes" ] ; then
echo "Usage: $PROGNAME [options]"
echo ""
echo "Build a test project from a RS testcase and a java driver template."
echo ""
echo "Required Parameters:"
echo " --sdk Location of Android SDK installation"
echo " --out <path> Location of your project directory"
echo " --testcase <name> The .rs testcase file with which to build the project"
echo " --driver <name> The java template directory with which to build the project"
echo ""
echo "Optional Parameters (reasonable defaults are used if not specified)"
echo " --activity <name> Name for your default Activity class"
echo " --package <name> Package namespace for your project"
echo " --target <name> Android build target. Execute 'android list targets' to list available targets and their ID's."
echo " --minsdk <name> minSdkVersion attribute to embed in AndroidManifest.xml of test project."
echo " --help|-h|-? Print this help"
echo " --verbose|-v Enable verbose mode"
echo ""
exit 0
fi
# Verify required parameters are non-empty
check_required_param "$SDK" "--sdk"
check_required_param "$OUT_DIR" "--out"
check_required_param "$TESTCASE_PATH" "--testcase"
check_required_param "$DRIVER" "--driver"
# Compute name of testcase
TESTCASE=`basename $TESTCASE_PATH .rs`
# Compute activity, appname, and java package, if not specified via parameters
if [ -z "$ACTIVITY" ]; then
ACTIVITY="$TESTCASE";
fi
if [ -z "$NAME" ]; then
NAME="$ACTIVITY"
fi
if [ -z "$PACKAGE" ]; then
PACKAGE=com.android.test.rsdebug.$TESTCASE
fi
# Create the project
run $SDK/tools/android create project --target $TARGET --name $NAME --path $OUT_DIR --activity $ACTIVITY --package $PACKAGE
if [ $? != 0 ] ; then
echo "ERROR: Could not create Android project."
echo " Check parameters and try again."
exit 1
fi
# Compute name of destination source directory
DEST_SRC_DIR=$OUT_DIR/src/`echo $PACKAGE | sed 's/\./\//g'`
if [ ! -d "$DRIVER" ]; then
# If driver directory does not exist, try to fix it up by searching the
# testcase directory as well
DRIVER=`dirname $TESTCASE_PATH`/"$DRIVER"
if [ ! -d $DRIVER ]; then
echo "unable to find driver in $DRIVER, please check --driver"
exit 1;
fi
fi
echo "Copying driver template from $DRIVER -> $DEST_SRC_DIR"
if [ ! -d "$DEST_SRC_DIR" ]; then
echo "Error, destination directory does not exist: $DEST_SRC_DIR";
exit 1;
fi
echo "Performing template substitutions:"
echo " %ACTIVITY% ==> $ACTIVITY"
echo " %PACKAGE% ==> $PACKAGE"
echo " %TESTCASE% ==> $TESTCASE"
echo " %MINSDK% ==> $MINSDK"
SUBST_PARAMS="$ACTIVITY $PACKAGE $TESTCASE $MINSDK"
# If it exists, use contents of driver-common directory to seed
# the testcase project
DRIVER_COMMON="`dirname $TESTCASE_PATH`/driver-common"
if [ -d $DRIVER_COMMON ]; then
echo "Found common driver directory: $DRIVER_COMMON"
ls $DRIVER_COMMON/SRC/*.java.template | while read src; do
SRC_BASENAME=`basename $src .java.template`;
dest=$DEST_SRC_DIR/`echo $SRC_BASENAME | sed "s/ACTIVITY/$ACTIVITY/g"`.java
process_template $src $dest $SUBST_PARAMS
done;
# Copy AndroidManifest.xml
COMMON_MANIFEST="$DRIVER_COMMON/AndroidManifest.xml"
if [ -e $COMMON_MANIFEST ]; then
process_template $COMMON_MANIFEST $OUT_DIR/AndroidManifest.xml $SUBST_PARAMS
fi
fi
# Copy Java source to project directory.
ls $DRIVER/*.java.template | while read src; do
SRC_BASENAME=`basename $src .java.template`
dest=$DEST_SRC_DIR/`echo $SRC_BASENAME | sed "s/ACTIVITY/$ACTIVITY/g"`.java
process_template $src $dest $SUBST_PARAMS
done;
# Copy AndroidManifest.xml override, if it exists
OVERRIDE_MANIFEST="$DRIVER/AndroidManifest.xml"
if [ -e $OVERRIDE_MANIFEST ]; then
process_template $OVERRIDE_MANIFEST $OUT_DIR/AndroidManifest.xml $SUBST_PARAMS
fi
# Copy RS testcase to project directory.
TESTCASE_DEST=$DEST_SRC_DIR/`basename $TESTCASE_PATH`
process_template $TESTCASE_PATH $TESTCASE_DEST $SUBST_PARAMS
# Buid signed and aligned apk
cd $OUT_DIR
run ant clean debug install
if [ $? != 0 ] ; then
echo "ERROR: Apk build and install failed"
exit 1
fi
exit 0