141 lines
3.8 KiB
Python
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
|