Skip to content

Commit

Permalink
Add support for Windows Arm64 compilation of packages using emsdk
Browse files Browse the repository at this point in the history
  • Loading branch information
Blackhex committed Feb 15, 2023
1 parent 6305e91 commit ce32e10
Showing 1 changed file with 40 additions and 6 deletions.
46 changes: 40 additions & 6 deletions emsdk.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,6 @@ def exit_with_error(msg):
ARCH = 'x86'
elif machine.startswith('aarch64') or machine.lower().startswith('arm64'):
ARCH = 'aarch64'
if WINDOWS:
errlog('No support for Windows on Arm, fallback to x64')
ARCH = 'x86_64'
elif machine.startswith('arm'):
ARCH = 'arm'
else:
Expand Down Expand Up @@ -256,7 +253,11 @@ def vswhere(version):
if not program_files:
program_files = os.environ['ProgramFiles']
vswhere_path = os.path.join(program_files, 'Microsoft Visual Studio', 'Installer', 'vswhere.exe')
output = json.loads(subprocess.check_output([vswhere_path, '-latest', '-version', '[%s.0,%s.0)' % (version, version + 1), '-requires', 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64', '-property', 'installationPath', '-format', 'json']))
# Source: https://learn.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-build-tools?view=vs-2022
tools_arch = 'ARM64' if ARCH == 'aarch64' else 'x86.x64'
# The "-products *" allows detection of Build Tools, the "-prerelease" allows detection of Preview version
# of Visual Studio and Build Tools.
output = json.loads(subprocess.check_output([vswhere_path, '-latest', '-products', '*', '-prerelease', '-version', '[%s.0,%s.0)' % (version, version + 1), '-requires', 'Microsoft.VisualStudio.Component.VC.Tools.' + tools_arch, '-property', 'installationPath', '-format', 'json']))
return str(output[0]['installationPath'])
except Exception:
return ''
Expand Down Expand Up @@ -1014,15 +1015,48 @@ def xcode_sdk_version():
return subprocess.checkplatform.mac_ver()[0].split('.')


def cmake_target_platform_no_tool_arch(tool):
if ARCH == 'aarch64':
return 'ARM64'
else:
return 'x64' if tool.bitness == 64 else 'Win32'


def cmake_target_platform(tool):
# Source: https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2017%202022.html#platform-selection
if hasattr(tool, 'arch'):
if tool.arch == 'aarch64':
return 'ARM64'
elif tool.arch == 'x86_64':
return 'x64'
elif tool.arch == 'x86':
return 'Win32'
else:
return cmake_target_platform_no_tool_arch(tool)
else:
return cmake_target_platform_no_tool_arch(tool)


def cmake_host_platform():
# Source: https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2017%202022.html#toolset-selection
arch_to_cmake_host_platform = {
'aarch64': 'ARM64',
'arm': 'ARM',
'x86_64': 'x64',
'x86': 'x86'
}
return arch_to_cmake_host_platform[ARCH]


def get_generator_and_config_args(tool):
args = []
cmake_generator = CMAKE_GENERATOR
if 'Visual Studio 16' in CMAKE_GENERATOR or 'Visual Studio 17' in CMAKE_GENERATOR: # VS2019 or VS2022
# With Visual Studio 16 2019, CMake changed the way they specify target arch.
# Instead of appending it into the CMake generator line, it is specified
# with a -A arch parameter.
args += ['-A', 'x64' if tool.bitness == 64 else 'x86']
args += ['-Thost=x64']
args += ['-A', cmake_target_platform(tool)]
args += ['-Thost=' + cmake_host_platform()]
elif 'Visual Studio' in CMAKE_GENERATOR and tool.bitness == 64:
cmake_generator += ' Win64'
args += ['-Thost=x64']
Expand Down

0 comments on commit ce32e10

Please sign in to comment.