"""utilities for fetching build dependencies.""" # # Copyright (C) PyZMQ Developers # Distributed under the terms of the Modified BSD License. # # This bundling code is largely adapted from pyzmq-static's get.sh by # Brandon Craig-Rhodes, which is itself BSD licensed. # # Adapted for use in pycapnp from pyzmq. See https://github.com/zeromq/pyzmq # for original project. import os import shutil import tarfile from urllib.request import urlopen pjoin = os.path.join # # Constants # bundled_version = (1, 4, 0) libcapnp_name = "capnproto-c++-%i.%i.%i.tar.gz" % (bundled_version) libcapnp_url = "https://capnproto.org/" + libcapnp_name def fetch_archive(savedir, url): """download an archive to a specific location""" req = urlopen(url) # Lookup filename fname = req.info().get_filename() if not fname: fname = os.path.basename(url) dest = pjoin(savedir, fname) if os.path.exists(dest): print("already have %s" % fname) return dest print("fetching %s into %s" % (url, savedir)) if not os.path.exists(savedir): os.makedirs(savedir) with open(dest, "wb") as f: f.write(req.read()) return dest # # libcapnp # def fetch_libcapnp(savedir, url=None): """download and extract libcapnp""" is_preconfigured = False if url is None: url = libcapnp_url is_preconfigured = True dest = pjoin(savedir, "capnproto-c++") if os.path.exists(dest): print("already have %s" % dest) return fname = fetch_archive(savedir, url) tf = tarfile.open(fname) with_version = pjoin(savedir, tf.firstmember.path) tf.extractall(savedir) tf.close() # remove version suffix: if is_preconfigured: shutil.move(with_version, dest) else: cpp_dir = os.path.join(with_version, "c++") shutil.move(cpp_dir, dest)