1f8833479SBarry Smithimport config.base 2f8833479SBarry Smith 3f8833479SBarry Smithimport os 4f8833479SBarry Smithimport re 5f8833479SBarry Smith 6f8833479SBarry Smithclass Configure(config.base.Configure): 7f8833479SBarry Smith def __init__(self, framework): 8f8833479SBarry Smith config.base.Configure.__init__(self, framework) 9f8833479SBarry Smith self.headerPrefix = 'PETSC' 10f8833479SBarry Smith self.substPrefix = 'PETSC' 11f8833479SBarry Smith self.defineAutoconfMacros() 12f8833479SBarry Smith return 13f8833479SBarry Smith 147c939e48SSatish Balay def __str2__(self): 157c939e48SSatish Balay desc = [] 16a0022257SSatish Balay desc.append('xxx=========================================================================xxx') 177c939e48SSatish Balay desc.append(' Configure stage complete. Now build PETSc libraries with:') 187c939e48SSatish Balay desc.append(' make PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' all') 19a0022257SSatish Balay desc.append('xxx=========================================================================xxx') 207c939e48SSatish Balay return '\n'.join(desc)+'\n' 21f8833479SBarry Smith 22f8833479SBarry Smith def setupHelp(self, help): 23f8833479SBarry Smith import nargs 24f8833479SBarry Smith help.addArgument('PETSc', '-prefix=<path>', nargs.Arg(None, '', 'Specifiy location to install PETSc (eg. /usr/local)')) 25eed94e11SSatish Balay help.addArgument('Windows','-with-windows-graphics=<bool>', nargs.ArgBool(None, 1,'Enable check for Windows Graphics')) 26569865ddSSatish Balay help.addArgument('PETSc', '-with-default-arch=<bool>', nargs.ArgBool(None, 1, 'Allow using the last configured arch without setting PETSC_ARCH')) 2757cb31baSSatish Balay help.addArgument('PETSc','-with-single-library=<bool>', nargs.ArgBool(None, 1,'Put all PETSc code into the single -lpetsc library')) 289e83c9eeSBarry Smith help.addArgument('PETSc', '-with-iphone=<no,yes>', nargs.ArgDownload(None, 0, 'Build an iPhone version of PETSc')) 29f8833479SBarry Smith return 30f8833479SBarry Smith 31f8833479SBarry Smith def setupDependencies(self, framework): 32f8833479SBarry Smith config.base.Configure.setupDependencies(self, framework) 33f8833479SBarry Smith self.setCompilers = framework.require('config.setCompilers', self) 34f8833479SBarry Smith self.arch = framework.require('PETSc.utilities.arch', self.setCompilers) 35f8833479SBarry Smith self.petscdir = framework.require('PETSc.utilities.petscdir', self.setCompilers) 36f8833479SBarry Smith self.languages = framework.require('PETSc.utilities.languages',self.setCompilers) 37f8833479SBarry Smith self.debugging = framework.require('PETSc.utilities.debugging',self.setCompilers) 388397fe1aSBarry Smith self.make = framework.require('PETSc.utilities.Make', self) 39a2b1cf82SBarry Smith self.CHUD = framework.require('PETSc.utilities.CHUD', self) 40f8833479SBarry Smith self.compilers = framework.require('config.compilers', self) 41f8833479SBarry Smith self.types = framework.require('config.types', self) 42f8833479SBarry Smith self.headers = framework.require('config.headers', self) 43f8833479SBarry Smith self.functions = framework.require('config.functions', self) 44f8833479SBarry Smith self.libraries = framework.require('config.libraries', self) 45f8833479SBarry Smith if os.path.isdir(os.path.join('config', 'PETSc')): 46f8833479SBarry Smith for d in ['utilities', 'packages']: 47f8833479SBarry Smith for utility in os.listdir(os.path.join('config', 'PETSc', d)): 48f8833479SBarry Smith (utilityName, ext) = os.path.splitext(utility) 49f8833479SBarry Smith if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__': 50f8833479SBarry Smith utilityObj = self.framework.require('PETSc.'+d+'.'+utilityName, self) 51f8833479SBarry Smith utilityObj.headerPrefix = self.headerPrefix 52f1ecedd2SMatthew Knepley utilityObj.archProvider = self.arch 53fdfda77fSMatthew Knepley utilityObj.languageProvider = self.languages 54fdfda77fSMatthew Knepley utilityObj.installDirProvider = self.petscdir 55f8833479SBarry Smith setattr(self, utilityName.lower(), utilityObj) 56e8793464SBarry Smith self.qd = framework.require('PETSc.packages.qd', self) 575389abc2SBarry Smith self.qd.archProvider = self.arch 585389abc2SBarry Smith self.qd.precisionProvider = self.scalartypes 595389abc2SBarry Smith self.qd.installDirProvider= self.petscdir 608cf378d1SBarry Smith 61d37554e4SMatthew G Knepley for package in config.packages.all: 62d37554e4SMatthew G Knepley if not package == 'PETSc': 63d37554e4SMatthew G Knepley packageObj = framework.require('config.packages.'+package, self) 64d37554e4SMatthew G Knepley packageObj.archProvider = self.arch 65d37554e4SMatthew G Knepley packageObj.languageProvider = self.languages 66d37554e4SMatthew G Knepley packageObj.installDirProvider = self.petscdir 67d37554e4SMatthew G Knepley setattr(self, package.lower(), packageObj) 68d37554e4SMatthew G Knepley # Force blaslapack to depend on scalarType so precision is set before BlasLapack is built 698cf378d1SBarry Smith framework.require('PETSc.utilities.scalarTypes', self.blaslapack) 70f8833479SBarry Smith self.blaslapack.precisionProvider = self.scalartypes 71f8833479SBarry Smith 72f8833479SBarry Smith self.compilers.headerPrefix = self.headerPrefix 73f8833479SBarry Smith self.types.headerPrefix = self.headerPrefix 74f8833479SBarry Smith self.headers.headerPrefix = self.headerPrefix 75f8833479SBarry Smith self.functions.headerPrefix = self.headerPrefix 76f8833479SBarry Smith self.libraries.headerPrefix = self.headerPrefix 77f8833479SBarry Smith self.blaslapack.headerPrefix = self.headerPrefix 78f8833479SBarry Smith self.mpi.headerPrefix = self.headerPrefix 79f8833479SBarry Smith headersC = map(lambda name: name+'.h', ['dos', 'endian', 'fcntl', 'float', 'io', 'limits', 'malloc', 'pwd', 'search', 'strings', 80f8833479SBarry Smith 'unistd', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource', 81b4bb646cSSatish Balay 'sys/systeminfo', 'sys/times', 'sys/utsname','string', 'stdlib','memory', 82f8833479SBarry Smith 'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types', 83b014e56cSJed Brown 'WindowsX', 'cxxabi','float','ieeefp','stdint','fenv']) 84f8833479SBarry Smith functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 'getpwuid', 85f8833479SBarry Smith 'gettimeofday', 'getwd', 'memalign', 'memmove', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize', 86a6d0e24fSJed Brown 'readlink', 'realpath', 'sigaction', 'signal', 'sigset', 'nanosleep', 'usleep', 'sleep', '_sleep', 'socket', 87a6d0e24fSJed Brown 'times', 'gethostbyname', 'uname','snprintf','_snprintf','_fullpath','lseek','_lseek','time','fork','stricmp', 88a6d0e24fSJed Brown 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror', 8964ffe704SBarry Smith '_intel_fast_memcpy','_intel_fast_memset'] 90f8833479SBarry Smith libraries1 = [(['socket', 'nsl'], 'socket'), (['fpe'], 'handle_sigfpes')] 91f8833479SBarry Smith self.headers.headers.extend(headersC) 92f8833479SBarry Smith self.functions.functions.extend(functions) 93f8833479SBarry Smith self.libraries.libraries.extend(libraries1) 94f8833479SBarry Smith return 95f8833479SBarry Smith 96f8833479SBarry Smith def defineAutoconfMacros(self): 97f8833479SBarry Smith self.hostMacro = 'dnl Version: 2.13\ndnl Variable: host_cpu\ndnl Variable: host_vendor\ndnl Variable: host_os\nAC_CANONICAL_HOST' 98f8833479SBarry Smith return 99f8833479SBarry Smith 100f8833479SBarry Smith def Dump(self): 101f8833479SBarry Smith ''' Actually put the values into the configuration files ''' 102f8833479SBarry Smith # eventually everything between -- should be gone 103f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 104f8833479SBarry Smith 105f8833479SBarry Smith # Sometimes we need C compiler, even if built with C++ 106f8833479SBarry Smith self.setCompilers.pushLanguage('C') 107f8833479SBarry Smith self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 108f8833479SBarry Smith self.setCompilers.popLanguage() 109f8833479SBarry Smith 110f8833479SBarry Smith # C preprocessor values 111a2b1cf82SBarry Smith self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS+self.CHUD.CPPFLAGS) 112f8833479SBarry Smith 113f8833479SBarry Smith # compiler values 114f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 115f8833479SBarry Smith self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 116f8833479SBarry Smith self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 117f8833479SBarry Smith self.setCompilers.popLanguage() 118f8833479SBarry Smith # .o or .obj 119f8833479SBarry Smith self.addMakeMacro('CC_SUFFIX','o') 120f8833479SBarry Smith 121f8833479SBarry Smith # executable linker values 122f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 123f8833479SBarry Smith pcc_linker = self.setCompilers.getLinker() 124f8833479SBarry Smith self.addMakeMacro('PCC_LINKER',pcc_linker) 125c84a332bSSatish Balay self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 126f8833479SBarry Smith self.setCompilers.popLanguage() 127f8833479SBarry Smith # '' for Unix, .exe for Windows 128f8833479SBarry Smith self.addMakeMacro('CC_LINKER_SUFFIX','') 129a2b1cf82SBarry Smith self.addMakeMacro('PCC_LINKER_LIBS',self.libraries.toStringNoDupes(self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS) 130f8833479SBarry Smith 131f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 132f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 133f8833479SBarry Smith # need FPPFLAGS in config/setCompilers 134f8833479SBarry Smith self.addDefine('HAVE_FORTRAN','1') 135f8833479SBarry Smith self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS) 136f8833479SBarry Smith 137f8833479SBarry Smith # compiler values 138f8833479SBarry Smith self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 139f8833479SBarry Smith self.setCompilers.popLanguage() 140f8833479SBarry Smith # .o or .obj 141f8833479SBarry Smith self.addMakeMacro('FC_SUFFIX','o') 142f8833479SBarry Smith 143f8833479SBarry Smith # executable linker values 144f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 145f8833479SBarry Smith # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker 146f8833479SBarry Smith fc_linker = self.setCompilers.getLinker() 147f8833479SBarry Smith if config.setCompilers.Configure.isNAG(fc_linker): 148f8833479SBarry Smith self.addMakeMacro('FC_LINKER',pcc_linker) 149f8833479SBarry Smith else: 150f8833479SBarry Smith self.addMakeMacro('FC_LINKER',fc_linker) 1516d53d35eSSatish Balay self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 1523feacd00SBarry Smith # apple requires this shared library linker flag on SOME versions of the os 1533feacd00SBarry Smith if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 1543feacd00SBarry Smith self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 155bb82cf9cSSatish Balay self.setCompilers.popLanguage() 1565d631499SMatthew Knepley 1575d631499SMatthew Knepley # F90 Modules 1585d631499SMatthew Knepley if self.setCompilers.fortranModuleIncludeFlag: 1595d631499SMatthew Knepley self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag) 1606ddd6694SSatish Balay else: # for non-f90 compilers like g77 1616ddd6694SSatish Balay self.addMakeMacro('FC_MODULE_FLAG', '-I') 162a324c51cSMatthew G Knepley if self.setCompilers.fortranModuleIncludeFlag: 163a324c51cSMatthew G Knepley self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag) 164f8833479SBarry Smith else: 165f8833479SBarry Smith self.addMakeMacro('FC','') 166f8833479SBarry Smith 167f8833479SBarry Smith # shared library linker values 168f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 169f8833479SBarry Smith # need to fix BuildSystem to collect these separately 170f8833479SBarry Smith self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 17170db8aa6SSatish Balay self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 172f8833479SBarry Smith self.setCompilers.popLanguage() 173f8833479SBarry Smith # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 174f8833479SBarry Smith # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 175f8833479SBarry Smith if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 176f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', '') 17746bc77b6SBarry Smith self.addDefine('SLSUFFIX','""') 178f8833479SBarry Smith else: 179f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 18046bc77b6SBarry Smith self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"') 181bb82cf9cSSatish Balay 182bb82cf9cSSatish Balay #SL_LINKER_LIBS is currently same as PCC_LINKER_LIBS - so simplify 183bb82cf9cSSatish Balay self.addMakeMacro('SL_LINKER_LIBS','${PCC_LINKER_LIBS}') 184bb82cf9cSSatish Balay #self.addMakeMacro('SL_LINKER_LIBS',self.libraries.toStringNoDupes(self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))) 185bb82cf9cSSatish Balay 186f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 187f8833479SBarry Smith 188f8833479SBarry Smith # CONLY or CPP. We should change the PETSc makefiles to do this better 189f8833479SBarry Smith if self.languages.clanguage == 'C': lang = 'CONLY' 190f8833479SBarry Smith else: lang = 'CXXONLY' 191f8833479SBarry Smith self.addMakeMacro('PETSC_LANGUAGE',lang) 192f8833479SBarry Smith 193f8833479SBarry Smith # real or complex 194f8833479SBarry Smith self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 195f8833479SBarry Smith # double or float 196f8833479SBarry Smith self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 197f8833479SBarry Smith 198f8833479SBarry Smith if self.framework.argDB['with-batch']: 199f8833479SBarry Smith self.addMakeMacro('PETSC_WITH_BATCH','1') 200f8833479SBarry Smith 201f8833479SBarry Smith # Test for compiler-specific macros that need to be defined. 202f8833479SBarry Smith if self.setCompilers.isCray('CC'): 203f8833479SBarry Smith self.addDefine('HAVE_CRAYC','1') 204f8833479SBarry Smith 205f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 206f8833479SBarry Smith if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket'): 207f8833479SBarry Smith self.addDefine('USE_SOCKET_VIEWER','1') 208f8833479SBarry Smith 209f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 210f8833479SBarry Smith # print include and lib for external packages 211f8833479SBarry Smith self.framework.packages.reverse() 212996b3231SBarry Smith includes = [] 213996b3231SBarry Smith libs = [] 214f8833479SBarry Smith for i in self.framework.packages: 215898a086dSBarry Smith if i.useddirectly: 216898a086dSBarry Smith self.addDefine('HAVE_'+i.PACKAGE, 1) # ONLY list package if it is used directly by PETSc (and not only by another package) 217f8833479SBarry Smith if not isinstance(i.lib, list): 218f8833479SBarry Smith i.lib = [i.lib] 219ac9e4c42SSatish Balay libs.extend(i.lib) 22034cdeb2aSSatish Balay self.addMakeMacro(i.PACKAGE+'_LIB', self.libraries.toStringNoDupes(i.lib)) 221f8833479SBarry Smith if hasattr(i,'include'): 222f8833479SBarry Smith if not isinstance(i.include,list): 223f8833479SBarry Smith i.include = [i.include] 224ac9e4c42SSatish Balay includes.extend(i.include) 22534cdeb2aSSatish Balay self.addMakeMacro(i.PACKAGE+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 226ac9e4c42SSatish Balay self.addMakeMacro('PACKAGES_LIBS',self.libraries.toStringNoDupes(libs+self.libraries.math)) 2272a4161d9SMatthew G Knepley self.PACKAGES_LIBS = self.libraries.toStringNoDupes(libs+self.libraries.math) 228ac9e4c42SSatish Balay self.addMakeMacro('PACKAGES_INCLUDES',self.headers.toStringNoDupes(includes)) 2292a4161d9SMatthew G Knepley self.PACKAGES_INCLUDES = self.headers.toStringNoDupes(includes) 230cbd5cc15SBarry Smith if hasattr(self.compilers, 'FC'): 231208c3fd5SBarry Smith if self.compilers.fortranIsF90: 23208784ffaSBarry Smith self.addMakeMacro('PACKAGES_MODULES_INCLUDES',self.headers.toStringModulesNoDupes(includes)) 233f8833479SBarry Smith 2341b1e03dfSSatish Balay self.addMakeMacro('DESTDIR',self.installdir) 235c6f99f23SBarry Smith self.addDefine('LIB_DIR','"'+os.path.join(self.installdir,'lib')+'"') 236f8833479SBarry Smith 2370f3b21c2SBarry Smith if self.framework.argDB['with-single-library']: 2380f3b21c2SBarry Smith # overrides the values set in conf/variables 2390f3b21c2SBarry Smith self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 2400f3b21c2SBarry Smith self.addMakeMacro('PETSC_SYS_LIB_BASIC','-lpetsc') 2410f3b21c2SBarry Smith self.addMakeMacro('PETSC_VEC_LIB_BASIC','-lpetsc') 2420f3b21c2SBarry Smith self.addMakeMacro('PETSC_MAT_LIB_BASIC','-lpetsc') 2430f3b21c2SBarry Smith self.addMakeMacro('PETSC_DM_LIB_BASIC','-lpetsc') 2440f3b21c2SBarry Smith self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 2450f3b21c2SBarry Smith self.addMakeMacro('PETSC_SNES_LIB_BASIC','-lpetsc') 2460f3b21c2SBarry Smith self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 2470f3b21c2SBarry Smith self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 2480f3b21c2SBarry Smith self.addMakeMacro('PETSC_CONTRIB_BASIC','-lpetsc') 24957cb31baSSatish Balay self.addMakeMacro('SHLIBS','libpetsc') 250bb84e0fdSBarry Smith self.addDefine('USE_SINGLE_LIBRARY', '1') 2510f3b21c2SBarry Smith 252f8833479SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 253f8833479SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 254f8833479SBarry Smith 255f8833479SBarry Smith # add a makefile entry for configure options 256f8833479SBarry Smith self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 257f8833479SBarry Smith return 258f8833479SBarry Smith 259f8833479SBarry Smith def dumpConfigInfo(self): 260f8833479SBarry Smith import time 261f8833479SBarry Smith fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 262f8833479SBarry Smith fd.write('static const char *petscconfigureruntime = "'+time.ctime(time.time())+'";\n') 263f8833479SBarry Smith fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 264f8833479SBarry Smith fd.close() 265f8833479SBarry Smith return 266f8833479SBarry Smith 2672a4161d9SMatthew G Knepley def dumpMachineInfo(self): 2682a4161d9SMatthew G Knepley import platform 2692a4161d9SMatthew G Knepley import time 27040373944SSatish Balay import script 2712a4161d9SMatthew G Knepley fd = file(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w') 2722a4161d9SMatthew G Knepley fd.write('static const char *petscmachineinfo = \"\\n\"\n') 2732a4161d9SMatthew G Knepley fd.write('\"-----------------------------------------\\n\"\n') 2742a4161d9SMatthew G Knepley fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (time.ctime(time.time()), platform.node())) 27560acdfe7SSatish Balay fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform())) 27660acdfe7SSatish Balay fd.write('\"Using PETSc directory: %s\\n\"\n' % (self.petscdir.dir)) 27760acdfe7SSatish Balay fd.write('\"Using PETSc arch: %s\\n\"\n' % (self.arch.arch)) 278cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 2792a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerinfo = \"\\n\"\n') 2802a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 28160acdfe7SSatish Balay fd.write('\"Using C compiler: %s %s ${COPTFLAGS} ${CFLAGS}\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags())) 2822a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 2838782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 2842a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 28560acdfe7SSatish Balay fd.write('\"Using Fortran compiler: %s %s ${FOPTFLAGS} ${FFLAGS} %s\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags(), self.setCompilers.CPPFLAGS)) 2862a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 287cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 2882a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n') 28960acdfe7SSatish Balay fd.write('\"Using include paths: %s %s %s\\n\"\n' % ('-I'+os.path.join(self.petscdir.dir, self.arch.arch, 'include'), '-I'+os.path.join(self.petscdir.dir, 'include'), self.PACKAGES_INCLUDES)) 290cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 2912a4161d9SMatthew G Knepley fd.write('static const char *petsclinkerinfo = \"\\n\"\n') 2922a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 29360acdfe7SSatish Balay fd.write('\"Using C linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 2942a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 2958782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 2962a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 29760acdfe7SSatish Balay fd.write('\"Using Fortran linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 2982a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 29960acdfe7SSatish Balay fd.write('\"Using libraries: %s%s -L%s %s %s %s\\n\"\n' % (self.setCompilers.CSharedLinkerFlag, os.path.join(self.petscdir.dir, self.arch.arch, 'lib'), os.path.join(self.petscdir.dir, self.arch.arch, 'lib'), '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys', self.PACKAGES_LIBS, self.libraries.toStringNoDupes(self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS)) 300cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3012a4161d9SMatthew G Knepley fd.close() 3022a4161d9SMatthew G Knepley return 303b2843cf1SBarry Smith 304511a6afcSJed Brown def dumpCMakeConfig(self): 305511a6afcSJed Brown ''' 30634ed7027SBarry Smith Writes configuration-specific values to ${PETSC_ARCH}/conf/PETScConfig.cmake. 307511a6afcSJed Brown This file is private to PETSc and should not be included by third parties 308511a6afcSJed Brown (a suitable file can be produced later by CMake, but this is not it). 309511a6afcSJed Brown ''' 310511a6afcSJed Brown def cmakeset(fd,key,val=True): 311511a6afcSJed Brown if val == True: val = 'YES' 312511a6afcSJed Brown if val == False: val = 'NO' 313511a6afcSJed Brown fd.write('set (' + key + ' ' + val + ')\n') 314511a6afcSJed Brown def ensurelist(a): 315826d9344SJed Brown if isinstance(a,list): 316826d9344SJed Brown return a 317826d9344SJed Brown else: 318826d9344SJed Brown return [a] 319511a6afcSJed Brown def libpath(lib): 320511a6afcSJed Brown 'Returns a search path if that is what this item provides, else "" which will be cleaned out later' 321511a6afcSJed Brown if lib.startswith('-L'): return lib[2:] 322511a6afcSJed Brown if lib.startswith('-R'): return lib[2:] 323511a6afcSJed Brown if lib.startswith('-Wl,-rpath,'): 324511a6afcSJed Brown # This case occurs when an external package needs a specific system library that is normally provided by the compiler. 325511a6afcSJed Brown # In other words, the -L path is builtin to the wrapper or compiler, here we provide it so that CMake can locate the 326511a6afcSJed Brown # corresponding library. 327511a6afcSJed Brown return lib[len('-Wl,-rpath,'):] 328511a6afcSJed Brown if lib.startswith('-'): return '' 329511a6afcSJed Brown return os.path.dirname(lib) 330511a6afcSJed Brown def cleanlib(lib): 331511a6afcSJed Brown 'Returns a library name if that is what this item provides, else "" which will be cleaned out later' 332511a6afcSJed Brown if lib.startswith('-l'): return lib[2:] 333511a6afcSJed Brown if lib.startswith('-Wl') or lib.startswith('-L'): return '' 334511a6afcSJed Brown lib = os.path.splitext(os.path.basename(lib))[0] 335511a6afcSJed Brown if lib.startswith('lib'): return lib[3:] 336511a6afcSJed Brown return lib 337511a6afcSJed Brown def nub(lst): 338511a6afcSJed Brown unique = [] 339511a6afcSJed Brown for elem in lst: 340511a6afcSJed Brown if elem not in unique and elem != '': 341511a6afcSJed Brown unique.append(elem) 342511a6afcSJed Brown return unique 343511a6afcSJed Brown def cmakeexpand(varname): 344511a6afcSJed Brown return r'"${' + varname + r'}"' 345511a6afcSJed Brown def uniqextend(list,new): 346511a6afcSJed Brown for x in ensurelist(new): 347511a6afcSJed Brown if x not in list: 348511a6afcSJed Brown list.append(x) 349511a6afcSJed Brown def notstandardinclude(path): 350511a6afcSJed Brown return path not in '/usr/include /usr/local/include'.split() 351511a6afcSJed Brown def writeMacroDefinitions(fd): 352511a6afcSJed Brown if self.mpi.usingMPIUni: 353511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_MPIUNI') 354511a6afcSJed Brown for pkg in self.framework.packages: 355511a6afcSJed Brown if pkg.useddirectly: 356511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_' + pkg.PACKAGE) 357511a6afcSJed Brown for name,val in self.functions.defines.items(): 358511a6afcSJed Brown cmakeset(fd,'PETSC_'+name,val) 359511a6afcSJed Brown for dct in [self.defines, self.libraryoptions.defines]: 360511a6afcSJed Brown for k,v in dct.items(): 361511a6afcSJed Brown if k.startswith('USE_'): 362511a6afcSJed Brown cmakeset(fd,'PETSC_' + k, v) 363511a6afcSJed Brown cmakeset(fd,'PETSC_USE_COMPLEX', self.scalartypes.scalartype == 'complex') 364511a6afcSJed Brown cmakeset(fd,'PETSC_USE_SCALAR_' + self.scalartypes.precision.upper()) 365511a6afcSJed Brown cmakeset(fd,'PETSC_CLANGUAGE_'+self.languages.clanguage) 366511a6afcSJed Brown if hasattr(self.compilers, 'FC'): 367511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_FORTRAN') 368511a6afcSJed Brown if self.compilers.fortranIsF90: 369511a6afcSJed Brown cmakeset(fd,'PETSC_USING_F90') 370511a6afcSJed Brown if self.sharedlibraries.useShared: 371511a6afcSJed Brown cmakeset(fd,'BUILD_SHARED_LIBS') 372511a6afcSJed Brown def writeBuildFlags(fd): 373511a6afcSJed Brown lib_paths = [] 374511a6afcSJed Brown lib_libs = [] 375511a6afcSJed Brown includes = [] 376511a6afcSJed Brown libvars = [] 377511a6afcSJed Brown for pkg in self.framework.packages: 378511a6afcSJed Brown libs = ensurelist(pkg.lib) 379511a6afcSJed Brown lib_paths.extend(map(libpath,libs)) 380511a6afcSJed Brown lib_libs.extend(map(cleanlib,libs)) 381511a6afcSJed Brown uniqextend(includes,pkg.include) 38290dd2285SSatish Balay if self.libraries.math: lib_libs.extend(map(cleanlib,self.libraries.math)) 38390dd2285SSatish Balay if self.libraries.rt: lib_libs.extend(map(cleanlib,self.libraries.rt)) 384511a6afcSJed Brown for libname in nub(lib_libs): 385511a6afcSJed Brown libvar = 'PETSC_' + libname.upper() + '_LIB' 3864c0032a9SSatish Balay addpath = '' 3874c0032a9SSatish Balay for lpath in nub(lib_paths): 3884c0032a9SSatish Balay addpath += '"' + str(lpath) + '" ' 3894c0032a9SSatish Balay fd.write('find_library (' + libvar + ' ' + libname + ' HINTS ' + addpath + ')\n') 390511a6afcSJed Brown libvars.append(libvar) 391511a6afcSJed Brown fd.write('mark_as_advanced (' + ' '.join(libvars) + ')\n') 392511a6afcSJed Brown fd.write('set (PETSC_PACKAGE_LIBS ' + ' '.join(map(cmakeexpand,libvars)) + ')\n') 393511a6afcSJed Brown fd.write('set (PETSC_PACKAGE_INCLUDES ' + ' '.join(map(lambda i: '"'+i+'"',filter(notstandardinclude,includes))) + ')\n') 394511a6afcSJed Brown fd = open(os.path.join(self.arch.arch,'conf','PETScConfig.cmake'), 'w') 395511a6afcSJed Brown writeMacroDefinitions(fd) 396511a6afcSJed Brown writeBuildFlags(fd) 397511a6afcSJed Brown fd.close() 398511a6afcSJed Brown return 399511a6afcSJed Brown 4008b0282a9SJed Brown def dumpCMakeLists(self): 4018b0282a9SJed Brown import sys 4028b0282a9SJed Brown if sys.version_info >= (2,5): 4038b0282a9SJed Brown sys.path.insert(0,os.path.join(self.petscdir.dir,'bin','maint')) 4048b0282a9SJed Brown import cmakegen 4058b0282a9SJed Brown del sys.path[0] 4068b0282a9SJed Brown try: 4078b0282a9SJed Brown cmakegen.main(self.petscdir.dir) 4088b0282a9SJed Brown except (OSError), e: 4098b0282a9SJed Brown self.framework.logPrint('Generating CMakeLists.txt failed:\n' + str(e)) 4108b0282a9SJed Brown 4118b0282a9SJed Brown def cmakeBoot(self): 4128b0282a9SJed Brown import sys 413*0b7111d2SJed Brown if sys.version_info >= (2,5) and hasattr(self.cmake,'cmake'): 4148b0282a9SJed Brown sys.path.insert(0,os.path.join(self.petscdir.dir,'bin','maint')) 4158b0282a9SJed Brown import cmakeboot 4168b0282a9SJed Brown del sys.path[0] 4178b0282a9SJed Brown try: 4188b0282a9SJed Brown cmakeboot.main(petscdir=self.petscdir.dir,petscarch=self.arch.arch,argDB=self.argDB,framework=self.framework,logPrint=self.framework.logPrint) 4198b0282a9SJed Brown except (OSError), e: 4208b0282a9SJed Brown self.framework.logPrint('Booting CMake in PETSC_ARCH failed:\n' + str(e)) 4218b0282a9SJed Brown 422b2843cf1SBarry Smith def configurePrefetch(self): 423b2843cf1SBarry Smith '''Sees if there are any prefetch functions supported''' 4243649974fSBarry Smith if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-iphone'] or self.framework.argDB['with-cuda']: 42593f78423SSatish Balay self.addDefine('Prefetch(a,b,c)', ' ') 42693f78423SSatish Balay return 427ec284106SBarry Smith self.pushLanguage(self.languages.clanguage) 42853ee7cf3SJed Brown if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,(int)0);\n'): 42947980e60SBarry Smith self.addDefine('HAVE_XMMINTRIN_H', 1) 43053ee7cf3SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(int)(c))') 43153ee7cf3SJed Brown elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,(int)0);\n'): 4321d9cd9bfSBarry Smith self.addDefine('HAVE_XMMINTRIN_H', 1) 43353ee7cf3SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(int)(c))') 4341c3996cdSBarry Smith elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 43553ee7cf3SJed Brown self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))') 436b2843cf1SBarry Smith else: 437b2843cf1SBarry Smith self.addDefine('Prefetch(a,b,c)', ' ') 4387d490b44SBarry Smith self.popLanguage() 439b2843cf1SBarry Smith 4402400fdedSBarry Smith def configureUnused(self): 4412400fdedSBarry Smith '''Sees if __attribute((unused)) is supported''' 4422400fdedSBarry Smith if self.framework.argDB['with-iphone'] or self.framework.argDB['with-cuda']: 4432400fdedSBarry Smith self.addDefine('UNUSED', ' ') 4442400fdedSBarry Smith return 4452400fdedSBarry Smith self.pushLanguage(self.languages.clanguage) 4462400fdedSBarry Smith if self.checkLink('__attribute((unused)) static int myfunc(void){ return 1;}', 'int i = myfunc();\n'): 4472400fdedSBarry Smith self.addDefine('UNUSED', '__attribute((unused))') 4482400fdedSBarry Smith else: 4492400fdedSBarry Smith self.addDefine('UNUSED', ' ') 4502400fdedSBarry Smith self.popLanguage() 4512400fdedSBarry Smith 4529800092aSJed Brown def configureExpect(self): 4539800092aSJed Brown '''Sees if the __builtin_expect directive is supported''' 4549800092aSJed Brown self.pushLanguage(self.languages.clanguage) 4559800092aSJed Brown if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'): 4569800092aSJed Brown self.addDefine('HAVE_BUILTIN_EXPECT', 1) 4579800092aSJed Brown self.popLanguage() 4589800092aSJed Brown 459753ebd1dSJed Brown def configureIntptrt(self): 460753ebd1dSJed Brown '''Determine what to use for uintptr_t''' 461753ebd1dSJed Brown def staticAssertSizeMatchesVoidStar(inc,typename): 462753ebd1dSJed Brown # The declaration is an error if either array size is negative. 463753ebd1dSJed Brown # It should be okay to use an int that is too large, but it would be very unlikely for this to be the case 464753ebd1dSJed Brown return self.checkCompile(inc, '#define SZ (sizeof(void*)-sizeof(%s))\nint type_is_too_large[SZ],type_is_too_small[-SZ];'%typename) 465753ebd1dSJed Brown self.pushLanguage(self.languages.clanguage) 466753ebd1dSJed Brown if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'): 467753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'uintptr_t') 468753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long long'): 469753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned long long') 470753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'): 471753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'size_t') 4722d1b7972SSatish Balay elif staticAssertSizeMatchesVoidStar('','unsigned'): 473753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned') 474753ebd1dSJed Brown self.popLanguage() 475753ebd1dSJed Brown 476f8833479SBarry Smith def configureInline(self): 477f8833479SBarry Smith '''Get a generic inline keyword, depending on the language''' 478f8833479SBarry Smith if self.languages.clanguage == 'C': 479f8833479SBarry Smith self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword) 480f8833479SBarry Smith self.addDefine('RESTRICT', self.compilers.cRestrict) 481f8833479SBarry Smith elif self.languages.clanguage == 'Cxx': 482f8833479SBarry Smith self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword) 483f8833479SBarry Smith self.addDefine('RESTRICT', self.compilers.cxxRestrict) 484f8833479SBarry Smith return 485f8833479SBarry Smith 486f8833479SBarry Smith def configureSolaris(self): 487f8833479SBarry Smith '''Solaris specific stuff''' 488f8833479SBarry Smith if self.arch.hostOsBase.startswith('solaris'): 489f8833479SBarry Smith if os.path.isdir(os.path.join('/usr','ucblib')): 490f8833479SBarry Smith try: 491f8833479SBarry Smith flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 492f8833479SBarry Smith except AttributeError: 493f8833479SBarry Smith flag = None 494f8833479SBarry Smith if flag is None: 495f8833479SBarry Smith self.compilers.LIBS += ' -L/usr/ucblib' 496f8833479SBarry Smith else: 497f8833479SBarry Smith self.compilers.LIBS += ' '+flag+'/usr/ucblib' 498f8833479SBarry Smith return 499f8833479SBarry Smith 500f8833479SBarry Smith def configureLinux(self): 501f8833479SBarry Smith '''Linux specific stuff''' 502f8833479SBarry Smith if self.arch.hostOsBase == 'linux': 503f8833479SBarry Smith self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 504f8833479SBarry Smith return 505f8833479SBarry Smith 506f8833479SBarry Smith def configureWin32(self): 507f8833479SBarry Smith '''Win32 non-cygwin specific stuff''' 508f8833479SBarry Smith kernel32=0 509f8833479SBarry Smith if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 510f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 511f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 512f8833479SBarry Smith kernel32=1 513f8833479SBarry Smith elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 514f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 515f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 516f8833479SBarry Smith kernel32=1 517f8833479SBarry Smith if kernel32: 518eed94e11SSatish Balay if self.framework.argDB['with-windows-graphics']: 519eed94e11SSatish Balay self.addDefine('USE_WINDOWS_GRAPHICS',1) 520f8833479SBarry Smith if self.checkLink('#include <Windows.h>','LoadLibrary(0)'): 521f8833479SBarry Smith self.addDefine('HAVE_LOADLIBRARY',1) 522b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'): 523b50f6d9eSLisandro Dalcin self.addDefine('HAVE_GETPROCADDRESS',1) 524b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','FreeLibrary(0)'): 525b50f6d9eSLisandro Dalcin self.addDefine('HAVE_FREELIBRARY',1) 526a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','GetLastError()'): 527a21658a3SLisandro Dalcin self.addDefine('HAVE_GETLASTERROR',1) 528a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','SetLastError(0)'): 529a21658a3SLisandro Dalcin self.addDefine('HAVE_SETLASTERROR',1) 530f8833479SBarry Smith if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'): 531f8833479SBarry Smith self.addDefine('USE_NT_TIME',1) 532f8833479SBarry Smith if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 533f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 534f8833479SBarry Smith elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 535f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 536f8833479SBarry Smith 537f8833479SBarry Smith if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'): 538f8833479SBarry Smith self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);') 539f8833479SBarry Smith if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'): 540f8833479SBarry Smith self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);') 541f8833479SBarry Smith 542f8833479SBarry Smith self.types.check('int32_t', 'int') 543f8833479SBarry Smith if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 544f8833479SBarry Smith self.addTypedef('int', 'uid_t') 545f8833479SBarry Smith self.addTypedef('int', 'gid_t') 546f8833479SBarry Smith if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 547f8833479SBarry Smith self.framework.addDefine('R_OK', '04') 548f8833479SBarry Smith self.framework.addDefine('W_OK', '02') 549f8833479SBarry Smith self.framework.addDefine('X_OK', '01') 550f8833479SBarry Smith if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 551f8833479SBarry Smith self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 552f8833479SBarry Smith self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 553f8833479SBarry Smith if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 554f8833479SBarry Smith self.addDefine('HAVE_LARGE_INTEGER_U',1) 555f8833479SBarry Smith 556f8833479SBarry Smith # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 557f8833479SBarry Smith if self.checkCompile('#include <Windows.h>\n',''): 558f8833479SBarry Smith self.addDefine('HAVE_O_BINARY',1) 559f8833479SBarry Smith 560f8833479SBarry Smith if self.compilers.CC.find('win32fe') >= 0: 561f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\';\'') 562f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'\\\\\'') 563f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 564f8833479SBarry Smith self.addDefine('CANNOT_START_DEBUGGER',1) 565f8833479SBarry Smith else: 566f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\':\'') 567f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 568f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'/\'') 569f8833479SBarry Smith return 570f8833479SBarry Smith 571f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 572569865ddSSatish Balay def configureDefaultArch(self): 573569865ddSSatish Balay conffile = os.path.join('conf', 'petscvariables') 574569865ddSSatish Balay if self.framework.argDB['with-default-arch']: 575569865ddSSatish Balay fd = file(conffile, 'w') 576569865ddSSatish Balay fd.write('PETSC_ARCH='+self.arch.arch+'\n') 577da93591fSBarry Smith fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 578569865ddSSatish Balay fd.write('include ${PETSC_DIR}/${PETSC_ARCH}/conf/petscvariables\n') 579569865ddSSatish Balay fd.close() 580569865ddSSatish Balay self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 581569865ddSSatish Balay elif os.path.isfile(conffile): 582569865ddSSatish Balay try: 583569865ddSSatish Balay os.unlink(conffile) 584569865ddSSatish Balay except: 585569865ddSSatish Balay raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 586569865ddSSatish Balay return 587569865ddSSatish Balay 588569865ddSSatish Balay#----------------------------------------------------------------------------------------------------- 589f8833479SBarry Smith def configureScript(self): 590f8833479SBarry Smith '''Output a script in the conf directory which will reproduce the configuration''' 591f8833479SBarry Smith import nargs 592495bf1a9SSatish Balay import sys 593495bf1a9SSatish Balay scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py') 594f8833479SBarry Smith args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 595f8833479SBarry Smith if 'configModules' in args: 5961063a081SSatish Balay if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 597f8833479SBarry Smith del args['configModules'] 598f8833479SBarry Smith if 'optionsModule' in args: 599c1486898SMatthew Knepley if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions': 600f8833479SBarry Smith del args['optionsModule'] 601f8833479SBarry Smith if not 'PETSC_ARCH' in args: 6021063a081SSatish Balay args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 603f8833479SBarry Smith f = file(scriptName, 'w') 604495bf1a9SSatish Balay f.write('#!'+sys.executable+'\n') 605f8833479SBarry Smith f.write('if __name__ == \'__main__\':\n') 606f8833479SBarry Smith f.write(' import sys\n') 6077561c02cSSatish Balay f.write(' import os\n') 6087561c02cSSatish Balay f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 609f8833479SBarry Smith f.write(' import configure\n') 6101063a081SSatish Balay # pretty print repr(args.values()) 6111063a081SSatish Balay f.write(' configure_options = [\n') 6121063a081SSatish Balay for itm in args.values(): 6131063a081SSatish Balay f.write(' \''+str(itm)+'\',\n') 6141063a081SSatish Balay f.write(' ]\n') 615f8833479SBarry Smith f.write(' configure.petsc_configure(configure_options)\n') 616f8833479SBarry Smith f.close() 617f8833479SBarry Smith try: 618f8833479SBarry Smith os.chmod(scriptName, 0775) 619f8833479SBarry Smith except OSError, e: 620f8833479SBarry Smith self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 621f8833479SBarry Smith self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 622f8833479SBarry Smith return 623f8833479SBarry Smith 624f8833479SBarry Smith def configureInstall(self): 625f8833479SBarry Smith '''Setup the directories for installation''' 626f8833479SBarry Smith if self.framework.argDB['prefix']: 627f8833479SBarry Smith self.installdir = self.framework.argDB['prefix'] 628824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\ 629824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 630315b77e6SSatish Balay '-@echo "========================================="']) 631f8833479SBarry Smith else: 632b559b537SSatish Balay self.installdir = os.path.join(self.petscdir.dir,self.arch.arch) 633824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\ 634824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\ 635315b77e6SSatish Balay '-@echo "========================================="']) 636f8833479SBarry Smith return 637f8833479SBarry Smith 638f8833479SBarry Smith def configureGCOV(self): 639f8833479SBarry Smith if self.framework.argDB['with-gcov']: 640f8833479SBarry Smith self.addDefine('USE_GCOV','1') 641f8833479SBarry Smith return 642f8833479SBarry Smith 643f8833479SBarry Smith def configureFortranFlush(self): 644f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 645f8833479SBarry Smith for baseName in ['flush','flush_']: 646f8833479SBarry Smith if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1): 647f8833479SBarry Smith self.addDefine('HAVE_'+baseName.upper(), 1) 648f8833479SBarry Smith return 649f8833479SBarry Smith 650f8833479SBarry Smith 651f8833479SBarry Smith def configure(self): 652f8833479SBarry Smith if not os.path.samefile(self.petscdir.dir, os.getcwd()): 653f8833479SBarry Smith raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 654550489e3SMatthew G Knepley if self.framework.argDB['prefix'] and os.path.isdir(self.framework.argDB['prefix']) and os.path.samefile(self.framework.argDB['prefix'],self.petscdir.dir): 6553552d8fbSSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 656f16c1317SJed Brown self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 657f16c1317SJed Brown self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 658f16c1317SJed Brown self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables') 659f16c1317SJed Brown self.framework.makeRuleHeader = os.path.join(self.arch.arch,'conf','petscrules') 660f8833479SBarry Smith if self.libraries.math is None: 661f8833479SBarry Smith raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 662f8833479SBarry Smith if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 663f8833479SBarry Smith raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 664f8833479SBarry Smith self.executeTest(self.configureInline) 665b2843cf1SBarry Smith self.executeTest(self.configurePrefetch) 6662400fdedSBarry Smith self.executeTest(self.configureUnused) 6679800092aSJed Brown self.executeTest(self.configureExpect); 668753ebd1dSJed Brown self.executeTest(self.configureIntptrt); 669f8833479SBarry Smith self.executeTest(self.configureSolaris) 670f8833479SBarry Smith self.executeTest(self.configureLinux) 671f8833479SBarry Smith self.executeTest(self.configureWin32) 672569865ddSSatish Balay self.executeTest(self.configureDefaultArch) 673f8833479SBarry Smith self.executeTest(self.configureScript) 674f8833479SBarry Smith self.executeTest(self.configureInstall) 675f8833479SBarry Smith self.executeTest(self.configureGCOV) 676f8833479SBarry Smith self.executeTest(self.configureFortranFlush) 677f8833479SBarry Smith # dummy rules, always needed except for remote builds 678f8833479SBarry Smith self.addMakeRule('remote','') 679f8833479SBarry Smith self.addMakeRule('remoteclean','') 680f8833479SBarry Smith 681f8833479SBarry Smith self.Dump() 682f8833479SBarry Smith self.dumpConfigInfo() 6832a4161d9SMatthew G Knepley self.dumpMachineInfo() 684511a6afcSJed Brown self.dumpCMakeConfig() 6858b0282a9SJed Brown self.dumpCMakeLists() 6868b0282a9SJed Brown self.cmakeBoot() 687f8833479SBarry Smith self.framework.log.write('================================================================================\n') 688f8833479SBarry Smith self.logClear() 689f8833479SBarry Smith return 690