test_win32_manifest.py
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. #!/usr/bin/env python
  2. # @file test_win32_manifest.py
  3. # @brief Test an assembly binding version and uniqueness in a windows dll or exe.  
  4. #
  5. # $LicenseInfo:firstyear=2009&license=viewergpl$
  6. # Copyright (c) 2009-2010, Linden Research, Inc.
  7. # Second Life Viewer Source Code
  8. # The source code in this file ("Source Code") is provided by Linden Lab
  9. # to you under the terms of the GNU General Public License, version 2.0
  10. # ("GPL"), unless you have obtained a separate licensing agreement
  11. # ("Other License"), formally executed by you and Linden Lab.  Terms of
  12. # the GPL can be found in doc/GPL-license.txt in this distribution, or
  13. # online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  14. # There are special exceptions to the terms and conditions of the GPL as
  15. # it is applied to this Source Code. View the full text of the exception
  16. # in the file doc/FLOSS-exception.txt in this software distribution, or
  17. # online at
  18. # http://secondlifegrid.net/programs/open_source/licensing/flossexception
  19. # By copying, modifying or distributing this software, you acknowledge
  20. # that you have read and understood your obligations described above,
  21. # and agree to abide by those obligations.
  22. # ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  23. # WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  24. # COMPLETENESS OR PERFORMANCE.
  25. # $/LicenseInfo$
  26. import sys, os
  27. import tempfile
  28. from xml.dom.minidom import parse
  29. class AssemblyTestException(Exception):
  30.     pass
  31. class NoManifestException(AssemblyTestException):
  32.     pass
  33. class MultipleBindingsException(AssemblyTestException):
  34.     pass
  35. class UnexpectedVersionException(AssemblyTestException):
  36.     pass
  37. class NoMatchingAssemblyException(AssemblyTestException):
  38.     pass
  39. def get_HKLM_registry_value(key_str, value_str):
  40.     import _winreg
  41.     reg = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
  42.     key = _winreg.OpenKey(reg, key_str)
  43.     value = _winreg.QueryValueEx(key, value_str)[0]
  44.     #print 'Found: %s' % value
  45.     return value
  46.         
  47. def find_vc_dir():
  48.     supported_versions = (r'8.0', r'9.0')
  49.     value_str = (r'ProductDir')
  50.     
  51.     for version in supported_versions:
  52.         key_str = (r'SOFTWAREMicrosoftVisualStudio%sSetupVC' %
  53.                    version)
  54.         try:
  55.             return get_HKLM_registry_value(key_str, value_str)
  56.         except WindowsError, err:
  57.             x64_key_str = (r'SOFTWAREWow6432NodeMicrosoftVisualStudio%sSetupVS' %
  58.                        version)
  59.             try:
  60.                 return get_HKLM_registry_value(x64_key_str, value_str)
  61.             except:
  62.                 print >> sys.stderr, "Didn't find MS VC version %s " % version
  63.         
  64.     raise
  65. def find_mt_path():
  66.     vc_dir = find_vc_dir()
  67.     mt_path = '"%sbin\mt.exe"' % vc_dir
  68.     return mt_path
  69.     
  70. def test_assembly_binding(src_filename, assembly_name, assembly_ver):
  71.     print "checking %s dependency %s..." % (src_filename, assembly_name)
  72.     (tmp_file_fd, tmp_file_name) = tempfile.mkstemp(suffix='.xml')
  73.     tmp_file = os.fdopen(tmp_file_fd)
  74.     tmp_file.close()
  75.     mt_path = find_mt_path()
  76.     resource_id = ""
  77.     if os.path.splitext(src_filename)[1].lower() == ".dll":
  78.        resource_id = ";#2"
  79.     system_call = '%s -nologo -inputresource:%s%s -out:%s > NUL' % (mt_path, src_filename, resource_id, tmp_file_name)
  80.     print "Executing: %s" % system_call
  81.     mt_result = os.system(system_call)
  82.     if mt_result == 31:
  83.         print "No manifest found in %s" % src_filename
  84.         raise NoManifestException()
  85.     manifest_dom = parse(tmp_file_name)
  86.     nodes = manifest_dom.getElementsByTagName('assemblyIdentity')
  87.     versions = list()
  88.     for node in nodes:
  89.         if node.getAttribute('name') == assembly_name:
  90.             versions.append(node.getAttribute('version'))
  91.     if len(versions) == 0:
  92.         print "No matching assemblies found in %s" % src_filename
  93.         raise NoMatchingAssemblyException()
  94.         
  95.     elif len(versions) > 1:
  96.         print "Multiple bindings to %s found:" % assembly_name
  97.         print versions
  98.         print 
  99.         raise MultipleBindingsException(versions)
  100.     elif versions[0] != assembly_ver:
  101.         print "Unexpected version found for %s:" % assembly_name
  102.         print "Wanted %s, found %s" % (assembly_ver, versions[0])
  103.         print
  104.         raise UnexpectedVersionException(assembly_ver, versions[0])
  105.             
  106.     os.remove(tmp_file_name)
  107.     
  108.     print "SUCCESS: %s OK!" % src_filename
  109.     print
  110.   
  111. if __name__ == '__main__':
  112.     print
  113.     print "Running test_win32_manifest.py..."
  114.     
  115.     usage = 'test_win32_manfest <srcFileName> <assemblyName> <assemblyVersion>'
  116.     try:
  117.         src_filename = sys.argv[1]
  118.         assembly_name = sys.argv[2]
  119.         assembly_ver = sys.argv[3]
  120.     except:
  121.         print "Usage:"
  122.         print usage
  123.         print
  124.         raise
  125.     
  126.     test_assembly_binding(src_filename, assembly_name, assembly_ver)
  127.