vxSDK/vxsdk/core/build/compile.py

141 lines
3.8 KiB
Python

"""
Compilation hadling using the dependency DAG graph
"""
from core.logger import log
from core.build.rules import project_rules_exec
import core.conv
__all__ = [
'project_compile'
]
#---
# Internals
#---
def __dep_generate_assets(dep_info, _, __):
log.user(f"[{dep_info['meta'].name}] generate assets...")
core.conv.assets_generate(
f"{dep_info['meta'].path}/assets/",
f"{dep_info['meta'].parent_path}/.vxsdk/converter/{dep_info['meta'].name}/src"
)
return 0
def __dep_build_sources(dep_info, env_extra, verbose):
log.user(f"[{dep_info['meta'].name}] build sources...")
return project_rules_exec(
dep_info['meta'],
dep_info['target'],
['configure', 'build'],
verbose,
env_extra
)
def __dep_install(dep_info, env_extra, verbose):
log.user(f"[{dep_info['meta'].name}] install...")
return project_rules_exec(
dep_info['meta'],
dep_info['target'],
['intall'],
verbose,
env_extra
)
def __compile_dependency(dep, env_extra, verbose):
""" Compile dependency
@args
> dep (dict) - dependency information
> verbose (bool) - display extra verbose information
@return
> 0 on success, negative value otherwise
"""
if __dep_generate_assets(dep['info'], env_extra, verbose) != 0:
log.error(f"[{dep['info']['meta'].name}] error during asset generation")
return -1
if __dep_build_sources(dep['info'], env_extra, verbose) != 0:
log.error(f"[{dep['info']['meta'].name}] error during source build")
return -2
if __dep_install(dep['info'], env_extra, verbose) != 0:
log.error(f"[{dep['info']['meta'].name}] error during installation")
return -3
return 0
def __env_extra_fetch(dep_graph):
""" Generate extra environement information
@args
> dep_graph (list) : DAG graph
@return
> a dictionary with all common env export
"""
env_extra = {}
for dep in dep_graph:
dep_meta = dep['info']['meta']
dep_env_extra = dep_meta.get_env_extra(dep['info']['target'])
for key in dep_env_extra:
if key.upper() != key:
log.warn(f"[{dep_meta.name}] : {key} : env key must be upper")
if key in env_extra:
log.warn(f"[{dep_meta.name}] : {key} : already set, overrided")
env_extra[key] = dep_env_extra[key]
return env_extra
#---
# Public
#---
def project_compile(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
"""
# generate "extra" environement configuration
env_extra = __env_extra_fetch(dep_graph)
# main build loop
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
error = __compile_dependency(dep, env_extra, enable_verbose)
if error != 0:
return error
# mark as completed
dep['completed'] = True
# if all package as been completed, quit
if completed:
break
# no error, exit
return 0