Download & bundle dependencies as wheel files.
build-dependency-wheels.sh has been removed, as it has been superseded by the 'python setup.py wheels' command.
This commit is contained in:
parent
7e9e1d122c
commit
cbdf1c1321
@ -1,44 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
MYDIR=$(dirname $(readlink -f $0))
|
|
||||||
WHEELS=$MYDIR/blender_cloud/wheels
|
|
||||||
cd $MYDIR
|
|
||||||
|
|
||||||
PILLAR_SDK_DIR=$MYDIR/../pillar-python-sdk
|
|
||||||
CACHECONTROL_DIR=$MYDIR/../cachecontrol
|
|
||||||
|
|
||||||
# Build the Pillar Python SDK wheel from ../pillar-python-sdk
|
|
||||||
if [ ! -e $WHEELS/lockfile*.whl ]; then
|
|
||||||
echo "Building pillar_sdk wheel"
|
|
||||||
if [ ! -e $PILLAR_SDK_DIR ]; then
|
|
||||||
cd $(dirname $PILLAR_SDK_DIR)
|
|
||||||
git clone https://github.com/armadillica/pillar-python-sdk.git $PILLAR_SDK_DIR
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd $PILLAR_SDK_DIR
|
|
||||||
python setup.py bdist_wheel
|
|
||||||
cp $(ls dist/*.whl -rt | tail -n 1) $WHEELS
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Download lockfile wheel
|
|
||||||
if [ ! -e $WHEELS/lockfile*.whl ]; then
|
|
||||||
echo "Downloading lockfile"
|
|
||||||
pip download --dest $WHEELS $(grep -i lockfile $MYDIR/requirements.txt)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Build CacheControl wheel
|
|
||||||
if [ ! -e $WHEELS/CacheControl*.whl ]; then
|
|
||||||
echo "Building CacheControl wheel"
|
|
||||||
if [ ! -e $CACHECONTROL_DIR ]; then
|
|
||||||
cd $(dirname $CACHECONTROL_DIR)
|
|
||||||
git clone https://github.com/ionrock/cachecontrol.git $CACHECONTROL_DIR
|
|
||||||
cd $CACHECONTROL_DIR
|
|
||||||
git checkout v0.11.6 # TODO: get from requirements.txt
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd $CACHECONTROL_DIR
|
|
||||||
rm -f dist/*.whl
|
|
||||||
python setup.py bdist_wheel
|
|
||||||
cp $(ls dist/*.whl -rt | tail -n 1) $WHEELS
|
|
||||||
fi
|
|
||||||
|
|
129
setup.py
129
setup.py
@ -1,11 +1,128 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
import sys
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import re
|
||||||
|
import pathlib
|
||||||
|
from glob import glob
|
||||||
|
|
||||||
|
from distutils import log
|
||||||
|
from distutils.core import Command
|
||||||
from distutils.command.bdist import bdist
|
from distutils.command.bdist import bdist
|
||||||
from distutils.command.install import install
|
from distutils.command.install import install
|
||||||
from distutils.command.install_egg_info import install_egg_info
|
from distutils.command.install_egg_info import install_egg_info
|
||||||
from setuptools import setup, find_packages
|
from setuptools import setup, find_packages
|
||||||
from glob import glob
|
|
||||||
|
|
||||||
|
requirement_re = re.compile('[><=]+')
|
||||||
|
|
||||||
|
|
||||||
|
class BuildWheels(Command):
|
||||||
|
"""Builds or downloads the dependencies as wheel files."""
|
||||||
|
|
||||||
|
description = "builds/downloads the dependencies as wheel files"
|
||||||
|
user_options = [
|
||||||
|
('wheels-path=', None, "wheel file installation path"),
|
||||||
|
('deps-path=', None, "path in which dependencies are built"),
|
||||||
|
('pillar-sdk-path=', None, "subdir of deps-path containing the Pillar Python SDK"),
|
||||||
|
('cachecontrol-path=', None, "subdir of deps-path containing CacheControl"),
|
||||||
|
]
|
||||||
|
|
||||||
|
def initialize_options(self):
|
||||||
|
self.wheels_path = None # path that will contain the installed wheels.
|
||||||
|
self.deps_path = None # path in which dependencies are built.
|
||||||
|
self.pillar_sdk_path = None # subdir of deps_path containing the Pillar Python SDK
|
||||||
|
self.cachecontrol_path = None # subdir of deps_path containing CacheControl
|
||||||
|
|
||||||
|
def finalize_options(self):
|
||||||
|
self.my_path = pathlib.Path(__file__).resolve().parent
|
||||||
|
package_path = self.my_path / self.distribution.get_name()
|
||||||
|
|
||||||
|
def set_default(var, default):
|
||||||
|
if var is None:
|
||||||
|
return default
|
||||||
|
return pathlib.Path(var) # convert CLI-arguments (string) to Paths.
|
||||||
|
|
||||||
|
self.wheels_path = set_default(self.wheels_path, package_path / 'wheels')
|
||||||
|
self.deps_path = set_default(self.deps_path, self.my_path / 'build/deps')
|
||||||
|
self.pillar_sdk_path = set_default(self.pillar_sdk_path,
|
||||||
|
self.deps_path / 'pillar-python-sdk')
|
||||||
|
self.cachecontrol_path = set_default(self.cachecontrol_path,
|
||||||
|
self.deps_path / 'cachecontrol')
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
log.info('Storing wheels in %s', self.wheels_path)
|
||||||
|
|
||||||
|
# Parse the requirements.txt file
|
||||||
|
requirements = {}
|
||||||
|
with open(str(self.my_path / 'requirements.txt')) as reqfile:
|
||||||
|
for line in reqfile.readlines():
|
||||||
|
line = line.strip()
|
||||||
|
|
||||||
|
if not line or line.startswith('#'):
|
||||||
|
# comments are lines that start with # only
|
||||||
|
continue
|
||||||
|
|
||||||
|
line_req = requirement_re.split(line)
|
||||||
|
package = line_req[0]
|
||||||
|
version = line_req[-1]
|
||||||
|
requirements[package] = (line, version)
|
||||||
|
# log.info(' - %s = %s / %s', package, line, line_req[-1])
|
||||||
|
|
||||||
|
self.wheels_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# Download lockfile, as there is a suitable wheel on pypi.
|
||||||
|
if not list(self.wheels_path.glob('lockfile*.whl')):
|
||||||
|
log.info('Downloading lockfile wheel')
|
||||||
|
subprocess.check_call([
|
||||||
|
'pip', 'download', '--dest', str(self.wheels_path), requirements['lockfile'][0]
|
||||||
|
])
|
||||||
|
|
||||||
|
# Build Pillar Python SDK.
|
||||||
|
if not list(self.wheels_path.glob('pillar-python-sdk*.whl')):
|
||||||
|
log.info('Building Pillar Python SDK in %s', self.pillar_sdk_path)
|
||||||
|
self.git_clone(self.pillar_sdk_path,
|
||||||
|
'https://github.com/armadillica/pillar-python-sdk.git')
|
||||||
|
self.build_copy_wheel(self.pillar_sdk_path)
|
||||||
|
|
||||||
|
# Build CacheControl.
|
||||||
|
if not list(self.wheels_path.glob('CacheControl*.whl')):
|
||||||
|
log.info('Building CacheControl in %s', self.cachecontrol_path)
|
||||||
|
self.git_clone(self.cachecontrol_path,
|
||||||
|
'https://github.com/ionrock/cachecontrol.git',
|
||||||
|
'v%s' % requirements['CacheControl'][1])
|
||||||
|
self.build_copy_wheel(self.cachecontrol_path)
|
||||||
|
|
||||||
|
# Ensure that the wheels are added to the data files.
|
||||||
|
self.distribution.data_files.append(
|
||||||
|
('blender_cloud/wheels', (str(p) for p in self.wheels_path.glob('*.whl')))
|
||||||
|
)
|
||||||
|
|
||||||
|
def git_clone(self, workdir: pathlib.Path, git_url: str, checkout: str = None):
|
||||||
|
if workdir.exists():
|
||||||
|
# Directory exists, expect it to be set up correctly.
|
||||||
|
return
|
||||||
|
|
||||||
|
workdir.mkdir(parents=True)
|
||||||
|
|
||||||
|
subprocess.check_call(['git', 'clone', git_url, str(workdir)],
|
||||||
|
cwd=str(workdir.parent))
|
||||||
|
|
||||||
|
if checkout:
|
||||||
|
subprocess.check_call(['git', 'checkout', checkout],
|
||||||
|
cwd=str(workdir))
|
||||||
|
|
||||||
|
def build_copy_wheel(self, package_path: pathlib.Path):
|
||||||
|
# Make sure no wheels exist yet, so that we know which one to copy later.
|
||||||
|
to_remove = list((package_path / 'dist').glob('*.whl'))
|
||||||
|
for fname in to_remove:
|
||||||
|
fname.unlink()
|
||||||
|
|
||||||
|
subprocess.check_call([sys.executable, 'setup.py', 'bdist_wheel'],
|
||||||
|
cwd=str(package_path))
|
||||||
|
|
||||||
|
wheel = next((package_path / 'dist').glob('*.whl'))
|
||||||
|
log.info('copying %s to %s', wheel, self.wheels_path)
|
||||||
|
shutil.copy(str(wheel), str(self.wheels_path))
|
||||||
|
|
||||||
class BlenderAddonBdist(bdist):
|
class BlenderAddonBdist(bdist):
|
||||||
"""Ensures that 'python setup.py bdist' creates a zip file."""
|
"""Ensures that 'python setup.py bdist' creates a zip file."""
|
||||||
@ -15,6 +132,10 @@ class BlenderAddonBdist(bdist):
|
|||||||
self.formats = ['zip']
|
self.formats = ['zip']
|
||||||
self.plat_name = 'addon' # use this instead of 'linux-x86_64' or similar.
|
self.plat_name = 'addon' # use this instead of 'linux-x86_64' or similar.
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self.run_command('wheels')
|
||||||
|
super().run()
|
||||||
|
|
||||||
|
|
||||||
class BlenderAddonInstall(install):
|
class BlenderAddonInstall(install):
|
||||||
"""Ensures the module is placed at the root of the zip file."""
|
"""Ensures the module is placed at the root of the zip file."""
|
||||||
@ -39,15 +160,15 @@ class AvoidEggInfo(install_egg_info):
|
|||||||
setup(
|
setup(
|
||||||
cmdclass={'bdist': BlenderAddonBdist,
|
cmdclass={'bdist': BlenderAddonBdist,
|
||||||
'install': BlenderAddonInstall,
|
'install': BlenderAddonInstall,
|
||||||
'install_egg_info': AvoidEggInfo},
|
'install_egg_info': AvoidEggInfo,
|
||||||
|
'wheels': BuildWheels},
|
||||||
name='blender_cloud',
|
name='blender_cloud',
|
||||||
description='The Blender Cloud addon allows browsing the Blender Cloud from Blender.',
|
description='The Blender Cloud addon allows browsing the Blender Cloud from Blender.',
|
||||||
version='1.0.0',
|
version='1.0.0',
|
||||||
author='Sybren A. Stüvel',
|
author='Sybren A. Stüvel',
|
||||||
author_email='sybren@stuvel.eu',
|
author_email='sybren@stuvel.eu',
|
||||||
packages=find_packages('.'),
|
packages=find_packages('.'),
|
||||||
data_files=[('blender_cloud', ['README.md']),
|
data_files=[('blender_cloud', ['README.md'])],
|
||||||
('blender_cloud/wheels', glob('blender_cloud/wheels/*.whl'))],
|
|
||||||
scripts=[],
|
scripts=[],
|
||||||
url='https://developer.blender.org/diffusion/BCA/',
|
url='https://developer.blender.org/diffusion/BCA/',
|
||||||
license='GNU General Public License v2 or later (GPLv2+)',
|
license='GNU General Public License v2 or later (GPLv2+)',
|
||||||
|
Reference in New Issue
Block a user