mirror of
https://github.com/capnproto/pycapnp.git
synced 2025-03-04 08:24:43 +01:00
81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
'Build the bundled capnp distribution'
|
|
|
|
import subprocess
|
|
import os
|
|
import shutil
|
|
import struct
|
|
import sys
|
|
|
|
|
|
def build_libcapnp(bundle_dir, build_dir):
|
|
'''
|
|
Build capnproto
|
|
'''
|
|
bundle_dir = os.path.abspath(bundle_dir)
|
|
capnp_dir = os.path.join(bundle_dir, 'capnproto-c++')
|
|
build_dir = os.path.abspath(build_dir)
|
|
tmp_dir = os.path.join(capnp_dir, 'build{}'.format(8 * struct.calcsize("P")))
|
|
|
|
# Clean the tmp build directory every time
|
|
if os.path.exists(tmp_dir):
|
|
shutil.rmtree(tmp_dir)
|
|
os.mkdir(tmp_dir)
|
|
|
|
cxxflags = os.environ.get('CXXFLAGS', None)
|
|
os.environ['CXXFLAGS'] = (cxxflags or '') + ' -O2 -DNDEBUG'
|
|
|
|
# Enable ninja for compilation if available
|
|
build_type = []
|
|
if shutil.which('ninja'):
|
|
build_type = ['-G', 'Ninja']
|
|
|
|
# Determine python shell architecture for Windows
|
|
python_arch = 8 * struct.calcsize("P")
|
|
build_arch = []
|
|
build_flags = []
|
|
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]
|
|
build_flags = ['--config', 'Release']
|
|
print('Building module for {}'.format(python_arch))
|
|
|
|
if not shutil.which('cmake'):
|
|
raise RuntimeError('Could not find cmake in your path!')
|
|
|
|
args = [
|
|
'cmake',
|
|
'-DCMAKE_POSITION_INDEPENDENT_CODE=1',
|
|
'-DBUILD_TESTING=OFF',
|
|
'-DBUILD_SHARED_LIBS=OFF',
|
|
'-DCMAKE_INSTALL_PREFIX:PATH={}'.format(build_dir),
|
|
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:
|
|
raise RuntimeError('CMake failed {}'.format(returncode))
|
|
|
|
# Run build through cmake
|
|
args = [
|
|
'cmake',
|
|
'--build',
|
|
'.',
|
|
'--target',
|
|
'install',
|
|
]
|
|
args.extend(build_flags)
|
|
build = subprocess.Popen(args, cwd=tmp_dir, stdout=sys.stdout)
|
|
returncode = build.wait()
|
|
if cxxflags is None:
|
|
del os.environ['CXXFLAGS']
|
|
else:
|
|
os.environ['CXXFLAGS'] = cxxflags
|
|
if returncode != 0:
|
|
raise RuntimeError('capnproto compilation failed: {}'.format(returncode))
|