diff options
Diffstat (limited to 'mobile/android/autopublish-settings.gradle')
-rw-r--r-- | mobile/android/autopublish-settings.gradle | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/mobile/android/autopublish-settings.gradle b/mobile/android/autopublish-settings.gradle new file mode 100644 index 0000000000..8d233abb12 --- /dev/null +++ b/mobile/android/autopublish-settings.gradle @@ -0,0 +1,114 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// This settings file configures an Android project for substituting a +// local Application Services and/or Glean. +// +// For convenience, this file reads the `autoPublish.*` properties from +// `$topsrcdir/local.properties`, so that you only need to set them once +// for all Android projects. +// +// You can also set or override these properties on a per-project basis, +// by setting them in `$topsrcdir/mobile/android/{project}/local.properties`, +// if you want to only substitute App Services or Glean for a specific project, +// or to substitute different versions for different projects. +// +// This settings file configures the build to automatically publish the +// contents of your Application Services and Glean checkouts to the +// Maven local repository. Any dependencies are then substituted to use +// the locally published versions. + +def rootLocalProperties = new File(gradle.mozconfig.topsrcdir, "local.properties").with { localPropertiesFile -> + def localProperties = new Properties() + if (localPropertiesFile.canRead()) { + localPropertiesFile.withInputStream { localProperties.load(it) } + } + localProperties +} + +[ + "autoPublish.application-services.dir", + "autoPublish.glean.dir", +].each { key -> + def relativeOrAbsolutePath = rootLocalProperties."$key" + if (relativeOrAbsolutePath != null) { + def autoPublishDir = new File(gradle.mozconfig.topsrcdir).toPath().resolve(relativeOrAbsolutePath) + gradle.ext."localProperties.$key" = autoPublishDir.toString() + } +} + +gradle.settingsEvaluated { + if (gradle.hasProperty("localProperties.autoPublish.application-services.dir")) { + // The project that we're configuring now might have overridden + // the path from `$topsrcdir/local.properties`, so we need to + // resolve it again. + def appServicesLocalPath = gradle."localProperties.autoPublish.application-services.dir".with { relativeOrAbsolutePath -> + def absolutePath = rootDir.toPath().resolve(relativeOrAbsolutePath).toString() + gradle."localProperties.autoPublish.application-services.dir" = absolutePath + absolutePath + } + + logger.lifecycle("settings.gradle> Enabling automatic publication of application-services from: $appServicesLocalPath") + // Windows can't execute .py files directly, so we assume a "manually installed" python, + // which comes with a "py" launcher and respects the shebang line to specify the version. + def publishAppServicesCmd = []; + if (System.properties["os.name"].toLowerCase().contains("windows")) { + publishAppServicesCmd << "py"; + } + publishAppServicesCmd << "./automation/publish_to_maven_local_if_modified.py"; + runCmd(publishAppServicesCmd, appServicesLocalPath, "Published application-services for local development.", false) + } else { + logger.lifecycle("settings.gradle> Disabled auto-publication of application-services. Enable it by settings 'autoPublish.application-services.dir' in local.properties") + } + + if (gradle.hasProperty("localProperties.autoPublish.glean.dir")) { + // As above, absolutize the path. + def gleanLocalPath = gradle."localProperties.autoPublish.glean.dir".with { relativeOrAbsolutePath -> + def absolutePath = rootDir.toPath().resolve(relativeOrAbsolutePath).toString() + gradle."localProperties.autoPublish.glean.dir" = absolutePath + absolutePath + } + + logger.lifecycle("settings.gradle> Enabling automatic publication of Glean from: $gleanLocalPath") + // As above, hacks to execute .py files on Windows. + def publishGleanCmd = []; + if (System.properties["os.name"].toLowerCase().contains("windows")) { + publishGleanCmd << "py"; + } + publishGleanCmd << "./build-scripts/publish_to_maven_local_if_modified.py"; + runCmd(publishGleanCmd, gleanLocalPath, "Published Glean for local development.", false) + } else { + logger.lifecycle("settings.gradle> Disabled auto-publication of Glean. Enable it by settings 'autoPublish.glean.dir' in local.properties") + } +} + +gradle.projectsLoaded { -> + gradle.rootProject.allprojects { + // Allow local appservices substitution in each project. + if (gradle.hasProperty("localProperties.autoPublish.application-services.dir")) { + def appServicesSrcDir = gradle."localProperties.autoPublish.application-services.dir" + apply from: "${appServicesSrcDir}/build-scripts/substitute-local-appservices.gradle" + } + + // Allow local Glean substitution in each project. + if (gradle.hasProperty('localProperties.autoPublish.glean.dir')) { + def gleanSrcDir = gradle."localProperties.autoPublish.glean.dir" + apply from: "${gleanSrcDir}/build-scripts/substitute-local-glean.gradle" + } + } +} + +def runCmd(cmd, workingDir, successMessage, captureStdout = true) { + def proc = cmd.execute(null, new File(workingDir)) + def standardOutput = captureStdout ? new ByteArrayOutputStream() : System.out + proc.consumeProcessOutput(standardOutput, System.err) + proc.waitFor() + + if (proc.exitValue() != 0) { + throw new GradleException("Process '${cmd}' finished with non-zero exit value ${proc.exitValue()}"); + } else { + logger.lifecycle("settings.gradle> ${successMessage}") + } + return captureStdout ? standardOutput : null +} |