147 lines
3.4 KiB
Python
147 lines
3.4 KiB
Python
import os
|
|
import shutil
|
|
from env import Environment
|
|
from path import Path
|
|
from pathlib import Path as SysPath
|
|
|
|
|
|
class UnknownBuildSystemError(Exception):
|
|
pass
|
|
|
|
|
|
class BuildConfigurationError(Exception):
|
|
pass
|
|
|
|
|
|
class BuildError(Exception):
|
|
pass
|
|
|
|
|
|
class BuildSystem:
|
|
def __init__(self, **kwargs):
|
|
self.__name = None
|
|
self.__source_dir = None
|
|
self.__bin_dir = None
|
|
self.__parent = None
|
|
self.__install = None
|
|
|
|
if 'name' in kwargs:
|
|
self.__name = kwargs['name']
|
|
if 'source_dir' in kwargs:
|
|
self.__source_dir = kwargs['source_dir']
|
|
if 'bin_dir' in kwargs:
|
|
self.__bin_dir = kwargs['bin_dir']
|
|
if 'parent' in kwargs:
|
|
self.__parent = kwargs['parent']
|
|
if 'install' in kwargs:
|
|
self.__install = kwargs['install']
|
|
|
|
|
|
def name(self):
|
|
return self.__name
|
|
|
|
|
|
def source_dir(self):
|
|
return self.__source_dir
|
|
|
|
|
|
def binary_dir(self):
|
|
return self.__bin_dir
|
|
|
|
|
|
def parent(self):
|
|
return self.__parent
|
|
|
|
|
|
def install_manifest(self):
|
|
return self.__install
|
|
|
|
|
|
def build_for(self):
|
|
return 'target'
|
|
|
|
|
|
def get_path_namespaces(self):
|
|
ns = {
|
|
'src': os.path.abspath(self.source_dir()),
|
|
'root-src': Environment.source_root(),
|
|
'bin': os.path.abspath(self.binary_dir()),
|
|
}
|
|
|
|
if self.build_for() == 'host':
|
|
ns['install'] = Environment.native_root()
|
|
else:
|
|
ns['install'] = Environment.system_root()
|
|
|
|
return ns
|
|
|
|
|
|
def check_out_of_date(self):
|
|
self.__config_out_of_date = self._is_configuration_out_of_date()
|
|
self.__build_out_of_date = self._is_build_out_of_date()
|
|
|
|
|
|
def is_configuration_out_of_date(self):
|
|
return self.__config_out_of_date
|
|
|
|
|
|
def is_build_out_of_date(self):
|
|
return self.__build_out_of_date
|
|
|
|
|
|
def configure(self):
|
|
return
|
|
|
|
|
|
def build(self):
|
|
return
|
|
|
|
|
|
def __copy_dir(self, src, dst):
|
|
dst_dir = os.path.dirname(dst)
|
|
SysPath(dst_dir).mkdir(parents=True, exist_ok=True)
|
|
shutil.copytree(src, dst, dirs_exist_ok=True)
|
|
|
|
|
|
def __copy_file(self, src, dst):
|
|
dst_dir = os.path.dirname(dst)
|
|
SysPath(dst_dir).mkdir(parents=True, exist_ok=True)
|
|
shutil.copyfile(src, dst)
|
|
|
|
|
|
def install_from_seed(self):
|
|
manifest = self.install_manifest()
|
|
if manifest is None:
|
|
return
|
|
|
|
ns = self.get_path_namespaces()
|
|
source_dir = self.source_dir()
|
|
|
|
dest_dir = Environment.system_root()
|
|
if self.build_for() == 'host':
|
|
dest_dir = Environment.native_root()
|
|
|
|
for dest, src in manifest.items():
|
|
if dest[0] != '/':
|
|
continue
|
|
|
|
dest = Path(dest).remove_root().get_path()
|
|
|
|
for p in src:
|
|
path = Path(p)
|
|
files = path.expand_path(relative_to=ns)
|
|
|
|
for p2 in files:
|
|
file_name = os.path.basename(p2)
|
|
rel_path = os.path.relpath(p2, start=source_dir)
|
|
src_path = p2
|
|
dst_path = os.path.join(dest_dir, dest, file_name)
|
|
if os.path.isdir(src_path):
|
|
self.__copy_dir(src_path, dst_path)
|
|
else:
|
|
self.__copy_file(src_path, dst_path)
|
|
|
|
|
|
def install(self):
|
|
return
|