vxSDK/vxsdk/core/build/compile.py

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