summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Chang <vichang@google.com>2021-07-29 16:17:31 +0100
committerVictor Chang <vichang@google.com>2021-07-30 13:11:47 +0100
commit23d9f7a23793a0b009a5afd05af253b7ee1d941b (patch)
treeef6e9dd3c09f4880c4d406d7d069499a67bbf73b
parent3fbb01db98e2a9b699af7532cbef844bf40b0db8 (diff)
downloadicu-23d9f7a23793a0b009a5afd05af253b7ee1d941b.tar.gz
Avoid python 2 and hardcoding the clang version in the icu4c
The clang keeps get updated, and the hardcoded version in the script gets outdated quicly, and the script stopped working. Avoid hardcoding the version, and so the script should keep working even though clang is updated. Also, print the clang version in the script. Test: ./generate_ndk.py Change-Id: Ia5cfd2db9af5a75f93cb54a78363076c973c8303
-rwxr-xr-xtools/icu4c_srcgen/generate_libandroidicu.py10
-rwxr-xr-xtools/icu4c_srcgen/generate_ndk.py10
-rw-r--r--tools/icu4c_srcgen/genutil.py46
3 files changed, 43 insertions, 23 deletions
diff --git a/tools/icu4c_srcgen/generate_libandroidicu.py b/tools/icu4c_srcgen/generate_libandroidicu.py
index 25c538057..85ca8893b 100755
--- a/tools/icu4c_srcgen/generate_libandroidicu.py
+++ b/tools/icu4c_srcgen/generate_libandroidicu.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
#
# Copyright (C) 2018 The Android Open Source Project
#
@@ -88,13 +88,11 @@ def main():
with open(android_path('external/icu/libandroidicu/static_shim/shim.cpp'),
'w') as out_file:
out_file.write(generate_shim(functions, includes, SYMBOL_SUFFIX,
- 'libandroidicu_shim.cpp.j2')
- .encode('utf8'))
+ 'libandroidicu_shim.cpp.j2'))
with open(android_path('external/icu/libandroidicu/libandroidicu.map.txt'),
'w') as out_file:
- out_file.write(generate_symbol_txt(functions, [], 'libandroidicu.map.txt.j2')
- .encode('utf8'))
+ out_file.write(generate_symbol_txt(functions, [], 'libandroidicu.map.txt.j2'))
for path in parser.header_paths_to_copy:
basename = os.path.basename(path)
@@ -102,5 +100,7 @@ def main():
copy_header_only_files()
+ print("Done. See libandroidicu/ for the generated content.")
+
if __name__ == '__main__':
main()
diff --git a/tools/icu4c_srcgen/generate_ndk.py b/tools/icu4c_srcgen/generate_ndk.py
index 802d07ea4..42e6808bf 100755
--- a/tools/icu4c_srcgen/generate_ndk.py
+++ b/tools/icu4c_srcgen/generate_ndk.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
#
# Copyright (C) 2018 The Android Open Source Project
#
@@ -221,12 +221,10 @@ def main():
with open(android_path('external/icu/libicu/src/shim.cpp'),
'w') as out_file:
- out_file.write(generate_shim(functions, includes, SYMBOL_SUFFIX, 'libicu_shim.cpp.j2')
- .encode('utf8'))
+ out_file.write(generate_shim(functions, includes, SYMBOL_SUFFIX, 'libicu_shim.cpp.j2'))
with open(android_path('external/icu/libicu/libicu.map.txt'), 'w') as out_file:
- out_file.write(generate_symbol_txt(functions, [], 'libicu.map.txt.j2')
- .encode('utf8'))
+ out_file.write(generate_symbol_txt(functions, [], 'libicu.map.txt.j2'))
# Process the C headers and put them into the ndk folder.
for src_path in parser.header_paths_to_copy:
@@ -245,5 +243,7 @@ def main():
subprocess.check_call(
[android_path('external/icu/tools/icu4c_srcgen/doc_patches/apply_patches.sh')])
+ print("Done. See the generated headers at libicu/ndk_headers/.")
+
if __name__ == '__main__':
main()
diff --git a/tools/icu4c_srcgen/genutil.py b/tools/icu4c_srcgen/genutil.py
index d652ac2e6..39b4eda06 100644
--- a/tools/icu4c_srcgen/genutil.py
+++ b/tools/icu4c_srcgen/genutil.py
@@ -70,15 +70,38 @@ def android_path(*args):
return os.path.join(ANDROID_TOP, *args)
-# TODO: Include clang bindings in prebuilt package. http://b/119270767
-site.addsitedir(android_path('external/clang/bindings/python'))
-import clang.cindex # pylint: disable=import-error,wrong-import-position
+def get_clang_path():
+ """Find the latest clang version and return the full path"""
+ base_path = android_path('prebuilts/clang/host/linux-x86/')
+ files = [f for f in os.listdir(base_path) if f.startswith('clang-r')]
+ # TODO: Don't use sort() because it assumes the same number of digits in the version name
+ files.sort(reverse=True)
+ selected = files[0]
+ print("Using clang version %s" % selected)
+ path = os.path.join(base_path, selected)
+ return path
+
+
+def get_clang_lib_path(clang_path):
+ """Return the libclang.so path"""
+ base_path = os.path.join(clang_path, 'lib64')
+ files = [f for f in os.listdir(base_path) if f.startswith('libclang.so.')]
+ return os.path.join(base_path, files[0])
+
-# TODO: Do not hardcode clang version. http://b/119270767
-CLANG_REVISION = 'r383902c'
-CLANG_LIB_VERSION = '11git'
-CLANG_HEADER_VERSION = '11.0.3'
-CLANG_PATH = android_path('prebuilts/clang/host/linux-x86/clang-%s' % CLANG_REVISION)
+def get_clang_header_dir(clang_path):
+ """Return the path to clang header directory"""
+ base_path = os.path.join(clang_path, 'lib64/clang/')
+ files = os.listdir(base_path)
+ return os.path.join(base_path, files[0], 'include/')
+
+
+CLANG_PATH = get_clang_path()
+CLANG_LIB_PATH = get_clang_lib_path(CLANG_PATH)
+CLANG_HEADER_PATH = get_clang_header_dir(CLANG_PATH)
+
+site.addsitedir(os.path.join(CLANG_PATH, 'lib64/python3/site-packages/'))
+import clang.cindex # pylint: disable=import-error,wrong-import-position
class Function:
@@ -170,9 +193,7 @@ class DeclaredFunctionsParser:
# Configures libclang to load in our environment
# Set up LD_LIBRARY_PATH to include libclang.so, libLLVM.so, etc. Note
# that setting LD_LIBRARY_PATH with os.putenv() sometimes doesn't help.
- # clang.cindex.Config.set_library_path(os.path.join(CLANG_PATH, 'lib64'))
- clang.cindex.Config.set_library_file(
- os.path.join(CLANG_PATH, 'lib64', 'libclang.so.%s' % CLANG_LIB_VERSION))
+ clang.cindex.Config.set_library_file(CLANG_LIB_PATH)
def set_va_functions_mapping(self, mapping):
"""Set mapping from a variable argument function to an implementation.
@@ -232,8 +253,7 @@ class DeclaredFunctionsParser:
]
include_dirs = [
- # TODO: Do not hardcode clang version. http://b/119270767
- os.path.join(CLANG_PATH, 'lib64/clang/', CLANG_HEADER_VERSION, 'include/'),
+ CLANG_HEADER_PATH,
android_path('bionic/libc/include'),
android_path('external/icu/android_icu4c/include'),
android_path('external/icu/icu4c/source/common'),