123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- #!/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.
- """
- __author__ = 'nsylvain (Nicolas Sylvain)'
- import os
- import re
- import sys
- import pretty_vcproj
- 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())
|