diff --git a/tools/export/__init__.py b/tools/export/__init__.py index 6fe222df71..30be03cb25 100644 --- a/tools/export/__init__.py +++ b/tools/export/__init__.py @@ -138,48 +138,6 @@ def get_exporter_toolchain(ide): return EXPORTERS[ide], EXPORTERS[ide].TOOLCHAIN -def rewrite_basepath(file_name, resources, export_path, loc): - """ Replace the basepath of filename with export_path - - Positional arguments: - file_name - the absolute path to a file - resources - the resources object that the file came from - export_path - the final destination of the file after export - """ - new_f = join(loc, relpath(file_name, resources.file_basepath[file_name])) - resources.file_basepath[new_f] = export_path - return new_f - - -def subtract_basepath(resources, export_path, loc=""): - """ Rewrite all of the basepaths with the export_path - - Positional arguments: - resources - the resource object to rewrite the basepaths of - export_path - the final destination of the resources with respect to the - generated project files - """ - keys = ['s_sources', 'c_sources', 'cpp_sources', 'hex_files', - 'objects', 'libraries', 'inc_dirs', 'headers', 'linker_script', - 'lib_dirs'] - for key in keys: - vals = getattr(resources, key) - if isinstance(vals, set): - vals = list(vals) - if isinstance(vals, list): - new_vals = [] - for val in vals: - new_vals.append(rewrite_basepath(val, resources, export_path, - loc)) - if isinstance(getattr(resources, key), set): - setattr(resources, key, set(new_vals)) - else: - setattr(resources, key, new_vals) - elif vals: - setattr(resources, key, rewrite_basepath(vals, resources, - export_path, loc)) - - def generate_project_files(resources, export_path, target, name, toolchain, ide, macros=None): """Generate the project files for a project @@ -305,27 +263,21 @@ def export_project(src_paths, export_path, target, ide, libraries_paths=None, notify=notify, silent=silent, verbose=verbose, extra_verbose=extra_verbose, config=config, build_profile=build_profile, app_config=app_config) - # The first path will give the name to the library + toolchain.RESPONSE_FILES = False if name is None: name = basename(normpath(abspath(src_paths[0]))) - # Call unified scan_resources resource_dict = {loc: sum((toolchain.scan_resources(p, collect_ignores=True) for p in path), Resources()) for loc, path in src_paths.items()} resources = Resources() - if zip_proj: - subtract_basepath(resources, ".") - for loc, res in resource_dict.items(): - temp = copy.deepcopy(res) - subtract_basepath(temp, ".", loc) - resources.add(temp) - else: - for _, res in resource_dict.items(): - resources.add(res) + for loc, res in resource_dict.items(): + temp = copy.deepcopy(res) + temp.subtract_basepath(".", loc) + resources.add(temp) toolchain.build_dir = export_path toolchain.config.load_resources(resources) @@ -345,8 +297,7 @@ def export_project(src_paths, export_path, target, ide, libraries_paths=None, if zip_proj: for resource in resource_dict.values(): for label, res in resource.features.items(): - if label not in toolchain.target.features: - resource.add(res) + resource.add(res) if isinstance(zip_proj, basestring): zip_export(join(export_path, zip_proj), name, resource_dict, files + list(exporter.static_files), inc_repos) diff --git a/tools/toolchains/__init__.py b/tools/toolchains/__init__.py index 07af4dd07a..1bf32e0448 100644 --- a/tools/toolchains/__init__.py +++ b/tools/toolchains/__init__.py @@ -169,8 +169,7 @@ class Resources: self.ignored_dirs.append(directory) def add(self, resources): - for f,p in resources.file_basepath.items(): - self.file_basepath[f] = p + self.file_basepath.update(resources.file_basepath) self.inc_dirs += resources.inc_dirs self.headers += resources.headers @@ -201,6 +200,48 @@ class Resources: return self + def rewrite_basepath(self, file_name, export_path, loc): + """ Replace the basepath of filename with export_path + + Positional arguments: + file_name - the absolute path to a file + export_path - the final destination of the file after export + """ + new_f = join(loc, relpath(file_name, self.file_basepath[file_name])) + self.file_basepath[new_f] = export_path + return new_f + + def subtract_basepath(self, export_path, loc=""): + """ Rewrite all of the basepaths with the export_path + + Positional arguments: + export_path - the final destination of the resources with respect to the + generated project files + """ + keys = ['s_sources', 'c_sources', 'cpp_sources', 'hex_files', + 'objects', 'libraries', 'inc_dirs', 'headers', 'linker_script', + 'lib_dirs'] + for key in keys: + vals = getattr(self, key) + if isinstance(vals, set): + vals = list(vals) + if isinstance(vals, list): + new_vals = [] + for val in vals: + new_vals.append(self.rewrite_basepath( + val, export_path, loc)) + if isinstance(getattr(self, key), set): + setattr(self, key, set(new_vals)) + else: + setattr(self, key, new_vals) + elif vals: + setattr(self, key, self.rewrite_basepath( + vals, export_path, loc)) + def closure(res, export_path=export_path, loc=loc): + res.subtract_basepath(export_path, loc) + return res + self.features.apply(closure) + def _collect_duplicates(self, dupe_dict, dupe_headers): for filename in self.s_sources + self.c_sources + self.cpp_sources: objname, _ = splitext(basename(filename))