From 5eef8a00cdca8493de10a76ac8be62fd036ae3fa Mon Sep 17 00:00:00 2001 From: luoqianlin Date: Fri, 4 Sep 2026 20:38:09 +0800 Subject: [PATCH] build: separate Android host and target compilers Signed-off-by: luoqianlin --- android_configure.py | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/android_configure.py b/android_configure.py index 5cea0393f48a..191ae2c7fdce 100644 --- a/android_configure.py +++ b/android_configure.py @@ -1,6 +1,8 @@ import platform import sys import os +import shutil +import subprocess # TODO: In next version, it will be a JSON file listing all the patches, and then it will iterate through to apply them. def patch_android(): @@ -18,8 +20,8 @@ def patch_android(): patch_android() sys.exit(0) -if len(sys.argv) != 4: - print("Usage: ./android-configure [patch] ") +if len(sys.argv) < 4: + print("Usage: ./android-configure [patch] [configure options...]") sys.exit(1) if not os.path.exists(sys.argv[1]) or not os.listdir(sys.argv[1]): @@ -33,6 +35,7 @@ def patch_android(): android_ndk_path = sys.argv[1] android_sdk_version = sys.argv[2] arch = sys.argv[3] +configure_options = sys.argv[4:] if arch == "arm": DEST_CPU = "arm" @@ -63,8 +66,26 @@ def patch_android(): toolchain_path = android_ndk_path + "/toolchains/llvm/prebuilt/linux-x86_64" os.environ['PATH'] += os.pathsep + toolchain_path + "/bin" -os.environ['CC'] = toolchain_path + "/bin/" + TOOLCHAIN_PREFIX + android_sdk_version + "-" + "clang" -os.environ['CXX'] = toolchain_path + "/bin/" + TOOLCHAIN_PREFIX + android_sdk_version + "-" + "clang++" +target_cc = os.path.join(toolchain_path, "bin", + TOOLCHAIN_PREFIX + android_sdk_version + "-clang") +target_cxx = os.path.join(toolchain_path, "bin", + TOOLCHAIN_PREFIX + android_sdk_version + "-clang++") + +# configure.py uses CC/CXX for compiler detection, while GYP uses the +# toolset-specific variables when generating host and target rules. +os.environ['CC_target'] = (os.environ.get('CC_target') or + os.environ.get('CC') or target_cc) +os.environ['CXX_target'] = (os.environ.get('CXX_target') or + os.environ.get('CXX') or target_cxx) +os.environ['CC'] = os.environ['CC_target'] +os.environ['CXX'] = os.environ['CXX_target'] + +host_cc_name = 'cc' if platform.system() == "Darwin" else 'gcc' +host_cxx_name = 'c++' if platform.system() == "Darwin" else 'g++' +os.environ['CC_host'] = (os.environ.get('CC_host') or + shutil.which(host_cc_name) or host_cc_name) +os.environ['CXX_host'] = (os.environ.get('CXX_host') or + shutil.which(host_cxx_name) or host_cxx_name) GYP_DEFINES = "target_arch=" + arch GYP_DEFINES += " v8_target_arch=" + arch @@ -74,4 +95,11 @@ def patch_android(): os.environ['GYP_DEFINES'] = GYP_DEFINES if os.path.exists("./configure"): - os.system("./configure --dest-cpu=" + DEST_CPU + " --dest-os=android --openssl-no-asm --cross-compiling") + command = [ + "./configure", + "--dest-cpu=" + DEST_CPU, + "--dest-os=android", + "--openssl-no-asm", + "--cross-compiling", + ] + configure_options + subprocess.run(command, check=True)