profile_toolchain.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. from __future__ import with_statement
  2. import contextlib
  3. import sys
  4. import os
  5. import optparse
  6. import json
  7. sys.path.append("%s/../../build" % os.path.dirname(os.path.realpath(__file__)))
  8. import find_depot_tools
  9. from vs_toolchain import \
  10. SetEnvironmentAndGetRuntimeDllDirs, \
  11. SetEnvironmentAndGetSDKDir, \
  12. NormalizePath
  13. sys.path.append("%s/win_toolchain" % find_depot_tools.add_depot_tools_to_path())
  14. from get_toolchain_if_necessary import CalculateHash
  15. @contextlib.contextmanager
  16. def cwd(directory):
  17. curdir = os.getcwd()
  18. try:
  19. os.chdir(directory)
  20. yield
  21. finally:
  22. os.chdir(curdir)
  23. def calculate_hash(root):
  24. with cwd(root):
  25. return CalculateHash('.', None)
  26. def windows_installed_software():
  27. import win32com.client
  28. strComputer = "."
  29. objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
  30. objSWbemServices = objWMIService.ConnectServer(strComputer, "root\cimv2")
  31. colItems = objSWbemServices.ExecQuery("Select * from Win32_Product")
  32. items = []
  33. for objItem in colItems:
  34. item = {}
  35. if objItem.Caption:
  36. item['caption'] = objItem.Caption
  37. if objItem.Caption:
  38. item['description'] = objItem.Description
  39. if objItem.InstallDate:
  40. item['install_date'] = objItem.InstallDate
  41. if objItem.InstallDate2:
  42. item['install_date_2'] = objItem.InstallDate2
  43. if objItem.InstallLocation:
  44. item['install_location'] = objItem.InstallLocation
  45. if objItem.Name:
  46. item['name'] = objItem.Name
  47. if objItem.SKUNumber:
  48. item['sku_number'] = objItem.SKUNumber
  49. if objItem.Vendor:
  50. item['vendor'] = objItem.Vendor
  51. if objItem.Version:
  52. item['version'] = objItem.Version
  53. items.append(item)
  54. return items
  55. def windows_profile():
  56. runtime_dll_dirs = SetEnvironmentAndGetRuntimeDllDirs()
  57. win_sdk_dir = SetEnvironmentAndGetSDKDir()
  58. path = NormalizePath(os.environ['GYP_MSVS_OVERRIDE_PATH'])
  59. # since current windows executable are symbols path dependant,
  60. # profile the current directory too
  61. return {
  62. 'pwd': os.getcwd(),
  63. 'installed_software': windows_installed_software(),
  64. 'sdks': [
  65. {'name': 'vs', 'path': path, 'hash': calculate_hash(path)},
  66. {
  67. 'name': 'wsdk',
  68. 'path': win_sdk_dir,
  69. 'hash': calculate_hash(win_sdk_dir),
  70. },
  71. ],
  72. 'runtime_lib_dirs': runtime_dll_dirs,
  73. }
  74. def main(options):
  75. if sys.platform == 'win32':
  76. with open(options.output_json, 'wb') as f:
  77. json.dump(windows_profile(), f)
  78. else:
  79. raise OSError("Unsupported OS")
  80. if __name__ == '__main__':
  81. parser = optparse.OptionParser()
  82. parser.add_option('--output-json', metavar='FILE', default='profile.json',
  83. help='write information about toolchain to FILE')
  84. opts, args = parser.parse_args()
  85. sys.exit(main(opts))