def get_toolchain(fips_dir, proj_dir, cfg): """get the toolchain path location for a config, this first checks for a 'cmake-toolchain' attribute, and if this does not exist, builds a xxx.toolchain.cmake file from the platform name (only for cross- compiling platforms). Toolchain files are searched in the following locations: - a fips-files/toolchains subdirectory in the project directory - a fips-files/toolchains subdirectory in all imported projects - finally in the cmake-toolchains subdirectory of the fips directory :param fips_dir: absolute path to fips :param plat: the target platform name :returns: path to toolchain file or None for non-cross-compiling """ # ignore native target platforms if 'platform' in cfg: if cfg['platform'] in native_platforms: return None else: log.error("config has no 'platform' attribute!'") # build toolchain file name toolchain = None if 'cmake-toolchain' in cfg: toolchain = cfg['cmake-toolchain'] else: toolchain = '{}.toolchain.cmake'.format(cfg['platform']) # look for toolchain file in current project directory toolchain_dir = util.get_toolchains_dir(proj_dir) toolchain_path = None if toolchain_dir: toolchain_path = toolchain_dir + '/' + toolchain if toolchain_path and os.path.isfile(toolchain_path): return toolchain_path else: # look for toolchain in all imported directories _, imported_projs = dep.get_all_imports_exports(fips_dir, proj_dir) for imported_proj_name in imported_projs: imported_proj_dir = imported_projs[imported_proj_name]['proj_dir'] toolchain_dir = util.get_toolchains_dir(imported_proj_dir) toolchain_path = None if toolchain_dir: toolchain_path = toolchain_dir + '/' + toolchain if toolchain_path and os.path.isfile(toolchain_path): return toolchain_path else: # toolchain is not in current project or imported projects, # try the fips directory toolchain_path = '{}/cmake-toolchains/{}'.format( fips_dir, toolchain) if os.path.isfile(toolchain_path): return toolchain_path # fallthrough: no toolchain file found return None
def get_toolchain(fips_dir, proj_dir, cfg) : """get the toolchain path location for a config, this first checks for a 'cmake-toolchain' attribute, and if this does not exist, builds a xxx.toolchain.cmake file from the platform name (only for cross- compiling platforms). Toolchain files are searched in the following locations: - a fips-files/toolchains subdirectory in the project directory - a fips-files/toolchains subdirectory in all imported projects - finally in the cmake-toolchains subdirectory of the fips directory :param fips_dir: absolute path to fips :param plat: the target platform name :returns: path to toolchain file or None for non-cross-compiling """ # ignore native target platforms if 'platform' in cfg : if cfg['platform'] in native_platforms : return None else : log.error("config has no 'platform' attribute!'") # build toolchain file name toolchain = None if 'cmake-toolchain' in cfg : toolchain = cfg['cmake-toolchain'] else : toolchain = '{}.toolchain.cmake'.format(cfg['platform']) # look for toolchain file in current project directory toolchain_dir = util.get_toolchains_dir(proj_dir) toolchain_path = None if toolchain_dir: toolchain_path = toolchain_dir + '/' + toolchain if toolchain_path and os.path.isfile(toolchain_path) : return toolchain_path else : # look for toolchain in all imported directories _, imported_projs = dep.get_all_imports_exports(fips_dir, proj_dir) for imported_proj_name in imported_projs : imported_proj_dir = imported_projs[imported_proj_name]['proj_dir'] toolchain_dir = util.get_toolchains_dir(imported_proj_dir) toolchain_path = None if toolchain_dir: toolchain_path = toolchain_dir + '/' + toolchain if toolchain_path and os.path.isfile(toolchain_path): return toolchain_path else : # toolchain is not in current project or imported projects, # try the fips directory toolchain_path = '{}/cmake-toolchains/{}'.format(fips_dir, toolchain) if os.path.isfile(toolchain_path) : return toolchain_path # fallthrough: no toolchain file found return None
def write_code_workspace_file(fips_dir, proj_dir, vscode_dir, cfg): '''write a multiroot-workspace config file''' ws = { 'folders': [], 'settings': {} } # fetch all project dependencies success, impex = dep.get_all_imports_exports(fips_dir, proj_dir) if not success : log.warn("missing import project directories, please run 'fips fetch'") # add dependencies in reverse order, so that main project is first for dep_proj_name in reversed(impex): dep_proj_dir = util.get_project_dir(fips_dir, dep_proj_name) ws['folders'].append({ 'path': dep_proj_dir }) proj_name = util.get_project_name_from_dir(proj_dir) with open('{}/{}.code-workspace'.format(vscode_dir, proj_name), 'w') as f: json.dump(ws, f, indent=1, separators=(',',':'))
def import_verbs(fips_dir, proj_dir) : """import verbs from local and imported projects, populates the 'verbs' and 'proj_verbs' dictionaries :param fipsdir: absolute fips directory :param proj_dir: absolute project directory """ # first import verbs from fips directory import_verbs_from('fips', fips_dir, fips_dir + '/verbs') # now go through all imported projects if fips_dir != proj_dir : _, imported_projs = dep.get_all_imports_exports(fips_dir, proj_dir) for imported_proj_name in imported_projs : imported_proj_dir = util.get_project_dir(fips_dir, imported_proj_name) import_verbs_from(imported_proj_name, imported_proj_dir, imported_proj_dir + '/fips-verbs')
def import_verbs(fips_dir, proj_dir): """import verbs from local and imported projects, populates the 'verbs' and 'proj_verbs' dictionaries :param fipsdir: absolute fips directory :param proj_dir: absolute project directory """ # first import verbs from fips directory import_verbs_from('fips', fips_dir, fips_dir + '/verbs') # now go through all imported projects if fips_dir != proj_dir: _, imported_projs = dep.get_all_imports_exports(fips_dir, proj_dir) for imported_proj_name in imported_projs: imported_proj_dir = imported_projs[imported_proj_name]['proj_dir'] import_verbs_from(imported_proj_name, imported_proj_dir, util.get_verbs_dir(imported_proj_dir))
def get_config_dirs(fips_dir, proj_dir) : """return list of config directories, including all imports :param fips_dir: absolute fips directory :param proj_dir: absolute project directory :returns: list of all directories with config files """ dirs = [ fips_dir + '/configs' ] if fips_dir != proj_dir : success, result = dep.get_all_imports_exports(fips_dir, proj_dir) if success : for dep_proj_name in result : dep_proj_dir = util.get_project_dir(fips_dir, dep_proj_name) dep_configs_dir = dep_proj_dir + '/fips-configs' if os.path.isdir(dep_configs_dir) : dirs.append(dep_configs_dir) else : log.warn("missing import directories, please run 'fips fetch'") return dirs
def get_config_dirs(fips_dir, proj_dir): """return list of config directories, including all imports :param fips_dir: absolute fips directory :param proj_dir: absolute project directory :returns: list of all directories with config files """ dirs = [fips_dir + '/configs'] if fips_dir != proj_dir: success, result = dep.get_all_imports_exports(fips_dir, proj_dir) if success: for dep_proj_name in result: dep_proj_dir = result[dep_proj_name]['proj_dir'] dep_configs_dir = dep_proj_dir + '/fips-configs' if os.path.isdir(dep_configs_dir): dirs.append(dep_configs_dir) else: log.warn("missing import directories, please run 'fips fetch'") return dirs
def list_exports(fips_dir, proj_dir): """list project exports""" log.colored(log.YELLOW, '=== exports:') if util.is_valid_project_dir(proj_dir): success, result = dep.get_all_imports_exports(fips_dir, proj_dir) if not success: log.warn( "missing import project directories, please un 'fips fetch'") for dep_proj_name in result: cur_dep = result[dep_proj_name] log.colored(log.BLUE, "project '{}' exports:".format(dep_proj_name)) cur_modules = cur_dep['exports']['modules'] cur_hdrs = cur_dep['exports']['header-dirs'] cur_libs = cur_dep['exports']['lib-dirs'] cur_defs = cur_dep['exports']['defines'] if not (cur_modules or cur_hdrs or cur_libs or cur_defs): log.info(" nothing") if cur_modules: log.info(" modules:") for mod in cur_modules: log.info(" {} => {}".format(mod, cur_modules[mod])) if cur_hdrs: log.info(" header search dirs:") for hdr in cur_hdrs: log.info(" {}".format(hdr)) if cur_libs: log.info(" lib search dirs:") for lib in cur_libs: log.info(" {}".format(lib)) if cur_defs: log.info(" defines:") for define in cur_defs: log.info(" {} => {}".format(define, cur_defs[define])) else: log.info(' currently not in a valid project directory')
def list_imports(fips_dir, proj_dir) : """list project imports""" log.colored(log.YELLOW, '=== imports:') if util.is_valid_project_dir(proj_dir) : success, result = dep.get_all_imports_exports(fips_dir, proj_dir) if not success : log.warn("missing import project directories, please run 'fips fetch'") for dep_proj_name in result : # top level project is in result, but has no URL set, filter # this from the output log.colored(log.BLUE, "project '{}' imports:".format(dep_proj_name)) cur_dep = result[dep_proj_name] if cur_dep['imports'] : for imp_proj in cur_dep['imports'] : git_url = cur_dep['imports'][imp_proj]['git'] git_branch = cur_dep['imports'][imp_proj]['branch'] log.info(" '{}' from '{}' at branch '{}'".format(imp_proj, git_url, git_branch)) else : log.info(" nothing") else : log.info(' currently not in a valid project directory')
def list_exports(fips_dir, proj_dir) : """list project exports""" log.colored(log.YELLOW, '=== exports:') if util.is_valid_project_dir(proj_dir) : success, result = dep.get_all_imports_exports(fips_dir, proj_dir) if not success : log.warn("missing import project directories, please un 'fips fetch'") for dep_proj_name in result : cur_dep = result[dep_proj_name] log.colored(log.BLUE, "project '{}' exports:".format(dep_proj_name)) cur_modules = cur_dep['exports']['modules'] cur_hdrs = cur_dep['exports']['header-dirs'] cur_libs = cur_dep['exports']['lib-dirs'] cur_defs = cur_dep['exports']['defines'] if not (cur_modules or cur_hdrs or cur_libs or cur_defs) : log.info(" nothing") if cur_modules : log.info(" modules:") for mod in cur_modules : log.info(" {} => {}".format(mod, cur_modules[mod])) if cur_hdrs : log.info(" header search dirs:") for hdr in cur_hdrs : log.info(" {}".format(hdr)) if cur_libs : log.info(" lib search dirs:") for lib in cur_libs : log.info(" {}".format(lib)) if cur_defs : log.info(" defines:") for define in cur_defs : log.info(" {} => {}".format(define, cur_defs[define])) else : log.info(' currently not in a valid project directory')
def cleanup(fips_dir, proj_dir): '''goes through all dependencies and deletes the .vscode directory''' # fetch all project dependencies success, impex = dep.get_all_imports_exports(fips_dir, proj_dir) if not success : log.warn("missing import project directories, please run 'fips fetch'") log.info(log.RED + 'Please confirm to delete the following directories:' + log.DEF) for dep_proj_name in reversed(impex): dep_proj_dir = util.get_project_dir(fips_dir, dep_proj_name) vscode_dir = dep_proj_dir + '/.vscode/' if os.path.isdir(vscode_dir): log.info(' {}'.format(vscode_dir)) if util.confirm(log.RED + 'Delete those directories?' + log.DEF): for dep_proj_name in reversed(impex): dep_proj_dir = util.get_project_dir(fips_dir, dep_proj_name) vscode_dir = dep_proj_dir + '/.vscode/' if os.path.isdir(vscode_dir): log.info(' deleting {}'.format(vscode_dir)) shutil.rmtree(vscode_dir) log.info('Done.') else: log.info('Nothing deleted, done.')
def write_workspace_settings(fips_dir, proj_dir, cfg): '''write the VSCode launch.json, tasks.json and c_cpp_properties.json files from cmake output files ''' log.info("=== writing Visual Studio Code config files...") vscode_dir = proj_dir + '/.vscode' if not os.path.isdir(vscode_dir): os.makedirs(vscode_dir) # fetch all project dependencies success, impex = dep.get_all_imports_exports(fips_dir, proj_dir) if not success : log.warn("missing import project directories, please run 'fips fetch'") vscode_extensions = list_extensions() has_cmake_tools = any('vector-of-bool.cmake-tools' in ext for ext in vscode_extensions) remove_vscode_tasks_launch_files(fips_dir, proj_dir, impex, cfg) write_tasks_json(fips_dir, proj_dir, vscode_dir, cfg) write_launch_json(fips_dir, proj_dir, vscode_dir, cfg) if has_cmake_tools: write_cmake_tools_settings(fips_dir, proj_dir, vscode_dir, cfg) else: write_c_cpp_properties_json(fips_dir, proj_dir, impex, cfg) write_code_workspace_file(fips_dir, proj_dir, impex, cfg)
def write_workspace_settings(fips_dir, proj_dir, cfg, proj_settings): '''write the VSCode launch.json, tasks.json and c_cpp_properties.json files from cmake output files ''' log.info("=== writing Visual Studio Code config files...") vscode_dir = proj_dir + '/.vscode' if not os.path.isdir(vscode_dir): os.makedirs(vscode_dir) # fetch all project dependencies success, impex = dep.get_all_imports_exports(fips_dir, proj_dir) if not success : log.warn("missing import project directories, please run 'fips fetch'") vscode_extensions = list_extensions() has_cmake_tools = any('vector-of-bool.cmake-tools' in ext for ext in vscode_extensions) remove_vscode_tasks_launch_files(fips_dir, proj_dir, impex, cfg) write_tasks_json(fips_dir, proj_dir, vscode_dir, cfg) write_launch_json(fips_dir, proj_dir, vscode_dir, cfg, proj_settings) if has_cmake_tools: write_cmake_tools_settings(fips_dir, proj_dir, vscode_dir, cfg) else: write_c_cpp_properties_json(fips_dir, proj_dir, impex, cfg) write_code_workspace_file(fips_dir, proj_dir, impex, cfg)