def cpp_includes_definition(self): includes = [] for definition in self.definitions: includes.extend(definition.cpp_includes_definition()) normalized_includes = [] for include in includes: normalized_include = include.strip() if not normalized_include.startswith('#include '): normalized_include = '#include ' + normalized_include normalized_includes.append(normalized_include) normalized_includes = deduplist(normalized_includes) std_includes = [] lib_includes = [] other_includes = [] for include in normalized_includes: if include.endswith('.hpp>') or include.endswith('.h>'): lib_includes.append(include) elif include.endswith('"'): other_includes.append(include) elif include.endswith('>'): std_includes.append(include) else: raise NotImplementedError includes = std_includes if len(lib_includes) > 0: if len(includes) > 0: includes.append('') includes.extend(lib_includes) if len(other_includes) > 0: if len(includes) > 0: includes.append('') includes.extend(other_includes) return includes
# if project A depends on project B depends on project C, the order will be [A, B, C] def __expand_project_references(project_name): project_references = [] for project_reference in PROJECT_REFERENCES[project_name]: project_references.append(project_reference) for project_reference in __expand_project_references(project_reference): try: del project_references[project_references.index(project_reference)] except ValueError: pass project_references.append(project_reference) return project_references PROJECT_REFERENCES_EXPANDED = {} for project_name in PROJECT_REFERENCES.iterkeys(): PROJECT_REFERENCES_EXPANDED[project_name] = \ deduplist(__expand_project_references(project_name)) # Construct LIBS to get the right link order on Unix, namely requirements flow # left to right (if A depends on B, the link order should be A B) LIBS_EXPANDED = {} for project_name, project_references in PROJECT_REFERENCES_EXPANDED.iteritems(): LIBS_EXPANDED[project_name] = {} try: for platform, platform_libs in LIBS[project_name].iteritems(): LIBS_EXPANDED[project_name].setdefault(platform, []).extend(platform_libs) except KeyError: pass # Add the project references' outputs to the project's libs