From: Dan Willemsen Date: Tue, 7 Jun 2016 23:55:57 +0000 (-0700) Subject: Rewrite LDLIBS and SHARED_LIBRARIES X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=6731b495ca70c3cdd9b545780d2c014993b433da;p=android-x86%2Fbuild.git Rewrite LDLIBS and SHARED_LIBRARIES LOCAL_LDLIBS was the only correct way to use NDK libraries, but few used it correctly. It also often got confused with LOCAL_LDFLAGS, so move the flags to the correct variable. For binaries that weren't using the NDK (empty LOCAL_SDK_VERSION), it was never valid to use LOCAL_LDLIBS, as dependencies would not be properly set up, and could lead to random build failures. So convert any -l linker flags to using LOCAL_SHARED_LIBRARIES automatically. For binaries built using the NDK (LOCAL_SDK_VERSION set), they were required to use LOCAL_LDLIBS for prebuilt NDK libraries, otherwise they would get headers and dependencies to the platform versions. Any non-prebuilt LOCAL_LDLIBS would miss dependencies. So move the NDK prebuilt libraries to LDLIBS from SHARED_LIBRARIES, and move everything else to SHARED_LIBRARIES. So now, for device modules, LOCAL_SHARED_LIBRARIES should always be used, and we'll do the right thing. LOCAL_LDLIBS should only be used for host libraries from the system. Change-Id: Ide34c7afdcfb6507a378d45a42471729e489a9e0 --- diff --git a/core/binary.mk b/core/binary.mk index d6445d4e1..c3bf45140 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -1133,6 +1133,34 @@ asm_objects += $(asm_objects_asm) endif +#################################################### +## For NDK-built libraries, move LOCAL_SHARED_LIBRARY +## references to my_ldlibs, so that we use the NDK +## prebuilt library and headers for linking. +#################################################### +ifndef LOCAL_IS_HOST_MODULE +my_allowed_ldlibs := +ifdef LOCAL_SDK_VERSION + my_ndk_shared_libraries := $(filter $(addprefix lib,$(NDK_PREBUILT_SHARED_LIBRARIES)),$(my_shared_libraries)) + my_shared_libraries := $(filter-out $(my_ndk_shared_libraries),$(my_shared_libraries)) + my_ldlibs += $(patsubst lib%,-l%,$(my_ndk_shared_libraries)) + my_ndk_shared_libraries := + my_allowed_ldlibs := $(addprefix -l,$(NDK_PREBUILT_SHARED_LIBRARIES)) +endif + +# Sort ldlibs and ldflags between -l and other linker flags +# We'll do this again later, since there are still changes happening, but that's fine. +my_ldlib_flags := $(my_ldflags) $(my_ldlibs) +my_ldlibs := $(filter -l%,$(my_ldlib_flags)) +my_ldflags := $(filter-out -l%,$(my_ldlib_flags)) +my_ldlib_flags := + +# Move other ldlibs back to shared libraries +my_shared_libraries += $(patsubst -l%,lib%,$(filter-out $(my_allowed_ldlibs),$(my_ldlibs))) +my_ldlibs := $(filter $(my_allowed_ldlibs),$(my_ldlibs)) +endif + + ########################################################## ## Set up installed module dependency ## We cannot compute the full path of the LOCAL_SHARED_LIBRARIES for @@ -1431,6 +1459,24 @@ ifneq (,$(filter 1 true,$(my_tidy_enabled))) endif endif +# Move -l* entries from ldflags to ldlibs, and everything else to ldflags +my_ldlib_flags := $(my_ldflags) $(my_ldlibs) +my_ldlibs := $(filter -l%,$(my_ldlib_flags)) +my_ldflags := $(filter-out -l%,$(my_ldlib_flags)) + +# One last verification check for ldlibs +ifndef LOCAL_IS_HOST_MODULE +my_allowed_ldlibs := +ifdef LOCAL_SDK_VERSION + my_allowed_ldlibs := $(addprefix -l,$(NDK_PREBUILT_SHARED_LIBRARIES)) +endif + +my_bad_ldlibs := $(filter-out $(my_allowed_ldlibs),$(my_ldlibs)) +ifneq ($(my_bad_ldlibs),) + $(error $(LOCAL_MODULE_MAKEFILE): $(LOCAL_MODULE): Bad LOCAL_LDLIBS entries: $(my_bad_ldlibs)) +endif +endif + $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASFLAGS := $(my_asflags) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CONLYFLAGS := $(my_conlyflags) diff --git a/core/config.mk b/core/config.mk index 727a5a80a..6f693f5b0 100644 --- a/core/config.mk +++ b/core/config.mk @@ -781,6 +781,8 @@ endif RSCOMPAT_32BIT_ONLY_API_LEVELS := 8 9 10 11 12 13 14 15 16 17 18 19 20 RSCOMPAT_NO_USAGEIO_API_LEVELS := 8 9 10 11 12 13 +NDK_PREBUILT_SHARED_LIBRARIES := android c dl EGL GLESv1_CM GLESv2 GLESv3 jnigraphics log mediandk m OpenMAXAL OpenSLES stdc++ vulkan z + ifeq ($(JAVA_NOT_REQUIRED),true) # Remove java and tools from our path so that we make sure nobody uses them. unexport ANDROID_JAVA_HOME