diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index f07a1b68bfe9..881d1518dda0 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -30,6 +30,7 @@ generated_resources := \ $(NULL) generated_files := \ + ../geckoview/generated/preprocessed/org/mozilla/geckoview/BuildConfig.java \ AndroidManifest.xml \ generated/preprocessed/org/mozilla/gecko/AdjustConstants.java \ generated/preprocessed/org/mozilla/gecko/AppConstants.java \ diff --git a/mobile/android/base/moz.build b/mobile/android/base/moz.build index 0f1138171cde..8843e83f9d58 100644 --- a/mobile/android/base/moz.build +++ b/mobile/android/base/moz.build @@ -112,11 +112,15 @@ with Files('../app/src/*/res/menu/browsersearch_contextmenu.xml'): DIRS += ['locales'] GENERATED_FILES += [ + '../geckoview/generated/preprocessed/org/mozilla/geckoview/BuildConfig.java', 'AndroidManifest.xml', 'generated/preprocessed/org/mozilla/gecko/AdjustConstants.java', 'generated/preprocessed/org/mozilla/gecko/AppConstants.java', 'generated/preprocessed/org/mozilla/gecko/MmaConstants.java', ] +w = GENERATED_FILES['../geckoview/generated/preprocessed/org/mozilla/geckoview/BuildConfig.java'] +w.script = 'generate_build_config.py:generate_java' +w.inputs += ['../geckoview/BuildConfig.java.in'] x = GENERATED_FILES['generated/preprocessed/org/mozilla/gecko/AdjustConstants.java'] x.script = 'generate_build_config.py:generate_java' x.inputs += ['AdjustConstants.java.in'] diff --git a/mobile/android/geckoview/BuildConfig.java.in b/mobile/android/geckoview/BuildConfig.java.in new file mode 100644 index 000000000000..8137ccddfa54 --- /dev/null +++ b/mobile/android/geckoview/BuildConfig.java.in @@ -0,0 +1,106 @@ +//#filter substitution +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- + * 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/. */ + +package org.mozilla.geckoview; + +import android.os.Build; + +/** + * A collection of constants that pertain to the build state of the GeckoView + * library, sourced from build-time definitions. This is a partial Java-side + * substitute for nsIXULAppInfo, amongst other things. + * + * See also SysInfo.java, which includes some of the values available from + * nsSystemInfo inside Gecko. + */ +public class BuildConfig { + public static final String GRE_MILESTONE = "@GRE_MILESTONE@"; + + public static final String MOZ_APP_ABI = "@MOZ_APP_ABI@"; + public static final String MOZ_APP_BASENAME = "@MOZ_APP_BASENAME@"; + + // For the benefit of future archaeologists: + // GRE_BUILDID is exactly the same as MOZ_APP_BUILDID unless you're running + // on XULRunner, which is never the case on Android. + public static final String MOZ_APP_BUILDID = "@MOZ_BUILDID@"; + public static final String MOZ_APP_ID = "@MOZ_APP_ID@"; + public static final String MOZ_APP_NAME = "@MOZ_APP_NAME@"; + public static final String MOZ_APP_VENDOR = "@MOZ_APP_VENDOR@"; + public static final String MOZ_APP_VERSION = "@MOZ_APP_VERSION@"; + public static final String MOZ_APP_DISPLAYNAME = "@MOZ_APP_DISPLAYNAME@"; + public static final String MOZ_APP_UA_NAME = "@MOZ_APP_UA_NAME@"; + + // MOZILLA_VERSION is already quoted when it gets substituted in. If we + // add additional quotes we end up with ""x.y"", which is a syntax error. + public static final String MOZILLA_VERSION = @MOZILLA_VERSION@; + public static final String OMNIJAR_NAME = "@OMNIJAR_NAME@"; + + public static final String USER_AGENT_GECKOVIEW_MOBILE = "Mozilla/5.0 (Android " + + Build.VERSION.RELEASE + "; Mobile; rv:" + + MOZ_APP_VERSION + ") Gecko/" + + MOZ_APP_VERSION + " GeckoView/" + + MOZ_APP_VERSION; + + public static final String USER_AGENT_GECKOVIEW_TABLET = "Mozilla/5.0 (Android " + + Build.VERSION.RELEASE + "; Tablet; rv:" + + MOZ_APP_VERSION + ") Gecko/" + + MOZ_APP_VERSION + " GeckoView/" + + MOZ_APP_VERSION; + + /** + * Target CPU architecture: "armeabi-v7a", "arm64-v8a", "x86", "mips", .. + */ + public static final String ANDROID_CPU_ARCH = "@ANDROID_CPU_ARCH@"; + + public static final String MOZ_UPDATE_CHANNEL = "@MOZ_UPDATE_CHANNEL@"; + + public static final int MIN_SDK_VERSION = @MOZ_ANDROID_MIN_SDK_VERSION@; + + // Is the underlying compiled C/C++ code compiled with --enable-debug? + public static final boolean DEBUG_BUILD = +//#ifdef MOZ_DEBUG + true; +//#else + false; +//#endif + + // See this wiki page for more details about channel specific build defines: + // https://wiki.mozilla.org/Platform/Channel-specific_build_defines + // This makes no sense for GeckoView and should be removed as soon as possible. + public static final boolean RELEASE_OR_BETA = +//#ifdef RELEASE_OR_BETA + true; +//#else + false; +//#endif + + // This makes no sense for GeckoView and should be removed as soon as possible. + public static final boolean NIGHTLY_BUILD = +//#ifdef NIGHTLY_BUILD + true; +//#else + false; +//#endif + + // This makes no sense for GeckoView and should be removed as soon as possible. + public static final boolean MOZ_CRASHREPORTER = +//#ifdef MOZ_CRASHREPORTER + true; +//#else + false; +//#endif + + // Official corresponds, roughly, to whether this build is performed on + // Mozilla's continuous integration infrastructure. You should disable + // developer-only functionality when this flag is set. + // This makes no sense for GeckoView and should be removed as soon as possible. + public static final boolean MOZILLA_OFFICIAL = +//#ifdef MOZILLA_OFFICIAL + true; +//#else + false; +//#endif +} diff --git a/mobile/android/geckoview/build.gradle b/mobile/android/geckoview/build.gradle index a74aca6084d2..9f26fd85d7c4 100644 --- a/mobile/android/geckoview/build.gradle +++ b/mobile/android/geckoview/build.gradle @@ -53,6 +53,8 @@ android { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + // TODO: ensure these fields always agree with mobile/android/geckoview/BuildConfig.java.in, + // either by diffing the processed files or by generating the output from a single source. buildConfigField 'String', "GRE_MILESTONE", "\"${mozconfig.substs.GRE_MILESTONE}\"" // This should really come from the included binaries, but that's not easy. buildConfigField 'String', "MOZ_APP_ABI", mozconfig.substs['COMPILE_ENVIRONMENT'] ? "\"${ mozconfig.substs.TARGET_XPCOM_ABI}\"" : '"arm-eabi-gcc3"'; diff --git a/python/mozbuild/mozbuild/backend/recursivemake.py b/python/mozbuild/mozbuild/backend/recursivemake.py index dd9020d62dbc..dbab2e2724e4 100644 --- a/python/mozbuild/mozbuild/backend/recursivemake.py +++ b/python/mozbuild/mozbuild/backend/recursivemake.py @@ -29,6 +29,10 @@ from mozbuild.frontend.context import ( ) from .common import CommonBackend from ..frontend.data import ( + AndroidAssetsDirs, + AndroidResDirs, + AndroidExtraResDirs, + AndroidExtraPackages, BaseLibrary, BaseProgram, ChromeManifestEntry, diff --git a/python/mozbuild/mozbuild/frontend/data.py b/python/mozbuild/mozbuild/frontend/data.py index 442fc9e0af19..2e5f8779bb0b 100644 --- a/python/mozbuild/mozbuild/frontend/data.py +++ b/python/mozbuild/mozbuild/frontend/data.py @@ -1133,6 +1133,59 @@ class GeneratedFile(ContextDerived): self.required_for_compile = any(f.endswith(suffixes) for f in self.outputs) +class AndroidResDirs(ContextDerived): + """Represents Android resource directories.""" + + __slots__ = ( + 'paths', + ) + + def __init__(self, context, paths): + ContextDerived.__init__(self, context) + self.paths = paths + + +class AndroidAssetsDirs(ContextDerived): + """Represents Android assets directories.""" + + __slots__ = ( + 'paths', + ) + + def __init__(self, context, paths): + ContextDerived.__init__(self, context) + self.paths = paths + + +class AndroidExtraResDirs(ContextDerived): + """Represents Android extra resource directories. + + Extra resources are resources provided by libraries and including in a + packaged APK, but not otherwise redistributed. In practice, this means + resources included in Fennec but not in GeckoView. + """ + + __slots__ = ( + 'paths', + ) + + def __init__(self, context, paths): + ContextDerived.__init__(self, context) + self.paths = paths + + +class AndroidExtraPackages(ContextDerived): + """Represents Android extra packages.""" + + __slots__ = ( + 'packages', + ) + + def __init__(self, context, packages): + ContextDerived.__init__(self, context) + self.packages = packages + + class ChromeManifestEntry(ContextDerived): """Represents a chrome.manifest entry.""" diff --git a/python/mozbuild/mozbuild/frontend/emitter.py b/python/mozbuild/mozbuild/frontend/emitter.py index ada144219144..91238ed9b965 100644 --- a/python/mozbuild/mozbuild/frontend/emitter.py +++ b/python/mozbuild/mozbuild/frontend/emitter.py @@ -23,6 +23,10 @@ import mozinfo import pytoml from .data import ( + AndroidAssetsDirs, + AndroidExtraPackages, + AndroidExtraResDirs, + AndroidResDirs, BaseRustProgram, BaseSources, ChromeManifestEntry,