Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3d81b4d

Browse files
committed
Merge the FreeType and Qhull download mechanisms.
1 parent dbe44f8 commit 3d81b4d

File tree

3 files changed

+47
-54
lines changed

3 files changed

+47
-54
lines changed

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,5 +105,3 @@ lib/z.lib
105105
#########################
106106
lib/matplotlib/backends/web_backend/node_modules/
107107
lib/matplotlib/backends/web_backend/package-lock.json
108-
109-
extern/qhull-*/

setup.py

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
from pathlib import Path
2929
import shutil
3030
import subprocess
31-
import tarfile
3231

3332
from setuptools import setup, find_packages, Extension
3433
from setuptools.command.build_ext import build_ext as BuildExtCommand
@@ -49,7 +48,7 @@
4948

5049
import setupext
5150
from setupext import (
52-
download_or_cache, print_raw, print_status, LOCAL_QHULL_VERSION)
51+
get_and_extract_tarball, print_raw, print_status, LOCAL_QHULL_VERSION)
5352

5453
# Get the version from versioneer
5554
import versioneer
@@ -87,24 +86,17 @@ def __init__(self, dist):
8786
"'python setup.py test'. Please run 'pytest'.")
8887

8988

90-
def _download_qhull_to(dest):
91-
url = "http://www.qhull.org/download/qhull-2020-src-8.0.2.tgz"
92-
sha = "b5c2d7eb833278881b952c8a52d20179eab87766b00b865000469a45c1838b7e"
93-
if (dest / f"qhull-{LOCAL_QHULL_VERSION}").exists():
94-
return
95-
dest.mkdir(parents=True, exist_ok=True)
96-
try:
97-
buf = download_or_cache(url, sha)
98-
except Exception:
99-
raise IOError(f"Failed to download qhull. Please download {url} and "
100-
f"extract it to {dest}.")
101-
with tarfile.open(fileobj=buf, mode="r:gz") as tf:
102-
tf.extractall(dest)
89+
def _download_qhull():
90+
toplevel = get_and_extract_tarball(
91+
urls=["http://www.qhull.org/download/qhull-2020-src-8.0.2.tgz"],
92+
sha="b5c2d7eb833278881b952c8a52d20179eab87766b00b865000469a45c1838b7e",
93+
dirname=f"qhull-{LOCAL_QHULL_VERSION}",
94+
)
10395

10496

10597
class BuildExtraLibraries(BuildExtCommand):
10698
def finalize_options(self):
107-
_download_qhull_to(Path("extern"))
99+
_download_qhull()
108100
self.distribution.ext_modules[:] = [
109101
ext
110102
for package in good_packages

setupext.py

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def download_or_cache(url, sha):
8686
file_sha = _get_hash(data)
8787
if file_sha != sha:
8888
raise Exception(
89-
f"The download file does not match the expected sha. {url} was "
89+
f"The downloaded file does not match the expected sha. {url} was "
9090
f"expected to have {sha} but it had {file_sha}")
9191

9292
if cache_dir is not None: # Try to cache the downloaded file.
@@ -100,6 +100,31 @@ def download_or_cache(url, sha):
100100
return BytesIO(data)
101101

102102

103+
def get_and_extract_tarball(urls, sha, dirname):
104+
toplevel = Path("build", dirname)
105+
if not toplevel.exists(): # Download it or load it from cache.
106+
Path("build").mkdir(exist_ok=True)
107+
for url in urls:
108+
try:
109+
tar_contents = download_or_cache(url, sha)
110+
break
111+
except Exception:
112+
pass
113+
else:
114+
raise IOError(
115+
f"Failed to download any of the following: {urls}. "
116+
f"Please download one of these urls and extract it into "
117+
f"'build/' at the top-level of the source repository.")
118+
print("Extracting {}".format(urllib.parse.urlparse(url).path))
119+
with tarfile.open(fileobj=tar_contents, mode="r:gz") as tgz:
120+
if os.path.commonpath(tgz.getnames()) != dirname:
121+
raise IOError(
122+
f"The downloaded tgz file was expected to have {dirname} "
123+
f"as sole top-level directory, but that is not the case")
124+
tgz.extractall("build")
125+
return toplevel
126+
127+
103128
# SHA256 hashes of the FreeType tarballs
104129
_freetype_hashes = {
105130
'2.6.1':
@@ -515,7 +540,7 @@ def add_qhull_flags(ext):
515540
if options.get("system_qhull"):
516541
ext.libraries.append("qhull")
517542
else:
518-
qhull_path = Path(f'extern/qhull-{LOCAL_QHULL_VERSION}/src')
543+
qhull_path = Path(f'build/qhull-{LOCAL_QHULL_VERSION}/src')
519544
ext.include_dirs.insert(0, str(qhull_path))
520545
ext.sources.extend(map(str, sorted(qhull_path.glob('libqhull_r/*.c'))))
521546
if sysconfig.get_config_var("LIBM") == "-lm":
@@ -560,46 +585,24 @@ def do_custom_build(self, env):
560585
if options.get('system_freetype'):
561586
return
562587

563-
src_path = Path('build', f'freetype-{LOCAL_FREETYPE_VERSION}')
588+
tarball = f'freetype-{LOCAL_FREETYPE_VERSION}.tar.gz'
589+
src_path = get_and_extract_tarball(
590+
urls=[
591+
(f'https://downloads.sourceforge.net/project/freetype'
592+
f'/freetype2/{LOCAL_FREETYPE_VERSION}/{tarball}'),
593+
(f'https://download.savannah.gnu.org/releases/freetype'
594+
f'/{tarball}')
595+
],
596+
sha=LOCAL_FREETYPE_HASH,
597+
dirname=f'freetype-{LOCAL_FREETYPE_VERSION}',
598+
)
564599

565-
# We've already built freetype
566600
if sys.platform == 'win32':
567601
libfreetype = 'libfreetype.lib'
568602
else:
569603
libfreetype = 'libfreetype.a'
570-
571-
# bailing because it is already built
572604
if (src_path / 'objs' / '.libs' / libfreetype).is_file():
573-
return
574-
575-
# do we need to download / load the source from cache?
576-
if not src_path.exists():
577-
os.makedirs('build', exist_ok=True)
578-
579-
tarball = f'freetype-{LOCAL_FREETYPE_VERSION}.tar.gz'
580-
target_urls = [
581-
(f'https://downloads.sourceforge.net/project/freetype'
582-
f'/freetype2/{LOCAL_FREETYPE_VERSION}/{tarball}'),
583-
(f'https://download.savannah.gnu.org/releases/freetype'
584-
f'/{tarball}')
585-
]
586-
587-
for tarball_url in target_urls:
588-
try:
589-
tar_contents = download_or_cache(tarball_url,
590-
LOCAL_FREETYPE_HASH)
591-
break
592-
except Exception:
593-
pass
594-
else:
595-
raise IOError(
596-
f"Failed to download FreeType. Please download one of "
597-
f"{target_urls} and extract it into {src_path} at the "
598-
f"top-level of the source repository.")
599-
600-
print(f"Extracting {tarball}")
601-
with tarfile.open(fileobj=tar_contents, mode="r:gz") as tgz:
602-
tgz.extractall("build")
605+
return # Bail out because we have already built FreeType.
603606

604607
print(f"Building freetype in {src_path}")
605608
if sys.platform != 'win32': # compilation on non-windows

0 commit comments

Comments
 (0)