summaryrefslogtreecommitdiffstats
path: root/config/makefiles/java-build.mk
diff options
context:
space:
mode:
Diffstat (limited to 'config/makefiles/java-build.mk')
-rw-r--r--config/makefiles/java-build.mk159
1 files changed, 159 insertions, 0 deletions
diff --git a/config/makefiles/java-build.mk b/config/makefiles/java-build.mk
new file mode 100644
index 000000000..bf667ac44
--- /dev/null
+++ b/config/makefiles/java-build.mk
@@ -0,0 +1,159 @@
+# -*- makefile -*-
+# vim:set ts=8 sw=8 sts=8 noet:
+#
+# 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/.
+
+ifndef INCLUDED_JAVA_BUILD_MK #{
+
+ifdef JAVAFILES #{
+GENERATED_DIRS += classes
+
+export:: classes
+classes: $(call mkdir_deps,classes)
+endif #} JAVAFILES
+
+default_bootclasspath_jars := \
+ $(ANDROID_SDK)/android.jar \
+ $(NULL)
+
+default_classpath_jars := \
+ $(NULL)
+
+# Turn a possibly empty list of JAR files into a Java classpath, like a.jar:b.jar.
+# Arg 1: Possibly empty list of JAR files.
+define classpath_template
+$(subst $(NULL) ,:,$(strip $(1)))
+endef
+
+ifdef ANDROID_APK_NAME #{
+$(if $(ANDROID_APK_PACKAGE),,$(error Missing ANDROID_APK_PACKAGE with ANDROID_APK_NAME))
+
+android_res_dirs := $(or $(ANDROID_RES_DIRS),$(srcdir)/res)
+_ANDROID_RES_FLAG := $(addprefix -S ,$(android_res_dirs))
+_ANDROID_ASSETS_FLAG := $(if $(ANDROID_ASSETS_DIRS),$(addprefix -A ,$(ANDROID_ASSETS_DIRS)))
+android_manifest := $(or $(ANDROID_MANIFEST_FILE),AndroidManifest.xml)
+
+GENERATED_DIRS += classes generated
+
+generated_r_java := generated/$(subst .,/,$(ANDROID_APK_PACKAGE))/R.java
+
+classes.dex: $(call mkdir_deps,classes)
+classes.dex: $(generated_r_java)
+classes.dex: $(ANDROID_APK_NAME).ap_
+classes.dex: $(default_classpath_jars) $(ANDROID_CLASSPATH_JARS)
+classes.dex: $(default_bootclasspath_jars) $(ANDROID_BOOTCLASSPATH_JARS) $(ANDROID_EXTRA_JARS)
+classes.dex: $(JAVAFILES)
+ $(JAVAC) $(JAVAC_FLAGS) -d classes $(filter %.java,$^) \
+ $(addprefix -bootclasspath ,$(call classpath_template,$(default_bootclasspath_jars) $(ANDROID_BOOTCLASSPATH_JARS))) \
+ $(addprefix -classpath ,$(call classpath_template,$(default_classpath_jars) $(ANDROID_CLASSPATH_JARS) $(ANDROID_EXTRA_JARS)))
+ $(DX) --dex --output=$@ classes $(ANDROID_EXTRA_JARS)
+
+# R.java and $(ANDROID_APK_NAME).ap_ are both produced by aapt. To
+# save an aapt invocation, we produce them both at the same time. 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_r_java): .aapt.deps ;
+$(ANDROID_APK_NAME).ap_: .aapt.deps ;
+
+# This uses the fact that Android resource directories list all
+# resource files one subdirectory below the parent resource directory.
+android_res_files := $(wildcard $(addsuffix /*,$(wildcard $(addsuffix /*,$(android_res_dirs)))))
+
+# An extra package like org.example.app generates dependencies like:
+# generated/org/example/app/R.java: .aapt.deps ;
+# classes.dex: generated/org/example/app/R.java
+# GARBAGE: generated/org/example/app/R.java
+$(foreach extra_package,$(ANDROID_EXTRA_PACKAGES), \
+ $(eval generated/$(subst .,/,$(extra_package))/R.java: .aapt.deps ;) \
+ $(eval classes.dex: generated/$(subst .,/,$(extra_package))/R.java) \
+ $(eval GARBAGE: generated/$(subst .,/,$(extra_package))/R.java) \
+)
+
+# aapt flag -m: 'make package directories under location specified by -J'.
+# The --extra-package list is colon separated.
+.aapt.deps: $(android_manifest) $(android_res_files) $(wildcard $(ANDROID_ASSETS_DIRS))
+ @$(TOUCH) $@
+ $(AAPT) package -f -M $< -I $(ANDROID_SDK)/android.jar $(_ANDROID_RES_FLAG) $(_ANDROID_ASSETS_FLAG) \
+ --custom-package $(ANDROID_APK_PACKAGE) \
+ --non-constant-id \
+ --auto-add-overlay \
+ $(if $(ANDROID_EXTRA_PACKAGES),--extra-packages $(subst $(NULL) ,:,$(strip $(ANDROID_EXTRA_PACKAGES)))) \
+ $(if $(ANDROID_EXTRA_RES_DIRS),$(addprefix -S ,$(ANDROID_EXTRA_RES_DIRS))) \
+ -m \
+ -J ${@D}/generated \
+ -F $(ANDROID_APK_NAME).ap_
+
+$(ANDROID_APK_NAME)-unsigned-unaligned.apk: $(ANDROID_APK_NAME).ap_ classes.dex
+ cp $< $@
+ $(ZIP) -0 $@ classes.dex
+
+$(ANDROID_APK_NAME)-unaligned.apk: $(ANDROID_APK_NAME)-unsigned-unaligned.apk
+ cp $< $@
+ $(DEBUG_JARSIGNER) $@
+
+$(ANDROID_APK_NAME).apk: $(ANDROID_APK_NAME)-unaligned.apk
+ $(ZIPALIGN) -f 4 $< $@
+
+GARBAGE += \
+ $(generated_r_java) \
+ classes.dex \
+ $(ANDROID_APK_NAME).ap_ \
+ $(ANDROID_APK_NAME)-unsigned-unaligned.apk \
+ $(ANDROID_APK_NAME)-unaligned.apk \
+ $(ANDROID_APK_NAME).apk \
+ $(NULL)
+
+# Include Android specific java flags, instead of what's in rules.mk.
+include $(topsrcdir)/config/android-common.mk
+endif #} ANDROID_APK_NAME
+
+
+ifdef JAVA_JAR_TARGETS #{
+# Arg 1: Output target name with .jar suffix, like jars/jarfile.jar.
+# Intermediate class files are generated in jars/jarfile-classes.
+# Arg 2: Java sources list. We use VPATH and $^ so sources can be
+# relative to $(srcdir) or $(CURDIR).
+# Arg 3: List of extra jars to link against. We do not use VPATH so
+# jars must be relative to $(CURDIR).
+# Arg 4: Additional JAVAC_FLAGS.
+
+# Note: Proguard fails when stale .class files corresponding to
+# removed inner classes are present in the object directory. These
+# stale class files get packaged into the .jar file, which then gets
+# processed by Proguard. To work around this, we always delete any
+# existing jarfile-classes directory and start fresh.
+
+define java_jar_template
+$(1): $(2) $(3) $(default_bootclasspath_jars) $(default_classpath_jars)
+ $$(REPORT_BUILD)
+ @$$(RM) -rf $(1:.jar=)-classes
+ @$$(NSINSTALL) -D $(1:.jar=)-classes
+ @$$(if $$(filter-out .,$$(@D)),$$(NSINSTALL) -D $$(@D))
+ $$(JAVAC) $$(JAVAC_FLAGS)\
+ $(4)\
+ -d $(1:.jar=)-classes\
+ $(addprefix -bootclasspath ,$(call classpath_template,$(default_bootclasspath_jars)))\
+ $(addprefix -classpath ,$(call classpath_template,$(default_classpath_jars) $(3)))\
+ $$(filter %.java,$$^)
+ $$(JAR) cMf $$@ -C $(1:.jar=)-classes .
+
+GARBAGE += $(1)
+
+GARBAGE_DIRS += $(1:.jar=)-classes
+endef
+
+$(foreach jar,$(JAVA_JAR_TARGETS),\
+ $(if $($(jar)_DEST),,$(error Missing $(jar)_DEST))\
+ $(if $($(jar)_JAVAFILES) $($(jar)_PP_JAVAFILES),,$(error Must provide at least one of $(jar)_JAVAFILES and $(jar)_PP_JAVAFILES))\
+ $(eval $(call java_jar_template,$($(jar)_DEST),$($(jar)_JAVAFILES) $($(jar)_PP_JAVAFILES),$($(jar)_EXTRA_JARS),$($(jar)_JAVAC_FLAGS)))\
+)
+endif #} JAVA_JAR_TARGETS
+
+
+INCLUDED_JAVA_BUILD_MK := 1
+
+endif #} INCLUDED_JAVA_BUILD_MK