#!/usr/bin/env python3 # # Copyright (C) 2017 Codethink Limited # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library. If not, see . # # Authors: # Tristan Maat import os import sys from .._exceptions import PlatformError, ImplError class Platform(): _instance = None # Platform() # # A class to manage platform-specific details. Currently holds the # sandbox factory, the artifact cache and staging operations, as # well as platform helpers. # # Args: # context (context): The project context # def __init__(self, context, project): self.context = context self.project = project @classmethod def _create_instance(cls, *args, **kwargs): if sys.platform.startswith('linux'): backend = 'linux' else: backend = 'unix' # Meant for testing purposes and therefore hidden in the # deepest corners of the source code. Try not to abuse this, # please? if os.getenv('BST_FORCE_BACKEND'): backend = os.getenv('BST_FORCE_BACKEND') if backend == 'linux': from .linux import Linux as PlatformImpl elif backend == 'unix': from .unix import Unix as PlatformImpl else: raise PlatformError("No such platform: '{}'".format(backend)) cls._instance = PlatformImpl(*args, **kwargs) @classmethod def get_platform(cls): if not cls._instance: raise PlatformError("Platform needs to be initialized first") return cls._instance ################################################################## # Platform properties # ################################################################## @property def artifactcache(self): raise ImplError("Platform {platform} does not implement an artifactcache" .format(platform=type(self).__name__)) ################################################################## # Sandbox functions # ################################################################## # create_sandbox(): # # Create a build sandbox suitable for the environment # # Args: # args (dict): The arguments to pass to the sandbox constructor # kwargs (file): The keyword arguments to pass to the sandbox constructor # # Returns: # (Sandbox) A sandbox # def create_sandbox(self, *args, **kwargs): raise ImplError("Platform {platform} does not implement create_sandbox()" .format(platform=type(self).__name__))