blob: ad1d59d8e76e5f4013c0f422401922816222afaf [file] [log] [blame]
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -07001#!/usr/bin/env bash
Jeff Gaston69713292020-06-04 12:53:39 -04002set -o pipefail
3set -e
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -07004
5##############################################################################
6##
7## Gradle start up script for UN*X
8##
9##############################################################################
10
Aurimas Liutikas9979d072018-03-13 15:38:56 -070011# --------- androidx specific code needed for build server. ------------------
12
Jeff Gastondd8a6e92020-09-01 14:26:49 -040013SCRIPT_PATH="$(cd $(dirname $0) && pwd -P)"
Aurimas Liutikas9979d072018-03-13 15:38:56 -070014if [ -n "$OUT_DIR" ] ; then
Jeff Gaston8fd9fc82019-07-26 14:26:10 -040015 mkdir -p "$OUT_DIR"
Jeff Gastondd8a6e92020-09-01 14:26:49 -040016 OUT_DIR="$(cd $OUT_DIR && pwd -P)"
Aurimas Liutikas9979d072018-03-13 15:38:56 -070017 export GRADLE_USER_HOME="$OUT_DIR/.gradle"
Jeff Gaston38004a62019-12-11 15:43:10 -050018 export TMPDIR=$OUT_DIR
Jeff Gastoncc694ab2019-04-11 16:51:36 -040019else
Jeff Gastondd8a6e92020-09-01 14:26:49 -040020 CHECKOUT_ROOT="$(cd $SCRIPT_PATH/../.. && pwd -P)"
Jeff Gastoncc694ab2019-04-11 16:51:36 -040021 export OUT_DIR="$CHECKOUT_ROOT/out"
Aurimas Liutikas9979d072018-03-13 15:38:56 -070022fi
23
Jeff Gaston440e1ac2020-09-09 08:32:22 -040024ORG_GRADLE_JVMARGS="$(cd $SCRIPT_PATH && grep org.gradle.jvmargs gradle.properties | sed 's/^/-D/')"
Jeff Gaston0e3d19a2019-10-02 12:17:39 -040025if [ -n "$DIST_DIR" ]; then
26 mkdir -p "$DIST_DIR"
Jeff Gastondd8a6e92020-09-01 14:26:49 -040027 DIST_DIR="$(cd $DIST_DIR && pwd -P)"
Jeff Gaston0e3d19a2019-10-02 12:17:39 -040028 export LINT_PRINT_STACKTRACE=true
29
Jeff Gastone72d2302019-12-19 18:32:31 -050030 #Set the initial heap size to match the max heap size,
31 #by replacing a string like "-Xmx1g" with one like "-Xms1g -Xmx1g"
Jeff Gaston440e1ac2020-09-09 08:32:22 -040032 ORG_GRADLE_JVMARGS="$(echo $ORG_GRADLE_JVMARGS | sed 's/-Xmx\([^ ]*\)/-Xms\1 -Xmx\1/')"
33
34 # tell Gradle where to put a heap dump on failure
35 ORG_GRADLE_JVMARGS="$(echo $ORG_GRADLE_JVMARGS | sed "s|$| -XX:HeapDumpPath=$DIST_DIR|")"
Jeff Gastone72d2302019-12-19 18:32:31 -050036
Jeff Gaston0e3d19a2019-10-02 12:17:39 -040037 # We don't set a default DIST_DIR in an else clause here because Studio doesn't use gradlew
38 # and doesn't set DIST_DIR and we want gradlew and Studio to match
39fi
40
Aurimas Liutikas9979d072018-03-13 15:38:56 -070041# ----------------------------------------------------------------------------
42
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -070043# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -070044
45APP_NAME="Gradle"
46APP_BASE_NAME=`basename "$0"`
47
48# Use the maximum available, or set MAX_FD != -1 to use that value.
49MAX_FD="maximum"
50
51warn ( ) {
52 echo "$*"
53}
54
55die ( ) {
56 echo
57 echo "$*"
58 echo
59 exit 1
60}
61
62# OS specific support (must be 'true' or 'false').
63cygwin=false
64msys=false
65darwin=false
66case "`uname`" in
67 CYGWIN* )
68 cygwin=true
69 ;;
70 Darwin* )
71 darwin=true
72 ;;
73 MINGW* )
74 msys=true
75 ;;
76esac
77
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -070078# Attempt to set APP_HOME
79# Resolve links: $0 may be a link
80PRG="$0"
81# Need this for relative symlinks.
82while [ -h "$PRG" ] ; do
83 ls=`ls -ld "$PRG"`
84 link=`expr "$ls" : '.*-> \(.*\)$'`
85 if expr "$link" : '/.*' > /dev/null; then
86 PRG="$link"
87 else
88 PRG=`dirname "$PRG"`"/$link"
89 fi
90done
91SAVED="`pwd`"
Yigit Boyarf77697d2016-08-16 10:55:36 -070092cd "`dirname \"$PRG\"`/" >/dev/null
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -070093APP_HOME="`pwd -P`"
Yigit Boyarf77697d2016-08-16 10:55:36 -070094cd "$SAVED" >/dev/null
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -070095
96CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
97
Jeff Gaston79a43f22019-04-09 16:19:12 -040098# --------- androidx specific code needed for lint and java. ------------------
99
Alan Viveretted38b36c2017-02-01 16:45:31 -0500100# Pick the correct fullsdk for this OS.
Alan Viverette7df63ff2017-03-06 13:12:24 -0500101if [ $darwin == "true" ]; then
Alan Viveretted38b36c2017-02-01 16:45:31 -0500102 plat="darwin"
103else
104 plat="linux"
105fi
106DEFAULT_JVM_OPTS="-DLINT_API_DATABASE=$APP_HOME/../../prebuilts/fullsdk-$plat/platform-tools/api/api-versions.xml"
107
Matthew Fraschilla6ab84fc32019-11-21 16:40:16 -0800108# Tests for lint checks default to using sdk defined by this variable. This removes a lot of
109# setup from each lint module.
110export ANDROID_HOME="$APP_HOME/../../prebuilts/fullsdk-$plat"
Sergey Vasilinetsefab5eb2019-01-04 12:38:06 +0000111# override JAVA_HOME, because CI machines have it and it points to very old JDK
Aurimas Liutikas4b897cb2019-10-14 13:25:08 -0700112export JAVA_HOME="$APP_HOME/../../prebuilts/jdk/jdk11/$plat-x86"
113export JAVA_TOOLS_JAR="$APP_HOME/../../prebuilts/jdk/jdk8/$plat-x86/lib/tools.jar"
114export STUDIO_GRADLE_JDK=$JAVA_HOME
Oussama Ben Abdelbakif825eb52018-12-04 16:17:00 -0500115
Jeff Gaston79a43f22019-04-09 16:19:12 -0400116# ----------------------------------------------------------------------------
117
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -0700118# Determine the Java command to use to start the JVM.
119if [ -n "$JAVA_HOME" ] ; then
120 if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
121 # IBM's JDK on AIX uses strange locations for the executables
122 JAVACMD="$JAVA_HOME/jre/sh/java"
123 else
124 JAVACMD="$JAVA_HOME/bin/java"
125 fi
126 if [ ! -x "$JAVACMD" ] ; then
127 die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
128
129Please set the JAVA_HOME variable in your environment to match the
130location of your Java installation."
131 fi
132else
133 JAVACMD="java"
134 which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
135
136Please set the JAVA_HOME variable in your environment to match the
137location of your Java installation."
138fi
139
140# Increase the maximum file descriptors if we can.
141if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
142 MAX_FD_LIMIT=`ulimit -H -n`
143 if [ $? -eq 0 ] ; then
144 if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
145 MAX_FD="$MAX_FD_LIMIT"
146 fi
147 ulimit -n $MAX_FD
148 if [ $? -ne 0 ] ; then
149 warn "Could not set maximum file descriptor limit: $MAX_FD"
150 fi
151 else
152 warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
153 fi
154fi
155
156# For Darwin, add options to specify how the application appears in the dock
157if $darwin; then
158 GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
159fi
160
161# For Cygwin, switch paths to Windows format before running java
162if $cygwin ; then
163 APP_HOME=`cygpath --path --mixed "$APP_HOME"`
164 CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
Yigit Boyarf77697d2016-08-16 10:55:36 -0700165 JAVACMD=`cygpath --unix "$JAVACMD"`
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -0700166
167 # We build the pattern for arguments to be converted via cygpath
168 ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
169 SEP=""
170 for dir in $ROOTDIRSRAW ; do
171 ROOTDIRS="$ROOTDIRS$SEP$dir"
172 SEP="|"
173 done
174 OURCYGPATTERN="(^($ROOTDIRS))"
175 # Add a user-defined pattern to the cygpath arguments
176 if [ "$GRADLE_CYGPATTERN" != "" ] ; then
177 OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
178 fi
179 # Now convert the arguments - kludge to limit ourselves to /bin/sh
180 i=0
181 for arg in "$@" ; do
182 CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
183 CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
184
185 if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
186 eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
187 else
188 eval `echo args$i`="\"$arg\""
189 fi
190 i=$((i+1))
191 done
192 case $i in
193 (0) set -- ;;
194 (1) set -- "$args0" ;;
195 (2) set -- "$args0" "$args1" ;;
196 (3) set -- "$args0" "$args1" "$args2" ;;
197 (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
198 (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
199 (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
200 (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
201 (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
202 (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
203 esac
204fi
205
206# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
207function splitJvmOpts() {
208 JVM_OPTS=("$@")
209}
210eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
211JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
212
Jeff Gaston826bdbe2019-11-20 14:56:24 -0500213#TODO: Remove HOME_SYSTEM_PROPERTY_ARGUMENT if https://github.com/gradle/gradle/issues/11433 gets fixed
214HOME_SYSTEM_PROPERTY_ARGUMENT=""
215if [ "$GRADLE_USER_HOME" != "" ]; then
216 HOME_SYSTEM_PROPERTY_ARGUMENT="-Duser.home=$GRADLE_USER_HOME"
217fi
Jeff Gaston38004a62019-12-11 15:43:10 -0500218if [ "$TMPDIR" != "" ]; then
219 TMPDIR_ARG="-Djava.io.tmpdir=$TMPDIR"
220fi
Jeff Gaston826bdbe2019-11-20 14:56:24 -0500221
Jeff Gaston18c47d32020-01-27 18:00:28 -0500222function tryToDiagnosePossibleDaemonFailure() {
223 # copy daemon logs
224 if [ -n "$GRADLE_USER_HOME" ]; then
225 if [ -n "$DIST_DIR" ]; then
226 cp -r "$GRADLE_USER_HOME/daemon" "$DIST_DIR/gradle-daemon"
Jeff Gastond54930d2020-02-13 17:25:02 -0500227 cp ./hs_err* $DIST_DIR/ 2>/dev/null || true
Jeff Gaston18c47d32020-01-27 18:00:28 -0500228 fi
229 fi
230}
231
Jeff Gaston224eb172020-01-09 12:31:47 -0500232function runGradle() {
Jeff Gaston440e1ac2020-09-09 08:32:22 -0400233 if "$JAVACMD" "${JVM_OPTS[@]}" $TMPDIR_ARG -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain $HOME_SYSTEM_PROPERTY_ARGUMENT $TMPDIR_ARG "$ORG_GRADLE_JVMARGS" "$@"; then
Jeff Gaston224eb172020-01-09 12:31:47 -0500234 return 0
235 else
Jeff Gaston18c47d32020-01-27 18:00:28 -0500236 tryToDiagnosePossibleDaemonFailure
Jeff Gaston224eb172020-01-09 12:31:47 -0500237 # Print AndroidX-specific help message if build fails
238 # Have to do this build-failure detection in gradlew rather than in build.gradle
239 # so that this message still prints even if buildSrc itself fails
240 echo
241 echo See also development/diagnose-build-failure for help with build failures in this project.
Jeff Gaston69713292020-06-04 12:53:39 -0400242 return 1
243 fi
244}
245
Jeff Gaston400ccb32020-06-08 16:44:58 -0400246if [[ " ${@} " =~ " -PdisallowExecution " ]]; then
247 echo "Passing '-PdisallowExecution' directly is forbidden. Did you mean -PverifyUpToDate ?"
248 echo "See TaskUpToDateValidator.java for more information"
249 exit 1
250fi
251
Jeff Gastone572f822020-06-12 14:04:48 -0400252runGradle "$@"
Jeff Gaston224eb172020-01-09 12:31:47 -0500253# Check whether we were given the "-PverifyUpToDate" argument
254if [[ " ${@} " =~ " -PverifyUpToDate " ]]; then
Jeff Gastoncefdeae2020-03-09 13:12:35 -0400255 # Re-run Gradle, and find all tasks that are unexpectly out of date
Jeff Gastond2897942020-06-17 16:13:58 -0400256 runGradle "$@" -PdisallowExecution --continue
Jeff Gastonb89c82b2019-08-21 16:24:09 -0400257fi