pycapnp/buildutils/build.py
Tobias Ahrens 7a4970605e Disable the use of ninja for windows builds
Aperantly github added ninja to all of there runners now. This
causes the windows build to fail. This is expected because we
add the architecture as a compiler arg which is not known to
ninja. Even with this the build fails.

This commit disables ninja on windows for now. Once we fixed the
underlying issue with ninja and windows we can reenable it.
2023-10-23 10:23:16 -07:00

87 lines
2.5 KiB
Python

"Build the bundled capnp distribution"
import subprocess
import os
import shutil
import struct
import sys
def build_libcapnp(bundle_dir, build_dir): # noqa: C901
"""
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)
ldflags = os.environ.get("LDFLAGS", None)
os.environ["CXXFLAGS"] = (cxxflags or "") + " -O2 -DNDEBUG"
os.environ["LDFLAGS"] = ldflags or ""
# Enable ninja for compilation if available
build_type = []
if shutil.which("ninja") and os.name != "nt":
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 ldflags is None:
del os.environ["LDFLAGS"]
else:
os.environ["LDFLAGS"] = ldflags
if returncode != 0:
raise RuntimeError("capnproto compilation failed: {}".format(returncode))