[Python-checkins] r76996 - in python/trunk/Lib/distutils: msvc9compiler.py tests/test_msvc9compiler.py

tarek.ziade python-checkins at python.org
Tue Dec 22 00:31:55 CET 2009


Author: tarek.ziade
Date: Tue Dec 22 00:31:55 2009
New Revision: 76996

Log:
backported r76993 and r76994 so the trunk behaves the same way with MSVC Manifest files editing

Modified:
   python/trunk/Lib/distutils/msvc9compiler.py
   python/trunk/Lib/distutils/tests/test_msvc9compiler.py

Modified: python/trunk/Lib/distutils/msvc9compiler.py
==============================================================================
--- python/trunk/Lib/distutils/msvc9compiler.py	(original)
+++ python/trunk/Lib/distutils/msvc9compiler.py	Tue Dec 22 00:31:55 2009
@@ -646,28 +646,7 @@
                 mfid = 1
             else:
                 mfid = 2
-                try:
-                    # Remove references to the Visual C runtime, so they will
-                    # fall through to the Visual C dependency of Python.exe.
-                    # This way, when installed for a restricted user (e.g.
-                    # runtimes are not in WinSxS folder, but in Python's own
-                    # folder), the runtimes do not need to be in every folder
-                    # with .pyd's.
-                    manifest_f = open(temp_manifest, "rb")
-                    manifest_buf = manifest_f.read()
-                    manifest_f.close()
-                    pattern = re.compile(
-                        r"""<assemblyIdentity.*?name=("|')Microsoft\."""\
-                        r"""VC\d{2}\.CRT("|').*?(/>|</assemblyIdentity>)""",
-                        re.DOTALL)
-                    manifest_buf = re.sub(pattern, "", manifest_buf)
-                    pattern = "<dependentAssembly>\s*</dependentAssembly>"
-                    manifest_buf = re.sub(pattern, "", manifest_buf)
-                    manifest_f = open(temp_manifest, "wb")
-                    manifest_f.write(manifest_buf)
-                    manifest_f.close()
-                except IOError:
-                    pass
+                self._remove_visual_c_ref(temp_manifest)
             out_arg = '-outputresource:%s;%s' % (output_filename, mfid)
             try:
                 self.spawn(['mt.exe', '-nologo', '-manifest',
@@ -677,6 +656,33 @@
         else:
             log.debug("skipping %s (up-to-date)", output_filename)
 
+    def _remove_visual_c_ref(self, manifest_file):
+        try:
+            # Remove references to the Visual C runtime, so they will
+            # fall through to the Visual C dependency of Python.exe.
+            # This way, when installed for a restricted user (e.g.
+            # runtimes are not in WinSxS folder, but in Python's own
+            # folder), the runtimes do not need to be in every folder
+            # with .pyd's.
+            manifest_f = open(manifest_file)
+            try:
+                manifest_buf = manifest_f.read()
+            finally:
+                manifest_f.close()
+            pattern = re.compile(
+                r"""<assemblyIdentity.*?name=("|')Microsoft\."""\
+                r"""VC\d{2}\.CRT("|').*?(/>|</assemblyIdentity>)""",
+                re.DOTALL)
+            manifest_buf = re.sub(pattern, "", manifest_buf)
+            pattern = "<dependentAssembly>\s*</dependentAssembly>"
+            manifest_buf = re.sub(pattern, "", manifest_buf)
+            manifest_f = open(manifest_file, 'w')
+            try:
+                manifest_f.write(manifest_buf)
+            finally:
+                manifest_f.close()
+        except IOError:
+            pass
 
     # -- Miscellaneous methods -----------------------------------------
     # These are all used by the 'gen_lib_options() function, in

Modified: python/trunk/Lib/distutils/tests/test_msvc9compiler.py
==============================================================================
--- python/trunk/Lib/distutils/tests/test_msvc9compiler.py	(original)
+++ python/trunk/Lib/distutils/tests/test_msvc9compiler.py	Tue Dec 22 00:31:55 2009
@@ -1,18 +1,73 @@
 """Tests for distutils.msvc9compiler."""
 import sys
 import unittest
+import os
 
 from distutils.errors import DistutilsPlatformError
+from distutils.tests import support
 
-class msvc9compilerTestCase(unittest.TestCase):
+_MANIFEST = """\
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
+          manifestVersion="1.0">
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+    <security>
+      <requestedPrivileges>
+        <requestedExecutionLevel level="asInvoker" uiAccess="false">
+        </requestedExecutionLevel>
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+  <dependency>
+    <dependentAssembly>
+      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT"
+         version="9.0.21022.8" processorArchitecture="x86"
+         publicKeyToken="XXXX">
+      </assemblyIdentity>
+    </dependentAssembly>
+  </dependency>
+  <dependency>
+    <dependentAssembly>
+      <assemblyIdentity type="win32" name="Microsoft.VC90.MFC"
+        version="9.0.21022.8" processorArchitecture="x86"
+        publicKeyToken="XXXX"></assemblyIdentity>
+    </dependentAssembly>
+  </dependency>
+</assembly>
+"""
+
+_CLEANED_MANIFEST = """\
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
+          manifestVersion="1.0">
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+    <security>
+      <requestedPrivileges>
+        <requestedExecutionLevel level="asInvoker" uiAccess="false">
+        </requestedExecutionLevel>
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+  <dependency>
+
+  </dependency>
+  <dependency>
+    <dependentAssembly>
+      <assemblyIdentity type="win32" name="Microsoft.VC90.MFC"
+        version="9.0.21022.8" processorArchitecture="x86"
+        publicKeyToken="XXXX"></assemblyIdentity>
+    </dependentAssembly>
+  </dependency>
+</assembly>"""
+
+ at unittest.skipUnless(sys.platform=="win32", "These tests are only for win32")
+class msvc9compilerTestCase(support.TempdirManager,
+                            unittest.TestCase):
 
     def test_no_compiler(self):
         # makes sure query_vcvarsall throws
         # a DistutilsPlatformError if the compiler
         # is not found
-        if sys.platform != 'win32':
-            # this test is only for win32
-            return
         from distutils.msvccompiler import get_build_version
         if get_build_version() < 8.0:
             # this test is only for MSVC8.0 or above
@@ -31,9 +86,6 @@
             msvc9compiler.find_vcvarsall = old_find_vcvarsall
 
     def test_reg_class(self):
-        if sys.platform != 'win32':
-            # this test is only for win32
-            return
         from distutils.msvccompiler import get_build_version
         if get_build_version() < 8.0:
             # this test is only for MSVC8.0 or above
@@ -56,6 +108,27 @@
         keys = Reg.read_keys(HKCU, r'Control Panel')
         self.assertTrue('Desktop' in keys)
 
+    def test_remove_visual_c_ref(self):
+        from distutils.msvc9compiler import MSVCCompiler
+        tempdir = self.mkdtemp()
+        manifest = os.path.join(tempdir, 'manifest')
+        f = open(manifest, 'w')
+        f.write(_MANIFEST)
+        f.close()
+
+        compiler = MSVCCompiler()
+        compiler._remove_visual_c_ref(manifest)
+
+        # see what we got
+        f = open(manifest)
+        # removing trailing spaces
+        content = '\n'.join([line.rstrip() for line in f.readlines()])
+        f.close()
+
+        # makes sure the manifest was properly cleaned
+        self.assertEquals(content, _CLEANED_MANIFEST)
+
+
 def test_suite():
     return unittest.makeSuite(msvc9compilerTestCase)
 


More information about the Python-checkins mailing list