profile_toolchain.py 2.9 KB

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