From f2392b57090af8c0a811e4d91164f004fc0d18f5 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']