1# Native prebuilt coming from Soong.
2# Extra inputs:
3# LOCAL_SOONG_UNSTRIPPED_BINARY
4
5ifneq ($(LOCAL_MODULE_MAKEFILE),$(SOONG_ANDROID_MK))
6  $(call pretty-error,soong_rust_prebuilt.mk may only be used from Soong)
7endif
8
9ifdef LOCAL_IS_HOST_MODULE
10  ifneq ($(HOST_OS),$(LOCAL_MODULE_HOST_OS))
11    my_prefix := HOST_CROSS_
12    LOCAL_HOST_PREFIX := $(my_prefix)
13  else
14    my_prefix := HOST_
15    LOCAL_HOST_PREFIX :=
16  endif
17else
18  my_prefix := TARGET_
19endif
20
21ifeq ($($(my_prefix)ARCH),$(LOCAL_MODULE_$(my_prefix)ARCH))
22  # primary arch
23  LOCAL_2ND_ARCH_VAR_PREFIX :=
24else ifeq ($($(my_prefix)2ND_ARCH),$(LOCAL_MODULE_$(my_prefix)ARCH))
25  # secondary arch
26  LOCAL_2ND_ARCH_VAR_PREFIX := $($(my_prefix)2ND_ARCH_VAR_PREFIX)
27else
28  $(call pretty-error,Unsupported LOCAL_MODULE_$(my_prefix)ARCH=$(LOCAL_MODULE_$(my_prefix)ARCH))
29endif
30
31# Don't install static/rlib/proc_macro libraries.
32ifndef LOCAL_UNINSTALLABLE_MODULE
33  ifneq ($(filter STATIC_LIBRARIES RLIB_LIBRARIES PROC_MACRO_LIBRARIES,$(LOCAL_MODULE_CLASS)),)
34    LOCAL_UNINSTALLABLE_MODULE := true
35  endif
36endif
37
38
39#######################################
40include $(BUILD_SYSTEM)/base_rules.mk
41#######################################
42
43ifneq ($(filter STATIC_LIBRARIES SHARED_LIBRARIES RLIB_LIBRARIES DYLIB_LIBRARIES,$(LOCAL_MODULE_CLASS)),)
44  # Soong module is a static or shared library
45  EXPORTS_LIST += $(intermediates)
46  EXPORTS.$(intermediates).FLAGS := $(LOCAL_EXPORT_CFLAGS)
47  EXPORTS.$(intermediates).DEPS := $(LOCAL_EXPORT_C_INCLUDE_DEPS)
48
49  SOONG_ALREADY_CONV += $(LOCAL_MODULE)
50
51  my_link_type := $(LOCAL_SOONG_LINK_TYPE)
52  my_warn_types :=
53  my_allowed_types :=
54  my_link_deps :=
55  my_2nd_arch_prefix := $(LOCAL_2ND_ARCH_VAR_PREFIX)
56  my_common :=
57  include $(BUILD_SYSTEM)/link_type.mk
58endif
59
60
61ifdef LOCAL_USE_VNDK
62  ifneq ($(LOCAL_VNDK_DEPEND_ON_CORE_VARIANT),true)
63    name_without_suffix := $(patsubst %.vendor,%,$(LOCAL_MODULE))
64    ifneq ($(name_without_suffix),$(LOCAL_MODULE))
65      SPLIT_VENDOR.$(LOCAL_MODULE_CLASS).$(name_without_suffix) := 1
66    else
67      name_without_suffix := $(patsubst %.product,%,$(LOCAL_MODULE))
68      ifneq ($(name_without_suffix),$(LOCAL_MODULE))
69        SPLIT_PRODUCT.$(LOCAL_MODULE_CLASS).$(name_without_suffix) := 1
70      endif
71    endif
72    name_without_suffix :=
73  endif
74endif
75
76# The real dependency will be added after all Android.mks are loaded and the install paths
77# of the shared libraries are determined.
78ifdef LOCAL_INSTALLED_MODULE
79  ifdef LOCAL_SHARED_LIBRARIES
80    my_shared_libraries := $(LOCAL_SHARED_LIBRARIES)
81    ifdef LOCAL_USE_VNDK
82      my_shared_libraries := $(foreach l,$(my_shared_libraries),\
83        $(if $(SPLIT_VENDOR.SHARED_LIBRARIES.$(l)),$(l).vendor,$(l)))
84    endif
85    $(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)DEPENDENCIES_ON_SHARED_LIBRARIES += \
86      $(my_register_name):$(LOCAL_INSTALLED_MODULE):$(subst $(space),$(comma),$(my_shared_libraries))
87  endif
88  ifdef LOCAL_DYLIB_LIBRARIES
89    my_dylibs := $(LOCAL_DYLIB_LIBRARIES)
90    # Treat these as shared library dependencies for installation purposes.
91    ifdef LOCAL_USE_VNDK
92      my_dylibs := $(foreach l,$(my_dylibs),\
93        $(if $(SPLIT_VENDOR.SHARED_LIBRARIES.$(l)),$(l).vendor,$(l)))
94    endif
95    $(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)DEPENDENCIES_ON_SHARED_LIBRARIES += \
96      $(my_register_name):$(LOCAL_INSTALLED_MODULE):$(subst $(space),$(comma),$(my_dylibs))
97  endif
98endif
99
100$(LOCAL_BUILT_MODULE): $(LOCAL_PREBUILT_MODULE_FILE)
101ifeq ($(LOCAL_IS_HOST_MODULE) $(if $(filter EXECUTABLES SHARED_LIBRARIES NATIVE_TESTS,$(LOCAL_MODULE_CLASS)),true,),true true)
102	$(copy-or-link-prebuilt-to-target)
103  ifneq ($(filter EXECUTABLES NATIVE_TESTS,$(LOCAL_MODULE_CLASS)),)
104	[ -x $@ ] || ( $(call echo-error,$@,Target of symlink is not executable); false )
105  endif
106else
107	$(transform-prebuilt-to-target)
108  ifneq ($(filter EXECUTABLES NATIVE_TESTS,$(LOCAL_MODULE_CLASS)),)
109	$(hide) chmod +x $@
110  endif
111endif
112
113ifndef LOCAL_IS_HOST_MODULE
114  ifdef LOCAL_SOONG_UNSTRIPPED_BINARY
115    my_symbol_path := $(if $(LOCAL_SOONG_SYMBOL_PATH),$(LOCAL_SOONG_SYMBOL_PATH),$(my_module_path))
116    # Store a copy with symbols for symbolic debugging
117    my_unstripped_path := $(TARGET_OUT_UNSTRIPPED)/$(patsubst $(PRODUCT_OUT)/%,%,$(my_symbol_path))
118    # drop /root as /root is mounted as /
119    my_unstripped_path := $(patsubst $(TARGET_OUT_UNSTRIPPED)/root/%,$(TARGET_OUT_UNSTRIPPED)/%, $(my_unstripped_path))
120    symbolic_output := $(my_unstripped_path)/$(my_installed_module_stem)
121    $(eval $(call copy-one-file,$(LOCAL_SOONG_UNSTRIPPED_BINARY),$(symbolic_output)))
122    $(LOCAL_BUILT_MODULE): | $(symbolic_output)
123  endif
124endif
125
126create_coverage_zip :=
127
128ifeq ($(NATIVE_COVERAGE),true)
129   create_coverage_zip := true
130endif
131
132# Until Rust supports LLVM coverage, Soong assumes GCOV coverage in both cases.
133# Therefore we should create the coverage zip with the gcno files in this case as well.
134ifeq ($(CLANG_COVERAGE),true)
135   create_coverage_zip := true
136endif
137
138ifdef create_coverage_zip
139  ifneq (,$(strip $(LOCAL_PREBUILT_COVERAGE_ARCHIVE)))
140    $(eval $(call copy-one-file,$(LOCAL_PREBUILT_COVERAGE_ARCHIVE),$(intermediates)/$(LOCAL_MODULE).zip))
141    ifneq ($(LOCAL_UNINSTALLABLE_MODULE),true)
142      ifdef LOCAL_IS_HOST_MODULE
143        my_coverage_path := $($(my_prefix)OUT_COVERAGE)/$(patsubst $($(my_prefix)OUT)/%,%,$(my_module_path))
144      else
145        my_coverage_path := $(TARGET_OUT_COVERAGE)/$(patsubst $(PRODUCT_OUT)/%,%,$(my_module_path))
146      endif
147      my_coverage_path := $(my_coverage_path)/$(patsubst %.so,%,$(my_installed_module_stem)).zip
148      $(eval $(call copy-one-file,$(LOCAL_PREBUILT_COVERAGE_ARCHIVE),$(my_coverage_path)))
149      $(LOCAL_BUILT_MODULE): $(my_coverage_path)
150    endif
151  endif
152endif
153
154# A product may be configured to strip everything in some build variants.
155# We do the stripping as a post-install command so that LOCAL_BUILT_MODULE
156# is still with the symbols and we don't need to clean it (and relink) when
157# you switch build variant.
158ifneq ($(filter $(STRIP_EVERYTHING_BUILD_VARIANTS),$(TARGET_BUILD_VARIANT)),)
159$(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := \
160  $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_STRIP) --strip-all $(LOCAL_INSTALLED_MODULE)
161endif
162
163$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
164
165# We don't care about installed rlib/static libraries, since the libraries have
166# already been linked into the module at that point. We do, however, care
167# about the NOTICE files for any rlib/static libraries that we use.
168# (see notice_files.mk)
169#
170# Filter out some NDK libraries that are not being exported.
171my_static_libraries := \
172    $(filter-out ndk_libc++_static ndk_libc++abi ndk_libandroid_support ndk_libunwind \
173      ndk_libc++_static.native_bridge ndk_libc++abi.native_bridge \
174      ndk_libandroid_support.native_bridge ndk_libunwind.native_bridge, \
175      $(LOCAL_STATIC_LIBRARIES))
176installed_static_library_notice_file_targets := \
177    $(foreach lib,$(my_static_libraries), \
178      NOTICE-$(if $(LOCAL_IS_HOST_MODULE),HOST$(if $(my_host_cross),_CROSS,),TARGET)-STATIC_LIBRARIES-$(lib))
179installed_static_library_notice_file_targets += \
180    $(foreach lib,$(LOCAL_RLIB_LIBRARIES), \
181      NOTICE-$(if $(LOCAL_IS_HOST_MODULE),HOST$(if $(my_host_cross),_CROSS,),TARGET)-RLIB_LIBRARIES-$(lib))
182
183$(notice_target): | $(installed_static_library_notice_file_targets)
184$(LOCAL_INSTALLED_MODULE): | $(notice_target)
185