(targets)
| 1927 | |
| 1928 | |
| 1929 | def BuildDependencyList(targets): |
| 1930 | # Create a DependencyGraphNode for each target. Put it into a dict for easy |
| 1931 | # access. |
| 1932 | dependency_nodes = {} |
| 1933 | for target, spec in targets.items(): |
| 1934 | if target not in dependency_nodes: |
| 1935 | dependency_nodes[target] = DependencyGraphNode(target) |
| 1936 | |
| 1937 | # Set up the dependency links. Targets that have no dependencies are treated |
| 1938 | # as dependent on root_node. |
| 1939 | root_node = DependencyGraphNode(None) |
| 1940 | for target, spec in targets.items(): |
| 1941 | target_node = dependency_nodes[target] |
| 1942 | dependencies = spec.get("dependencies") |
| 1943 | if not dependencies: |
| 1944 | target_node.dependencies = [root_node] |
| 1945 | root_node.dependents.append(target_node) |
| 1946 | else: |
| 1947 | for dependency in dependencies: |
| 1948 | dependency_node = dependency_nodes.get(dependency) |
| 1949 | if not dependency_node: |
| 1950 | raise GypError( |
| 1951 | "Dependency '%s' not found while " |
| 1952 | "trying to load target %s" % (dependency, target) |
| 1953 | ) |
| 1954 | target_node.dependencies.append(dependency_node) |
| 1955 | dependency_node.dependents.append(target_node) |
| 1956 | |
| 1957 | flat_list = root_node.FlattenToList() |
| 1958 | |
| 1959 | # If there's anything left unvisited, there must be a circular dependency |
| 1960 | # (cycle). |
| 1961 | if len(flat_list) != len(targets): |
| 1962 | if not root_node.dependents: |
| 1963 | # If all targets have dependencies, add the first target as a dependent |
| 1964 | # of root_node so that the cycle can be discovered from root_node. |
| 1965 | target = next(iter(targets)) |
| 1966 | target_node = dependency_nodes[target] |
| 1967 | target_node.dependencies.append(root_node) |
| 1968 | root_node.dependents.append(target_node) |
| 1969 | |
| 1970 | cycles = [] |
| 1971 | for cycle in root_node.FindCycles(): |
| 1972 | paths = [node.ref for node in cycle] |
| 1973 | cycles.append("Cycle: %s" % " -> ".join(paths)) |
| 1974 | raise DependencyGraphNode.CircularException( |
| 1975 | "Cycles in dependency graph detected:\n" + "\n".join(cycles) |
| 1976 | ) |
| 1977 | |
| 1978 | return [dependency_nodes, flat_list] |
| 1979 | |
| 1980 | |
| 1981 | def VerifyNoGYPFileCircularDependencies(targets): |
no test coverage detected