1import config.base 2 3import re 4import os 5 6class Configure(config.base.Configure): 7 def __init__(self, framework): 8 config.base.Configure.__init__(self, framework) 9 self.headerPrefix = '' 10 self.substPrefix = '' 11 self.version = {} 12 self.rejected = {} 13 return 14 15 def __str__(self): 16 return '' 17 18 def setupHelp(self, help): 19 import nargs 20 help.addArgument('Compiler Flags', '-optionsModule=<module name>', nargs.Arg(None, 'config.compilerOptions', 'The Python module used to determine compiler options and versions')) 21 help.addArgument('Compiler Flags', '-with-debugging=<bool>', nargs.ArgBool(None, 1, 'Specify debugging version of libraries')) 22 help.addArgument('Compiler Flags', '-C_VERSION=<string>', nargs.Arg(None, 'Unknown', 'The version of the C compiler')) 23 help.addArgument('Compiler Flags', '-CXX_VERSION=<string>', nargs.Arg(None, 'Unknown', 'The version of the C++ compiler')) 24 help.addArgument('Compiler Flags', '-FC_VERSION=<string>', nargs.Arg(None, 'Unknown', 'The version of the Fortran compiler')) 25 help.addArgument('Compiler Flags', '-CUDA_VERSION=<string>',nargs.Arg(None, 'Unknown', 'The version of the CUDA compiler')) 26 help.addArgument('Compiler Flags', '-COPTFLAGS=<string>', nargs.Arg(None, None, 'Override the debugging/optimization flags for the C compiler')) 27 help.addArgument('Compiler Flags', '-CXXOPTFLAGS=<string>', nargs.Arg(None, None, 'Override the debugging/optimization flags for the C++ compiler')) 28 help.addArgument('Compiler Flags', '-FOPTFLAGS=<string>', nargs.Arg(None, None, 'Override the debugging/optimization flags for the Fortran compiler')) 29 help.addArgument('Compiler Flags', '-CUDAOPTFLAGS=<string>', nargs.Arg(None, None, 'Override the debugging/optimization flags for the CUDA compiler')) 30 # not sure where to put this, currently gcov is handled in ../compilerOptions.py 31 help.addArgument('Compiler Flags', '-with-gcov=<bool>', nargs.ArgBool(None, 0, 'Specify that GNUs coverage tool gcov is used')) 32 return 33 34 def setupDependencies(self, framework): 35 config.base.Configure.setupDependencies(self, framework) 36 self.setCompilers = framework.require('config.setCompilers', self) 37 return 38 39 def getOptionalFlagsName(self, language, compilerOnly = 0): 40 if language == 'C': 41 flagsArg = 'COPTFLAGS' 42 elif language == 'Cxx': 43 if compilerOnly: 44 flagsArg = 'CXX_CXXOPTFLAGS' 45 else: 46 flagsArg = 'CXXOPTFLAGS' 47 elif language == 'FC': 48 flagsArg = 'FOPTFLAGS' 49 elif language == 'CUDA': 50 flagsArg = 'CUDAOPTFLAGS' 51 else: 52 raise RuntimeError('Unknown language: '+language) 53 return flagsArg 54 55 def getOptionsObject(self): 56 '''Get a configure object which will return default options for each compiler''' 57 options = None 58 try: 59 mod = __import__(self.framework.argDB['optionsModule'], locals(), globals(), ['CompilerOptions']) 60 options = mod.CompilerOptions(self.framework) 61 except ImportError: 62 self.framework.logPrint('ERROR: Failed to load user options module '+str(self.framework.argDB['optionsModule'])) 63 return options 64 65 def configureCompilerFlags(self): 66 '''Get the default compiler flags''' 67 self.debugging = self.argDB['with-debugging'] 68 bopts = [''] 69 if self.debugging: 70 bopts.append('g') 71 else: 72 bopts.append('O') 73 options = self.getOptionsObject() 74 if not options: 75 return 76 for language, compiler in [('C', 'CC'), ('Cxx', 'CXX'), ('FC', 'FC'), ('CUDA', 'CUDAC')]: 77 if not hasattr(self.setCompilers, compiler): 78 continue 79 self.setCompilers.pushLanguage(language) 80 flagsArg = self.getCompilerFlagsArg() 81 try: 82 self.version[language] = self.argDB[language.upper()+'_VERSION'] 83 if self.version[language] == 'Unknown': 84 self.version[language] = options.getCompilerVersion(language, self.setCompilers.getCompiler()) 85 except RuntimeError: 86 pass 87 try: 88 self.rejected[language] = [] 89 for bopt in bopts: 90 if not bopt == '' and self.getOptionalFlagsName(language) in self.framework.argDB: 91 # treat user supplied options as single option - as it could include options separated by spaces '-tp k8-64' 92 flags = [self.framework.argDB[self.getOptionalFlagsName(language)]] 93 elif bopt == '' and self.getCompilerFlagsName(language) in self.framework.argDB: 94 self.logPrint('Ignoring default options which were overridden using --'+self.getCompilerFlagsName(language)+ ' ' + self.framework.argDB[self.getCompilerFlagsName(language)]) 95 flags = [] 96 else: 97 flags = options.getCompilerFlags(language, self.setCompilers.getCompiler(), bopt) 98 for testFlag in flags: 99 if isinstance(testFlag,tuple): 100 testFlag = ' '.join(testFlag) 101 try: 102 self.framework.logPrint('Trying '+language+' compiler flag '+testFlag) 103 self.setCompilers.addCompilerFlag(testFlag) 104 except RuntimeError: 105 self.framework.logPrint('Rejected '+language+' compiler flag '+testFlag) 106 self.rejected[language].append(testFlag) 107 except RuntimeError: 108 pass 109 self.setCompilers.popLanguage() 110 return 111 112 def configure(self): 113 self.executeTest(self.configureCompilerFlags) 114 return 115