1# Copyright (C) 2017 The Android Open Source Project 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15current_makefile := $(lastword $(MAKEFILE_LIST)) 16 17# BOARD_VNDK_VERSION must be set to 'current' in order to generate a VNDK snapshot. 18ifeq ($(BOARD_VNDK_VERSION),current) 19 20# PLATFORM_VNDK_VERSION must be set. 21ifneq (,$(PLATFORM_VNDK_VERSION)) 22 23# BOARD_VNDK_RUNTIME_DISABLE must not be set to 'true'. 24ifneq ($(BOARD_VNDK_RUNTIME_DISABLE),true) 25 26# Returns arch-specific libclang_rt.ubsan* library name. 27# Because VNDK_CORE_LIBRARIES includes all arch variants for libclang_rt.ubsan* 28# libs, the arch-specific libs are selected separately. 29# 30# Args: 31# $(1): if not empty, evaluates for TARGET_2ND_ARCH 32define clang-ubsan-vndk-core 33$(strip \ 34 $(eval prefix := $(if $(1),2ND_,)) \ 35 $(addsuffix .vendor,$($(addprefix $(prefix),UBSAN_RUNTIME_LIBRARY))) \ 36) 37endef 38 39# Returns list of file paths of the intermediate objs 40# 41# Args: 42# $(1): list of module and filename pairs (e.g., ld.config.txt:ld.config.27.txt ...) 43# $(2): target class (e.g., SHARED_LIBRARIES, STATIC_LIBRARIES, ETC) 44# $(3): if not empty, evaluates for TARGET_2ND_ARCH 45define paths-of-intermediates 46$(strip \ 47 $(foreach pair,$(1), \ 48 $(eval split_pair := $(subst :,$(space),$(pair))) \ 49 $(eval module := $(word 1,$(split_pair))) \ 50 $(eval filename := $(word 2,$(split_pair))) \ 51 $(eval dir := $(call intermediates-dir-for,$(2),$(module),,,$(3))) \ 52 $(call append-path,$(dir),$(filename)) \ 53 ) \ 54) 55endef 56 57# Returns paths of notice files under $(TARGET_OUT_NOTICE_FILES) 58# 59# Args: 60# $(1): list of lib names (e.g., libfoo.vendor) 61# $(2): vndk lib type, one of 'vndk' or 'vndk-sp' 62define paths-of-notice-files 63$(strip \ 64 $(eval lib_dir := lib$(if $(TARGET_IS_64BIT),64,)) \ 65 $(eval vndk_dir := $(2)-$(PLATFORM_VNDK_VERSION)) \ 66 $(foreach lib,$(1), \ 67 $(eval notice_file_name := $(patsubst %.vendor,%.so.txt,$(lib))) \ 68 $(TARGET_OUT_NOTICE_FILES)/src/system/$(lib_dir)/$(vndk_dir)/$(notice_file_name) \ 69 ) \ 70) 71endef 72 73# If in the future libclang_rt.ubsan* is removed from the VNDK-core list, 74# need to update the related logic in this file. 75ifeq (,$(filter libclang_rt.ubsan%,$(VNDK_CORE_LIBRARIES))) 76 $(warning libclang_rt.ubsan* is no longer a VNDK-core library. Please update this file.) 77 vndk_core_libs := $(addsuffix .vendor,$(VNDK_CORE_LIBRARIES)) 78else 79 vndk_core_libs := $(addsuffix .vendor,$(filter-out libclang_rt.ubsan%,$(VNDK_CORE_LIBRARIES))) 80 81 vndk_core_libs += $(call clang-ubsan-vndk-core) 82 ifdef TARGET_2ND_ARCH 83 vndk_core_libs += $(call clang-ubsan-vndk-core,true) 84 endif 85endif 86 87vndk_sp_libs := $(addsuffix .vendor,$(VNDK_SAMEPROCESS_LIBRARIES)) 88vndk_private_libs := $(addsuffix .vendor,$(VNDK_PRIVATE_LIBRARIES)) 89 90vndk_snapshot_libs := \ 91 $(vndk_core_libs) \ 92 $(vndk_sp_libs) 93 94vndk_prebuilt_txts := \ 95 ld.config.txt \ 96 vndksp.libraries.txt \ 97 llndk.libraries.txt 98 99vndk_snapshot_top := $(call intermediates-dir-for,PACKAGING,vndk-snapshot) 100vndk_snapshot_out := $(vndk_snapshot_top)/vndk-snapshot 101vndk_snapshot_configs_out := $(vndk_snapshot_top)/configs 102 103####################################### 104# vndkcore.libraries.txt 105vndkcore.libraries.txt := $(vndk_snapshot_configs_out)/vndkcore.libraries.txt 106$(vndkcore.libraries.txt): $(vndk_core_libs) 107 @echo 'Generating: $@' 108 @rm -f $@ 109 @mkdir -p $(dir $@) 110 $(hide) echo -n > $@ 111 $(hide) $(foreach lib,$^,echo $(patsubst %.vendor,%,$(lib)).so >> $@;) 112 113 114####################################### 115# vndkprivate.libraries.txt 116vndkprivate.libraries.txt := $(vndk_snapshot_configs_out)/vndkprivate.libraries.txt 117$(vndkprivate.libraries.txt): $(vndk_private_libs) 118 @echo 'Generating: $@' 119 @rm -f $@ 120 @mkdir -p $(dir $@) 121 $(hide) echo -n > $@ 122 $(hide) $(foreach lib,$^,echo $(patsubst %.vendor,%,$(lib)).so >> $@;) 123 124 125####################################### 126# module_paths.txt 127module_paths.txt := $(vndk_snapshot_configs_out)/module_paths.txt 128$(module_paths.txt): $(vndk_snapshot_libs) 129 @echo 'Generating: $@' 130 @rm -f $@ 131 @mkdir -p $(dir $@) 132 $(hide) echo -n > $@ 133 $(hide) $(foreach lib,$^,echo $(patsubst %.vendor,%,$(lib)).so $(ALL_MODULES.$(lib).PATH) >> $@;) 134 135 136vndk_snapshot_configs := \ 137 $(vndkcore.libraries.txt) \ 138 $(vndkprivate.libraries.txt) \ 139 $(module_paths.txt) 140 141####################################### 142# vndk_snapshot_zip 143vndk_snapshot_variant := $(vndk_snapshot_out)/$(TARGET_ARCH) 144binder := 145ifneq ($(TARGET_USES_64_BIT_BINDER), true) 146 binder := binder32 147endif 148vndk_lib_dir := $(subst $(space),/,$(strip $(vndk_snapshot_variant) $(binder) arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT))) 149vndk_lib_dir_2nd := $(subst $(space),/,$(strip $(vndk_snapshot_variant) $(binder) arch-$(TARGET_2ND_ARCH)-$(TARGET_2ND_ARCH_VARIANT))) 150vndk_snapshot_zip := $(PRODUCT_OUT)/android-vndk-$(TARGET_PRODUCT).zip 151 152$(vndk_snapshot_zip): PRIVATE_VNDK_SNAPSHOT_OUT := $(vndk_snapshot_out) 153 154$(vndk_snapshot_zip): PRIVATE_VNDK_CORE_OUT := $(vndk_lib_dir)/shared/vndk-core 155$(vndk_snapshot_zip): PRIVATE_VNDK_CORE_INTERMEDIATES := \ 156 $(call paths-of-intermediates,$(foreach lib,$(vndk_core_libs),$(lib):$(lib).so),SHARED_LIBRARIES) 157 158$(vndk_snapshot_zip): PRIVATE_VNDK_SP_OUT := $(vndk_lib_dir)/shared/vndk-sp 159$(vndk_snapshot_zip): PRIVATE_VNDK_SP_INTERMEDIATES := \ 160 $(call paths-of-intermediates,$(foreach lib,$(vndk_sp_libs),$(lib):$(lib).so),SHARED_LIBRARIES) 161 162$(vndk_snapshot_zip): PRIVATE_CONFIGS_OUT := $(vndk_snapshot_variant)/configs 163$(vndk_snapshot_zip): PRIVATE_CONFIGS_INTERMEDIATES := \ 164 $(call paths-of-intermediates,$(foreach txt,$(vndk_prebuilt_txts), \ 165 $(txt):$(patsubst %.txt,%.$(PLATFORM_VNDK_VERSION).txt,$(txt))),ETC) \ 166 $(vndk_snapshot_configs) 167 168$(vndk_snapshot_zip): PRIVATE_NOTICE_FILES_OUT := $(vndk_snapshot_variant)/NOTICE_FILES 169$(vndk_snapshot_zip): PRIVATE_NOTICE_FILES_INTERMEDIATES := \ 170 $(call paths-of-notice-files,$(vndk_core_libs),vndk) \ 171 $(call paths-of-notice-files,$(vndk_sp_libs),vndk-sp) 172 173ifdef TARGET_2ND_ARCH 174$(vndk_snapshot_zip): PRIVATE_VNDK_CORE_OUT_2ND := $(vndk_lib_dir_2nd)/shared/vndk-core 175$(vndk_snapshot_zip): PRIVATE_VNDK_CORE_INTERMEDIATES_2ND := \ 176 $(call paths-of-intermediates,$(foreach lib,$(vndk_core_libs),$(lib):$(lib).so),SHARED_LIBRARIES,true) 177 178$(vndk_snapshot_zip): PRIVATE_VNDK_SP_OUT_2ND := $(vndk_lib_dir_2nd)/shared/vndk-sp 179$(vndk_snapshot_zip): PRIVATE_VNDK_SP_INTERMEDIATES_2ND := \ 180 $(call paths-of-intermediates,$(foreach lib,$(vndk_sp_libs),$(lib):$(lib).so),SHARED_LIBRARIES,true) 181endif 182 183# Args 184# $(1): destination directory 185# $(2): list of files to copy 186$(vndk_snapshot_zip): private-copy-vndk-intermediates = \ 187 $(if $(2),$(strip \ 188 @mkdir -p $(1); \ 189 $(foreach file,$(2), \ 190 if [ -e $(file) ]; then \ 191 cp -p $(file) $(call append-path,$(1),$(subst .vendor,,$(notdir $(file)))); \ 192 fi; \ 193 ) \ 194 )) 195 196vndk_snapshot_dependencies := \ 197 $(vndk_snapshot_libs) \ 198 $(vndk_prebuilt_txts) \ 199 $(vndk_snapshot_configs) 200 201$(vndk_snapshot_zip): $(vndk_snapshot_dependencies) $(SOONG_ZIP) 202 @echo 'Generating VNDK snapshot: $@' 203 @rm -f $@ 204 @rm -rf $(PRIVATE_VNDK_SNAPSHOT_OUT) 205 @mkdir -p $(PRIVATE_VNDK_SNAPSHOT_OUT) 206 $(call private-copy-vndk-intermediates, \ 207 $(PRIVATE_VNDK_CORE_OUT),$(PRIVATE_VNDK_CORE_INTERMEDIATES)) 208 $(call private-copy-vndk-intermediates, \ 209 $(PRIVATE_VNDK_SP_OUT),$(PRIVATE_VNDK_SP_INTERMEDIATES)) 210 $(call private-copy-vndk-intermediates, \ 211 $(PRIVATE_CONFIGS_OUT),$(PRIVATE_CONFIGS_INTERMEDIATES)) 212 $(call private-copy-vndk-intermediates, \ 213 $(PRIVATE_NOTICE_FILES_OUT),$(PRIVATE_NOTICE_FILES_INTERMEDIATES)) 214ifdef TARGET_2ND_ARCH 215 $(call private-copy-vndk-intermediates, \ 216 $(PRIVATE_VNDK_CORE_OUT_2ND),$(PRIVATE_VNDK_CORE_INTERMEDIATES_2ND)) 217 $(call private-copy-vndk-intermediates, \ 218 $(PRIVATE_VNDK_SP_OUT_2ND),$(PRIVATE_VNDK_SP_INTERMEDIATES_2ND)) 219endif 220 $(hide) $(SOONG_ZIP) -o $@ -C $(PRIVATE_VNDK_SNAPSHOT_OUT) -D $(PRIVATE_VNDK_SNAPSHOT_OUT) 221 222.PHONY: vndk 223vndk: $(vndk_snapshot_zip) 224 225$(call dist-for-goals, vndk, $(vndk_snapshot_zip)) 226 227# clear global vars 228clang-ubsan-vndk-core := 229paths-of-intermediates := 230paths-of-notice-files := 231vndk_core_libs := 232vndk_sp_libs := 233vndk_snapshot_libs := 234vndk_prebuilt_txts := 235vndk_snapshot_configs := 236vndk_snapshot_top := 237vndk_snapshot_out := 238vndk_snapshot_configs_out := 239vndk_snapshot_variant := 240binder := 241vndk_lib_dir := 242vndk_lib_dir_2nd := 243vndk_snapshot_dependencies := 244 245else # BOARD_VNDK_RUNTIME_DISABLE is set to 'true' 246error_msg := "CANNOT generate VNDK snapshot. BOARD_VNDK_RUNTIME_DISABLE must not be set to 'true'." 247endif # BOARD_VNDK_RUNTIME_DISABLE 248 249else # PLATFORM_VNDK_VERSION is NOT set 250error_msg := "CANNOT generate VNDK snapshot. PLATFORM_VNDK_VERSION must be set." 251endif # PLATFORM_VNDK_VERSION 252 253else # BOARD_VNDK_VERSION is NOT set to 'current' 254error_msg := "CANNOT generate VNDK snapshot. BOARD_VNDK_VERSION must be set to 'current'." 255endif # BOARD_VNDK_VERSION 256 257ifneq (,$(error_msg)) 258 259.PHONY: vndk 260vndk: 261 $(call echo-error,$(current_makefile),$(error_msg)) 262 exit 1 263 264endif 265