You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					77 lines
				
				2.6 KiB
			
		
		
			
		
	
	
					77 lines
				
				2.6 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								import os
							 | 
						||
| 
								 | 
							
								from distutils.msvccompiler import MSVCCompiler as _MSVCCompiler
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from .system_info import platform_bits
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def _merge(old, new):
							 | 
						||
| 
								 | 
							
								    """Concatenate two environment paths avoiding repeats.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Here `old` is the environment string before the base class initialize
							 | 
						||
| 
								 | 
							
								    function is called and `new` is the string after the call. The new string
							 | 
						||
| 
								 | 
							
								    will be a fixed string if it is not obtained from the current environment,
							 | 
						||
| 
								 | 
							
								    or the same as the old string if obtained from the same environment. The aim
							 | 
						||
| 
								 | 
							
								    here is not to append the new string if it is already contained in the old
							 | 
						||
| 
								 | 
							
								    string so as to limit the growth of the environment string.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Parameters
							 | 
						||
| 
								 | 
							
								    ----------
							 | 
						||
| 
								 | 
							
								    old : string
							 | 
						||
| 
								 | 
							
								        Previous environment string.
							 | 
						||
| 
								 | 
							
								    new : string
							 | 
						||
| 
								 | 
							
								        New environment string.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Returns
							 | 
						||
| 
								 | 
							
								    -------
							 | 
						||
| 
								 | 
							
								    ret : string
							 | 
						||
| 
								 | 
							
								        Updated environment string.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    if new in old:
							 | 
						||
| 
								 | 
							
								        return old
							 | 
						||
| 
								 | 
							
								    if not old:
							 | 
						||
| 
								 | 
							
								        return new
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Neither new nor old is empty. Give old priority.
							 | 
						||
| 
								 | 
							
								    return ';'.join([old, new])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class MSVCCompiler(_MSVCCompiler):
							 | 
						||
| 
								 | 
							
								    def __init__(self, verbose=0, dry_run=0, force=0):
							 | 
						||
| 
								 | 
							
								        _MSVCCompiler.__init__(self, verbose, dry_run, force)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def initialize(self):
							 | 
						||
| 
								 | 
							
								        # The 'lib' and 'include' variables may be overwritten
							 | 
						||
| 
								 | 
							
								        # by MSVCCompiler.initialize, so save them for later merge.
							 | 
						||
| 
								 | 
							
								        environ_lib = os.getenv('lib', '')
							 | 
						||
| 
								 | 
							
								        environ_include = os.getenv('include', '')
							 | 
						||
| 
								 | 
							
								        _MSVCCompiler.initialize(self)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Merge current and previous values of 'lib' and 'include'
							 | 
						||
| 
								 | 
							
								        os.environ['lib'] = _merge(environ_lib, os.environ['lib'])
							 | 
						||
| 
								 | 
							
								        os.environ['include'] = _merge(environ_include, os.environ['include'])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # msvc9 building for 32 bits requires SSE2 to work around a
							 | 
						||
| 
								 | 
							
								        # compiler bug.
							 | 
						||
| 
								 | 
							
								        if platform_bits == 32:
							 | 
						||
| 
								 | 
							
								            self.compile_options += ['/arch:SSE2']
							 | 
						||
| 
								 | 
							
								            self.compile_options_debug += ['/arch:SSE2']
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def lib_opts_if_msvc(build_cmd):
							 | 
						||
| 
								 | 
							
								    """ Add flags if we are using MSVC compiler
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    We can't see `build_cmd` in our scope, because we have not initialized
							 | 
						||
| 
								 | 
							
								    the distutils build command, so use this deferred calculation to run
							 | 
						||
| 
								 | 
							
								    when we are building the library.
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    if build_cmd.compiler.compiler_type != 'msvc':
							 | 
						||
| 
								 | 
							
								        return []
							 | 
						||
| 
								 | 
							
								    # Explicitly disable whole-program optimization.
							 | 
						||
| 
								 | 
							
								    flags = ['/GL-']
							 | 
						||
| 
								 | 
							
								    # Disable voltbl section for vc142 to allow link using mingw-w64; see:
							 | 
						||
| 
								 | 
							
								    # https://github.com/matthew-brett/dll_investigation/issues/1#issuecomment-1100468171
							 | 
						||
| 
								 | 
							
								    if build_cmd.compiler_opt.cc_test_flags(['-d2VolatileMetadata-']):
							 | 
						||
| 
								 | 
							
								        flags.append('-d2VolatileMetadata-')
							 | 
						||
| 
								 | 
							
								    return flags
							 |