diff options
Diffstat (limited to 'config/makefiles/java-build.mk')
-rw-r--r-- | config/makefiles/java-build.mk | 159 |
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 |