From 063522d30877e4d4a4321b1f645af54fa361cd42 Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Tue, 15 Oct 2019 18:09:11 -0700 Subject: [PATCH] Adding Windows compilation support - Automatically determining build arch from running Python shell * Should work across all platforms --- .github/workflows/pythonpackage.yml | 2 +- buildutils/build.py | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index cd6c5dc..daf985d 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -13,7 +13,7 @@ jobs: # Some asyncio commands require 3.7+ # It may be possible to use 3.6 and maybe 3.5; however, this will take some patching to get examples to work python-version: [3.7] - os: [ubuntu-latest, macOS-latest] + os: [ubuntu-latest, macOS-latest, windows-latest] steps: - uses: actions/checkout@v1 diff --git a/buildutils/build.py b/buildutils/build.py index b1c33fa..b9d6ff1 100644 --- a/buildutils/build.py +++ b/buildutils/build.py @@ -3,9 +3,10 @@ import subprocess import os import shutil +import struct import sys -def build_libcapnp(bundle_dir, build_dir, verbose=False): +def build_libcapnp(bundle_dir, build_dir): ''' Build capnproto ''' @@ -27,7 +28,18 @@ def build_libcapnp(bundle_dir, build_dir, verbose=False): if shutil.which('ninja'): build_type = ['-G', 'Ninja'] - # TODO Determine VS version + # Determine python shell architecture + python_arch = 8 * struct.calcsize("P") + build_arch = [] + if os.name == 'nt': + if python_arch == 64: + build_arch_flag = "x64" + elif python_arch == 32: + build_arch_flag = "Win32" + else: + raise RuntimeError('Unknown windows build arch') + build_arch = ['-A', build_arch_flag] + print('Building module for {}'.format(python_arch)) args = [ 'cmake', @@ -38,6 +50,7 @@ def build_libcapnp(bundle_dir, build_dir, verbose=False): capnp_dir, ] args.extend(build_type) + args.extend(build_arch) conf = subprocess.Popen(args, cwd=tmp_dir, stdout=sys.stdout) returncode = conf.wait() if returncode != 0: