зеркало из https://github.com/mozilla/gecko-dev.git
658 строки
25 KiB
Makefile
658 строки
25 KiB
Makefile
# 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
|
|
|
|
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
|
|
|
|
gradle_dir := $(topobjdir)/gradle/build/mobile/android
|
|
|
|
# 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
|
|
|
|
# MOZ_ANDROID_MMA requires MOZ_ANDROID_GCM and MOZ_NATIVE_DEVICES,
|
|
# which take care of the Play Services requirements in JAVA_CLASSPATH.
|
|
# Based on the import of
|
|
# `com.google.android.gms.ads.identifier.AdvertisingIdClient` in
|
|
# `com.leanplum.internal.Util` one would assume that
|
|
# `play-services-ads` is required, by in version 8.4.0 (at least) that
|
|
# class is defined in `play-services-basement`. Therefore, unlike
|
|
# MOZ_INSTALL_TRACKING, we don't need to depend on
|
|
# `play-services-ads`.
|
|
|
|
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
|
|
|
|
# MOZ_ANDROID_MMA requires MOZ_ANDROID_GCM and MOZ_NATIVE_DEVICES,
|
|
# which take care of the Play Services requirements in
|
|
# java_bundled_libs. See the note above.
|
|
|
|
# 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)))
|
|
|
|
ifndef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
|
|
GECKOVIEW_JARS = \
|
|
constants.jar \
|
|
gecko-R.jar \
|
|
gecko-mozglue.jar \
|
|
gecko-util.jar \
|
|
gecko-view.jar \
|
|
sync-thirdparty.jar \
|
|
$(NULL)
|
|
|
|
ifdef MOZ_WEBRTC
|
|
GECKOVIEW_JARS += webrtc.jar
|
|
endif
|
|
|
|
ifdef MOZ_INSTALL_TRACKING
|
|
GECKOVIEW_JARS += gecko-thirdparty-adjust_sdk.jar
|
|
endif
|
|
|
|
ifdef MOZ_ANDROID_MMA
|
|
GECKOVIEW_JARS += gecko-thirdparty-leanplum_sdk.jar
|
|
endif
|
|
|
|
FENNEC_JARS = \
|
|
gecko-browser.jar \
|
|
gecko-thirdparty.jar \
|
|
services.jar \
|
|
$(NULL)
|
|
|
|
ifdef MOZ_ANDROID_MLS_STUMBLER
|
|
FENNEC_JARS += ../stumbler/stumbler.jar
|
|
endif
|
|
|
|
else # MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
|
|
|
|
GECKOVIEW_JARS := $(gradle_dir)/geckoview/intermediates/bundles/debug/classes.jar
|
|
FENNEC_JARS := $(gradle_dir)/app/intermediates/packaged/officialPhoton/debug/classes.jar
|
|
|
|
$(GECKOVIEW_JARS): .gradle.deps
|
|
$(FENNEC_JARS): .gradle.deps
|
|
|
|
endif # MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
|
|
|
|
geckoview_jars_classpath := $(subst $(NULL) ,:,$(strip $(GECKOVIEW_JARS)))
|
|
|
|
# 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.
|
|
#
|
|
# MOZ_ANDROID_MMA requires MOZ_INSTALL_TRACKING, so we don't need a
|
|
# separate clause for MMA (Leanplum) support.
|
|
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)))
|
|
|
|
ifdef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
|
|
define gradle_command
|
|
$(1): $(2)
|
|
@$$(TOUCH) $$@
|
|
$$(topsrcdir)/mach android assemble-app
|
|
endef
|
|
|
|
# .gradle.deps: .aapt.deps FORCE
|
|
$(eval $(call gradle_command,.gradle.deps,.aapt.deps FORCE))
|
|
|
|
classes.dex: .gradle.deps
|
|
$(REPORT_BUILD)
|
|
cp $(gradle_dir)/app/intermediates/transforms/dex/officialPhoton/debug/folders/1000/1f/main/classes.dex $@
|
|
|
|
GeneratedJNIWrappers.cpp GeneratedJNIWrappers.h GeneratedJNINatives.h : .gradle.deps
|
|
$(REPORT_BUILD)
|
|
|
|
FennecJNIWrappers.cpp FennecJNIWrappers.h FennecJNINatives.h: .gradle.deps
|
|
$(REPORT_BUILD)
|
|
|
|
else
|
|
classes.dex: .proguard.deps
|
|
$(REPORT_BUILD)
|
|
$(DX) --dex --output=classes.dex --force-jumbo jars-proguarded
|
|
|
|
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 $(PROGUARD_JAR)
|
|
$(REPORT_BUILD)
|
|
@$(TOUCH) $@
|
|
$(JAVA) \
|
|
-Xmx512m -Xms128m \
|
|
-jar $(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 $(PROGUARD_JAR)
|
|
$(REPORT_BUILD)
|
|
@$(TOUCH) $@
|
|
$(JAVA) \
|
|
-Xmx512m -Xms128m \
|
|
-jar $(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 := $(abspath $(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)
|
|
|
|
endif # MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
|
|
|
|
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 = \
|
|
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
|
|
|
|
# It's not quite "no dependencies": nodeps means that it doesn't
|
|
# depend on the generated resources that incorporate l10n, principally
|
|
# strings.xml.
|
|
|
|
# .gradle.nodeps: AndroidManifest.xml generated/preprocessed/org/mozilla/gecko/AppConstants.java ... FORCE
|
|
$(eval $(call gradle_command,.gradle.nodeps,AndroidManifest.xml $(constants_PP_JAVAFILES) FORCE))
|
|
|
|
.aapt.nodeps: .gradle.nodeps FORCE
|
|
@$(TOUCH) $@
|
|
cp $(GRADLE_ANDROID_APP_APK) gecko-nodeps.ap_
|
|
cp $(gradle_dir)/app/intermediates/transforms/dex/officialPhoton/debug/folders/1000/1f/main/classes.dex classes.dex
|
|
else
|
|
# .aapt.nodeps: AndroidManifest.xml FORCE
|
|
$(eval $(call aapt_command,.aapt.nodeps,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 update-fennec-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))
|
|
|
|
ifndef MOZILLA_OFFICIAL
|
|
# Targets built very early during a Gradle build. In automation,
|
|
# these are built before Gradle is invoked by .gradle.deps and
|
|
# gradle-targets is not made at all. This is required to avoid
|
|
# building gradle-targets with AB_CD=multi during multi-l10n builds.
|
|
gradle-targets: $(foreach f,$(constants_PP_JAVAFILES),$(f))
|
|
gradle-targets: AndroidManifest.xml
|
|
gradle-targets: $(ANDROID_GENERATED_RESFILES)
|
|
|
|
# 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:
|
|
|
|
gradle-targets:
|
|
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
|
|
|
|
# List of build flags used by auto-generated JNI bindings (through the
|
|
# @BuildFlag annotation in Java). For example, add a "MOZ_FOO \" line to this
|
|
# list to support @BuildFlag(MOZ_FOO).
|
|
BINDING_BUILD_FLAGS = \
|
|
$(NULL)
|
|
|
|
# Preprocess a JNI binding file using the build flags defined above.
|
|
# $(1): JNI binding file to preprocess.
|
|
preprocess-binding = ($(call py_action,preprocessor, \
|
|
$(foreach flag,$(BINDING_BUILD_FLAGS),$(if $($(flag)),-D$(flag))) \
|
|
-DMOZ_PREPROCESSOR $(1)) || echo $(1))
|
|
|
|
# Preprocess and compare two versions of a JNI binding file, one in-tree
|
|
# version and one newly generated version.
|
|
# $(1): Base file name of the JNI binding file.
|
|
# $(2): Additional path to prepend to the in-tree file name. This is required
|
|
# because in-tree Fennec-specific bindings are in a separate fennec/ directory.
|
|
compare-binding = $(call preprocess-binding,$(1)) | ( \
|
|
$(call preprocess-binding,$(topsrcdir)/widget/android/$(2)$(1)) 3<&- | \
|
|
diff /dev/fd/3 - >/dev/null ) 3<&0
|
|
|
|
libs:: GeneratedJNIWrappers.cpp
|
|
@($(call compare-binding,GeneratedJNIWrappers.cpp) && \
|
|
$(call compare-binding,GeneratedJNIWrappers.h) && \
|
|
$(call compare-binding,GeneratedJNINatives.h)) || \
|
|
(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
|
|
@($(call compare-binding,FennecJNIWrappers.cpp,fennec/) && \
|
|
$(call compare-binding,FennecJNIWrappers.h,fennec/) && \
|
|
$(call compare-binding,FennecJNINatives.h,fennec/)) || \
|
|
(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)
|
|
|
|
libs:: classes.dex
|
|
$(INSTALL) classes.dex $(FINAL_TARGET)
|
|
|
|
ifndef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
|
|
|
|
# Generate Java binder interfaces from AIDL files.
|
|
GECKOVIEW_AIDLS = \
|
|
org/mozilla/gecko/IGeckoEditableChild.aidl \
|
|
org/mozilla/gecko/IGeckoEditableParent.aidl \
|
|
org/mozilla/gecko/gfx/ISurfaceAllocator.aidl \
|
|
org/mozilla/gecko/media/ICodec.aidl \
|
|
org/mozilla/gecko/media/ICodecCallbacks.aidl \
|
|
org/mozilla/gecko/media/IMediaDrmBridge.aidl \
|
|
org/mozilla/gecko/media/IMediaDrmBridgeCallbacks.aidl \
|
|
org/mozilla/gecko/media/IMediaManager.aidl \
|
|
org/mozilla/gecko/process/IChildProcess.aidl \
|
|
org/mozilla/gecko/process/IProcessManager.aidl \
|
|
org/mozilla/gecko/util/GeckoBundle.aidl \
|
|
$(NULL)
|
|
|
|
geckoview_aidl_src_path := $(topsrcdir)/mobile/android/geckoview/src/main/aidl
|
|
geckoview_aidl_target_path := generated
|
|
geckoview_aidl_targets := $(addprefix $(geckoview_aidl_target_path)/,$(patsubst %.aidl,%.java,$(GECKOVIEW_AIDLS:.java=)))
|
|
|
|
$(geckoview_aidl_targets): $(geckoview_aidl_target_path)/%.java: $(geckoview_aidl_src_path)/%.aidl
|
|
@echo "Processing AIDL: $< => $@"
|
|
$(AIDL) -p$(ANDROID_SDK)/framework.aidl -I$(geckoview_aidl_src_path) -o$(geckoview_aidl_target_path) $<
|
|
|
|
FENNEC_AIDLS = \
|
|
$(NULL)
|
|
|
|
fennec_aidl_src_path := $(srcdir)/aidl
|
|
fennec_aidl_target_path := generated
|
|
fennec_aidl_targets := $(addprefix $(fennec_aidl_target_path)/,$(patsubst %.aidl,%.java,$(FENNEC_AIDLS:.java=)))
|
|
|
|
$(fennec_aidl_targets): $(fennec_aidl_target_path)/%.java: $(fennec_aidl_src_path)/%.aidl
|
|
@echo "Processing AIDL: $< => $@"
|
|
$(AIDL) -p$(ANDROID_SDK)/framework.aidl -I$(fennec_aidl_src_path) -I$(geckoview_aidl_src_path) -o$(fennec_aidl_target_path) $<
|
|
|
|
endif # MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
|