Files
chinook/chinook/pipeline/_build.py
T

55 lines
1.5 KiB
Python

from logging import getLogger
from logging import Logger
from ..models import Output
from ..models import Project
from ..models import Result
from ..models import Target
from .._config import Config
from ._commands import Command
from ._except import NoTargetsFoundError
from ._execute import execute
from ._prepare import prepare
_logger = getLogger("chinook")
def build(
appcfg: Config,
project: Project,
logger: Logger = _logger
) -> list[Result]:
if len(project.targets) == 0:
raise NoTargetsFoundError(project)
commands: list[Command] = []
for target in project.targets:
commands.extend(_prepare_dependencies(appcfg, project, target, logger))
commands.extend(prepare(appcfg, project, target, logger))
return execute(commands, "Building")
def _prepare_dependencies(
appcfg: Config,
project: Project,
target: Target,
logger: Logger = _logger
) -> list[Command]:
from ..management import find_target_by_name
from ..management import find_project_by_target
commands: list[Command] = []
for required in target.deps:
dependency = find_target_by_name(required.value)
if dependency.type == Output.IMP or \
dependency.type == Output.INT or \
dependency._prepared:
continue
parent = find_project_by_target(required.value)
if project.cid != parent.cid:
if required.value not in parent.exports:
raise Exception(f"Cannot depend on non-exported target: {required.value}")
commands.extend(prepare(appcfg, parent, target, logger))
return commands