1#!/bin/bash
2
3# build script for eclipse adt build on the Linux and Mac platforms
4#
5# Usage: sdk/eclipse/scripts/build_plugins <build_version>
6#
7# It expects environment variable ECLIPSE_HOME to be defined to point to _your_
8# version of Eclipse RCP (must have the WTP & GEF plugins available too.)
9#
10# If ECLIPSE_HOME is not provided, this script will _download_ a reference version
11# of Eclipse RCP and install it in a specific location.
12#
13# Other properties, ant scripts that drive the build are defined in ./buildConfig
14# Currently, this script will create an update site at ${user.home}/www/no_crawl/android-build
15# or at the directory specified using "-d"
16
17# Known Issues:
18# - Build does not properly clean up after itself (build server always executes from
19#   a clean state.)
20# - Script will fail if current absolute path has spaces in it.
21# - Only linux and OSX are supported for now
22# - Do NOT manually invoke this script. Instead use the build_server.sh wrapper
23#   which does some extra preliminary steps (it builds a few libs needed here.)
24
25
26set -e # abort this script early if any command fails
27
28#
29# -- Utility methods --
30#
31
32function printUsage() {
33  echo "Usage: $0 <build_qualifier> [-i] [-d <destination-directory>] [-a <archivePrefix>] "
34  echo "<build_qualifier>: build qualifier string"
35  echo "-i = build internal site. Otherwise, external site will be built"
36  echo "-d = destination directory. Default is $USER/www/no_crawl/. Cannot contain spaces."
37  echo "-a = archive prefix. Cannot contain spaces."
38}
39
40function die() {
41  echo $@
42  exit 1
43}
44
45function dieWithUsage() {
46  echo $@
47  echo
48  printUsage
49  exit 1
50}
51
52
53#
54# -- Setup our custom version of Eclipse --
55#
56
57# The dependency on the linux platform comes from a series of environment
58# variables that the eclipse ant runner expects. These are defined in the
59# build.properties file. We can easily support other platforms but would need
60# to override those values in this script.
61HOST=`uname`
62if [ "$HOST" == "Linux" ]; then
63  BASEOS=linux
64  BASEWS=gtk
65  BASEARCH=x86
66elif [ "$HOST" == "Darwin" ]; then
67  BASEOS=macosx
68  BASEWS=cocoa
69  BASEARCH=x86
70else
71  die "ERROR: This script is currently only supported on Linux and MacOSX."
72fi
73
74
75# Make sure this runs from the sdk/eclipse plugin.
76D=`dirname "$0"`
77cd "$D/.."
78[ `basename "$PWD"` == "eclipse" ] || dieWithUsage "Please run this script from the sdk/eclipse directory"
79
80# check for number of parameters
81[ $# -lt 1 ] && dieWithUsage "ERROR: Not enough parameters"
82
83# check if ECLIPSE_HOME set (ECLIPSE_HOME is were the "eclipse" binary and the
84# "plugins" sub-directory are located)
85if [ -z "$ECLIPSE_HOME" ]; then
86  BASE_DIR=/buildbot/eclipse-android
87
88  echo "ECLIPSE_HOME not set, using $BASE_DIR as default"
89
90  if [ ! -d "$BASE_DIR" ]; then
91    mkdir -p "$BASE_DIR" || die "Please create a directory $BASE_DIR where Eclipse will be installed, i.e. execute 'mkdir -p $BASE_DIR && chown $USER $BASE_DIR'."
92  fi
93
94  # download the version if not available
95  VERSION="3.6.2"
96  BASE_DIR="$BASE_DIR/$VERSION"
97  scripts/setup_eclipse.sh -p "$BASE_DIR"
98
99  ECLIPSE_HOME="$BASE_DIR/eclipse"      # path to installed directory
100  PID_FILE="$BASE_DIR/eclipse.pid"
101  [ -f "$PID_FILE" ] && ECLIPSE_PID=`cat "$PID_FILE"`
102fi
103
104echo "PWD=`pwd`"
105echo "ECLIPSE_HOME=$ECLIPSE_HOME"
106
107#
108# -- Site parameters and Build version --
109#
110
111BUILD_VERSION="$1" ; shift
112
113# parse for build internal site flag. If set, pass in internalSite property to ant scripts
114if [ "-i" == "$1" ]; then
115  shift
116  echo "Setting for internal site build"
117  SITE_PARAM="-DinternalSite=1 -DupdateSiteSource=$PWD/sites/internal"
118else
119  SITE_PARAM="-DupdateSiteSource=$PWD/sites/external"
120fi
121
122if [ "-d" == $1 ]; then
123  shift
124  echo "Setting destination directory to $1"
125  SITE_PARAM="$SITE_PARAM -DupdateSiteRoot=$1"
126  shift
127fi
128
129if [ "-a" == "$1" ]; then
130  shift
131  echo "Setting archivePrefix to $1"
132  SITE_PARAM="$SITE_PARAM -DarchivePrefix=$1"
133  shift
134fi
135
136
137#
138# -- Configuration directory --
139#
140
141# The "configuration directory" will hold the workspace for this build.
142# If it contains old data the build may fail so we need to clean it first
143# and create it if it doesn't exist.
144CONFIG_DIR="../../out/eclipse-configuration-$BUILD_VERSION"
145[ -d "$CONFIG_DIR" ] && rm -rfv "$CONFIG_DIR"
146mkdir -p "$CONFIG_DIR"
147
148# The "buildConfig" directory contains our customized ant rules
149BUILDCONFIG="$PWD/buildConfig"
150
151
152#
153# -- Find Eclipse Launcher --
154#
155
156# Get the Eclipse launcher and build script to use
157function findFirst() {
158  for i in "$@"; do
159    if [ -f "$i" ]; then
160      echo "$i"
161      return
162    fi
163  done
164}
165
166LAUNCHER=`findFirst "$ECLIPSE_HOME"/plugins/org.eclipse.equinox.launcher_*.jar`
167BUILDFILE=`findFirst "$ECLIPSE_HOME"/plugins/org.eclipse.pde.build_*/scripts/build.xml`
168
169# make sure we found valid files
170if [ ! -f "$LAUNCHER" ]; then
171  echo "Installation Error: Eclipse plugin org.eclipse.equinox.launcher...jar not detected. " \
172       "Found '$LAUNCHER'. Aborting."
173  exit 1
174fi
175if [ ! -f "$BUILDFILE" ]; then
176  echo "Installation Error: Eclipse build file org.eclipse.pde.build_.../scripts/build.xml " \
177       "not detected. Found '$BUILDFILE'. Aborting."
178  exit 1
179fi
180
181#
182# Ensure that the src dir exists since it's empty
183#
184mkdir -p $PWD/plugins/com.android.ide.eclipse.adt.overlay/src
185
186#
187# -- Print configuration used and actually execute the build --
188#
189
190echo "Eclipse configuration found:"
191echo "  Eclipse Home: $ECLIPSE_HOME"
192echo "  Launcher:     $LAUNCHER"
193echo "  Build File:   $BUILDFILE"
194echo "  Build Config: $BUILDCONFIG"
195echo "  Config Dir:   $CONFIG_DIR"
196echo "  Java:         " $(which java)
197java -version
198
199# clean input directories to make sure there's nothing left from previous run
200
201rm -fv *.properties *.xml
202find . -name "@*" | xargs rm -rfv
203
204# Now execute the ant runner
205
206set +e  # don't stop on errors anymore, we want to catch them here
207set -x
208
209java \
210  -jar $LAUNCHER \
211  -data "$CONFIG_DIR" \
212  -configuration "$CONFIG_DIR" \
213  -application org.eclipse.ant.core.antRunner \
214  -buildfile $BUILDFILE \
215  -Dbuilder=$BUILDCONFIG \
216  -DbuildDirectory=$PWD \
217  -DforceContextQualifier=$BUILD_VERSION \
218  -DECLIPSE_HOME=$ECLIPSE_HOME \
219  -Dbaseos=$BASEOS \
220  -Dbasews=$BASEWS \
221  -Dbasearch=$BASEARCH \
222  $SITE_PARAM
223RESULT=$?
224set +x
225
226if [ "0" != "$RESULT" ]; then
227    echo "JAVA died with error code $RESULT"
228    echo "Dump of build config logs:"
229    for i in "$CONFIG_DIR"/*.log; do
230        if [ -f "$i" ]; then
231            echo "----------------------"
232            echo "--- $i"
233            echo "----------------------"
234            cat "$i"
235            echo
236        fi
237    done
238fi
239
240#
241# -- Cleanup
242#
243
244if [ -n "$ECLIPSE_PID" ] && [ -f "$PID_FILE" ]; then
245  rm -fv "$PID_FILE"
246  kill -9 "$ECLIPSE_PID"
247fi
248
249# Remove build files left by Eclipse all behind
250rm -fv *.properties *.xml
251find . -name "@*" | xargs rm -rfv
252
253
254# we're done!
255