From 128800f2c8d3f27d6ae29b9cb8e62cb26bcf5f2f Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Thu, 10 Aug 2017 15:24:10 -0700 Subject: [PATCH] Sort files in directories passed to jar jar -C . produces a jar containing files in filesystem order, which can vary between builds. Manually find and sort the list of files, and convert them into a list of -C pairs. Fixes: 64634025 Test: m -j checkbuild Test: m -j out/target/product/sailfish/system/framework/ext.jar, check that entries are sorted Test: m -j out/target/product/generic_arm64/system/framework/ext.jar on mac Change-Id: I7dced6acbe621a60cd49daf17872941485602732 --- core/definitions.mk | 19 +++++++++++++++---- core/host_dalvik_java_library.mk | 1 + core/host_java_library.mk | 1 + core/jacoco.mk | 3 ++- core/java.mk | 1 + core/main.mk | 4 ++++ core/package_internal.mk | 1 + core/static_java_library.mk | 3 ++- 8 files changed, 27 insertions(+), 6 deletions(-) diff --git a/core/definitions.mk b/core/definitions.mk index d868b63f8b..fcf4fa33d1 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -2187,6 +2187,17 @@ define call-jack JACK_VERSION=$(PRIVATE_JACK_VERSION) $(JACK) $(DEFAULT_JACK_EXTRA_ARGS) endef +# Return jar arguments to compress files in a given directory +# $(1): directory +# +# Returns an @-file argument that contains the output of a subshell +# that looks like -C $(1) path/to/file1 -C $(1) path/to/file2 +# Also adds "-C out/empty ." which avoids errors in jar when +# there are no files in the directory. +define jar-args-sorted-files-in-directory + @<(find $(1) -type f | sort | $(JAR_ARGS) $(1); echo "-C $(EMPTY_DIRECTORY) .") +endef + # Common definition to invoke javac on the host and target. # # Some historical notes: @@ -2244,9 +2255,9 @@ $(if $(PRIVATE_JAR_EXCLUDE_PACKAGES), $(hide) rm -rf \ $(if $(PRIVATE_JAR_MANIFEST), \ $(hide) sed -e "s/%BUILD_NUMBER%/$(BUILD_NUMBER_FROM_FILE)/" \ $(PRIVATE_JAR_MANIFEST) > $(dir $@)/manifest.mf && \ - $(JAR) -cfm $@ $(dir $@)/manifest.mf \ - -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) ., \ - $(hide) $(JAR) -cf $@ -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) .) + $(JAR) -cfm $@ $(dir $@)/manifest.mf, \ + $(hide) $(JAR) -cf $@) \ + $(call jar-args-sorted-files-in-directory,$(PRIVATE_CLASS_INTERMEDIATES_DIR)) $(if $(PRIVATE_EXTRA_JAR_ARGS),$(call add-java-resources-to,$@)) endef @@ -2693,7 +2704,7 @@ define add-jar-resources-to-package rm -rf $(3) mkdir -p $(3) unzip -qo $(2) -d $(3) $$(zipinfo -1 $(2) | grep -v -E "\.class$$") - $(JAR) uf $(1) -C $(3) . + $(JAR) uf $(1) $(call jar-args-sorted-files-in-directory,$(3)) endef # Sign a package using the specified key/cert. diff --git a/core/host_dalvik_java_library.mk b/core/host_dalvik_java_library.mk index 4f3069fb58..0aabd51086 100644 --- a/core/host_dalvik_java_library.mk +++ b/core/host_dalvik_java_library.mk @@ -98,6 +98,7 @@ $(full_classes_compiled_jar): \ $(proto_java_sources_file_stamp) \ $(annotation_processor_deps) \ $(NORMALIZE_PATH) \ + $(JAR_ARGS) \ $(LOCAL_ADDITIONAL_DEPENDENCIES) \ | $(SOONG_JAVAC_WRAPPER) $(transform-host-java-to-package) diff --git a/core/host_java_library.mk b/core/host_java_library.mk index a68be6af29..033297a312 100644 --- a/core/host_java_library.mk +++ b/core/host_java_library.mk @@ -71,6 +71,7 @@ $(full_classes_compiled_jar): \ $(proto_java_sources_file_stamp) \ $(annotation_processor_deps) \ $(NORMALIZE_PATH) \ + $(JAR_ARGS) \ $(ZIPTIME) \ $(LOCAL_ADDITIONAL_DEPENDENCIES) \ | $(SOONG_JAVAC_WRAPPER) diff --git a/core/jacoco.mk b/core/jacoco.mk index a04d25ec41..f4788bfb28 100644 --- a/core/jacoco.mk +++ b/core/jacoco.mk @@ -120,12 +120,13 @@ $(my_instrumented_timestamp_path): $(my_unzipped_timestamp_path) $(JACOCO_CLI_JA $(LOCAL_FULL_CLASSES_JACOCO_JAR): PRIVATE_TEMP_JAR_PATH := $(my_temp_jar_path) $(LOCAL_FULL_CLASSES_JACOCO_JAR): PRIVATE_INSTRUMENTED_PATH := $(my_instrumented_path) $(LOCAL_FULL_CLASSES_JACOCO_JAR): PRIVATE_FULL_CLASSES_PRE_JACOCO_JAR := $(LOCAL_FULL_CLASSES_PRE_JACOCO_JAR) +$(LOCAL_FULL_CLASSES_JACOCO_JAR): $(JAR_ARGS) $(LOCAL_FULL_CLASSES_JACOCO_JAR): $(my_instrumented_timestamp_path) $(LOCAL_FULL_CLASSES_PRE_JACOCO_JAR) rm -f $@ $(PRIVATE_TEMP_JAR_PATH) # copy the pre-jacoco jar (containing files excluded from instrumentation) cp $(PRIVATE_FULL_CLASSES_PRE_JACOCO_JAR) $(PRIVATE_TEMP_JAR_PATH) # copy instrumented files back into the resultant jar - $(JAR) -uf $(PRIVATE_TEMP_JAR_PATH) -C $(PRIVATE_INSTRUMENTED_PATH) . + $(JAR) -uf $(PRIVATE_TEMP_JAR_PATH) $(call jar-args-sorted-files-in-directory,$(PRIVATE_INSTRUMENTED_PATH)) mv $(PRIVATE_TEMP_JAR_PATH) $@ # this is used to trigger $(my_classes_to_report_on_path) to build diff --git a/core/java.mk b/core/java.mk index c457bd84e7..8cc6fe61e4 100644 --- a/core/java.mk +++ b/core/java.mk @@ -445,6 +445,7 @@ $(full_classes_compiled_jar): \ $(proto_java_sources_file_stamp) \ $(annotation_processor_deps) \ $(NORMALIZE_PATH) \ + $(JAR_ARGS) \ $(LOCAL_ADDITIONAL_DEPENDENCIES) \ | $(SOONG_JAVAC_WRAPPER) $(transform-java-to-classes.jar) diff --git a/core/main.mk b/core/main.mk index ef690e0209..59f58f9e97 100644 --- a/core/main.mk +++ b/core/main.mk @@ -70,6 +70,10 @@ else DATE_FROM_FILE := date -d @$(BUILD_DATETIME_FROM_FILE) endif +# Make an empty directory, which can be used to make empty jars +EMPTY_DIRECTORY := $(OUT_DIR)/empty +$(shell mkdir -p $(EMPTY_DIRECTORY) && rm -rf $(EMPTY_DIRECTORY)/*) + # CTS-specific config. -include cts/build/config.mk # VTS-specific config. diff --git a/core/package_internal.mk b/core/package_internal.mk index e3ec91a7ea..ec211f3e51 100644 --- a/core/package_internal.mk +++ b/core/package_internal.mk @@ -553,6 +553,7 @@ $(LOCAL_BUILT_MODULE): PRIVATE_DONT_DELETE_JAR_DIRS := $(LOCAL_DONT_DELETE_JAR_D $(LOCAL_BUILT_MODULE): PRIVATE_RESOURCE_INTERMEDIATES_DIR := $(intermediates.COMMON)/resources $(LOCAL_BUILT_MODULE): PRIVATE_FULL_CLASSES_JAR := $(full_classes_jar) $(LOCAL_BUILT_MODULE) : $(jni_shared_libraries) +$(LOCAL_BUILT_MODULE) : $(JAR_ARGS) ifdef LOCAL_USE_AAPT2 $(LOCAL_BUILT_MODULE): PRIVATE_RES_PACKAGE := $(my_res_package) $(LOCAL_BUILT_MODULE) : $(my_res_package) $(AAPT2) | $(ACP) diff --git a/core/static_java_library.mk b/core/static_java_library.mk index cea8764c9e..2a80661c91 100644 --- a/core/static_java_library.mk +++ b/core/static_java_library.mk @@ -199,6 +199,7 @@ $(built_aar): PRIVATE_ANDROID_MANIFEST := $(full_android_manifest) $(built_aar): PRIVATE_CLASSES_JAR := $(aar_classes_jar) $(built_aar): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR) $(built_aar): PRIVATE_R_TXT := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/R.txt +$(built_aar): $(JAR_ARGS) $(built_aar) : $(aar_classes_jar) $(full_android_manifest) @echo "target AAR: $(PRIVATE_MODULE) ($@)" $(hide) rm -rf $(dir $@)aar && mkdir -p $(dir $@)aar/res @@ -208,7 +209,7 @@ $(built_aar) : $(aar_classes_jar) $(full_android_manifest) $(hide) $(foreach res,$(PRIVATE_RESOURCE_DIR),cp -Rfn $(res)/* $(dir $@)aar/res;) $(hide) cp $(PRIVATE_R_TXT) $(dir $@)aar/R.txt $(hide) $(JAR) -cMf $@ \ - -C $(dir $@)aar . + $(call jar-args-sorted-files-in-directory,(dir $@)aar) # Register the aar file. ALL_MODULES.$(LOCAL_MODULE).AAR := $(built_aar)