From 62db0f0945b682a4c8bb44b157c3955d2fe0e8a3 Mon Sep 17 00:00:00 2001 From: Dan Willemsen Date: Sat, 16 Jun 2018 09:37:13 -0700 Subject: [PATCH] Deprecate implicit make rules Test: mm Test: view docs in gitiles Change-Id: I1ced4b4218c733b5b5b771d626b20eb6fb22f0df --- Changes.md | 25 +++++++++++++++++++++++++ core/binary.mk | 7 ++++++- core/main.mk | 4 ---- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/Changes.md b/Changes.md index 21a0abed6e..2583ae2698 100644 --- a/Changes.md +++ b/Changes.md @@ -1,5 +1,30 @@ # Build System Changes for Android.mk Writers +## Implicit make rules are deprecated {#implicit_rules} + +Implicit rules look something like the following: + +``` make +$(TARGET_OUT_SHARED_LIBRARIES)/%_vendor.so: $(TARGET_OUT_SHARED_LIBRARIES)/%.so + ... + +%.o : %.foo + ... +``` + +These can have wide ranging effects across unrelated modules, so they're now deprecated. Instead, use static pattern rules, which are similar, but explicitly match the specified outputs: + +``` make +libs := $(foreach lib,libfoo libbar,$(TARGET_OUT_SHARED_LIBRARIES)/$(lib)_vendor.so) +$(libs): %_vendor.so: %.so + ... + +files := $(wildcard $(LOCAL_PATH)/*.foo) +gen := $(patsubst $(LOCAL_PATH)/%.foo,$(intermediates)/%.o,$(files)) +$(gen): %.o : %.foo + ... +``` + ## Removing '/' from Valid Module Names {#name_slash} The build system uses module names in path names in many places. Having an diff --git a/core/binary.mk b/core/binary.mk index 2899d4d51c..60f78ddb9c 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -1602,10 +1602,15 @@ built_whole_libraries := \ # libraries have already been linked into the module at that point. # We do, however, care about the NOTICE files for any static # libraries that we use. (see notice_files.mk) - +# +# Don't do this in mm, since many of the targets won't exist. +ifeq ($(ONE_SHOT_MAKEFILE),) installed_static_library_notice_file_targets := \ $(foreach lib,$(my_static_libraries) $(my_whole_static_libraries), \ NOTICE-$(if $(LOCAL_IS_HOST_MODULE),HOST,TARGET)-STATIC_LIBRARIES-$(lib)) +else +installed_static_library_notice_file_targets := +endif # Default is -fno-rtti. ifeq ($(strip $(LOCAL_RTTI_FLAG)),) diff --git a/core/main.mk b/core/main.mk index a2f624ccb7..b37cac3abb 100644 --- a/core/main.mk +++ b/core/main.mk @@ -416,10 +416,6 @@ include $(SOONG_ANDROID_MK) $(wildcard $(ONE_SHOT_MAKEFILE)) # would have been with a normal make. CUSTOM_MODULES := $(sort $(call get-tagged-modules,$(ALL_MODULE_TAGS))) FULL_BUILD := -# Stub out the notice targets, which probably aren't defined -# when using ONE_SHOT_MAKEFILE. -NOTICE-HOST-%: ; -NOTICE-TARGET-%: ; # A helper goal printing out install paths define register_module_install_path