summaryrefslogtreecommitdiffstats
path: root/Lib/distutils
diff options
context:
space:
mode:
authorTarek Ziadé <ziade.tarek@gmail.com>2009-12-21 23:12:41 (GMT)
committerTarek Ziadé <ziade.tarek@gmail.com>2009-12-21 23:12:41 (GMT)
commitc60ea329a4f40791139c24fbb25c8514cc40eeb2 (patch)
treed0ce7cd7f83c120357ca69fc07f5b5748ea1afe7 /Lib/distutils
parent036dd31f882a271c87db3e28cee4e4ff4149a122 (diff)
downloadcpython-c60ea329a4f40791139c24fbb25c8514cc40eeb2.zip
cpython-c60ea329a4f40791139c24fbb25c8514cc40eeb2.tar.gz
cpython-c60ea329a4f40791139c24fbb25c8514cc40eeb2.tar.bz2
Fixed #7556: editing the MSVC manifest file with a regexp was throwing an error
Diffstat (limited to 'Lib/distutils')
-rw-r--r--Lib/distutils/msvc9compiler.py51
-rw-r--r--Lib/distutils/tests/test_msvc9compiler.py87
2 files changed, 109 insertions, 29 deletions
diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py
index 4d05a44..6455fff 100644
--- a/Lib/distutils/msvc9compiler.py
+++ b/Lib/distutils/msvc9compiler.py
@@ -645,28 +645,8 @@ class MSVCCompiler(CCompiler) :
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
+ # Remove references to the Visual C runtime
+ self._remove_visual_c_ref(temp_manifest)
out_arg = '-outputresource:%s;%s' % (output_filename, mfid)
try:
self.spawn(['mt.exe', '-nologo', '-manifest',
@@ -676,6 +656,33 @@ class MSVCCompiler(CCompiler) :
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
diff --git a/Lib/distutils/tests/test_msvc9compiler.py b/Lib/distutils/tests/test_msvc9compiler.py
index 05d34e6..e1f08d8 100644
--- a/Lib/distutils/tests/test_msvc9compiler.py
+++ b/Lib/distutils/tests/test_msvc9compiler.py
@@ -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>"""
+
+@unittest.skip("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 @@ class msvc9compilerTestCase(unittest.TestCase):
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 @@ class msvc9compilerTestCase(unittest.TestCase):
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)