From 61ecbbcd6fd63650a33a32e8db7da71cb8caef98 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Tue, 25 Feb 2025 08:00:41 +0300 Subject: [PATCH] scripts: waifulib: xcompile: add support for building on Windows. Drop using shortcut target clang symlinks, as those don't work on Windows at all (they are wrapped into batch files, which can't be invoked like exes) --- scripts/waifulib/xcompile.py | 42 +++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index e8ea2da2..1b833551 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -50,6 +50,7 @@ class Android: self.api = api self.toolchain = toolchain self.arch = arch + self.exe = '.exe' if sys.platform.startswith('win32') or sys.platform.startswith('cygwin') else '' for i in ANDROID_NDK_ENVVARS: self.ndk_home = os.getenv(i) @@ -196,10 +197,10 @@ class Android: def gen_toolchain_path(self): if self.is_clang(): - triplet = '%s%d-' % (self.ndk_triplet(llvm_toolchain = True), self.api) + base = '' else: - triplet = self.ndk_triplet() + '-' - return os.path.join(self.gen_gcc_toolchain_path(), 'bin', triplet) + base = self.ndk_triplet() + '-' + return os.path.join(self.gen_gcc_toolchain_path(), 'bin', base) def gen_binutils_path(self): if self.ndk_rev >= 23: @@ -215,7 +216,11 @@ class Android: s = environ['CC'] return '%s --target=%s%d' % (s, self.ndk_triplet(), self.api) - return self.gen_toolchain_path() + ('clang' if self.is_clang() else 'gcc') + + if self.is_clang(): + return '%s --target=%s%d' % (self.gen_toolchain_path() + 'clang' + self.exe, self.ndk_triplet(), self.api) + + return self.gen_toolchain_path() + 'gcc' def cxx(self): if self.is_host(): @@ -226,19 +231,33 @@ class Android: s = environ['CXX'] return '%s --target=%s%d' % (s, self.ndk_triplet(), self.api) - return self.gen_toolchain_path() + ('clang++' if self.is_clang() else 'g++') + + if self.is_clang(): + return '%s --target=%s%d' % (self.gen_toolchain_path() + 'clang++' + self.exe, self.ndk_triplet(), self.api) + + return self.gen_toolchain_path() + 'g++' def strip(self): if self.is_host(): environ = getattr(self.ctx, 'environ', os.environ) - if 'STRIP' in environ: return environ['STRIP'] return 'llvm-strip' if self.ndk_rev >= 23: - return os.path.join(self.gen_binutils_path(), 'llvm-strip') - return os.path.join(self.gen_binutils_path(), 'strip') + return os.path.join(self.gen_binutils_path(), 'llvm-strip' + self.exe) + return os.path.join(self.gen_binutils_path(), 'strip' + self.exe) + + def ar(self): + if self.is_host(): + environ = getattr(self.ctx, 'environ', os.environ) + if 'AR' in environ: + return environ['AR'] + return 'llvm-ar' + + if self.ndk_rev >= 23: + return os.path.join(self.gen_binutils_path(), 'llvm-ar' + self.exe) + return os.path.join(self.gen_binutils_path(), 'ar' + self.exe) def system_stl(self): # TODO: proper STL support @@ -528,14 +547,21 @@ def configure(conf): conf.fatal('Unknown arch: %s. Supported: %r' % (values[0], ', '.join(valid_archs))) conf.android = android = Android(conf, values[0], values[1], int(values[2])) + conf.environ['CC'] = android.cc() conf.environ['CXX'] = android.cxx() conf.environ['STRIP'] = android.strip() + conf.environ['AR'] = android.ar() conf.env.CFLAGS += android.cflags() conf.env.CXXFLAGS += android.cflags(True) conf.env.LINKFLAGS += android.linkflags() conf.env.LDFLAGS += android.ldflags() + from waflib.Tools.compiler_c import c_compiler + from waflib.Tools.compiler_cxx import cxx_compiler + c_compiler['win32'] = ['clang' if android.is_clang() or android.is_host() else 'gcc'] + cxx_compiler['win32'] = ['clang++' if android.is_clang() or android.is_host() else 'gxx'] + conf.env.HAVE_M = True if android.is_hardfp(): conf.env.LIB_M = ['m_hard']