# -*- 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