Source code for puffin.bootstrap

# -*- 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))