blob: bbc6b8f2af2e4a708cd1b4aad7f94ec9b44f8b69 [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 Gaston77bb2b12021-04-15 12:51:08 -040032 MAX_MEM=24g
Jeff Gastoncca984c2020-10-05 12:54:17 -040033 ORG_GRADLE_JVMARGS="$(echo $ORG_GRADLE_JVMARGS | sed "s/-Xmx\([^ ]*\)/-Xms$MAX_MEM -Xmx$MAX_MEM/")"
Jeff Gaston440e1ac2020-09-09 08:32:22 -040034
35 # tell Gradle where to put a heap dump on failure
36 ORG_GRADLE_JVMARGS="$(echo $ORG_GRADLE_JVMARGS | sed "s|$| -XX:HeapDumpPath=$DIST_DIR|")"
Jeff Gastone72d2302019-12-19 18:32:31 -050037
Jeff Gaston0e3d19a2019-10-02 12:17:39 -040038 # We don't set a default DIST_DIR in an else clause here because Studio doesn't use gradlew
39 # and doesn't set DIST_DIR and we want gradlew and Studio to match
40fi
41
Jeff Gastonc21ecb32020-11-05 17:16:35 -050042# unset ANDROID_BUILD_TOP so that Lint doesn't think we're building the platform itself
43unset ANDROID_BUILD_TOP
Aurimas Liutikas9979d072018-03-13 15:38:56 -070044# ----------------------------------------------------------------------------
45
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -070046# 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 -070047
Jeff Gaston54723ef2021-08-16 11:35:08 -040048JAVA_OPTS="$JAVA_OPTS -Dkotlin.incremental.compilation=true" # b/188565660
49
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -070050APP_NAME="Gradle"
51APP_BASE_NAME=`basename "$0"`
52
53# Use the maximum available, or set MAX_FD != -1 to use that value.
54MAX_FD="maximum"
55
56warn ( ) {
57 echo "$*"
58}
59
60die ( ) {
61 echo
62 echo "$*"
63 echo
64 exit 1
65}
66
67# OS specific support (must be 'true' or 'false').
68cygwin=false
69msys=false
70darwin=false
71case "`uname`" in
72 CYGWIN* )
73 cygwin=true
74 ;;
75 Darwin* )
76 darwin=true
77 ;;
78 MINGW* )
79 msys=true
80 ;;
81esac
82
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -070083# Attempt to set APP_HOME
84# Resolve links: $0 may be a link
85PRG="$0"
86# Need this for relative symlinks.
87while [ -h "$PRG" ] ; do
88 ls=`ls -ld "$PRG"`
89 link=`expr "$ls" : '.*-> \(.*\)$'`
90 if expr "$link" : '/.*' > /dev/null; then
91 PRG="$link"
92 else
93 PRG=`dirname "$PRG"`"/$link"
94 fi
95done
96SAVED="`pwd`"
Yigit Boyarf77697d2016-08-16 10:55:36 -070097cd "`dirname \"$PRG\"`/" >/dev/null
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -070098APP_HOME="`pwd -P`"
Yigit Boyarf77697d2016-08-16 10:55:36 -070099cd "$SAVED" >/dev/null
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -0700100
101CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
102
Jeff Gaston79a43f22019-04-09 16:19:12 -0400103# --------- androidx specific code needed for lint and java. ------------------
104
Alan Viveretted38b36c2017-02-01 16:45:31 -0500105# Pick the correct fullsdk for this OS.
Alan Viverette7df63ff2017-03-06 13:12:24 -0500106if [ $darwin == "true" ]; then
Alan Viveretted38b36c2017-02-01 16:45:31 -0500107 plat="darwin"
108else
109 plat="linux"
110fi
111DEFAULT_JVM_OPTS="-DLINT_API_DATABASE=$APP_HOME/../../prebuilts/fullsdk-$plat/platform-tools/api/api-versions.xml"
112
Matthew Fraschilla6ab84fc32019-11-21 16:40:16 -0800113# Tests for lint checks default to using sdk defined by this variable. This removes a lot of
114# setup from each lint module.
115export ANDROID_HOME="$APP_HOME/../../prebuilts/fullsdk-$plat"
Sergey Vasilinetsefab5eb2019-01-04 12:38:06 +0000116# override JAVA_HOME, because CI machines have it and it points to very old JDK
Aurimas Liutikas4b897cb2019-10-14 13:25:08 -0700117export JAVA_HOME="$APP_HOME/../../prebuilts/jdk/jdk11/$plat-x86"
118export JAVA_TOOLS_JAR="$APP_HOME/../../prebuilts/jdk/jdk8/$plat-x86/lib/tools.jar"
119export STUDIO_GRADLE_JDK=$JAVA_HOME
Oussama Ben Abdelbakif825eb52018-12-04 16:17:00 -0500120
Jeff Gaston79a43f22019-04-09 16:19:12 -0400121# ----------------------------------------------------------------------------
122
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -0700123# Determine the Java command to use to start the JVM.
124if [ -n "$JAVA_HOME" ] ; then
125 if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
126 # IBM's JDK on AIX uses strange locations for the executables
127 JAVACMD="$JAVA_HOME/jre/sh/java"
128 else
129 JAVACMD="$JAVA_HOME/bin/java"
130 fi
131 if [ ! -x "$JAVACMD" ] ; then
132 die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
133
134Please set the JAVA_HOME variable in your environment to match the
135location of your Java installation."
136 fi
137else
138 JAVACMD="java"
139 which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
140
141Please set the JAVA_HOME variable in your environment to match the
142location of your Java installation."
143fi
144
145# Increase the maximum file descriptors if we can.
146if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
147 MAX_FD_LIMIT=`ulimit -H -n`
148 if [ $? -eq 0 ] ; then
149 if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
150 MAX_FD="$MAX_FD_LIMIT"
151 fi
152 ulimit -n $MAX_FD
153 if [ $? -ne 0 ] ; then
154 warn "Could not set maximum file descriptor limit: $MAX_FD"
155 fi
156 else
157 warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
158 fi
159fi
160
161# For Darwin, add options to specify how the application appears in the dock
162if $darwin; then
163 GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
164fi
165
166# For Cygwin, switch paths to Windows format before running java
167if $cygwin ; then
168 APP_HOME=`cygpath --path --mixed "$APP_HOME"`
169 CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
Yigit Boyarf77697d2016-08-16 10:55:36 -0700170 JAVACMD=`cygpath --unix "$JAVACMD"`
Xavier Ducrohet0f3d9032014-03-18 17:25:21 -0700171
172 # We build the pattern for arguments to be converted via cygpath
173 ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
174 SEP=""
175 for dir in $ROOTDIRSRAW ; do
176 ROOTDIRS="$ROOTDIRS$SEP$dir"
177 SEP="|"
178 done
179 OURCYGPATTERN="(^($ROOTDIRS))"
180 # Add a user-defined pattern to the cygpath arguments
181 if [ "$GRADLE_CYGPATTERN" != "" ] ; then
182 OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
183 fi
184 # Now convert the arguments - kludge to limit ourselves to /bin/sh
185 i=0
186 for arg in "$@" ; do
187 CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
188 CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
189
190 if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
191 eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
192 else
193 eval `echo args$i`="\"$arg\""
194 fi
195 i=$((i+1))
196 done
197 case $i in
198 (0) set -- ;;
199 (1) set -- "$args0" ;;
200 (2) set -- "$args0" "$args1" ;;
201 (3) set -- "$args0" "$args1" "$args2" ;;
202 (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
203 (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
204 (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
205 (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
206 (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
207 (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
208 esac
209fi
210
211# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
212function splitJvmOpts() {
213 JVM_OPTS=("$@")
214}
215eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
216JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
217
Jeff Gaston826bdbe2019-11-20 14:56:24 -0500218#TODO: Remove HOME_SYSTEM_PROPERTY_ARGUMENT if https://github.com/gradle/gradle/issues/11433 gets fixed
219HOME_SYSTEM_PROPERTY_ARGUMENT=""
220if [ "$GRADLE_USER_HOME" != "" ]; then
221 HOME_SYSTEM_PROPERTY_ARGUMENT="-Duser.home=$GRADLE_USER_HOME"
222fi
Jeff Gaston38004a62019-12-11 15:43:10 -0500223if [ "$TMPDIR" != "" ]; then
224 TMPDIR_ARG="-Djava.io.tmpdir=$TMPDIR"
225fi
Jeff Gaston826bdbe2019-11-20 14:56:24 -0500226
Jeff Gastonbaa2b202021-04-23 15:44:59 -0400227if [[ " ${@} " =~ " --clean " ]]; then
228 cleanCaches=true
229else
230 cleanCaches=false
231fi
232
Jeff Gaston794b0b72021-09-28 12:47:47 -0400233if [[ " ${@} " =~ " --no-ci " ]]; then
234 disableCi=true
235else
236 disableCi=false
237fi
238
Jeff Gaston829fd822021-09-23 11:42:48 -0400239# workaround for https://github.com/gradle/gradle/issues/18386
240if [[ " ${@} " =~ " --profile " ]]; then
241 mkdir -p reports
242fi
243
Jeff Gaston7eafa5d2021-02-10 16:12:54 -0500244# Expand some arguments
Jeff Gaston794b0b72021-09-28 12:47:47 -0400245for compact in "--ci" "--strict" "--clean" "--no-ci"; do
246 expanded=""
Jeff Gaston7eafa5d2021-02-10 16:12:54 -0500247 if [ "$compact" == "--ci" ]; then
Jeff Gaston794b0b72021-09-28 12:47:47 -0400248 if [ "$disableCi" == "false" ]; then
249 expanded="--strict\
250 --stacktrace\
251 -Pandroidx.summarizeStderr\
252 -Pandroidx.enableAffectedModuleDetection\
253 --no-watch-fs"
254 fi
Jeff Gaston4537e142021-01-27 13:08:50 -0500255 fi
Jeff Gaston7eafa5d2021-02-10 16:12:54 -0500256 if [ "$compact" == "--strict" ]; then
257 expanded="-Pandroidx.allWarningsAsErrors\
258 -Pandroidx.validateNoUnrecognizedMessages\
Jeff Gaston55624742021-04-22 14:05:49 -0400259 -Pandroidx.verifyUpToDate\
Jeff Gaston7eafa5d2021-02-10 16:12:54 -0500260 --no-watch-fs\
261 --no-daemon\
262 --offline"
263 fi
Jeff Gaston794b0b72021-09-28 12:47:47 -0400264 # if compact is something else then we parsed the argument above but
265 # still have to remove it (expanded == "") to avoid confusing Gradle
Jeff Gaston7eafa5d2021-02-10 16:12:54 -0500266
Jeff Gastonbaa2b202021-04-23 15:44:59 -0400267 # check whether this particular compat argument was passed (and therefore needs expansion)
268 if [[ " ${@} " =~ " $compact " ]]; then
269 # Expand an individual argument
270 # Start by making a copy of our list of arguments and iterating through the copy
271 for arg in "$@"; do
272 # Remove this argument from our list of arguments.
273 # By the time we've completed this loop, we will have removed the original copy of
274 # each argument, and potentially re-added a new copy or an expansion of each.
275 shift
276 # Determine whether to expand this argument
277 if [ "$arg" == "$compact" ]; then
278 # Add the expansion to our arguments
279 set -- "$@" $expanded
280 if [ "$expanded" != "" ]; then
281 echo "gradlew expanded '$compact' into '$expanded'"
282 echo
283 fi
284 # We avoid re-adding this argument itself back into the list for two reasons:
285 # 1. This argument might not be directly understood by Gradle
286 # 2. We want to enforce that all behaviors enabled by this flag can be toggled independently,
287 # so we don't want it to be easy to inadvertently check for the presence of this flag
288 # specifically
289 else
290 # Add this argument back into our arguments
291 set -- "$@" "$arg"
292 fi
293 done
294 fi
Jeff Gaston4537e142021-01-27 13:08:50 -0500295done
296
Jeff Gastond2806b32021-09-29 12:20:39 -0400297if [[ " ${@} " =~ " --scan " ]]; then
298 if [[ " ${@} " =~ " --offline " ]]; then
299 echo "--scan incompatible with --offline"
300 echo "you could try --no-ci"
301 exit 1
302 fi
303fi
304
Jeff Gastonbaa2b202021-04-23 15:44:59 -0400305function removeCaches() {
306 rm -rf $SCRIPT_PATH/.gradle
307 rm -rf $SCRIPT_PATH/buildSrc/.gradle
308 rm -f $SCRIPT_PATH/local.properties
309 if [ "$GRADLE_USER_HOME" != "" ]; then
310 rm -rf "$GRADLE_USER_HOME"
311 else
312 rm -rf ~/.gradle
313 fi
Jeff Gaston829fd822021-09-23 11:42:48 -0400314 # https://github.com/gradle/gradle/issues/18386
315 rm -rf $SCRIPT_PATH/reports
Jeff Gaston96eb6012021-09-27 14:55:36 +0000316 rm -rf $SCRIPT_PATH/build
Jeff Gastonbaa2b202021-04-23 15:44:59 -0400317 rm -rf $OUT_DIR
318}
319
320if [ "$cleanCaches" == true ]; then
321 echo "IF ./gradlew --clean FIXES YOUR BUILD; OPEN A BUG."
322 echo "In nearly all cases, it should not be necessary to run a clean build."
323 echo
324 echo "You may be more interested in running:"
325 echo
326 echo " ./development/diagnose-build-failure/diagnose-build-failure.sh $*"
327 echo
328 echo "which attempts to diagnose more details about build failures."
329 echo
330 echo "Removing caches"
331 # one case where it is convenient to have a clean build is for double-checking that a build failure isn't due to an incremental build failure
332 # another case where it is convenient to have a clean build is for performance testing
333 # another case where it is convenient to have a clean build is when you're modifying the build and may have introduced some errors but haven't shared your changes yet (at which point you should have fixed the errors)
334 echo
335
336 removeCaches
337fi
338
Jeff Gaston224eb172020-01-09 12:31:47 -0500339function runGradle() {
Jeff Gaston41b90222020-08-18 11:09:55 -0400340 processOutput=false
Jeff Gastone4b4b872020-08-25 09:02:13 -0400341 if [[ " ${@} " =~ " -Pandroidx.validateNoUnrecognizedMessages " ]]; then
Jeff Gaston41b90222020-08-18 11:09:55 -0400342 processOutput=true
343 fi
344 if [[ " ${@} " =~ " -Pandroidx.summarizeStderr " ]]; then
345 processOutput=true
346 fi
347 if [ "$processOutput" == "true" ]; then
348 wrapper="$SCRIPT_PATH/development/build_log_processor.sh"
349 else
350 wrapper=""
351 fi
Jeff Gaston3febf902021-03-16 11:23:15 -0400352
353 PROJECT_CACHE_DIR_ARGUMENT="--project-cache-dir $OUT_DIR/gradle-project-cache"
354 if $wrapper "$JAVACMD" "${JVM_OPTS[@]}" $TMPDIR_ARG -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain $HOME_SYSTEM_PROPERTY_ARGUMENT $TMPDIR_ARG $PROJECT_CACHE_DIR_ARGUMENT "$ORG_GRADLE_JVMARGS" "$@"; then
Jeff Gaston224eb172020-01-09 12:31:47 -0500355 return 0
356 else
357 # Print AndroidX-specific help message if build fails
358 # Have to do this build-failure detection in gradlew rather than in build.gradle
359 # so that this message still prints even if buildSrc itself fails
360 echo
Jeff Gaston61cef332020-12-22 11:23:09 -0500361 echo For help with unexpected failures, see development/diagnose-build-failure/README.md
362 echo
Jeff Gaston69713292020-06-04 12:53:39 -0400363 return 1
364 fi
365}
366
Jeff Gaston400ccb32020-06-08 16:44:58 -0400367if [[ " ${@} " =~ " -PdisallowExecution " ]]; then
Jeff Gaston55624742021-04-22 14:05:49 -0400368 echo "Passing '-PdisallowExecution' directly is forbidden. Did you mean -Pandroidx.verifyUpToDate ?"
Jeff Gaston400ccb32020-06-08 16:44:58 -0400369 echo "See TaskUpToDateValidator.java for more information"
370 exit 1
371fi
372
Jeff Gaston224eb172020-01-09 12:31:47 -0500373if [[ " ${@} " =~ " -PverifyUpToDate " ]]; then
Jeff Gaston55624742021-04-22 14:05:49 -0400374 echo "-PverifyUpToDate has been renamed to -Pandroidx.verifyUpToDate"
375 exit 1
376fi
377
378runGradle "$@"
379# Check whether we were given the "-Pandroidx.verifyUpToDate" argument
380if [[ " ${@} " =~ " -Pandroidx.verifyUpToDate " ]]; then
Jeff Gastoncefdeae2020-03-09 13:12:35 -0400381 # Re-run Gradle, and find all tasks that are unexpectly out of date
Jeff Gastone906e5c2020-11-05 12:33:10 -0500382 if ! runGradle "$@" -PdisallowExecution --continue; then
383 echo >&2
384 echo "TaskUpToDateValidator's second build failed, -PdisallowExecution specified" >&2
385 exit 1
386 fi
Jeff Gastonb89c82b2019-08-21 16:24:09 -0400387fi