121 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			121 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#http://www.compaq.com/fortran/docs/
							 | 
						||
| 
								 | 
							
								import os
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from numpy.distutils.fcompiler import FCompiler
							 | 
						||
| 
								 | 
							
								from distutils.errors import DistutilsPlatformError
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								compilers = ['CompaqFCompiler']
							 | 
						||
| 
								 | 
							
								if os.name != 'posix' or sys.platform[:6] == 'cygwin' :
							 | 
						||
| 
								 | 
							
								    # Otherwise we'd get a false positive on posix systems with
							 | 
						||
| 
								 | 
							
								    # case-insensitive filesystems (like darwin), because we'll pick
							 | 
						||
| 
								 | 
							
								    # up /bin/df
							 | 
						||
| 
								 | 
							
								    compilers.append('CompaqVisualFCompiler')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class CompaqFCompiler(FCompiler):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    compiler_type = 'compaq'
							 | 
						||
| 
								 | 
							
								    description = 'Compaq Fortran Compiler'
							 | 
						||
| 
								 | 
							
								    version_pattern = r'Compaq Fortran (?P<version>[^\s]*).*'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if sys.platform[:5]=='linux':
							 | 
						||
| 
								 | 
							
								        fc_exe = 'fort'
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								        fc_exe = 'f90'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    executables = {
							 | 
						||
| 
								 | 
							
								        'version_cmd'  : ['<F90>', "-version"],
							 | 
						||
| 
								 | 
							
								        'compiler_f77' : [fc_exe, "-f77rtl", "-fixed"],
							 | 
						||
| 
								 | 
							
								        'compiler_fix' : [fc_exe, "-fixed"],
							 | 
						||
| 
								 | 
							
								        'compiler_f90' : [fc_exe],
							 | 
						||
| 
								 | 
							
								        'linker_so'    : ['<F90>'],
							 | 
						||
| 
								 | 
							
								        'archiver'     : ["ar", "-cr"],
							 | 
						||
| 
								 | 
							
								        'ranlib'       : ["ranlib"]
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    module_dir_switch = '-module ' # not tested
							 | 
						||
| 
								 | 
							
								    module_include_switch = '-I'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def get_flags(self):
							 | 
						||
| 
								 | 
							
								        return ['-assume no2underscore', '-nomixed_str_len_arg']
							 | 
						||
| 
								 | 
							
								    def get_flags_debug(self):
							 | 
						||
| 
								 | 
							
								        return ['-g', '-check bounds']
							 | 
						||
| 
								 | 
							
								    def get_flags_opt(self):
							 | 
						||
| 
								 | 
							
								        return ['-O4', '-align dcommons', '-assume bigarrays',
							 | 
						||
| 
								 | 
							
								                '-assume nozsize', '-math_library fast']
							 | 
						||
| 
								 | 
							
								    def get_flags_arch(self):
							 | 
						||
| 
								 | 
							
								        return ['-arch host', '-tune host']
							 | 
						||
| 
								 | 
							
								    def get_flags_linker_so(self):
							 | 
						||
| 
								 | 
							
								        if sys.platform[:5]=='linux':
							 | 
						||
| 
								 | 
							
								            return ['-shared']
							 | 
						||
| 
								 | 
							
								        return ['-shared', '-Wl,-expect_unresolved,*']
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class CompaqVisualFCompiler(FCompiler):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    compiler_type = 'compaqv'
							 | 
						||
| 
								 | 
							
								    description = 'DIGITAL or Compaq Visual Fortran Compiler'
							 | 
						||
| 
								 | 
							
								    version_pattern = (r'(DIGITAL|Compaq) Visual Fortran Optimizing Compiler'
							 | 
						||
| 
								 | 
							
								                       r' Version (?P<version>[^\s]*).*')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    compile_switch = '/compile_only'
							 | 
						||
| 
								 | 
							
								    object_switch = '/object:'
							 | 
						||
| 
								 | 
							
								    library_switch = '/OUT:'      #No space after /OUT:!
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    static_lib_extension = ".lib"
							 | 
						||
| 
								 | 
							
								    static_lib_format = "%s%s"
							 | 
						||
| 
								 | 
							
								    module_dir_switch = '/module:'
							 | 
						||
| 
								 | 
							
								    module_include_switch = '/I'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ar_exe = 'lib.exe'
							 | 
						||
| 
								 | 
							
								    fc_exe = 'DF'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if sys.platform=='win32':
							 | 
						||
| 
								 | 
							
								        from numpy.distutils.msvccompiler import MSVCCompiler
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        try:
							 | 
						||
| 
								 | 
							
								            m = MSVCCompiler()
							 | 
						||
| 
								 | 
							
								            m.initialize()
							 | 
						||
| 
								 | 
							
								            ar_exe = m.lib
							 | 
						||
| 
								 | 
							
								        except DistutilsPlatformError:
							 | 
						||
| 
								 | 
							
								            pass
							 | 
						||
| 
								 | 
							
								        except AttributeError as e:
							 | 
						||
| 
								 | 
							
								            if '_MSVCCompiler__root' in str(e):
							 | 
						||
| 
								 | 
							
								                print('Ignoring "%s" (I think it is msvccompiler.py bug)' % (e))
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                raise
							 | 
						||
| 
								 | 
							
								        except OSError as e:
							 | 
						||
| 
								 | 
							
								            if not "vcvarsall.bat" in str(e):
							 | 
						||
| 
								 | 
							
								                print("Unexpected OSError in", __file__)
							 | 
						||
| 
								 | 
							
								                raise
							 | 
						||
| 
								 | 
							
								        except ValueError as e:
							 | 
						||
| 
								 | 
							
								            if not "'path'" in str(e):
							 | 
						||
| 
								 | 
							
								                print("Unexpected ValueError in", __file__)
							 | 
						||
| 
								 | 
							
								                raise
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    executables = {
							 | 
						||
| 
								 | 
							
								        'version_cmd'  : ['<F90>', "/what"],
							 | 
						||
| 
								 | 
							
								        'compiler_f77' : [fc_exe, "/f77rtl", "/fixed"],
							 | 
						||
| 
								 | 
							
								        'compiler_fix' : [fc_exe, "/fixed"],
							 | 
						||
| 
								 | 
							
								        'compiler_f90' : [fc_exe],
							 | 
						||
| 
								 | 
							
								        'linker_so'    : ['<F90>'],
							 | 
						||
| 
								 | 
							
								        'archiver'     : [ar_exe, "/OUT:"],
							 | 
						||
| 
								 | 
							
								        'ranlib'       : None
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def get_flags(self):
							 | 
						||
| 
								 | 
							
								        return ['/nologo', '/MD', '/WX', '/iface=(cref,nomixed_str_len_arg)',
							 | 
						||
| 
								 | 
							
								                '/names:lowercase', '/assume:underscore']
							 | 
						||
| 
								 | 
							
								    def get_flags_opt(self):
							 | 
						||
| 
								 | 
							
								        return ['/Ox', '/fast', '/optimize:5', '/unroll:0', '/math_library:fast']
							 | 
						||
| 
								 | 
							
								    def get_flags_arch(self):
							 | 
						||
| 
								 | 
							
								        return ['/threads']
							 | 
						||
| 
								 | 
							
								    def get_flags_debug(self):
							 | 
						||
| 
								 | 
							
								        return ['/debug']
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == '__main__':
							 | 
						||
| 
								 | 
							
								    from distutils import log
							 | 
						||
| 
								 | 
							
								    log.set_verbosity(2)
							 | 
						||
| 
								 | 
							
								    from numpy.distutils import customized_fcompiler
							 | 
						||
| 
								 | 
							
								    print(customized_fcompiler(compiler='compaq').get_version())
							 |