From 2bfe0a1a2533e011d981146b3636a6c061a3de5b Mon Sep 17 00:00:00 2001 From: Justin Yun Date: Mon, 20 Jan 2020 18:57:01 +0900 Subject: [PATCH] Restore "Linktype check for native:product" Similar to native:vendor, native:product can use VNDK libs but not vndk_private. It is activated when PRODUCT_PRODUCT_VNDK_VERSION is set. This restores the reverted commit 4e7e76fe5a19996ad02f7260ef81c780b41f1a99 (aosp/1197274). The problem of the original CL was assuming no modules have both LOCAL_PRODUCT_MODULE and LOCAL_USE_VNDK in the old implementations. But many vendor modules in the targets without setting PRODUCT_PRODUCT_VNDK_VERSION in old branches had both flags that caused link failures. To make it no-op without PRODUCT_PRODUCT_VNDK_VERSION, I defined LOCAL_USE_VNDK_PRODUCT that is set to true if PRODUCT_PRODUCT_VNDK_VERSION is defined and LOCAL_PRODUCT_MODULE is true. Bug: 146620523 Test: build with PRODUCT_PRODUCT_VNDK_VERSION := current Change-Id: I344c7dc1c47f08706c101e486ff07c3f10aff8ac --- core/base_rules.mk | 32 +++++++++++-------- core/binary.mk | 52 +++++++++++++++++++++---------- core/cc_prebuilt_internal.mk | 16 ++++++++-- core/clear_vars.mk | 1 + core/install_jni_libs_internal.mk | 4 ++- core/local_vndk.mk | 10 +++++- core/soong_cc_prebuilt.mk | 7 ++++- 7 files changed, 87 insertions(+), 35 deletions(-) diff --git a/core/base_rules.mk b/core/base_rules.mk index 6b80a1580d..cce6ec1933 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -800,22 +800,28 @@ ifdef LOCAL_IS_HOST_MODULE my_required_modules += $(LOCAL_REQUIRED_MODULES_$($(my_prefix)OS)) endif -############################################################################### -## When compiling against the VNDK, add the .vendor suffix to required modules. -############################################################################### +########################################################################## +## When compiling against the VNDK, add the .vendor or .product suffix to +## required modules. +########################################################################## ifneq ($(LOCAL_USE_VNDK),) - #################################################### - ## Soong modules may be built twice, once for /system - ## and once for /vendor. If we're using the VNDK, - ## switch all soong libraries over to the /vendor - ## variant. - #################################################### + ##################################################### + ## Soong modules may be built three times, once for + ## /system, once for /vendor and once for /product. + ## If we're using the VNDK, switch all soong + ## libraries over to the /vendor or /product variant. + ##################################################### ifneq ($(LOCAL_MODULE_MAKEFILE),$(SOONG_ANDROID_MK)) # We don't do this renaming for soong-defined modules since they already - # have correct names (with .vendor suffix when necessary) in their - # LOCAL_*_LIBRARIES. - my_required_modules := $(foreach l,$(my_required_modules),\ - $(if $(SPLIT_VENDOR.SHARED_LIBRARIES.$(l)),$(l).vendor,$(l))) + # have correct names (with .vendor or .product suffix when necessary) in + # their LOCAL_*_LIBRARIES. + ifeq ($(LOCAL_USE_VNDK_PRODUCT),true) + my_required_modules := $(foreach l,$(my_required_modules),\ + $(if $(SPLIT_PRODUCT.SHARED_LIBRARIES.$(l)),$(l).product,$(l))) + else + my_required_modules := $(foreach l,$(my_required_modules),\ + $(if $(SPLIT_VENDOR.SHARED_LIBRARIES.$(l)),$(l).vendor,$(l))) + endif endif endif diff --git a/core/binary.mk b/core/binary.mk index 560fff7535..a62f76ce91 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -1145,22 +1145,35 @@ endif ## When compiling against the VNDK, use LL-NDK libraries ########################################################### ifneq ($(LOCAL_USE_VNDK),) - #################################################### - ## Soong modules may be built twice, once for /system - ## and once for /vendor. If we're using the VNDK, - ## switch all soong libraries over to the /vendor - ## variant. - #################################################### - my_whole_static_libraries := $(foreach l,$(my_whole_static_libraries),\ - $(if $(SPLIT_VENDOR.STATIC_LIBRARIES.$(l)),$(l).vendor,$(l))) - my_static_libraries := $(foreach l,$(my_static_libraries),\ - $(if $(SPLIT_VENDOR.STATIC_LIBRARIES.$(l)),$(l).vendor,$(l))) - my_shared_libraries := $(foreach l,$(my_shared_libraries),\ - $(if $(SPLIT_VENDOR.SHARED_LIBRARIES.$(l)),$(l).vendor,$(l))) - my_system_shared_libraries := $(foreach l,$(my_system_shared_libraries),\ - $(if $(SPLIT_VENDOR.SHARED_LIBRARIES.$(l)),$(l).vendor,$(l))) - my_header_libraries := $(foreach l,$(my_header_libraries),\ - $(if $(SPLIT_VENDOR.HEADER_LIBRARIES.$(l)),$(l).vendor,$(l))) + ##################################################### + ## Soong modules may be built three times, once for + ## /system, once for /vendor and once for /product. + ## If we're using the VNDK, switch all soong + ## libraries over to the /vendor or /product variant. + ##################################################### + ifeq ($(LOCAL_USE_VNDK_PRODUCT),true) + my_whole_static_libraries := $(foreach l,$(my_whole_static_libraries),\ + $(if $(SPLIT_PRODUCT.STATIC_LIBRARIES.$(l)),$(l).product,$(l))) + my_static_libraries := $(foreach l,$(my_static_libraries),\ + $(if $(SPLIT_PRODUCT.STATIC_LIBRARIES.$(l)),$(l).product,$(l))) + my_shared_libraries := $(foreach l,$(my_shared_libraries),\ + $(if $(SPLIT_PRODUCT.SHARED_LIBRARIES.$(l)),$(l).product,$(l))) + my_system_shared_libraries := $(foreach l,$(my_system_shared_libraries),\ + $(if $(SPLIT_PRODUCT.SHARED_LIBRARIES.$(l)),$(l).product,$(l))) + my_header_libraries := $(foreach l,$(my_header_libraries),\ + $(if $(SPLIT_PRODUCT.HEADER_LIBRARIES.$(l)),$(l).product,$(l))) + else + my_whole_static_libraries := $(foreach l,$(my_whole_static_libraries),\ + $(if $(SPLIT_VENDOR.STATIC_LIBRARIES.$(l)),$(l).vendor,$(l))) + my_static_libraries := $(foreach l,$(my_static_libraries),\ + $(if $(SPLIT_VENDOR.STATIC_LIBRARIES.$(l)),$(l).vendor,$(l))) + my_shared_libraries := $(foreach l,$(my_shared_libraries),\ + $(if $(SPLIT_VENDOR.SHARED_LIBRARIES.$(l)),$(l).vendor,$(l))) + my_system_shared_libraries := $(foreach l,$(my_system_shared_libraries),\ + $(if $(SPLIT_VENDOR.SHARED_LIBRARIES.$(l)),$(l).vendor,$(l))) + my_header_libraries := $(foreach l,$(my_header_libraries),\ + $(if $(SPLIT_VENDOR.HEADER_LIBRARIES.$(l)),$(l).vendor,$(l))) + endif endif # Platform can use vendor public libraries. If a required shared lib is one of @@ -1207,6 +1220,7 @@ my_warn_types := $(my_warn_ndk_types) my_allowed_types := $(my_allowed_ndk_types) else ifdef LOCAL_USE_VNDK _name := $(patsubst %.vendor,%,$(LOCAL_MODULE)) + _name := $(patsubst %.product,%,$(LOCAL_MODULE)) ifneq ($(filter $(_name),$(VNDK_CORE_LIBRARIES) $(VNDK_SAMEPROCESS_LIBRARIES) $(LLNDK_LIBRARIES)),) ifeq ($(filter $(_name),$(VNDK_PRIVATE_LIBRARIES)),) my_link_type := native:vndk @@ -1215,6 +1229,12 @@ else ifdef LOCAL_USE_VNDK endif my_warn_types := my_allowed_types := native:vndk native:vndk_private + else ifeq ($(LOCAL_USE_VNDK_PRODUCT),true) + # Modules installed to /product cannot directly depend on modules marked + # with vendor_available: false + my_link_type := native:product + my_warn_types := + my_allowed_types := native:product native:vndk native:platform_vndk else # Modules installed to /vendor cannot directly depend on modules marked # with vendor_available: false diff --git a/core/cc_prebuilt_internal.mk b/core/cc_prebuilt_internal.mk index 6313019eb5..1d959b5cad 100644 --- a/core/cc_prebuilt_internal.mk +++ b/core/cc_prebuilt_internal.mk @@ -85,6 +85,7 @@ ifdef LOCAL_SDK_VERSION my_link_type := native:ndk:$(my_ndk_stl_family):$(my_ndk_stl_link_type) else ifdef LOCAL_USE_VNDK _name := $(patsubst %.vendor,%,$(LOCAL_MODULE)) + _name := $(patsubst %.product,%,$(LOCAL_MODULE)) ifneq ($(filter $(_name),$(VNDK_CORE_LIBRARIES) $(VNDK_SAMEPROCESS_LIBRARIES) $(LLNDK_LIBRARIES)),) ifeq ($(filter $(_name),$(VNDK_PRIVATE_LIBRARIES)),) my_link_type := native:vndk @@ -92,7 +93,11 @@ else ifdef LOCAL_USE_VNDK my_link_type := native:vndk_private endif else - my_link_type := native:vendor + ifeq ($(LOCAL_USE_VNDK_PRODUCT),true) + my_link_type := native:product + else + my_link_type := native:vendor + endif endif else ifneq ($(filter $(TARGET_RECOVERY_OUT)/%,$(LOCAL_MODULE_PATH)),) my_link_type := native:recovery @@ -136,8 +141,13 @@ include $(BUILD_SYSTEM)/cxx_stl_setup.mk ifdef my_shared_libraries ifdef LOCAL_USE_VNDK - my_shared_libraries := $(foreach l,$(my_shared_libraries),\ - $(if $(SPLIT_VENDOR.SHARED_LIBRARIES.$(l)),$(l).vendor,$(l))) + ifeq ($(LOCAL_USE_VNDK_PRODUCT),true) + my_shared_libraries := $(foreach l,$(my_shared_libraries),\ + $(if $(SPLIT_PRODUCT.SHARED_LIBRARIES.$(l)),$(l).product,$(l))) + else + my_shared_libraries := $(foreach l,$(my_shared_libraries),\ + $(if $(SPLIT_VENDOR.SHARED_LIBRARIES.$(l)),$(l).vendor,$(l))) + endif endif $(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)DEPENDENCIES_ON_SHARED_LIBRARIES += \ $(my_register_name):$(LOCAL_INSTALLED_MODULE):$(subst $(space),$(comma),$(my_shared_libraries)) diff --git a/core/clear_vars.mk b/core/clear_vars.mk index a5b50187f2..bbc117fe20 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -304,6 +304,7 @@ LOCAL_UNSTRIPPED_PATH:= LOCAL_USE_AAPT2:= LOCAL_USE_CLANG_LLD:= LOCAL_USE_VNDK:= +LOCAL_USE_VNDK_PRODUCT:= LOCAL_USES_LIBRARIES:= LOCAL_VENDOR_MODULE:= LOCAL_VINTF_FRAGMENTS:= diff --git a/core/install_jni_libs_internal.mk b/core/install_jni_libs_internal.mk index 25a16a373f..d87513bd0e 100644 --- a/core/install_jni_libs_internal.mk +++ b/core/install_jni_libs_internal.mk @@ -106,11 +106,13 @@ ifneq ($(strip $(LOCAL_JNI_SHARED_LIBRARIES)),) my_allowed_types := $(my_allowed_ndk_types) ifneq (,$(filter true,$(LOCAL_VENDOR_MODULE) $(LOCAL_ODM_MODULE) $(LOCAL_PROPRIETARY_MODULE))) my_allowed_types += native:vendor native:vndk native:platform_vndk + else ifeq ($(LOCAL_PRODUCT_MODULE),true) + my_allowed_types += native:product native:vndk native:platform_vndk endif else my_link_type := app:platform my_warn_types := $(my_warn_ndk_types) - my_allowed_types := $(my_allowed_ndk_types) native:platform native:vendor native:vndk native:vndk_private native:platform_vndk + my_allowed_types := $(my_allowed_ndk_types) native:platform native:product native:vendor native:vndk native:vndk_private native:platform_vndk endif my_link_deps := $(addprefix SHARED_LIBRARIES:,$(LOCAL_JNI_SHARED_LIBRARIES)) diff --git a/core/local_vndk.mk b/core/local_vndk.mk index 198e3615bd..b1bd3e6c89 100644 --- a/core/local_vndk.mk +++ b/core/local_vndk.mk @@ -1,5 +1,5 @@ -#Set LOCAL_USE_VNDK for modules going into vendor or odm partition, except for host modules +#Set LOCAL_USE_VNDK for modules going into product, vendor or odm partition, except for host modules #If LOCAL_SDK_VERSION is set, thats a more restrictive set, so they dont need LOCAL_USE_VNDK ifndef LOCAL_IS_HOST_MODULE ifndef LOCAL_SDK_VERSION @@ -8,6 +8,13 @@ ifndef LOCAL_SDK_VERSION # Note: no need to check LOCAL_MODULE_PATH* since LOCAL_[VENDOR|ODM|OEM]_MODULE is already # set correctly before this is included. endif + ifdef PRODUCT_PRODUCT_VNDK_VERSION + # Product modules also use VNDK when PRODUCT_PRODUCT_VNDK_VERSION is defined. + ifeq (true,$(LOCAL_PRODUCT_MODULE)) + LOCAL_USE_VNDK:=true + LOCAL_USE_VNDK_PRODUCT:=true + endif + endif endif endif @@ -33,6 +40,7 @@ ifdef LOCAL_USE_VNDK # If we're not using the VNDK, drop all restrictions ifndef BOARD_VNDK_VERSION LOCAL_USE_VNDK:= + LOCAL_USE_VNDK_PRODUCT:= endif endif diff --git a/core/soong_cc_prebuilt.mk b/core/soong_cc_prebuilt.mk index b095b7c388..8ea1e5067d 100644 --- a/core/soong_cc_prebuilt.mk +++ b/core/soong_cc_prebuilt.mk @@ -75,8 +75,13 @@ endif ifdef LOCAL_USE_VNDK ifneq ($(LOCAL_VNDK_DEPEND_ON_CORE_VARIANT),true) name_without_suffix := $(patsubst %.vendor,%,$(LOCAL_MODULE)) - ifneq ($(name_without_suffix),$(LOCAL_MODULE) + ifneq ($(name_without_suffix),$(LOCAL_MODULE)) SPLIT_VENDOR.$(LOCAL_MODULE_CLASS).$(name_without_suffix) := 1 + else + name_without_suffix := $(patsubst %.product,%,$(LOCAL_MODULE)) + ifneq ($(name_without_suffix),$(LOCAL_MODULE)) + SPLIT_PRODUCT.$(LOCAL_MODULE_CLASS).$(name_without_suffix) := 1 + endif endif name_without_suffix := endif