diff --git a/scripts/wdev.py b/scripts/wdev.py index 4d3ab9d26d..3f9d3661bb 100644 --- a/scripts/wdev.py +++ b/scripts/wdev.py @@ -221,6 +221,12 @@ def __init__(self, name=None): self.windows_name = 'x64' self.windows_config = 'x64' self.windows_suffix = '64' + elif name in ('arm64', 'ARM64'): + self.bits = 64 + self.windows_subdir = 'ARM64/' + self.windows_name = 'ARM64' + self.windows_config = 'ARM64' + self.windows_suffix = '64' else: assert 0, f'Unrecognised cpu name: {name}' @@ -356,10 +362,15 @@ def __repr__(self): def _cpu_name(): ''' - Returns `x32` or `x64` depending on Python build. + Returns `x32`, `x64` or `ARM64` depending on Python build. ''' - #log(f'sys.maxsize={hex(sys.maxsize)}') - return f'x{32 if sys.maxsize == 2**31 - 1 else 64}' + # Check platform architecture + machine = platform.machine().lower() + if machine in ('arm64', 'aarch64'): + return 'arm64' + else: + #log(f'sys.maxsize={hex(sys.maxsize)}') + return f'x{32 if sys.maxsize == 2**31 - 1 else 64}' diff --git a/scripts/wrap/__main__.py b/scripts/wrap/__main__.py index ff95a1a5e8..05a4a6448c 100644 --- a/scripts/wrap/__main__.py +++ b/scripts/wrap/__main__.py @@ -1870,12 +1870,16 @@ def fn(name): if state.state_.windows: libdir = f'{build_dirs.dir_mupdf}/platform/win32/' - mupdfcpp_lib = f'{build_dirs.dir_mupdf}/platform/win32/' - if build_dirs.cpu.bits == 64: + if build_dirs.cpu.name == 'arm64': + libdir += 'ARM64/' + elif build_dirs.cpu.bits == 64: libdir += 'x64/' libdir += 'Debug/' if debug else 'Memento/' if memento else 'Release/' libs = list() - libs.append(libdir + ('mupdfcpp64.lib' if build_dirs.cpu.bits == 64 else 'mupdfcpp.lib')) + if build_dirs.cpu.name in ('arm64', 'x64'): + libs.append(libdir + f'mupdfcpp{build_dirs.cpu.windows_suffix}.lib') + else: + libs.append(libdir + 'mupdfcpp.lib') if memento: libs.append(libdir + 'libmupdf.lib') diff --git a/scripts/wrap/state.py b/scripts/wrap/state.py index 4a621bb6ed..971be75de5 100644 --- a/scripts/wrap/state.py +++ b/scripts/wrap/state.py @@ -221,6 +221,12 @@ def __init__(self, name=None): self.windows_name = 'x64' self.windows_config = 'x64' self.windows_suffix = '64' + elif name in ('arm64', 'ARM64'): + self.bits = 64 + self.windows_subdir = 'ARM64/' + self.windows_name = 'ARM64' + self.windows_config = 'ARM64' + self.windows_suffix = '64' else: assert 0, f'Unrecognised cpu name: {name}' @@ -239,9 +245,14 @@ def python_version(): def cpu_name(): ''' - Returns 'x32' or 'x64' depending on Python build. + Returns 'x32', 'x64' or 'ARM64' depending on Python build. ''' - ret = f'x{32 if sys.maxsize == 2**31 - 1 else 64}' + machine = platform.machine().lower() + if machine in ('arm64', 'aarch64'): + ret = 'arm64' + else: + #log(f'sys.maxsize={hex(sys.maxsize)}') + ret = f'x{32 if sys.maxsize == 2**31 - 1 else 64}' #jlib.log(f'returning ret={ret!r}') return ret @@ -335,7 +346,7 @@ def set_dir_so( self, dir_so): self.cpu = None self.python_version = None for flag in flags: - if flag in ('x32', 'x64'): + if flag in ('x32', 'x64', 'arm64', 'ARM64'): self.cpu = Cpu(flag) if flag.startswith('py'): self.python_version = flag[2:] diff --git a/source/fitz/hyphen.c b/source/fitz/hyphen.c index 01a1c0e6dd..853b0fe3c9 100644 --- a/source/fitz/hyphen.c +++ b/source/fitz/hyphen.c @@ -34,6 +34,13 @@ extern const unsigned char _binary_resources_hyphen_hyph_all_zip_end; #else +#ifdef _M_ARM64 +// Disable embedded hyphen data on ARM64 to avoid linker alignment errors +#define HYPH_STD NULL, 0 +#define HYPH_ALL NULL, 0 + +#else + extern const unsigned char _binary_hyph_std_zip[]; extern const unsigned int _binary_hyph_std_zip_size; #define HYPH_STD _binary_hyph_std_zip, _binary_hyph_std_zip_size @@ -41,6 +48,7 @@ extern const unsigned int _binary_hyph_std_zip_size; extern const unsigned char _binary_hyph_all_zip[]; extern const unsigned int _binary_hyph_all_zip_size; #define HYPH_ALL _binary_hyph_all_zip, _binary_hyph_all_zip_size +#endif #endif