""" 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