From 63d94fa3056066ba7be6754356975af6a1c82981 Mon Sep 17 00:00:00 2001 From: Ying Wang Date: Thu, 13 Dec 2012 18:23:01 -0800 Subject: [PATCH] Build from source or prebuilt With this change, you can easily switch between building from source code and prebuilt. Set LOCAL_PREBUILT_MODULE_FILE to the path of the prebuilt file, relative to the top of the source tree, in the usual module definition. The prebuilt will be used unless any of the followings satisfied: 1) ANDROID_BUILD_FROM_SOURCE is "true", which disable prebuilt globally; 2) The module name is in ANDROID_NO_PREBUILT_MODULES; 3) The LOCAL_PATH is prefixed by any of ANDROID_NO_PREBUILT_PATHS. A developer can set ANDROID_NO_PREBUILT_MODULES or ANDROID_NO_PREBUILT_PATHS to build only his own module(s) from source, while build other modules from prebuilts. You can set ANDROID_BUILD_FROM_SOURCE to true to build everything from source. Those variables can be set with shell environmental variable or in your buildspec.mk. Sometimes module B is able to be built from source only if module A is also built from source, for example, if B is the test apk of A. In that case, you can use the macro include-if-build-from-source to include B's Android.mk only if A is built from source too, or if-build-from-source to conditionally include the definition of module B, if their module definitions are in the same Android.mk. Support host-executable-hook and host-shared-library-hook. Change-Id: Icab7cf028c87eaba0dd7efc2a7749fd6f32b44e4 --- core/clear_vars.mk | 1 + core/definitions.mk | 24 ++++++++++++++++++++++++ core/host_executable.mk | 14 ++++++++++++++ core/host_shared_library.mk | 14 ++++++++++++++ core/main.mk | 33 ++++++++++++++++++--------------- core/prebuilt.mk | 20 +++++++++++++------- 6 files changed, 84 insertions(+), 22 deletions(-) diff --git a/core/clear_vars.mk b/core/clear_vars.mk index a5667686df..91b5df6afc 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -130,6 +130,7 @@ LOCAL_SOURCE_FILES_ALL_GENERATED:= # '',true # Don't delete the META_INF dir when merging static Java libraries. LOCAL_DONT_DELETE_JAR_META_INF:= LOCAL_ADDITIONAL_CERTIFICATES:= +LOCAL_PREBUILT_MODULE_FILE:= # Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to # iterate over thousands of entries every time. diff --git a/core/definitions.mk b/core/definitions.mk index 96cc0cc108..4bce0a7fcb 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -2110,6 +2110,30 @@ $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp: $(2) $(3) $(6): $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(strip $(1))-timestamp endef +## Whether to build from source if prebuilt alternative exists +########################################################### +# $(1): module name +# $(2): LOCAL_PATH +# Expands to empty string if not from source. +ifeq (true,$(ANDROID_BUILD_FROM_SOURCE)) +define if-build-from-source +true +endef +else +define if-build-from-source +$(if $(filter $(ANDROID_NO_PREBUILT_MODULES),$(1))$(filter \ + $(addsuffix %,$(ANDROID_NO_PREBUILT_PATHS)),$(2)),true) +endef +endif + +# Include makefile $(1) if build from source for module $(2) +# $(1): the makefile to include +# $(2): module name +# $(3): LOCAL_PATH +define include-if-build-from-source +$(if $(call if-build-from-source,$(2),$(3)),$(eval include $(1))) +endef + ########################################################### ## Other includes ########################################################### diff --git a/core/host_executable.mk b/core/host_executable.mk index 93d3f10cb5..ab0f8f3e38 100644 --- a/core/host_executable.mk +++ b/core/host_executable.mk @@ -13,7 +13,21 @@ ifeq ($(strip $(LOCAL_MODULE_SUFFIX)),) LOCAL_MODULE_SUFFIX := $(HOST_EXECUTABLE_SUFFIX) endif +$(call host-executable-hook) + +skip_build_from_source := +ifdef LOCAL_PREBUILT_MODULE_FILE +ifeq (,$(call if-build-from-source,$(LOCAL_MODULE),$(LOCAL_PATH))) +include $(BUILD_PREBUILT) +skip_build_from_source := true +endif +endif + +ifndef skip_build_from_source + include $(BUILD_SYSTEM)/binary.mk $(LOCAL_BUILT_MODULE): $(all_objects) $(all_libraries) $(transform-host-o-to-executable) + +endif # skip_build_from_source diff --git a/core/host_shared_library.mk b/core/host_shared_library.mk index 65e82583b6..a29e14c2d7 100644 --- a/core/host_shared_library.mk +++ b/core/host_shared_library.mk @@ -22,6 +22,18 @@ ifneq ($(strip $(LOCAL_MODULE_STEM)$(LOCAL_BUILT_MODULE_STEM)),) $(error $(LOCAL_PATH): Cannot set module stem for a library) endif +$(call host-shared-library-hook) + +skip_build_from_source := +ifdef LOCAL_PREBUILT_MODULE_FILE +ifeq (,$(call if-build-from-source,$(LOCAL_MODULE),$(LOCAL_PATH))) +include $(BUILD_PREBUILT) +skip_build_from_source := true +endif +endif + +ifndef skip_build_from_source + # Put the built modules of all shared libraries in a common directory # to simplify the link line. OVERRIDE_BUILT_MODULE_PATH := $(HOST_OUT_INTERMEDIATE_LIBRARIES) @@ -30,3 +42,5 @@ include $(BUILD_SYSTEM)/binary.mk $(LOCAL_BUILT_MODULE): $(all_objects) $(all_libraries) $(LOCAL_ADDITIONAL_DEPENDENCIES) $(transform-host-o-to-shared-lib) + +endif # skip_build_from_source diff --git a/core/main.mk b/core/main.mk index 771b9b3a38..61c041fce7 100644 --- a/core/main.mk +++ b/core/main.mk @@ -84,6 +84,24 @@ include $(BUILD_SYSTEM)/config.mk # be generated correctly include $(BUILD_SYSTEM)/cleanbuild.mk +# These targets are going to delete stuff, don't bother including +# the whole directory tree if that's all we're going to do +ifeq ($(MAKECMDGOALS),clean) +dont_bother := true +endif +ifeq ($(MAKECMDGOALS),clobber) +dont_bother := true +endif +ifeq ($(MAKECMDGOALS),dataclean) +dont_bother := true +endif +ifeq ($(MAKECMDGOALS),installclean) +dont_bother := true +endif + +# Include the google-specific config +-include vendor/google/build/config.mk + VERSION_CHECK_SEQUENCE_NUMBER := 3 -include $(OUT_DIR)/versions_checked.mk ifneq ($(VERSION_CHECK_SEQUENCE_NUMBER),$(VERSIONS_CHECKED)) @@ -387,21 +405,6 @@ ifeq ($(filter-out $(INTERNAL_MODIFIER_TARGETS),$(MAKECMDGOALS)),) $(INTERNAL_MODIFIER_TARGETS): $(DEFAULT_GOAL) endif -# These targets are going to delete stuff, don't bother including -# the whole directory tree if that's all we're going to do -ifeq ($(MAKECMDGOALS),clean) -dont_bother := true -endif -ifeq ($(MAKECMDGOALS),clobber) -dont_bother := true -endif -ifeq ($(MAKECMDGOALS),dataclean) -dont_bother := true -endif -ifeq ($(MAKECMDGOALS),installclean) -dont_bother := true -endif - # Bring in all modules that need to be built. ifneq ($(dont_bother),true) diff --git a/core/prebuilt.mk b/core/prebuilt.mk index aa04ebd3ae..c9e07ef109 100644 --- a/core/prebuilt.mk +++ b/core/prebuilt.mk @@ -16,6 +16,12 @@ ifneq ($(LOCAL_PREBUILT_JAVA_LIBRARIES),) $(error dont use LOCAL_PREBUILT_JAVA_LIBRARIES anymore LOCAL_PATH=$(LOCAL_PATH)) endif +ifdef LOCAL_PREBUILT_MODULE_FILE +my_prebuilt_src_file := $(LOCAL_PREBUILT_MODULE_FILE) +else +my_prebuilt_src_file := $(LOCAL_PATH)/$(LOCAL_SRC_FILES) +endif + ifdef LOCAL_IS_HOST_MODULE my_prefix := HOST_ else @@ -73,7 +79,7 @@ else endif $(LOCAL_BUILT_MODULE) : | $(intermediates)/export_includes -endif +endif # prebuilt_module_is_a_library endif PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES)) @@ -95,7 +101,7 @@ ifeq ($(LOCAL_CERTIFICATE),) ifneq ($(filter APPS,$(LOCAL_MODULE_CLASS)),) # It is now a build error to add a prebuilt .apk without # specifying a key for it. - $(error No LOCAL_CERTIFICATE specified for prebuilt "$(LOCAL_SRC_FILES)") + $(error No LOCAL_CERTIFICATE specified for prebuilt "$(my_prebuilt_src_file)") endif else ifeq ($(LOCAL_CERTIFICATE),PRESIGNED) # The magic string "PRESIGNED" means this package is already checked @@ -123,21 +129,21 @@ endif ifneq ($(filter APPS,$(LOCAL_MODULE_CLASS)),) ifeq ($(LOCAL_CERTIFICATE),PRESIGNED) # Ensure that presigned .apks have been aligned. -$(built_module) : $(LOCAL_PATH)/$(LOCAL_SRC_FILES) | $(ZIPALIGN) +$(built_module) : $(my_prebuilt_src_file) | $(ZIPALIGN) $(transform-prebuilt-to-target-with-zipalign) else # Sign and align non-presigned .apks. -$(built_module) : $(LOCAL_PATH)/$(LOCAL_SRC_FILES) | $(ACP) $(ZIPALIGN) $(SIGNAPK_JAR) +$(built_module) : $(my_prebuilt_src_file) | $(ACP) $(ZIPALIGN) $(SIGNAPK_JAR) $(transform-prebuilt-to-target) $(sign-package) $(align-package) endif else ifneq ($(LOCAL_PREBUILT_STRIP_COMMENTS),) -$(built_module) : $(LOCAL_PATH)/$(LOCAL_SRC_FILES) +$(built_module) : $(my_prebuilt_src_file) $(transform-prebuilt-to-target-strip-comments) else -$(built_module) : $(LOCAL_PATH)/$(LOCAL_SRC_FILES) | $(ACP) +$(built_module) : $(my_prebuilt_src_file) | $(ACP) $(transform-prebuilt-to-target) ifneq ($(prebuilt_module_is_a_library),) ifneq ($(LOCAL_IS_HOST_MODULE),) @@ -157,7 +163,7 @@ ifeq ($(LOCAL_IS_HOST_MODULE)$(LOCAL_MODULE_CLASS),JAVA_LIBRARIES) common_classes_jar := $(call intermediates-dir-for,JAVA_LIBRARIES,$(LOCAL_MODULE),,COMMON)/classes.jar common_javalib_jar := $(dir $(common_classes_jar))javalib.jar -$(common_classes_jar) : $(LOCAL_PATH)/$(LOCAL_SRC_FILES) | $(ACP) +$(common_classes_jar) : $(my_prebuilt_src_file) | $(ACP) $(transform-prebuilt-to-target) $(common_javalib_jar) : $(common_classes_jar) | $(ACP)