55 lines
1.5 KiB
Python
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
|