123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- #!/usr/bin/env python
- # Copyright (c) 2012 Google Inc. All rights reserved.
- # Use of this source code is governed by a BSD-style license that can be
- # found in the LICENSE file.
- """Prints the information in a sln file in a diffable way.
- It first outputs each projects in alphabetical order with their
- dependencies.
- Then it outputs a possible build order.
- """
- from __future__ import print_function
- import os
- import re
- import sys
- import pretty_vcproj
- __author__ = "nsylvain (Nicolas Sylvain)"
- def BuildProject(project, built, projects, deps):
- # if all dependencies are done, we can build it, otherwise we try to build the
- # dependency.
- # This is not infinite-recursion proof.
- for dep in deps[project]:
- if dep not in built:
- BuildProject(dep, built, projects, deps)
- print(project)
- built.append(project)
- def ParseSolution(solution_file):
- # All projects, their clsid and paths.
- projects = dict()
- # A list of dependencies associated with a project.
- dependencies = dict()
- # Regular expressions that matches the SLN format.
- # The first line of a project definition.
- begin_project = re.compile(
- r'^Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942'
- r'}"\) = "(.*)", "(.*)", "(.*)"$'
- )
- # The last line of a project definition.
- end_project = re.compile("^EndProject$")
- # The first line of a dependency list.
- begin_dep = re.compile(r"ProjectSection\(ProjectDependencies\) = postProject$")
- # The last line of a dependency list.
- end_dep = re.compile("EndProjectSection$")
- # A line describing a dependency.
- dep_line = re.compile(" *({.*}) = ({.*})$")
- in_deps = False
- solution = open(solution_file)
- for line in solution:
- results = begin_project.search(line)
- if results:
- # Hack to remove icu because the diff is too different.
- if results.group(1).find("icu") != -1:
- continue
- # We remove "_gyp" from the names because it helps to diff them.
- current_project = results.group(1).replace("_gyp", "")
- projects[current_project] = [
- results.group(2).replace("_gyp", ""),
- results.group(3),
- results.group(2),
- ]
- dependencies[current_project] = []
- continue
- results = end_project.search(line)
- if results:
- current_project = None
- continue
- results = begin_dep.search(line)
- if results:
- in_deps = True
- continue
- results = end_dep.search(line)
- if results:
- in_deps = False
- continue
- results = dep_line.search(line)
- if results and in_deps and current_project:
- dependencies[current_project].append(results.group(1))
- continue
- # Change all dependencies clsid to name instead.
- for project in dependencies:
- # For each dependencies in this project
- new_dep_array = []
- for dep in dependencies[project]:
- # Look for the project name matching this cldis
- for project_info in projects:
- if projects[project_info][1] == dep:
- new_dep_array.append(project_info)
- dependencies[project] = sorted(new_dep_array)
- return (projects, dependencies)
- def PrintDependencies(projects, deps):
- print("---------------------------------------")
- print("Dependencies for all projects")
- print("---------------------------------------")
- print("-- --")
- for (project, dep_list) in sorted(deps.items()):
- print("Project : %s" % project)
- print("Path : %s" % projects[project][0])
- if dep_list:
- for dep in dep_list:
- print(" - %s" % dep)
- print("")
- print("-- --")
- def PrintBuildOrder(projects, deps):
- print("---------------------------------------")
- print("Build order ")
- print("---------------------------------------")
- print("-- --")
- built = []
- for (project, _) in sorted(deps.items()):
- if project not in built:
- BuildProject(project, built, projects, deps)
- print("-- --")
- def PrintVCProj(projects):
- for project in projects:
- print("-------------------------------------")
- print("-------------------------------------")
- print(project)
- print(project)
- print(project)
- print("-------------------------------------")
- print("-------------------------------------")
- project_path = os.path.abspath(
- os.path.join(os.path.dirname(sys.argv[1]), projects[project][2])
- )
- pretty = pretty_vcproj
- argv = [
- "",
- project_path,
- "$(SolutionDir)=%s\\" % os.path.dirname(sys.argv[1]),
- ]
- argv.extend(sys.argv[3:])
- pretty.main(argv)
- def main():
- # check if we have exactly 1 parameter.
- if len(sys.argv) < 2:
- print('Usage: %s "c:\\path\\to\\project.sln"' % sys.argv[0])
- return 1
- (projects, deps) = ParseSolution(sys.argv[1])
- PrintDependencies(projects, deps)
- PrintBuildOrder(projects, deps)
- if "--recursive" in sys.argv:
- PrintVCProj(projects)
- return 0
- if __name__ == "__main__":
- sys.exit(main())
|