1cddda72410c992a12db61cef26713b498e31fea4Thanh Le#!/bin/bash -e
2cddda72410c992a12db61cef26713b498e31fea4Thanh Le
3cddda72410c992a12db61cef26713b498e31fea4Thanh Le# Copyright 2012, The Android Open Source Project
4cddda72410c992a12db61cef26713b498e31fea4Thanh Le#
5cddda72410c992a12db61cef26713b498e31fea4Thanh Le# Licensed under the Apache License, Version 2.0 (the "License");
6cddda72410c992a12db61cef26713b498e31fea4Thanh Le# you may not use this file except in compliance with the License.
7cddda72410c992a12db61cef26713b498e31fea4Thanh Le# You may obtain a copy of the License at
8cddda72410c992a12db61cef26713b498e31fea4Thanh Le#
9cddda72410c992a12db61cef26713b498e31fea4Thanh Le#     http://www.apache.org/licenses/LICENSE-2.0
10cddda72410c992a12db61cef26713b498e31fea4Thanh Le#
11cddda72410c992a12db61cef26713b498e31fea4Thanh Le# Unless required by applicable law or agreed to in writing, software
12cddda72410c992a12db61cef26713b498e31fea4Thanh Le# distributed under the License is distributed on an "AS IS" BASIS,
13cddda72410c992a12db61cef26713b498e31fea4Thanh Le# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14cddda72410c992a12db61cef26713b498e31fea4Thanh Le# See the License for the specific language governing permissions and
15cddda72410c992a12db61cef26713b498e31fea4Thanh Le# limitations under the License.
16cddda72410c992a12db61cef26713b498e31fea4Thanh Le
17cddda72410c992a12db61cef26713b498e31fea4Thanh Le# Creates and builds projects from a RenderScript testcase and a set of Java templates
18cddda72410c992a12db61cef26713b498e31fea4Thanh Le
19cddda72410c992a12db61cef26713b498e31fea4Thanh LeHELP=no
205838b1a067427865c3ec8cc33a5dfa64ba05407fKevin JinVERBOSE=no
2107faa170442ca86bb21e6076ff3309615be3b9a8Kevin JinMINSDK=1
22cddda72410c992a12db61cef26713b498e31fea4Thanh LeTARGET=1
23cddda72410c992a12db61cef26713b498e31fea4Thanh LeNAME=""
2474676fdd3c8a9e599eddd13bea56898674d9916aKevin JinOUT_DIR=
25f50519233078e65a056cff49d7b4989d57c3e750Kevin JinACTIVITY=""
2674676fdd3c8a9e599eddd13bea56898674d9916aKevin JinPACKAGE=""
27da42ba49053dd39b7a19531cb72525d14f285c9bKevin JinSDK=""
285838b1a067427865c3ec8cc33a5dfa64ba05407fKevin JinTESTCASE_PATH=""
29115eb39036a7a4e500dc94b57975a5693861f654Tony WickhamDRIVER=""
3007faa170442ca86bb21e6076ff3309615be3b9a8Kevin Jin
310d7b67b43f83536708a6ae0330e739744049a48eKevin Jincheck_param ()
32cddda72410c992a12db61cef26713b498e31fea4Thanh Le{
3339b609194aea07e7f1d8ead084d48d1171198f02Kevin Jin    if [ -z "$2" ]; then
34cddda72410c992a12db61cef26713b498e31fea4Thanh Le        echo "ERROR: Missing parameter after option '$1'"
3574676fdd3c8a9e599eddd13bea56898674d9916aKevin Jin        exit 1
3674676fdd3c8a9e599eddd13bea56898674d9916aKevin Jin    fi
3774676fdd3c8a9e599eddd13bea56898674d9916aKevin Jin}
38f50519233078e65a056cff49d7b4989d57c3e750Kevin Jin
39cddda72410c992a12db61cef26713b498e31fea4Thanh Lecheck_required_param()
40cddda72410c992a12db61cef26713b498e31fea4Thanh Le{
4174676fdd3c8a9e599eddd13bea56898674d9916aKevin Jin    if [ -z "$1" ]; then
4274676fdd3c8a9e599eddd13bea56898674d9916aKevin Jin        echo "ERROR: Missing required parameter $2"
43f50519233078e65a056cff49d7b4989d57c3e750Kevin Jin        exit 1
44cddda72410c992a12db61cef26713b498e31fea4Thanh Le    fi
45cddda72410c992a12db61cef26713b498e31fea4Thanh Le}
46cddda72410c992a12db61cef26713b498e31fea4Thanh Le
4774676fdd3c8a9e599eddd13bea56898674d9916aKevin Jinrun ()
4874676fdd3c8a9e599eddd13bea56898674d9916aKevin Jin{
49c91cb19438c6ef8ecd794664bf1f879725866bb9Kevin Jin    if [ "$VERBOSE" = "yes" ] ; then
50115eb39036a7a4e500dc94b57975a5693861f654Tony Wickham        echo "## COMMAND: $@"
5121a0001e2426644dd68e6140b5873ebaeafcc3dcKevin Jin    fi
5274676fdd3c8a9e599eddd13bea56898674d9916aKevin Jin    $@ 2>&1
5374676fdd3c8a9e599eddd13bea56898674d9916aKevin Jin}
5474676fdd3c8a9e599eddd13bea56898674d9916aKevin Jin
5574676fdd3c8a9e599eddd13bea56898674d9916aKevin Jinprocess_template()
5674676fdd3c8a9e599eddd13bea56898674d9916aKevin Jin{
5774676fdd3c8a9e599eddd13bea56898674d9916aKevin Jin  src=$1
5874676fdd3c8a9e599eddd13bea56898674d9916aKevin Jin  dest=$2
5921a0001e2426644dd68e6140b5873ebaeafcc3dcKevin Jin  sed -e "s/%ACTIVITY%/$3/g" -e "s/%PACKAGE%/$4/g" -e "s/%TESTCASE%/$5/g" -e "s/%MINSDK%/$6/g" < $src > $dest;
6021a0001e2426644dd68e6140b5873ebaeafcc3dcKevin Jin  echo "processed $src ==> $dest"
61da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin}
62da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin
63da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jinwhile [ -n "$1" ]; do
64da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin    opt="$1"
65da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin    case "$opt" in
66da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin        --help|-h|-\?)
67da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            HELP=yes
68da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            ;;
69da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin        --verbose|-v)
70da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            VERBOSE=yes
71da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            ;;
72da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin        --sdk)
73da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            check_param $1 $2
74da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            SDK="$2"
75da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            ;;
76da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin        --name)
77c91cb19438c6ef8ecd794664bf1f879725866bb9Kevin Jin            check_param $1 $2
78da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            NAME="$2"
79da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            ;;
80da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin        --out)
81da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            check_param $1 $2
82da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            OUT_DIR="$2"
83c91cb19438c6ef8ecd794664bf1f879725866bb9Kevin Jin            ;;
84115eb39036a7a4e500dc94b57975a5693861f654Tony Wickham        --activity)
85cddda72410c992a12db61cef26713b498e31fea4Thanh Le            check_param $1 $2
86cddda72410c992a12db61cef26713b498e31fea4Thanh Le            ACTIVITY="$2"
87da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            ;;
88da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin        --package)
89da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            check_param $1 $2
90da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            PACKAGE="$2"
91da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            ;;
92da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin        --minsdk)
93da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            check_param $1 $2
94da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            MINSDK="$2"
95da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            ;;
96da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin        --target)
97da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            check_param $1 $2
985838b1a067427865c3ec8cc33a5dfa64ba05407fKevin Jin            TARGET="$2"
995838b1a067427865c3ec8cc33a5dfa64ba05407fKevin Jin            ;;
1005838b1a067427865c3ec8cc33a5dfa64ba05407fKevin Jin        --testcase)
101da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            check_param $1 $2
102da42ba49053dd39b7a19531cb72525d14f285c9bKevin Jin            TESTCASE_PATH="$2"
1035838b1a067427865c3ec8cc33a5dfa64ba05407fKevin Jin            ;;
1045838b1a067427865c3ec8cc33a5dfa64ba05407fKevin Jin        --driver)
1055838b1a067427865c3ec8cc33a5dfa64ba05407fKevin Jin            check_param $1 $2
1065838b1a067427865c3ec8cc33a5dfa64ba05407fKevin Jin            DRIVER="${2%/}"
1075838b1a067427865c3ec8cc33a5dfa64ba05407fKevin Jin            ;;
1085838b1a067427865c3ec8cc33a5dfa64ba05407fKevin Jin        -*) # unknown options
10917342a5115d7575d44a99fed9c7032e3ab316dccKevin Jin            echo "ERROR: Unknown option '$opt', use --help for list of valid ones."
1105838b1a067427865c3ec8cc33a5dfa64ba05407fKevin Jin            exit 1
1115838b1a067427865c3ec8cc33a5dfa64ba05407fKevin Jin        ;;
1125838b1a067427865c3ec8cc33a5dfa64ba05407fKevin Jin        *)  # Simply record parameter
11370e34108e0fc19277e642aef3b36b65b8e254899Kevin Jin            if [ -z "$PARAMETERS" ] ; then
114f50519233078e65a056cff49d7b4989d57c3e750Kevin Jin                PARAMETERS="$opt"
11570e34108e0fc19277e642aef3b36b65b8e254899Kevin Jin            else
11670e34108e0fc19277e642aef3b36b65b8e254899Kevin Jin                PARAMETERS="$PARAMETERS $opt"
117cddda72410c992a12db61cef26713b498e31fea4Thanh Le            fi
118            ;;
119    esac
120    shift
121done
122
123if [ "$HELP" = "yes" ] ; then
124    echo "Usage: $PROGNAME [options]"
125    echo ""
126    echo "Build a test project from a RS testcase and a java driver template."
127    echo ""
128    echo "Required Parameters:"
129    echo "    --sdk                Location of Android SDK installation"
130    echo "    --out <path>         Location of your project directory"
131    echo "    --testcase <name>    The .rs testcase file with which to build the project"
132    echo "    --driver <name>      The java template directory with which to build the project"
133    echo ""
134    echo "Optional Parameters (reasonable defaults are used if not specified)"
135    echo "    --activity <name>    Name for your default Activity class"
136    echo "    --package <name>     Package namespace for your project"
137    echo "    --target <name>      Android build target. Execute 'android list targets' to list available targets and their ID's."
138    echo "    --minsdk <name>      minSdkVersion attribute to embed in AndroidManifest.xml of test project."
139    echo "    --help|-h|-?         Print this help"
140    echo "    --verbose|-v         Enable verbose mode"
141    echo ""
142    exit 0
143fi
144
145# Verify required parameters are non-empty
146check_required_param "$SDK" "--sdk"
147check_required_param "$OUT_DIR" "--out"
148check_required_param "$TESTCASE_PATH" "--testcase"
149check_required_param "$DRIVER" "--driver"
150
151# Compute name of testcase
152TESTCASE=`basename $TESTCASE_PATH .rs`
153
154# Compute activity, appname, and java package, if not specified via parameters
155if [ -z "$ACTIVITY" ]; then
156  ACTIVITY="$TESTCASE";
157fi
158
159if [ -z "$NAME" ]; then
160  NAME="$ACTIVITY"
161fi
162
163if [ -z "$PACKAGE" ]; then
164  PACKAGE=com.android.test.rsdebug.$TESTCASE
165fi
166
167# Create the project
168run $SDK/tools/android create project --target $TARGET --name $NAME --path $OUT_DIR --activity $ACTIVITY --package $PACKAGE
169
170if [ $? != 0 ] ; then
171    echo "ERROR: Could not create Android project."
172    echo "       Check parameters and try again."
173    exit 1
174fi
175
176# Compute name of destination source directory
177DEST_SRC_DIR=$OUT_DIR/src/`echo $PACKAGE | sed 's/\./\//g'`
178
179if [ ! -d "$DRIVER" ]; then
180  # If driver directory does not exist, try to fix it up by searching the
181  # testcase directory as well
182  DRIVER=`dirname $TESTCASE_PATH`/"$DRIVER"
183  if [ ! -d $DRIVER ]; then
184    echo "unable to find driver in $DRIVER, please check --driver"
185    exit 1;
186  fi
187fi
188
189echo "Copying driver template from $DRIVER -> $DEST_SRC_DIR"
190if [ ! -d "$DEST_SRC_DIR" ]; then
191  echo "Error, destination directory does not exist: $DEST_SRC_DIR";
192  exit 1;
193fi
194echo "Performing template substitutions:"
195echo "    %ACTIVITY% ==> $ACTIVITY"
196echo "    %PACKAGE% ==> $PACKAGE"
197echo "    %TESTCASE% ==> $TESTCASE"
198echo "    %MINSDK% ==> $MINSDK"
199SUBST_PARAMS="$ACTIVITY $PACKAGE $TESTCASE $MINSDK"
200
201# If it exists, use contents of driver-common directory to seed
202# the testcase project
203DRIVER_COMMON="`dirname $TESTCASE_PATH`/driver-common"
204if [ -d $DRIVER_COMMON ]; then
205  echo "Found common driver directory: $DRIVER_COMMON"
206  ls $DRIVER_COMMON/SRC/*.java.template | while read src; do
207    SRC_BASENAME=`basename $src .java.template`;
208    dest=$DEST_SRC_DIR/`echo $SRC_BASENAME | sed "s/ACTIVITY/$ACTIVITY/g"`.java
209    process_template $src $dest $SUBST_PARAMS
210  done;
211
212  # Copy AndroidManifest.xml
213  COMMON_MANIFEST="$DRIVER_COMMON/AndroidManifest.xml"
214  if [ -e $COMMON_MANIFEST ]; then
215    process_template $COMMON_MANIFEST $OUT_DIR/AndroidManifest.xml $SUBST_PARAMS
216  fi
217fi
218
219# Copy Java source to project directory.
220ls $DRIVER/*.java.template | while read src; do
221  SRC_BASENAME=`basename $src .java.template`
222  dest=$DEST_SRC_DIR/`echo $SRC_BASENAME | sed "s/ACTIVITY/$ACTIVITY/g"`.java
223  process_template $src $dest $SUBST_PARAMS
224done;
225
226# Copy AndroidManifest.xml override, if it exists
227OVERRIDE_MANIFEST="$DRIVER/AndroidManifest.xml"
228if [ -e $OVERRIDE_MANIFEST ]; then
229  process_template $OVERRIDE_MANIFEST $OUT_DIR/AndroidManifest.xml $SUBST_PARAMS
230fi
231
232# Copy RS testcase to project directory.
233TESTCASE_DEST=$DEST_SRC_DIR/`basename $TESTCASE_PATH`
234process_template $TESTCASE_PATH $TESTCASE_DEST $SUBST_PARAMS
235
236# Buid signed and aligned apk
237cd $OUT_DIR
238run ant clean debug install
239
240if [ $? != 0 ] ; then
241    echo "ERROR: Apk build and install failed"
242    exit 1
243fi
244
245exit 0
246