Skip to content
Snippets Groups Projects
Commit d2601114 authored by André Anjos's avatar André Anjos :speech_balloon:
Browse files

Add prototypical build-deps-install script

parent 62266181
No related branches found
No related tags found
No related merge requests found
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
# Uses the conda render API to render a recipe and install an environment
# containing all build/host, run and test dependencies of a package.
import os
import re
import sys
import copy
import shutil
import tempfile
import argparse
import subprocess
try:
import yaml
except ImportError:
print('The package pyyaml must be installed alongside python')
sys.exit(1)
if not hasattr(shutil, 'which'):
print('This program only runs with python v3.3 or above')
sys.exit(1)
CONDA=shutil.which('conda')
if CONDA is None:
print('You must have the "conda" command available on your shell')
print(' -- also, make sure to have installed the conda-build package')
sys.exit(1)
BASEDIR=os.path.realpath(os.path.dirname(sys.argv[0]))
def get_condarc():
rcpath = os.path.join(BASEDIR, 'build-condarc')
return os.environ.get('CONDARC', rcpath)
def get_buildopt(python):
return [
'--variant-config-files', os.path.join(os.path.dirname(BASEDIR),
'gitlab', 'conda_build_config.yaml'),
'--python', python,
]
def get_rendered_recipe(python, path):
if path.endswith('meta.yaml'):
path = os.path.dirname(path)
with tempfile.NamedTemporaryFile(dir=path, mode='wt', suffix='.yaml') as f:
# writes a temporary recipe with an injected version of bob-devel
orig = os.path.join(path, 'meta.yaml')
contents = open(orig).read()
import pdb; pdb.set_trace()
result = re.search(r'^requirements:.*run:\s*\n', contents, re.MULTILINE)
contents = contents[:result.end()] + \
' - bob-devel {{ bob_devel }}.*\n' + \
contents[result.end():]
f.write(contents)
f.flush()
cmd = [CONDA, 'render'] + get_buildopt(python) + [f.name]
print('$ ' + ' '.join(cmd))
env = copy.copy(os.environ)
env['CONDARC'] = get_condarc()
output = subprocess.check_output(cmd, env=env)
return yaml.load(output)
def parse_dependencies(python, path):
recipe = get_rendered_recipe(python, path)
return recipe['requirements'].get('host', []) + \
recipe['requirements'].get('build', []) + \
recipe.get('test', {}).get('requires', [])
def conda_install(subcmd, env, packages):
packages = [k.replace(' ', '=') for k in packages]
cmd = [CONDA, subcmd, '--yes', '--name', env] + packages
print('$ ' + ' '.join(cmd))
env = copy.copy(os.environ)
env['CONDARC'] = get_condarc()
status = subprocess.call(cmd, env=env)
return status
def main():
parser = argparse.ArgumentParser(description='Creates a new conda environment with the build/run/test dependencies of a package')
parser.add_argument('name', help='name of the target environment to create')
parser.add_argument('python', help='version of python to build the environment for', nargs='?', default='3.6')
parser.add_argument('path', help='path to the directory containing the conda recipe', nargs='?', default='conda')
args = parser.parse_args()
deps = parse_dependencies(args.python, args.path)
status = conda_install('create', args.name, deps)
sys.exit(status)
if __name__ == '__main__':
main()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment