Home | History | Annotate | Download | only in core
      1 # Requires:
      2 # LOCAL_MODULE_SUFFIX
      3 # LOCAL_MODULE_CLASS
      4 # all_res_assets
      5 
      6 # Make sure there's something to build.
      7 # It's possible to build a package that doesn't contain any classes.
      8 ifeq (,$(strip $(LOCAL_SRC_FILES)$(all_res_assets)))
      9 $(error $(LOCAL_PATH): Target java module does not define any source or resource files)
     10 endif
     11 
     12 LOCAL_NO_STANDARD_LIBRARIES:=$(strip $(LOCAL_NO_STANDARD_LIBRARIES))
     13 LOCAL_SDK_VERSION:=$(strip $(LOCAL_SDK_VERSION))
     14 
     15 ifneq ($(LOCAL_SDK_VERSION),)
     16   ifeq ($(LOCAL_NO_STANDARD_LIBRARIES),true)
     17     $(error $(LOCAL_PATH): Must not define both LOCAL_NO_STANDARD_LIBRARIES and LOCAL_SDK_VERSION)
     18   else
     19     ifeq ($(strip $(filter $(LOCAL_SDK_VERSION),$(TARGET_AVAILABLE_SDK_VERSIONS))),)
     20       $(error $(LOCAL_PATH): Invalid LOCAL_SDK_VERSION '$(LOCAL_SDK_VERSION)' \
     21              Choices are: $(TARGET_AVAILABLE_SDK_VERSIONS))
     22     else
     23       ifeq ($(LOCAL_SDK_VERSION),current)
     24         LOCAL_JAVA_LIBRARIES := android_stubs_$(LOCAL_SDK_VERSION) $(LOCAL_JAVA_LIBRARIES)
     25       else
     26         LOCAL_JAVA_LIBRARIES := sdk_v$(LOCAL_SDK_VERSION) $(LOCAL_JAVA_LIBRARIES)
     27       endif
     28     endif
     29   endif
     30 else
     31   ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true)
     32     LOCAL_JAVA_LIBRARIES := core core-junit ext framework $(LOCAL_JAVA_LIBRARIES)
     33   endif
     34 endif
     35 LOCAL_JAVA_LIBRARIES := $(sort $(LOCAL_JAVA_LIBRARIES))
     36 
     37 LOCAL_BUILT_MODULE_STEM := $(strip $(LOCAL_BUILT_MODULE_STEM))
     38 ifeq ($(LOCAL_BUILT_MODULE_STEM),)
     39 $(error $(LOCAL_PATH): Target java template must define LOCAL_BUILT_MODULE_STEM)
     40 endif
     41 ifneq ($(filter classes-compiled.jar classes.jar,$(LOCAL_BUILT_MODULE_STEM)),)
     42 $(error LOCAL_BUILT_MODULE_STEM may not be "$(LOCAL_BUILT_MODULE_STEM)")
     43 endif
     44 
     45 
     46 ##############################################################################
     47 # Define the intermediate targets before including base_rules so they get
     48 # the correct environment.
     49 ##############################################################################
     50 
     51 intermediates := $(call local-intermediates-dir)
     52 intermediates.COMMON := $(call local-intermediates-dir,COMMON)
     53 
     54 # Emma source code coverage
     55 ifneq ($(EMMA_INSTRUMENT),true)
     56 LOCAL_NO_EMMA_INSTRUMENT := true
     57 LOCAL_NO_EMMA_COMPILE := true
     58 endif
     59 
     60 # Choose leaf name for the compiled jar file.
     61 ifneq ($(LOCAL_NO_EMMA_COMPILE),true)
     62 full_classes_compiled_jar_leaf := classes-no-debug-var.jar
     63 built_dex_intermediate_leaf := classes-no-local.dex
     64 else
     65 full_classes_compiled_jar_leaf := classes-full-debug.jar
     66 built_dex_intermediate_leaf := classes-with-local.dex
     67 endif
     68 
     69 LOCAL_PROGUARD_ENABLED:=$(strip $(LOCAL_PROGUARD_ENABLED))
     70 ifeq ($(LOCAL_PROGUARD_ENABLED),disabled)
     71 LOCAL_PROGUARD_ENABLED :=
     72 endif
     73 
     74 # By giving different file name, files can be updated correctly when switching
     75 # between builds with and without Proguard enabled.
     76 # Note that ANY intermediate targets between the proguard and
     77 # the final built_dex should be differently named!
     78 ifdef LOCAL_PROGUARD_ENABLED
     79 proguard_jar_leaf := proguard.classes.jar
     80 built_dex_intermediate_leaf := proguard.$(built_dex_intermediate_leaf)
     81 built_dex_leaf := progaurd.classes.dex
     82 else
     83 proguard_jar_leaf := noproguard.classes.jar
     84 built_dex_intermediate_leaf := noproguard.$(built_dex_intermediate_leaf)
     85 built_dex_leaf := noproguard.classes.dex
     86 endif
     87 
     88 full_classes_compiled_jar := $(intermediates.COMMON)/$(full_classes_compiled_jar_leaf)
     89 jarjar_leaf := classes-jarjar.jar
     90 full_classes_jarjar_jar := $(intermediates.COMMON)/$(jarjar_leaf)
     91 emma_intermediates_dir := $(intermediates.COMMON)/emma_out
     92 # emma is hardcoded to use the leaf name of its input for the output file --
     93 # only the output directory can be changed
     94 full_classes_emma_jar := $(emma_intermediates_dir)/lib/$(jarjar_leaf)
     95 full_classes_proguard_jar := $(intermediates.COMMON)/$(proguard_jar_leaf)
     96 built_dex_intermediate := $(intermediates.COMMON)/$(built_dex_intermediate_leaf)
     97 full_classes_stubs_jar := $(intermediates.COMMON)/stubs.jar
     98 
     99 # full_classes_jar and built_dex are cleared below, and re-set if we really need them.
    100 full_classes_jar := $(intermediates.COMMON)/classes.jar
    101 built_dex := $(intermediates.COMMON)/$(built_dex_leaf)
    102 
    103 LOCAL_INTERMEDIATE_TARGETS += \
    104     $(full_classes_compiled_jar) \
    105     $(full_classes_jarjar_jar) \
    106     $(full_classes_emma_jar) \
    107     $(full_classes_jar) \
    108     $(full_classes_proguard_jar) \
    109     $(built_dex_intermediate) \
    110     $(built_dex) \
    111     $(full_classes_stubs_jar)
    112 
    113 
    114 LOCAL_INTERMEDIATE_SOURCE_DIR := $(intermediates.COMMON)/src
    115 
    116 # TODO: It looks like the only thing we need from base_rules is
    117 # all_java_sources.  See if we can get that by adding a
    118 # common_java.mk, and moving the include of base_rules.mk to
    119 # after all the declarations.
    120 
    121 #######################################
    122 include $(BUILD_SYSTEM)/base_rules.mk
    123 #######################################
    124 
    125 # We use intermediates.COMMON because the classes.jar/.dex files will be
    126 # common even if LOCAL_BUILT_MODULE isn't.
    127 #
    128 # Override some target variables that base_rules set up for us.
    129 $(LOCAL_INTERMEDIATE_TARGETS): \
    130 	PRIVATE_CLASS_INTERMEDIATES_DIR := $(intermediates.COMMON)/classes
    131 $(LOCAL_INTERMEDIATE_TARGETS): \
    132 	PRIVATE_SOURCE_INTERMEDIATES_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR)
    133 
    134 # Since we're using intermediates.COMMON, make sure that it gets cleaned
    135 # properly.
    136 $(cleantarget): PRIVATE_CLEAN_FILES += $(intermediates.COMMON)
    137 
    138 # If the module includes java code (i.e., it's not framework-res), compile it.
    139 full_classes_jar :=
    140 built_dex :=
    141 ifneq (,$(strip $(all_java_sources)))
    142 
    143 # If LOCAL_BUILT_MODULE_STEM wasn't overridden by our caller,
    144 # full_classes_jar will be the same module as LOCAL_BUILT_MODULE.
    145 # Otherwise, the caller will define it as a prerequisite of
    146 # LOCAL_BUILT_MODULE, so it will inherit the necessary PRIVATE_*
    147 # variable definitions.
    148 full_classes_jar := $(intermediates.COMMON)/classes.jar
    149 built_dex := $(intermediates.COMMON)/$(built_dex_leaf)
    150 
    151 # Droiddoc isn't currently able to generate stubs for modules, so we're just
    152 # allowing it to use the classes.jar as the "stubs" that would be use to link
    153 # against, for the cases where someone needs the jar to link against.
    154 # - Use the classes.jar instead of the handful of other intermediates that
    155 #   we have, because it's the most processed, but still hasn't had dex run on
    156 #   it, so it's closest to what's on the device.
    157 # - This extra copy, with the dependency on LOCAL_BUILT_MODULE allows the
    158 #   PRIVATE_ vars to be preserved.
    159 $(full_classes_stubs_jar): PRIVATE_SOURCE_FILE := $(full_classes_jar)
    160 $(full_classes_stubs_jar) : $(LOCAL_BUILT_MODULE) | $(ACP)
    161 	@echo Copying $(PRIVATE_SOURCE_FILE)
    162 	$(hide) $(ACP) -fp $(PRIVATE_SOURCE_FILE) $@
    163 ALL_MODULES.$(LOCAL_MODULE).STUBS := $(full_classes_stubs_jar)
    164 
    165 # Compile the java files to a .jar file.
    166 # This intentionally depends on java_sources, not all_java_sources.
    167 # Deps for generated source files must be handled separately,
    168 # via deps on the target that generates the sources.
    169 $(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(LOCAL_JAVACFLAGS)
    170 $(full_classes_compiled_jar): $(java_sources) $(java_resource_sources) $(full_java_lib_deps) $(jar_manifest_file)
    171 	$(transform-java-to-classes.jar)
    172 
    173 # All of the rules after full_classes_compiled_jar are very unlikely
    174 # to fail except for bugs in their respective tools.  If you would
    175 # like to run these rules, add the "all" modifier goal to the make
    176 # command line.
    177 # This overwrites the value defined in base_rules.mk.  That's a little
    178 # dirty.  It's preferable to set LOCAL_CHECKED_MODULE, but this has to
    179 # be done after the inclusion of base_rules.mk.
    180 ALL_MODULES.$(LOCAL_MODULE).CHECKED := $(full_classes_compiled_jar)
    181 
    182 $(full_classes_compiled_jar): PRIVATE_JAVAC_DEBUG_FLAGS := -g
    183 
    184 # Run jarjar if necessary, otherwise just copy the file.
    185 ifneq ($(strip $(LOCAL_JARJAR_RULES)),)
    186 $(full_classes_jarjar_jar): PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES)
    187 $(full_classes_jarjar_jar): $(full_classes_compiled_jar) | $(JARJAR)
    188 	@echo JarJar: $@
    189 	$(hide) java -jar $(JARJAR) process $(PRIVATE_JARJAR_RULES) $< $@
    190 else
    191 $(full_classes_jarjar_jar): $(full_classes_compiled_jar) | $(ACP)
    192 	@echo Copying: $@
    193 	$(hide) $(ACP) $< $@
    194 endif
    195 
    196 ifeq ($(LOCAL_IS_STATIC_JAVA_LIBRARY),true)
    197 # Skip adding emma instrumentation to class files if this is a static library,
    198 # since it will be instrumented by the package that includes it
    199 LOCAL_NO_EMMA_INSTRUMENT:= true
    200 endif
    201 
    202 ifneq ($(LOCAL_NO_EMMA_INSTRUMENT),true)
    203 $(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILE := $(intermediates.COMMON)/coverage.em
    204 $(full_classes_emma_jar): PRIVATE_EMMA_INTERMEDIATES_DIR := $(emma_intermediates_dir)
    205 # module level coverage filter can be defined using LOCAL_EMMA_COVERAGE_FILTER
    206 # in Android.mk
    207 ifdef LOCAL_EMMA_COVERAGE_FILTER
    208 $(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := $(LOCAL_EMMA_COVERAGE_FILTER)
    209 else
    210 # by default, avoid applying emma instrumentation onto emma classes itself,
    211 # otherwise there will be exceptions thrown
    212 $(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := *,-emma,-emmarun,-com.vladium.*
    213 endif
    214 # this rule will generate both $(PRIVATE_EMMA_COVERAGE_FILE) and
    215 # $(full_classes_emma_jar)
    216 $(full_classes_emma_jar): $(full_classes_jarjar_jar) | $(EMMA_JAR)
    217 	$(transform-classes.jar-to-emma)
    218 $(PRIVATE_EMMA_COVERAGE_FILE): $(full_classes_emma_jar)
    219 
    220 # tell proguard to load emma jar
    221 LOCAL_PROGUARD_FLAGS := $(LOCAL_PROGUARD_FLAGS) $(addprefix -libraryjars ,$(EMMA_JAR))
    222 else
    223 $(full_classes_emma_jar): $(full_classes_jarjar_jar) | $(ACP)
    224 	@echo Copying: $@
    225 	$(copy-file-to-target)
    226 endif
    227 
    228 # Keep a copy of the jar just before proguard processing.
    229 $(full_classes_jar): $(full_classes_emma_jar) | $(ACP)
    230 	@echo Copying: $@
    231 	$(hide) $(ACP) $< $@
    232 
    233 # Run proguard if necessary, otherwise just copy the file.
    234 proguard_dictionary := $(intermediates.COMMON)/proguard_dictionary
    235 # Proguard doesn't like a class in both library and the jar to be processed.
    236 proguard_full_java_libs := $(filter-out $(full_static_java_libs),$(full_java_libs))
    237 proguard_flags := $(addprefix -libraryjars ,$(proguard_full_java_libs)) \
    238                   -include $(BUILD_SYSTEM)/proguard.flags \
    239                   -forceprocessing \
    240                   -printmapping $(proguard_dictionary)
    241 # If this is a test package, add proguard keep flags for tests.
    242 ifneq ($(strip $(LOCAL_INSTRUMENTATION_FOR)$(filter tests,$(LOCAL_MODULE_TAGS))$(filter android.test.runner,$(LOCAL_JAVA_LIBRARIES))),)
    243 proguard_flags := $(proguard_flags) -include $(BUILD_SYSTEM)/proguard_tests.flags
    244 endif # test package
    245 
    246 ifneq ($(LOCAL_PROGUARD_ENABLED),)
    247 ifeq ($(LOCAL_PROGUARD_ENABLED),full)
    248     # full
    249 else
    250 ifeq ($(LOCAL_PROGUARD_ENABLED),optonly)
    251     # optonly
    252     proguard_flags += -dontobfuscate
    253 else
    254 ifeq ($(LOCAL_PROGUARD_ENABLED),custom)
    255     # custom
    256 else
    257     $(warning while processing: $(LOCAL_MODULE))
    258     $(error invalid value for LOCAL_PROGUARD_ENABLED: $(LOCAL_PROGUARD_ENABLED))
    259 endif # custom
    260 endif # optonly
    261 endif # full
    262 endif # LOCAL_PROGUARD_ENABLED
    263 
    264 proguard_flag_files := $(addprefix $(LOCAL_PATH)/, $(LOCAL_PROGUARD_FLAG_FILES))
    265 LOCAL_PROGUARD_FLAGS += $(addprefix -include , $(proguard_flag_files))
    266 
    267 $(full_classes_proguard_jar): PRIVATE_PROGUARD_ENABLED:=$(LOCAL_PROGUARD_ENABLED)
    268 $(full_classes_proguard_jar): PRIVATE_PROGUARD_FLAGS := $(proguard_flags) $(LOCAL_PROGUARD_FLAGS)
    269 $(full_classes_proguard_jar): PRIVATE_INSTRUMENTATION_FOR:=$(strip $(LOCAL_INSTRUMENTATION_FOR))
    270 $(full_classes_proguard_jar) : $(full_classes_jar) $(proguard_flag_files) | $(ACP) $(PROGUARD)
    271 	$(call transform-jar-to-proguard)
    272 
    273 ALL_MODULES.$(LOCAL_MODULE).PROGUARD_ENABLED:=$(LOCAL_PROGUARD_ENABLED)
    274 
    275 # If you instrument class files that have local variable debug information in
    276 # them emma does not correctly maintain the local variable table.
    277 # This will cause an error when you try to convert the class files for Android.
    278 # The workaround here is to build different dex file here based on emma switch
    279 # then later copy into classes.dex. When emma is on, dx is run with --no-locals
    280 # option to remove local variable information
    281 
    282 # Override PRIVATE_INTERMEDIATES_DIR so that install-dex-debug
    283 # will work even when intermediates != intermediates.COMMON.
    284 $(built_dex_intermediate): PRIVATE_INTERMEDIATES_DIR := $(intermediates.COMMON)
    285 $(built_dex_intermediate): PRIVATE_DX_FLAGS := $(LOCAL_DX_FLAGS)
    286 ifneq ($(LOCAL_NO_EMMA_COMPILE),true)
    287 $(built_dex_intermediate): PRIVATE_DX_FLAGS += --no-locals
    288 endif
    289 $(built_dex_intermediate): $(full_classes_proguard_jar) $(DX)
    290 	$(transform-classes.jar-to-dex)
    291 $(built_dex): $(built_dex_intermediate) | $(ACP)
    292 	@echo Copying: $@
    293 	$(hide) $(ACP) $< $@
    294 ifneq ($(GENERATE_DEX_DEBUG),)
    295 	$(install-dex-debug)
    296 endif
    297 
    298 findbugs_xml := $(intermediates.COMMON)/findbugs.xml
    299 $(findbugs_xml) : PRIVATE_JAR_FILE := $(full_classes_jar)
    300 $(findbugs_xml) : PRIVATE_AUXCLASSPATH := $(addprefix -auxclasspath ,$(strip \
    301 								$(call normalize-path-list,$(filter %.jar,\
    302 										$(full_java_libs)))))
    303 # We can't depend directly on full_classes_jar because the PRIVATE_
    304 # vars won't be set up correctly.
    305 $(findbugs_xml) : $(LOCAL_BUILT_MODULE)
    306 	@echo Findbugs: $@
    307 	$(hide) $(FINDBUGS) -textui -effort:min -xml:withMessages \
    308 		$(PRIVATE_AUXCLASSPATH) \
    309 		$(PRIVATE_JAR_FILE) \
    310 		> $@
    311 
    312 ALL_FINDBUGS_FILES += $(findbugs_xml)
    313 
    314 findbugs_html := $(PRODUCT_OUT)/findbugs/$(LOCAL_MODULE).html
    315 $(findbugs_html) : PRIVATE_XML_FILE := $(findbugs_xml)
    316 $(LOCAL_MODULE)-findbugs : $(findbugs_html)
    317 $(findbugs_html) : $(findbugs_xml)
    318 	@mkdir -p $(dir $@)
    319 	@echo ConvertXmlToText: $@
    320 	$(hide) prebuilt/common/findbugs/bin/convertXmlToText -html:fancy.xsl $(PRIVATE_XML_FILE) \
    321 	> $@
    322 
    323 $(LOCAL_MODULE)-findbugs : $(findbugs_html)
    324 
    325 endif
    326