settings.gradle
author Nick Alexander <nalexander@mozilla.com>
Thu, 09 May 2019 20:38:48 +0000
changeset 473327 55b7de7850bebd08d85caeb719de711a32f71369
parent 466665 b698ba8b6e2454bd18dbe5b03fb98f8f6ff47df6
child 495732 3282de8d3e5190213b65f32c0a9349fea2bdce7c
permissions -rw-r--r--
Bug 1543982 - Part 1: Avoid re-configuring from within Gradle. r=emilio The inline comment explains what is happening here. The issue is that client.mk is setting MOZ_OBJDIR (and autoconf.mk is setting CC/CXX and others) as part of `mach build`, which means that recursively invoking `mach build` sees a different environment, and that triggers reconfigure. In some situations we can avoid this by recognizing that the environment has changed and setting it back to what it was at the time of `mach build` before client.mk adjusts it. Differential Revision: https://phabricator.services.mozilla.com/D30425

// You might think topsrcdir is '.', but that's not true when the Gradle build
// is launched from within IntelliJ.
def topsrcdir = rootProject.projectDir.absolutePath

def commandLine = ["${topsrcdir}/mach", "environment", "--format", "json", "--verbose"]
if (System.properties['os.name'].toLowerCase().contains('windows')) {
    // gradle is called before parsing config.status, we cannot use PYTHON
    // value.
    if (System.env.MOZILLABUILD) {
        def mozillabuild = System.env.MOZILLABUILD
        if (mozillabuild) {
            commandLine.addAll(0, ["${mozillabuild}/python/python.exe"])
        }
    }
}
def proc = commandLine.execute(null, new File(topsrcdir))
def standardOutput = new ByteArrayOutputStream()
proc.consumeProcessOutput(standardOutput, standardOutput)
proc.waitFor()

// Only show the output if something went wrong.
if (proc.exitValue() != 0) {
    throw new GradleException("Process '${commandLine}' finished with non-zero exit value ${proc.exitValue()}:\n\n${standardOutput.toString()}")
}

import groovy.json.JsonSlurper

def slurper = new JsonSlurper()
def json = slurper.parseText(standardOutput.toString())

if (json.substs.MOZ_BUILD_APP != 'mobile/android') {
    throw new GradleException("Building with Gradle is only supported for Fennec, i.e., MOZ_BUILD_APP == 'mobile/android'.")
}

// Set the Android SDK location.  This is the *least specific* mechanism, which
// is unfortunate: we'd prefer to use the *most specific* mechanism.  That is,
// local.properties (first 'sdk.dir', then 'android.dir') and then the
// environment variable ANDROID_HOME will override this.  That's unfortunate,
// but it's hard to automatically arrange better.
System.setProperty('android.home', json.substs.ANDROID_SDK_ROOT)

include ':annotations'
include ':app'
include ':geckoview'
include ':geckoview_example'
include ':omnijar'
include ':thirdparty'

project(':annotations').projectDir = new File("${json.topsrcdir}/mobile/android/annotations")
project(':app').projectDir = new File("${json.topsrcdir}/mobile/android/app")
project(':geckoview').projectDir = new File("${json.topsrcdir}/mobile/android/geckoview")
project(':geckoview_example').projectDir = new File("${json.topsrcdir}/mobile/android/geckoview_example")
project(':omnijar').projectDir = new File("${json.topsrcdir}/mobile/android/app/omnijar")
project(':thirdparty').projectDir = new File("${json.topsrcdir}/mobile/android/thirdparty")

// The Gradle instance is shared between settings.gradle and all the
// other build.gradle files (see
// http://forums.gradle.org/gradle/topics/define_extension_properties_from_settings_xml).
// We use this ext property to pass the per-object-directory mozconfig
// between scripts.  This lets us execute set-up code before we gradle
// tries to configure the project even once, and as a side benefit
// saves invoking |mach environment| multiple times.
gradle.ext.mozconfig = json

// Produced by `mach build`.  Bug 1543982: the mozconfig determined by `mach
// environment` above can be different because `mach build` itself sets certain
// critical environment variables including MOZ_OBJDIR, CC, and CXX.  We use
// this record to patch up the environment when we recursively invoke `mach
// build ...` commands from within Gradle.  This avoids invalidating configure
// based on the changed environment variables.
def orig = slurper.parse(new File(json.topobjdir, '.mozconfig.json'))
gradle.ext.mozconfig.orig_mozconfig = orig.mozconfig