diff options
Diffstat (limited to 'mobile/android/base/Makefile.in')
-rw-r--r-- | mobile/android/base/Makefile.in | 594 |
1 files changed, 594 insertions, 0 deletions
diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in new file mode 100644 index 000000000..fe2f9d3ec --- /dev/null +++ b/mobile/android/base/Makefile.in @@ -0,0 +1,594 @@ +# 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/. + +# We call mach -> Make -> gradle -> mach, which races to find and +# create .mozconfig files and to generate targets. +ifdef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE +.NOTPARALLEL: +endif + +MOZ_BUILDID := $(shell awk '{print $$3}' $(DEPTH)/buildid.h) + +# Set the appropriate version code, based on the existance of the +# MOZ_APP_ANDROID_VERSION_CODE variable. +ifdef MOZ_APP_ANDROID_VERSION_CODE + ANDROID_VERSION_CODE:=$(MOZ_APP_ANDROID_VERSION_CODE) +else + ANDROID_VERSION_CODE:=$(shell $(PYTHON) \ + $(topsrcdir)/python/mozbuild/mozbuild/android_version_code.py \ + --verbose \ + --with-android-cpu-arch=$(ANDROID_CPU_ARCH) \ + $(if $(MOZ_ANDROID_MIN_SDK_VERSION),--with-android-min-sdk=$(MOZ_ANDROID_MIN_SDK_VERSION)) \ + $(if $(MOZ_ANDROID_MAX_SDK_VERSION),--with-android-max-sdk=$(MOZ_ANDROID_MAX_SDK_VERSION)) \ + $(MOZ_BUILDID)) +endif + +DEFINES += \ + -DANDROID_VERSION_CODE=$(ANDROID_VERSION_CODE) \ + -DMOZ_ANDROID_SHARED_ID="$(MOZ_ANDROID_SHARED_ID)" \ + -DMOZ_BUILDID=$(MOZ_BUILDID) \ + $(NULL) + +GARBAGE += \ + classes.dex \ + gecko.ap_ \ + res/values/strings.xml \ + res/raw/browsersearch.json \ + res/raw/suggestedsites.json \ + .aapt.deps \ + GeneratedJNINatives.h \ + GeneratedJNIWrappers.cpp \ + GeneratedJNIWrappers.h \ + FennecJNINatives.h \ + FennecJNIWrappers.cpp \ + FennecJNIWrappers.h \ + $(NULL) + +GARBAGE_DIRS += classes db jars res sync services generated + +# The bootclasspath is functionally identical to the classpath, but allows the +# classes given to redefine classes in core packages, such as java.lang. +# android.jar is here as it provides Android's definition of the Java Standard +# Library. The compatability lib here tweaks a few of the core classes to paint +# over changes in behaviour between versions. +JAVA_BOOTCLASSPATH := \ + $(ANDROID_SDK)/android.jar \ + $(NULL) + +JAVA_BOOTCLASSPATH := $(subst $(NULL) ,:,$(strip $(JAVA_BOOTCLASSPATH))) + +JAVA_CLASSPATH += \ + $(ANDROID_SUPPORT_ANNOTATIONS_JAR_LIB) \ + $(ANDROID_SUPPORT_V4_AAR_LIB) \ + $(ANDROID_SUPPORT_V4_AAR_INTERNAL_LIB) \ + $(ANDROID_APPCOMPAT_V7_AAR_LIB) \ + $(ANDROID_SUPPORT_VECTOR_DRAWABLE_AAR_LIB) \ + $(ANDROID_ANIMATED_VECTOR_DRAWABLE_AAR_LIB) \ + $(ANDROID_CARDVIEW_V7_AAR_LIB) \ + $(ANDROID_DESIGN_AAR_LIB) \ + $(ANDROID_RECYCLERVIEW_V7_AAR_LIB) \ + $(ANDROID_CUSTOMTABS_AAR_LIB) \ + $(ANDROID_PALETTE_V7_AAR_LIB) \ + $(NULL) + +# If native devices are enabled, add Google Play Services and some of the v7 +# compat libraries. +ifdef MOZ_NATIVE_DEVICES + JAVA_CLASSPATH += \ + $(ANDROID_PLAY_SERVICES_BASE_AAR_LIB) \ + $(ANDROID_PLAY_SERVICES_BASEMENT_AAR_LIB) \ + $(ANDROID_PLAY_SERVICES_CAST_AAR_LIB) \ + $(ANDROID_MEDIAROUTER_V7_AAR_LIB) \ + $(ANDROID_MEDIAROUTER_V7_AAR_INTERNAL_LIB) \ + $(NULL) +endif + +ifdef MOZ_ANDROID_GCM + JAVA_CLASSPATH += \ + $(ANDROID_PLAY_SERVICES_BASE_AAR_LIB) \ + $(ANDROID_PLAY_SERVICES_BASEMENT_AAR_LIB) \ + $(ANDROID_PLAY_SERVICES_GCM_AAR_LIB) \ + $(ANDROID_PLAY_SERVICES_MEASUREMENT_AAR_LIB) \ + $(NULL) +endif + +ifdef MOZ_INSTALL_TRACKING + JAVA_CLASSPATH += \ + $(ANDROID_PLAY_SERVICES_ADS_AAR_LIB) \ + $(ANDROID_PLAY_SERVICES_BASEMENT_AAR_LIB) \ + $(NULL) +endif + +JAVA_CLASSPATH := $(subst $(NULL) ,:,$(strip $(JAVA_CLASSPATH))) + +# Library jars that we're bundling: these are subject to Proguard before inclusion +# into classes.dex. +java_bundled_libs := \ + $(ANDROID_SUPPORT_V4_AAR_LIB) \ + $(ANDROID_SUPPORT_V4_AAR_INTERNAL_LIB) \ + $(ANDROID_APPCOMPAT_V7_AAR_LIB) \ + $(ANDROID_SUPPORT_VECTOR_DRAWABLE_AAR_LIB) \ + $(ANDROID_ANIMATED_VECTOR_DRAWABLE_AAR_LIB) \ + $(ANDROID_CARDVIEW_V7_AAR_LIB) \ + $(ANDROID_DESIGN_AAR_LIB) \ + $(ANDROID_RECYCLERVIEW_V7_AAR_LIB) \ + $(ANDROID_CUSTOMTABS_AAR_LIB) \ + $(ANDROID_PALETTE_V7_AAR_LIB) \ + $(NULL) + +ifdef MOZ_NATIVE_DEVICES + java_bundled_libs += \ + $(ANDROID_PLAY_SERVICES_BASE_AAR_LIB) \ + $(ANDROID_PLAY_SERVICES_BASEMENT_AAR_LIB) \ + $(ANDROID_PLAY_SERVICES_CAST_AAR_LIB) \ + $(ANDROID_MEDIAROUTER_V7_AAR_LIB) \ + $(ANDROID_MEDIAROUTER_V7_AAR_INTERNAL_LIB) \ + $(NULL) +endif + +ifdef MOZ_ANDROID_GCM + java_bundled_libs += \ + $(ANDROID_PLAY_SERVICES_BASE_AAR_LIB) \ + $(ANDROID_PLAY_SERVICES_BASEMENT_AAR_LIB) \ + $(ANDROID_PLAY_SERVICES_GCM_AAR_LIB) \ + $(ANDROID_PLAY_SERVICES_MEASUREMENT_AAR_LIB) \ + $(NULL) +endif + +ifdef MOZ_INSTALL_TRACKING + java_bundled_libs += \ + $(ANDROID_PLAY_SERVICES_ADS_AAR_LIB) \ + $(ANDROID_PLAY_SERVICES_BASEMENT_AAR_LIB) \ + $(NULL) +endif + +# uniq purloined from http://stackoverflow.com/a/16151140. +uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1))) + +java_bundled_libs := $(call uniq,$(java_bundled_libs)) +java_bundled_libs := $(subst $(NULL) ,:,$(strip $(java_bundled_libs))) + +GECKOVIEW_JARS = \ + constants.jar \ + gecko-R.jar \ + gecko-mozglue.jar \ + gecko-util.jar \ + gecko-view.jar \ + sync-thirdparty.jar \ + $(NULL) + +ifdef MOZ_INSTALL_TRACKING +GECKOVIEW_JARS += gecko-thirdparty-adjust_sdk.jar +endif + +geckoview_jars_classpath := $(subst $(NULL) ,:,$(strip $(GECKOVIEW_JARS))) + +FENNEC_JARS = \ + gecko-browser.jar \ + gecko-thirdparty.jar \ + services.jar \ + ../javaaddons/javaaddons-1.0.jar \ + $(NULL) + +ifdef MOZ_WEBRTC +FENNEC_JARS += webrtc.jar +endif + +ifdef MOZ_ANDROID_SEARCH_ACTIVITY +FENNEC_JARS += search-activity.jar +endif + +ifdef MOZ_ANDROID_MLS_STUMBLER +FENNEC_JARS += ../stumbler/stumbler.jar +endif + +# All the jars we're compiling from source. (not to be confused with +# java_bundled_libs, which holds the jars which we're including as binaries). +ALL_JARS = \ + $(GECKOVIEW_JARS) \ + $(FENNEC_JARS) \ + $(NULL) + +# The list of jars in Java classpath notation (colon-separated). +all_jars_classpath := $(subst $(NULL) ,:,$(strip $(ALL_JARS))) + +include $(topsrcdir)/config/config.mk + +library_jars := \ + $(ANDROID_SDK)/android.jar \ + $(NULL) + +# Android 23 (Marshmallow) deprecated a part of the Android platform, namely the +# org.apache.http package. Fennec removed all code that referenced said package +# in order to easily ship to Android 23 devices (and, by extension, all devices +# before Android 23). +# +# Google did not remove all code that referenced said package in their own +# com.google.android.gms namespace! It turns out that the org.apache.http +# package is not removed, only deprecated and hidden by default. Google added a +# a `useLibrary` Gradle directive that allows legacy code to reference the +# package, which is still (hidden) in the Android 23 platform. +# +# Fennec code doesn't need to compile against the deprecated package, since our +# code doesn't reference the package anymore. However, we do need to Proguard +# against the deprecated package. If we don't, Proguard -- which is a global +# optimization -- sees Google libraries referencing "non-existent" libraries and +# complains. The solution is to mimic the `useLibraries` directive by declaring +# the legacy package as a provided library jar. +# +# See https://bugzilla.mozilla.org/show_bug.cgi?id=1233238#c19 for symptoms and +# more discussion. +ifdef MOZ_INSTALL_TRACKING +library_jars += $(ANDROID_SDK)/optional/org.apache.http.legacy.jar +endif # MOZ_INSTALL_TRACKING + +library_jars := $(subst $(NULL) ,:,$(strip $(library_jars))) + +gradle_dir := $(topobjdir)/gradle/build/mobile/android + +ifdef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE +.gradle.deps: .aapt.deps FORCE + @$(TOUCH) $@ + $(topsrcdir)/mach gradle \ + app:assembleAutomationDebug app:assembleAutomationDebugAndroidTest -x lint + +classes.dex: .gradle.deps + $(REPORT_BUILD) + cp $(gradle_dir)/app/intermediates/transforms/dex/automation/debug/folders/1000/1f/main/classes.dex $@ +else +classes.dex: .proguard.deps + $(REPORT_BUILD) + $(DX) --dex --output=classes.dex jars-proguarded +endif + +ifdef MOZ_DISABLE_PROGUARD + PROGUARD_PASSES=0 +else + ifdef MOZ_DEBUG + PROGUARD_PASSES=1 + else + ifndef MOZILLA_OFFICIAL + PROGUARD_PASSES=1 + else + PROGUARD_PASSES=6 + endif + endif +endif + +proguard_config_dir=$(topsrcdir)/mobile/android/config/proguard + +# This stanza ensures that the set of GeckoView classes does not depend on too +# much of Fennec, where "too much" is defined as the set of potentially +# non-GeckoView classes that GeckoView already depended on at a certain point in +# time. The idea is to set a high-water mark that is not to be crossed. +classycle_jar := $(topsrcdir)/mobile/android/build/classycle/classycle-1.4.1.jar +.geckoview.deps: geckoview.ddf $(classycle_jar) $(ALL_JARS) + $(JAVA) -cp $(classycle_jar) \ + classycle.dependency.DependencyChecker \ + -mergeInnerClasses \ + -dependencies=@$< \ + $(ALL_JARS) + @$(TOUCH) $@ + +# First, we delete debugging information from libraries. Having line-number +# information for libraries for which we lack the source isn't useful, so this +# saves us a bit of space. Importantly, Proguard has a bug causing it to +# sometimes corrupt this information if present (which it does for some of the +# included libraries). This corruption prevents dex from completing, so we need +# to get rid of it. This prevents us from seeing line numbers in stack traces +# for stack frames inside libraries. +# +# This step can occur much earlier than the main Proguard pass: it needs only +# gecko-R.jar to have been compiled (as that's where the library R.java files +# end up), but it does block the main Proguard pass. +.bundled.proguard.deps: gecko-R.jar $(proguard_config_dir)/strip-libs.cfg + $(REPORT_BUILD) + @$(TOUCH) $@ + $(JAVA) \ + -Xmx512m -Xms128m \ + -jar $(ANDROID_SDK_ROOT)/tools/proguard/lib/proguard.jar \ + @$(proguard_config_dir)/strip-libs.cfg \ + -injars $(subst ::,:,$(java_bundled_libs))\ + -outjars bundled-jars-nodebug \ + -libraryjars $(library_jars):gecko-R.jar + +# We touch the target file before invoking Proguard so that Proguard's +# outputs are fresher than the target, preventing a subsequent +# invocation from thinking Proguard's outputs are stale. This is safe +# because Make removes the target file if any recipe command fails. +.proguard.deps: .geckoview.deps .bundled.proguard.deps $(ALL_JARS) $(proguard_config_dir)/proguard.cfg + $(REPORT_BUILD) + @$(TOUCH) $@ + $(JAVA) \ + -Xmx512m -Xms128m \ + -jar $(ANDROID_SDK_ROOT)/tools/proguard/lib/proguard.jar \ + @$(proguard_config_dir)/proguard.cfg \ + -optimizationpasses $(PROGUARD_PASSES) \ + -injars $(subst ::,:,$(all_jars_classpath)):bundled-jars-nodebug \ + -outjars jars-proguarded \ + -libraryjars $(library_jars) + +ANNOTATION_PROCESSOR_JAR_FILES := $(DEPTH)/build/annotationProcessors/annotationProcessors.jar + +# This annotation processing step also generates +# GeneratedJNIWrappers.h and GeneratedJNINatives.h +GeneratedJNIWrappers.cpp: $(ANNOTATION_PROCESSOR_JAR_FILES) $(GECKOVIEW_JARS) + $(JAVA) -classpath $(geckoview_jars_classpath):$(JAVA_BOOTCLASSPATH):$(JAVA_CLASSPATH):$(ANNOTATION_PROCESSOR_JAR_FILES) \ + org.mozilla.gecko.annotationProcessors.AnnotationProcessor \ + Generated $(GECKOVIEW_JARS) + +# This annotation processing step also generates +# FennecJNIWrappers.h and FennecJNINatives.h +FennecJNIWrappers.cpp: $(ANNOTATION_PROCESSOR_JAR_FILES) $(FENNEC_JARS) + $(JAVA) -classpath $(all_jars_classpath):$(JAVA_BOOTCLASSPATH):$(JAVA_CLASSPATH):$(ANNOTATION_PROCESSOR_JAR_FILES) \ + org.mozilla.gecko.annotationProcessors.AnnotationProcessor \ + Fennec $(FENNEC_JARS) + +# Certain source files need to be preprocessed. This special rule +# generates these files into generated/org/mozilla/gecko for +# consumption by the build system and IDEs. + +# The list in moz.build looks like +# 'preprocessed/org/mozilla/gecko/AppConstants.java'. The list in +# constants_PP_JAVAFILES looks like +# 'generated/preprocessed/org/mozilla/gecko/AppConstants.java'. We +# need to write AppConstants.java.in to +# generated/preprocessed/org/mozilla/gecko. +preprocessed := $(addsuffix .in,$(subst generated/preprocessed/org/mozilla/gecko/,,$(filter generated/preprocessed/org/mozilla/gecko/%,$(constants_PP_JAVAFILES)))) + +preprocessed_PATH := generated/preprocessed/org/mozilla/gecko +preprocessed_KEEP_PATH := 1 +preprocessed_FLAGS := --marker='//\\\#' + +PP_TARGETS += preprocessed + +include $(topsrcdir)/config/rules.mk + +not_android_res_files := \ + *.mkdir.done* \ + *.DS_Store* \ + *\#* \ + *.rej \ + *.orig \ + $(NULL) + +# This uses the fact that Android resource directories list all +# resource files one subdirectory below the parent resource directory. +android_res_files := $(filter-out $(not_android_res_files),$(wildcard $(addsuffix /*,$(wildcard $(addsuffix /*,$(ANDROID_RES_DIRS)))))) + +$(ANDROID_GENERATED_RESFILES): $(call mkdir_deps,$(sort $(dir $(ANDROID_GENERATED_RESFILES)))) + +# [Comment 1/3] We don't have correct dependencies for strings.xml at +# this point, so we always recursively invoke the submake to check the +# dependencies. Sigh. And, with multilocale builds, there will be +# multiple strings.xml files, and we need to rebuild gecko.ap_ if any +# of them change. But! mobile/android/base/locales does not have +# enough information to actually build res/values/strings.xml during a +# language repack. So rather than adding rules into the main +# makefile, and trying to work around the lack of information, we +# force a rebuild of gecko.ap_ during packaging. See below. + +# Since the sub-Make is forced, it doesn't matter that we touch the +# target file before the command. If in the future we stop forcing +# the sub-Make, touching the target file first is better, because the +# sub-Make outputs will be fresher than the target, and not require +# rebuilding. This is all safe because Make removes the target file +# if any recipe command fails. It is crucial that the sub-Make touch +# the target files (those depending on .locales.deps) only when there +# contents have changed; otherwise, this will force rebuild them as +# part of every build. +.locales.deps: FORCE + $(TOUCH) $@ + $(MAKE) -C locales + + +# This .deps pattern saves an invocation of the sub-Make: the single +# invocation generates strings.xml, browsersearch.json, and +# suggestedsites.json. The trailing semi-colon defines an empty +# recipe: defining no recipe at all causes Make to treat the target +# differently, in a way that defeats our dependencies. +res/values/strings.xml: .locales.deps ; +res/raw/browsersearch.json: .locales.deps ; +res/raw/suggestedsites.json: .locales.deps ; + +all_resources = \ + $(DEPTH)/mobile/android/base/AndroidManifest.xml \ + $(android_res_files) \ + $(ANDROID_GENERATED_RESFILES) \ + $(NULL) + +# All of generated/org/mozilla/gecko/R.java, gecko.ap_, and R.txt are +# produced by aapt; this saves aapt invocations. The trailing +# semi-colon defines an empty recipe; defining no recipe at all causes +# Make to treat the target differently, in a way that defeats our +# dependencies. + +generated/org/mozilla/gecko/R.java: .aapt.deps ; + +# Only add libraries that contain resources here. We (unecessarily) generate an identical R.java which +# is copied into each of these locations, and each of these files contains thousands of fields. +# Each unnecessary copy therefore wastes unnecessary fields in the output dex file. +# Note: usually proguard will help clean this up after the fact, but having too many fields will cause +# dexing to fail, regardless of any later optimisations proguard could later make to bring us back +# under the limit. +# Ideally we would fix our aapt invocations to correctly generate minimal copies of R.java for each +# package, but that seems redundant since gradle builds are able to correctly generate these files. + +# If native devices are enabled, add Google Play Services, build their resources +# (no resources) generated/android/support/v4/R.java: .aapt.deps ; +generated/android/support/v7/appcompat/R.java: .aapt.deps ; +# (no resources) generated/android/support/graphics/drawable/animated/R.java: .aapt.deps ; +# (no resources) generated/android/support/graphics/drawable/R.java: .aapt.deps ; +generated/android/support/v7/cardview/R.java: .aapt.deps ; +generated/android/support/design/R.java: .aapt.deps ; +generated/android/support/v7/mediarouter/R.java: .aapt.deps ; +generated/android/support/v7/recyclerview/R.java: .aapt.deps ; +# (no resources) generated/android/support/customtabs/R.java: .aapt.deps ; +# (no resources) generated/android/support/v7/palette/R.java: .aapt.deps ; +generated/com/google/android/gms/R.java: .aapt.deps ; +generated/com/google/android/gms/ads/R.java: .aapt.deps ; +generated/com/google/android/gms/base/R.java: .aapt.deps ; +generated/com/google/android/gms/cast/R.java: .aapt.deps ; +# (no resources) generated/com/google/android/gms/gcm/R.java: .aapt.deps ; +# (no resources) generated/com/google/android/gms/measurement/R.java: .aapt.deps ; + +gecko.ap_: .aapt.deps ; +R.txt: .aapt.deps ; + +# [Comment 2/3] This tom-foolery provides a target that forces a +# rebuild of gecko.ap_. This is used during packaging to ensure that +# resources are fresh. The alternative would be complicated; see +# [Comment 1/3]. + +gecko-nodeps/R.java: .aapt.nodeps ; +gecko-nodeps.ap_: .aapt.nodeps ; +gecko-nodeps/R.txt: .aapt.nodeps ; + +# This ignores the default set of resources ignored by aapt, plus +# files starting with '#'. (Emacs produces temp files named #temp#.) +# This doesn't actually set the environment variable; it's used as a +# parameter in the aapt invocation below. Consider updating +# not_android_res_files as well. + +ANDROID_AAPT_IGNORE := !.svn:!.git:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~:\#*:*.rej:*.orig + +# 1: target file. +# 2: dependencies. +# 3: name of ap_ file to write. +# 4: directory to write R.java into. +# 5: directory to write R.txt into. +# We touch the target file before invoking aapt so that aapt's outputs +# are fresher than the target, preventing a subsequent invocation from +# thinking aapt's outputs are stale. This is safe because Make +# removes the target file if any recipe command fails. + +define aapt_command +$(1): $$(call mkdir_deps,$(filter-out ./,$(dir $(3) $(4) $(5)))) $(2) + @$$(TOUCH) $$@ + $$(AAPT) package -f -m \ + -M AndroidManifest.xml \ + -I $(ANDROID_SDK)/android.jar \ + $(if $(MOZ_ANDROID_MAX_SDK_VERSION),--max-res-version $(MOZ_ANDROID_MAX_SDK_VERSION),) \ + --auto-add-overlay \ + $$(addprefix -S ,$$(ANDROID_RES_DIRS)) \ + $$(addprefix -A ,$$(ANDROID_ASSETS_DIRS)) \ + $(if $(ANDROID_EXTRA_PACKAGES),--extra-packages $$(subst $$(NULL) ,:,$$(strip $$(ANDROID_EXTRA_PACKAGES)))) \ + $(if $(ANDROID_EXTRA_RES_DIRS),$$(addprefix -S ,$$(ANDROID_EXTRA_RES_DIRS))) \ + --custom-package org.mozilla.gecko \ + --no-version-vectors \ + -F $(3) \ + -J $(4) \ + --output-text-symbols $(5) \ + --ignore-assets "$$(ANDROID_AAPT_IGNORE)" +endef + +# [Comment 3/3] The first of these rules is used during regular +# builds. The second writes an ap_ file that is only used during +# packaging. It doesn't write the normal ap_, or R.java, since we +# don't want the packaging step to write anything that would make a +# further no-op build do work. See also +# toolkit/mozapps/installer/packager.mk. + +# .aapt.deps: $(all_resources) +$(eval $(call aapt_command,.aapt.deps,$(all_resources),gecko.ap_,generated/,./)) + +ifdef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE +.aapt.nodeps: FORCE + cp $(gradle_dir)/app/intermediates/res/resources-automation-debug.ap_ gecko-nodeps.ap_ +else +# .aapt.nodeps: $(DEPTH)/mobile/android/base/AndroidManifest.xml FORCE +$(eval $(call aapt_command,.aapt.nodeps,$(DEPTH)/mobile/android/base/AndroidManifest.xml FORCE,gecko-nodeps.ap_,gecko-nodeps/,gecko-nodeps/)) +endif + +# Override the Java settings with some specific android settings +include $(topsrcdir)/config/android-common.mk + +update-generated-wrappers: + @cp $(CURDIR)/GeneratedJNIWrappers.cpp \ + $(CURDIR)/GeneratedJNIWrappers.h \ + $(CURDIR)/GeneratedJNINatives.h $(topsrcdir)/widget/android + @echo Updated generated JNI code + +update-fennec-wrappers: + @cp $(CURDIR)/FennecJNIWrappers.cpp \ + $(CURDIR)/FennecJNIWrappers.h \ + $(CURDIR)/FennecJNINatives.h $(topsrcdir)/widget/android/fennec + @echo Updated Fennec JNI code + +.PHONY: update-generated-wrappers + +# This target is only used by IDE integrations. It rebuilds resources +# that end up in omni.ja using the equivalent of |mach build faster|, +# does most of the packaging step, and then updates omni.ja in +# place. If you're not using an IDE, you should be using |mach build +# mobile/android && mach package|. +$(ABS_DIST)/fennec/$(OMNIJAR_NAME): FORCE + $(REPORT_BUILD) + $(MAKE) -C ../../../faster + $(MAKE) -C ../installer stage-package + $(MKDIR) -p $(@D) + rsync --update $(DIST)/fennec/$(notdir $(OMNIJAR_NAME)) $@ + $(RM) $(DIST)/fennec/$(notdir $(OMNIJAR_NAME)) + +# Targets built very early during a Gradle build. +gradle-targets: $(foreach f,$(constants_PP_JAVAFILES),$(f)) +gradle-targets: $(DEPTH)/mobile/android/base/AndroidManifest.xml +gradle-targets: $(ANDROID_GENERATED_RESFILES) + +ifndef MOZILLA_OFFICIAL +# Local developers update omni.ja during their builds. There's a +# chicken-and-egg problem here. +gradle-omnijar: $(abspath $(DIST)/fennec/$(OMNIJAR_NAME)) +else +# In automation, omni.ja is built only during packaging. +gradle-omnijar: +endif + +.PHONY: gradle-targets gradle-omnijar + +# GeneratedJNIWrappers.cpp target also generates +# GeneratedJNIWrappers.h and GeneratedJNINatives.h +# FennecJNIWrappers.cpp target also generates +# FennecJNIWrappers.h and FennecJNINatives.h +ifndef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE +libs:: GeneratedJNIWrappers.cpp + @(diff GeneratedJNIWrappers.cpp $(topsrcdir)/widget/android/GeneratedJNIWrappers.cpp >/dev/null && \ + diff GeneratedJNIWrappers.h $(topsrcdir)/widget/android/GeneratedJNIWrappers.h >/dev/null && \ + diff GeneratedJNINatives.h $(topsrcdir)/widget/android/GeneratedJNINatives.h >/dev/null) || \ + (echo '*****************************************************' && \ + echo '*** Error: The generated JNI code has changed ***' && \ + echo '* To update generated code in the tree, please run *' && \ + echo && \ + echo ' make -C $(CURDIR) update-generated-wrappers' && \ + echo && \ + echo '* Repeat the build, and check in any changes. *' && \ + echo '*****************************************************' && \ + exit 1) + +libs:: FennecJNIWrappers.cpp + @(diff FennecJNIWrappers.cpp $(topsrcdir)/widget/android/fennec/FennecJNIWrappers.cpp >/dev/null && \ + diff FennecJNIWrappers.h $(topsrcdir)/widget/android/fennec/FennecJNIWrappers.h >/dev/null && \ + diff FennecJNINatives.h $(topsrcdir)/widget/android/fennec/FennecJNINatives.h >/dev/null) || \ + (echo '*****************************************************' && \ + echo '*** Error: The Fennec JNI code has changed ***' && \ + echo '* To update generated code in the tree, please run *' && \ + echo && \ + echo ' make -C $(CURDIR) update-fennec-wrappers' && \ + echo && \ + echo '* Repeat the build, and check in any changes. *' && \ + echo '*****************************************************' && \ + exit 1) +endif + +libs:: classes.dex + $(INSTALL) classes.dex $(FINAL_TARGET) + +# Generate Java binder interfaces from AIDL files. +aidl_src_path := $(srcdir)/aidl +aidl_target_path := generated +media_pkg := org/mozilla/gecko/media + +$(aidl_target_path)/$(media_pkg)/%.java:$(aidl_src_path)/$(media_pkg)/%.aidl + @echo "Processing AIDL: $< => $@" + $(AIDL) -p$(ANDROID_SDK)/framework.aidl -I$(aidl_src_path) -o$(aidl_target_path) $< |