| 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 osimport reimport sysimport pretty_vcprojdef 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 0if __name__ == '__main__':  sys.exit(main())
 |