From d2ff15715976bcb0179518565de134508236b5c2 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Mon, 3 Oct 2016 16:49:02 -0700 Subject: [PATCH] Enable toc optimization for host builds The toc optimization had been disabled for host builds to ensure that the timestamp of the final binary changed whenever its implementation changed, in order to support rerunning host tools that were modified during incremental builds. However, only the final install rule must be re-run to update the timestamp, and not the link rule. Update the shared library install dependencies to use normal dependencies instead of order-only dependencies for host modules, and then enable the the toc optimization for host modules. If the implementation of a library changes it will be reinstalled, and libraries or binaries that depend on it will also be reinstalled. Bug: 26015464 Test: m -j; touch art/disassembler/disassembler_x86.cc; m -j, verify out/host/linux-x86/bin/oatdump is updated Change-Id: I0a14decc1994eb55ad269d841943aef66e320c63 --- core/base_rules.mk | 4 ---- core/binary.mk | 6 ------ core/main.mk | 12 +++++++++++- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/core/base_rules.mk b/core/base_rules.mk index 56df2a918c..13d20e073f 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -269,9 +269,6 @@ LOCAL_INTERMEDIATE_TARGETS += $(LOCAL_BUILT_MODULE) # dependent binaries of a .toc file will be rebuilt only when the content of # the .toc file is changed. ########################################################### -ifndef LOCAL_IS_HOST_MODULE -# Disable .toc optimization for host modules: we may run the host binaries during the build process -# and the libraries' implementation matters. ifeq ($(LOCAL_MODULE_CLASS),SHARED_LIBRARIES) LOCAL_INTERMEDIATE_TARGETS += $(LOCAL_BUILT_MODULE).toc $(LOCAL_BUILT_MODULE).toc: $(LOCAL_BUILT_MODULE) @@ -283,7 +280,6 @@ $(LOCAL_BUILT_MODULE).toc: $(LOCAL_BUILT_MODULE) # Build .toc file when using mm, mma, or make $(my_register_name) $(my_all_targets): $(LOCAL_BUILT_MODULE).toc endif -endif ########################################################### ## logtags: Add .logtags files to global list diff --git a/core/binary.mk b/core/binary.mk index 6413153ebd..4dcb152b74 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -1507,13 +1507,7 @@ built_shared_libraries := \ $(addprefix $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \ $(addsuffix $(so_suffix), \ $(installed_shared_library_module_names))) -ifdef LOCAL_IS_HOST_MODULE -# Disable .toc optimization for host modules: we may run the host binaries during the build process -# and the libraries' implementation matters. -built_shared_library_deps := $(built_shared_libraries) -else built_shared_library_deps := $(addsuffix .toc, $(built_shared_libraries)) -endif my_system_shared_libraries_fullpath := endif diff --git a/core/main.mk b/core/main.mk index fee299569b..de77927a06 100644 --- a/core/main.mk +++ b/core/main.mk @@ -660,6 +660,14 @@ define add-required-deps $(1): | $(2) endef +# Use a normal dependency instead of an order-only dependency when installing +# host dynamic binaries so that the timestamp of the final binary always +# changes, even if the toc optimization has skipped relinking the binary +# and its dependant shared libraries. +define add-required-host-so-deps +$(1): $(2) +endef + $(foreach m,$(ALL_MODULES), \ $(eval r := $(ALL_MODULES.$(m).REQUIRED)) \ $(if $(r), \ @@ -702,7 +710,9 @@ $(foreach m,$($(if $(2),$($(1)2ND_ARCH_VAR_PREFIX))$(1)DEPENDENCIES_ON_SHARED_LI $(if $(3),$(eval deps := $(addprefix host_cross_,$(deps))))\ $(eval r := $(filter $($(root))/%,$(call module-installed-files,\ $(deps))))\ - $(eval $(call add-required-deps,$(word 2,$(p)),$(r)))\ + $(if $(filter $(1),HOST_),\ + $(eval $(call add-required-host-so-deps,$(word 2,$(p)),$(r))),\ + $(eval $(call add-required-deps,$(word 2,$(p)),$(r))))\ $(eval ALL_MODULES.$(mod).REQUIRED += $(deps))) endef