102 lines
2.5 KiB
Python
102 lines
2.5 KiB
Python
"""
|
|
core.build.compile - Compilation hadling using the dependency DAG graph
|
|
"""
|
|
|
|
from core.logger import log
|
|
from core.build.rules import rules_project_exec
|
|
|
|
__all__ = [
|
|
'compile_project'
|
|
]
|
|
|
|
#---
|
|
# Internals
|
|
#---
|
|
|
|
def _dep_build_sources(dep_info, verbose):
|
|
log.user(f"[{dep_info['meta'].name}] build sources...")
|
|
return rules_project_exec(
|
|
dep_info['meta'],
|
|
['configure', 'build'],
|
|
dep_info['env'],
|
|
verbose
|
|
)
|
|
|
|
def _dep_install(dep_info, verbose):
|
|
log.user(f"[{dep_info['meta'].name}] install...")
|
|
return rules_project_exec(
|
|
dep_info['meta'],
|
|
['install'],
|
|
dep_info['env'],
|
|
verbose
|
|
)
|
|
|
|
def _compile_dependency(dep, verbose):
|
|
""" Compile dependency
|
|
|
|
@args
|
|
> dep (dict) - dependency information
|
|
> verbose (bool) - display extra verbose information
|
|
|
|
@return
|
|
> 0 on success, negative value otherwise
|
|
"""
|
|
dep_meta = dep['info']['meta']
|
|
if _dep_build_sources(dep['info'], verbose) != 0:
|
|
log.error(f"[{dep_meta.name}] error during source build")
|
|
return -1
|
|
if _dep_install(dep['info'], verbose) != 0:
|
|
log.error(f"[{dep_meta.name}] error during installation")
|
|
return -2
|
|
return 0
|
|
|
|
#---
|
|
# Public
|
|
#---
|
|
|
|
def compile_project(dep_graph, verbose=False):
|
|
r""" Build the entire project
|
|
|
|
@args
|
|
> dep_graph (list) : DAG graph
|
|
> verbose (bool) : enable or disable verbose mode during build steps
|
|
|
|
Return:
|
|
> 0 for succes, negative vale otherwise
|
|
"""
|
|
while True:
|
|
completed = True
|
|
for dep in dep_graph:
|
|
# check if the package as been completed
|
|
if dep['completed']:
|
|
continue
|
|
completed = False
|
|
|
|
# check that all of its dependencies as been completed
|
|
can_run = True
|
|
for dep_idx in dep['dependencies']:
|
|
if not dep_graph[dep_idx]['completed']:
|
|
can_run = False
|
|
break
|
|
if not can_run:
|
|
continue
|
|
|
|
# handle verbosity during its building
|
|
enable_verbose = verbose
|
|
if dep['info']['meta'].type == 'app':
|
|
enable_verbose = True
|
|
|
|
# build the package
|
|
if (error := _compile_dependency(dep, enable_verbose)) != 0:
|
|
return error
|
|
|
|
# mark as completed
|
|
dep['completed'] = True
|
|
|
|
# if all package as been completed, quit
|
|
if completed:
|
|
break
|
|
|
|
# no error, exit
|
|
return 0
|