summaryrefslogtreecommitdiffstats
path: root/rootdir
diff options
context:
space:
mode:
authorJustin Yun <justinyun@google.com>2018-09-11 00:42:36 +0000
committerJustin Yun <justinyun@google.com>2018-09-11 09:45:09 +0900
commit79d07bcfc3051a2f3e309b8c599476cdfd0e0a33 (patch)
tree3dcf7504bba011437d8a13169fe4670f24a40924 /rootdir
parent9a568732141cbc7ae1f91812cca59c6764d88809 (diff)
downloadsystem_core-79d07bcfc3051a2f3e309b8c599476cdfd0e0a33.tar.gz
system_core-79d07bcfc3051a2f3e309b8c599476cdfd0e0a33.tar.bz2
system_core-79d07bcfc3051a2f3e309b8c599476cdfd0e0a33.zip
Restore "Check if current ld.config.txt files is backward compatible"
This reverts commit bd2b0c78a1cead7a77bd7a4ec577344ce7e1bb1a. Reason for revert: Solved the build error on mac_sdk build by using python2 Bug: 112738739 Bug: 111417344 Test: make ld.config.txt Change-Id: Ic5a3ed2e6b091813c0310f859b7d20935514a7c6
Diffstat (limited to 'rootdir')
-rw-r--r--rootdir/Android.mk2
-rwxr-xr-xrootdir/ld_config_backward_compatibility_check.py177
-rw-r--r--rootdir/update_and_install_ld_config.mk13
3 files changed, 192 insertions, 0 deletions
diff --git a/rootdir/Android.mk b/rootdir/Android.mk
index 07f079722..b68dc341a 100644
--- a/rootdir/Android.mk
+++ b/rootdir/Android.mk
@@ -206,6 +206,7 @@ ifeq ($(_enforce_vndk_at_runtime),true)
LOCAL_MODULE_STEM := $(call append_vndk_version,$(LOCAL_MODULE))
include $(BUILD_SYSTEM)/base_rules.mk
ld_config_template := $(LOCAL_PATH)/etc/ld.config.txt
+check_backward_compatibility := true
vndk_version := $(PLATFORM_VNDK_VERSION)
include $(LOCAL_PATH)/update_and_install_ld_config.mk
@@ -243,6 +244,7 @@ LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)
LOCAL_MODULE_STEM := $$(LOCAL_MODULE)
include $(BUILD_SYSTEM)/base_rules.mk
ld_config_template := $(LOCAL_PATH)/etc/ld.config.txt
+check_backward_compatibility := true
vndk_version := $(1)
lib_list_from_prebuilts := true
include $(LOCAL_PATH)/update_and_install_ld_config.mk
diff --git a/rootdir/ld_config_backward_compatibility_check.py b/rootdir/ld_config_backward_compatibility_check.py
new file mode 100755
index 000000000..1a27578ea
--- /dev/null
+++ b/rootdir/ld_config_backward_compatibility_check.py
@@ -0,0 +1,177 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import glob
+import os.path
+import re
+import sys
+
+PREBUILTS_VNDK_DIR = "prebuilts/vndk"
+VENDOR_DIRECTORIES = ('/vendor', '/odm')
+
+def find_latest_vndk_snapshot_version():
+ """Returns latest vndk snapshot version in current source tree.
+ It will skip the test if the snapshot directories are not found.
+
+ Returns:
+ latest_version: string
+ """
+ vndk_dir_list = glob.glob(PREBUILTS_VNDK_DIR + "/v*")
+ if not vndk_dir_list:
+ """Exit without error because we may have source trees that do not include
+ VNDK snapshot directories in it.
+ """
+ sys.exit(0)
+ vndk_ver_list = [re.match(r".*/v(\d+)", vndk_dir).group(1)
+ for vndk_dir in vndk_dir_list]
+ latest_version = max(vndk_ver_list)
+ if latest_version == '27':
+ """Exit without error because VNDK v27 is not using ld.config.txt template
+ """
+ sys.exit(0)
+ return latest_version
+
+def get_vendor_configuration(ld_config_file):
+ """Reads the ld.config.txt file to parse the namespace configurations.
+ It finds the configurations that include vendor directories.
+
+ Args:
+ ld_config_file: string, path (relative to build top) of the ld.config.txt
+ file.
+ Returns:
+ configs: dict{string:[string]}, dictionary of namespace configurations.
+ it has 'section + property' names as keys and the directory list
+ as values.
+ """
+ try:
+ conf_file = open(ld_config_file)
+ except IOError:
+ print("error: could not read %s" % ld_config_file)
+ sys.exit(1)
+
+ configs = dict()
+ current_section = None
+
+ with conf_file:
+ for line in conf_file:
+ # ignore comments
+ found = line.find('#')
+ if found != -1:
+ line = line[:found]
+ line = line.strip()
+ if not line:
+ continue
+
+ if line[0] == '[' and line[-1] == ']':
+ # new section started
+ current_section = line[1:-1]
+ continue
+
+ if current_section == None:
+ continue
+
+ found = line.find('+=')
+ opr_len = 2
+ if found == -1:
+ found = line.find('=')
+ opr_len = 1
+ if found == -1:
+ continue
+
+ namespace = line[:found].strip()
+ if not namespace.endswith(".paths"):
+ # check ".paths" only
+ continue
+ namespace = '[' + current_section + ']' + namespace
+ values = line[found + opr_len:].strip()
+ directories = values.split(':')
+
+ for directory in directories:
+ if any(vendor_dir in directory for vendor_dir in VENDOR_DIRECTORIES):
+ if namespace in configs:
+ configs[namespace].append(directory)
+ else:
+ configs[namespace] = [directory]
+
+ return configs
+
+def get_snapshot_config(version):
+ """Finds the ld.config.{version}.txt file from the VNDK snapshot directory.
+ In the vndk prebuilt directory (prebuilts/vndk/v{version}), it searches
+ {arch}/configs/ld.config.{version}.txt file, where {arch} is one of ('arm64',
+ 'arm', 'x86_64', 'x86').
+
+ Args:
+ version: string, the VNDK snapshot version to search.
+ Returns:
+ ld_config_file: string, relative path to ld.config.{version}.txt
+ """
+ arch_list = ('arm64', 'arm', 'x86_64', 'x86')
+ for arch in arch_list:
+ ld_config_file = (PREBUILTS_VNDK_DIR
+ + "/v{0}/{1}/configs/ld.config.{0}.txt".format(version, arch))
+ if os.path.isfile(ld_config_file):
+ return ld_config_file
+ print("error: cannot find ld.config.{0}.txt file in snapshot v{0}"
+ .format(version))
+ sys.exit(1)
+
+def check_backward_compatibility(ld_config, vndk_snapshot_version):
+ """Checks backward compatibility for current ld.config.txt file with the
+ old ld.config.txt file. If any of the vendor directories in the old namespace
+ configurations are missing, the test will fail. It is allowed to have new
+ vendor directories in current ld.config.txt file.
+
+ Args:
+ ld_config: string, relative path to current ld.config.txt file.
+ vndk_snapshot_version: string, the VNDK snapshot version that has an old
+ ld.config.txt file to compare.
+ Returns:
+ result: bool, True if the current configuration is backward compatible.
+ """
+ current_config = get_vendor_configuration(ld_config)
+ old_config = get_vendor_configuration(
+ get_snapshot_config(vndk_snapshot_version))
+ for namespace in old_config:
+ if namespace not in current_config:
+ print("error: cannot find %s which was provided in ld.config.%s.txt"
+ % (namespace, vndk_snapshot_version))
+ return False
+ for path in old_config[namespace]:
+ if not path in current_config[namespace]:
+ print("error: %s for %s in ld.config.%s.txt are missing in %s"
+ % (path, namespace, vndk_snapshot_version, ld_config))
+ return False
+ return True
+
+def main():
+ if len(sys.argv) != 2:
+ print ("Usage: %s target_ld_config_txt_file_name" % sys.argv[0])
+ sys.exit(1)
+
+ latest_vndk_snapshot_version = find_latest_vndk_snapshot_version()
+ if not check_backward_compatibility(sys.argv[1],
+ latest_vndk_snapshot_version):
+ print("error: %s has backward incompatible changes to old "
+ "vendor partition." % sys.argv[1])
+ sys.exit(1)
+
+ # Current ld.config.txt file is backward compatible
+ sys.exit(0)
+
+if __name__ == '__main__':
+ main()
diff --git a/rootdir/update_and_install_ld_config.mk b/rootdir/update_and_install_ld_config.mk
index 4d6df77ae..56a30b271 100644
--- a/rootdir/update_and_install_ld_config.mk
+++ b/rootdir/update_and_install_ld_config.mk
@@ -18,10 +18,13 @@
# Read inputs
ld_config_template := $(strip $(ld_config_template))
+check_backward_compatibility := $(strip $(check_backward_compatibility))
vndk_version := $(strip $(vndk_version))
lib_list_from_prebuilts := $(strip $(lib_list_from_prebuilts))
libz_is_llndk := $(strip $(libz_is_llndk))
+compatibility_check_script := \
+ $(LOCAL_PATH)/ld_config_backward_compatibility_check.py
intermediates_dir := $(call intermediates-dir-for,ETC,$(LOCAL_MODULE))
library_lists_dir := $(intermediates_dir)
ifeq ($(lib_list_from_prebuilts),true)
@@ -82,11 +85,19 @@ $(LOCAL_BUILT_MODULE): PRIVATE_VNDK_PRIVATE_LIBRARIES_FILE := $(vndkprivate_libr
$(LOCAL_BUILT_MODULE): PRIVATE_SANITIZER_RUNTIME_LIBRARIES := $(sanitizer_runtime_libraries)
$(LOCAL_BUILT_MODULE): PRIVATE_VNDK_VERSION_SUFFIX := $(vndk_version_suffix)
$(LOCAL_BUILT_MODULE): PRIVATE_INTERMEDIATES_DIR := $(intermediates_dir)
+$(LOCAL_BUILT_MODULE): PRIVATE_COMP_CHECK_SCRIPT := $(compatibility_check_script)
deps := $(llndk_libraries_file) $(vndksp_libraries_file) $(vndkcore_libraries_file) \
$(vndkprivate_libraries_file)
+ifeq ($(check_backward_compatibility),true)
+deps += $(compatibility_check_script)
+endif
$(LOCAL_BUILT_MODULE): $(ld_config_template) $(deps)
@echo "Generate: $< -> $@"
+ifeq ($(check_backward_compatibility),true)
+ @echo "Checking backward compatibility..."
+ $(hide) $(PRIVATE_COMP_CHECK_SCRIPT) $<
+endif
@mkdir -p $(dir $@)
$(call private-filter-out-private-libs,$(PRIVATE_LLNDK_LIBRARIES_FILE),$(PRIVATE_INTERMEDIATES_DIR)/llndk_filtered)
$(hide) sed -e "s?%LLNDK_LIBRARIES%?$$(cat $(PRIVATE_INTERMEDIATES_DIR)/llndk_filtered)?g" $< >$@
@@ -108,9 +119,11 @@ $(LOCAL_BUILT_MODULE): $(ld_config_template) $(deps)
$(hide) rm -f $@.bak
ld_config_template :=
+check_backward_compatibility :=
vndk_version :=
lib_list_from_prebuilts :=
libz_is_llndk :=
+compatibility_check_script :=
intermediates_dir :=
library_lists_dir :=
llndk_libraries_file :=