# -*- coding: utf-8 -*-
__copyright__ = """This file is part of SCINE Puffin.
This code is licensed under the 3-clause BSD license.
Copyright ETH Zurich, Laboratory for Physical Chemistry, Reiher Group.
See LICENSE.txt for details
"""
import os
import sys
import importlib
from .config import Configuration
from .programs.database import Database
from .programs.readuct import Readuct
from .programs.molassembler import Molassembler
from .programs.utils import Utils
[docs]def bootstrap(config: Configuration):
"""
Sets up all required and also all additionally requested programs/packages
for the use with Puffin.
Generates a ``puffin.sh`` to be sourced before running the actual puffin.
Parameters
----------.
config :: puffin.config.Configuration
The current configuration of the Puffin.
"""
# Prepare directories
initial_dir = os.getcwd()
jobs = config.daemon()['job_dir']
if jobs and not os.path.exists(jobs):
os.makedirs(jobs)
software = config.daemon()['software_dir']
if software and not os.path.exists(software):
os.makedirs(software)
build_dir = os.path.join(software, 'build')
if build_dir and not os.path.exists(build_dir):
os.makedirs(build_dir)
install_dir = os.path.join(software, 'install')
if install_dir and not os.path.exists(install_dir):
os.makedirs(install_dir)
archive_dir = config.daemon()['archive_dir']
if archive_dir and not os.path.exists(archive_dir) and archive_dir:
os.makedirs(archive_dir)
error_dir = config.daemon()['error_dir']
if error_dir and not os.path.exists(error_dir) and error_dir:
os.makedirs(error_dir)
# Install minimal requirements
# Scine: Utils
print("")
print("Building SCINE Utils from sources.")
print("")
utils_build_dir = os.path.join(build_dir, 'utils')
utils = Utils(config.programs()['utils'])
utils.install(utils_build_dir, install_dir, config["resources"]["cores"])
# Scine: Database API
print("")
print("Building SCINE Database API from sources.")
print("")
database_build_dir = os.path.join(build_dir, 'database')
database = Database(config.programs()['database'])
database.install(database_build_dir, install_dir, config["resources"]["cores"])
# Scine: Readuct
print("")
print("Building SCINE Readuct from sources.")
print("")
readuct_build_dir = os.path.join(build_dir, 'readuct')
readuct = Readuct(config.programs()['readuct'])
readuct.install(readuct_build_dir, install_dir, config["resources"]["cores"])
# Scine: Molassembler
print("")
print("Building SCINE Molassembler from sources.")
print("")
molassembler_build_dir = os.path.join(build_dir, 'molassembler')
molassembler = Molassembler(config.programs()['molassembler'])
molassembler.install(molassembler_build_dir, install_dir, config["resources"]["cores"])
# Install all other programs
for program_name, settings in config.programs().items():
if program_name in ['readuct', 'database', 'molassembler', 'utils']:
continue
if not settings['available']:
continue
print("")
print("Preparing "+program_name.capitalize()+"...")
print("")
module = importlib.import_module("puffin.programs."+program_name)
class_ = getattr(module, program_name.capitalize())
program = class_(settings)
program_build_dir = os.path.join(build_dir, program_name)
program.install(program_build_dir, install_dir, config["resources"]["cores"])
# Setup environment
# General setup
env = {}
executables = {}
python_version = sys.version_info
executables["OMP_NUM_THREADS"] = str(config['resources']['cores'])
env["PYTHONPATH"] = os.path.join(install_dir, 'lib', 'python' +
str(python_version[0])+'.'+str(python_version[1]), 'site-packages')\
+ ':' + os.path.join(install_dir, 'lib64', 'python' +
str(python_version[0])+'.'+str(python_version[1]), 'site-packages')
env["PATH"] = os.path.join(install_dir, 'bin')
env["LD_LIBRARY_PATH"] = os.path.join(install_dir, 'lib') + ':' + os.path.join(install_dir, 'lib64')
env["SCINE_MODULE_PATH"] = os.path.join(install_dir, 'lib') + ':' + os.path.join(install_dir, 'lib64')
# Program specific environment setup
for program_name, settings in config.programs().items():
if not settings['available']:
continue
module = importlib.import_module("puffin.programs."+program_name)
class_ = getattr(module, program_name.capitalize())
program = class_(settings)
program.setup_environment(config, env, executables)
os.chdir(initial_dir)
# Windows TODO also generate a bat file
with open('puffin.sh', 'w') as f:
for key, paths in env.items():
f.write('export {:s}={:s}:${:s}\n'.format(key, paths, key))
for key, paths in executables.items():
f.write('export {:s}={:s}\n'.format(key, paths))