77 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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
 |