1f8833479SBarry Smithimport config.base 2f8833479SBarry Smith 3f8833479SBarry Smithimport os 4f8833479SBarry Smithimport re 5f8833479SBarry Smith 68bec23c5SJed Brown# The sorted() builtin is not available with python-2.3 78bec23c5SJed Browntry: sorted 88bec23c5SJed Brownexcept NameError: 98bec23c5SJed Brown def sorted(lst): 108bec23c5SJed Brown lst.sort() 118bec23c5SJed Brown return lst 128bec23c5SJed Brown 13f8833479SBarry Smithclass Configure(config.base.Configure): 14f8833479SBarry Smith def __init__(self, framework): 15f8833479SBarry Smith config.base.Configure.__init__(self, framework) 16f8833479SBarry Smith self.headerPrefix = 'PETSC' 17f8833479SBarry Smith self.substPrefix = 'PETSC' 18f8833479SBarry Smith return 19f8833479SBarry Smith 207c939e48SSatish Balay def __str2__(self): 217c939e48SSatish Balay desc = [] 22a0022257SSatish Balay desc.append('xxx=========================================================================xxx') 238c1ceebfSJed Brown if self.getMakeMacro('PETSC_BUILD_USING_CMAKE'): 24b3618d6dSSatish Balay build_type = 'cmake build' 25b3618d6dSSatish Balay else: 26b3618d6dSSatish Balay build_type = 'legacy build' 27b3618d6dSSatish Balay desc.append(' Configure stage complete. Now build PETSc libraries with (%s):' % build_type) 28b3618d6dSSatish Balay desc.append(' make PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' all') 29a8a678f1SSatish Balay desc.append(' or (experimental with python):') 30c77b0880SMatthew G Knepley desc.append(' PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' ./config/builder.py') 31a0022257SSatish Balay desc.append('xxx=========================================================================xxx') 327c939e48SSatish Balay return '\n'.join(desc)+'\n' 33f8833479SBarry Smith 34f8833479SBarry Smith def setupHelp(self, help): 35f8833479SBarry Smith import nargs 36ce0b2093SBarry Smith help.addArgument('PETSc', '-prefix=<dir>', nargs.Arg(None, '', 'Specifiy location to install PETSc (eg. /usr/local)')) 37eed94e11SSatish Balay help.addArgument('Windows','-with-windows-graphics=<bool>', nargs.ArgBool(None, 1,'Enable check for Windows Graphics')) 38569865ddSSatish Balay help.addArgument('PETSc', '-with-default-arch=<bool>', nargs.ArgBool(None, 1, 'Allow using the last configured arch without setting PETSC_ARCH')) 3957cb31baSSatish Balay help.addArgument('PETSc','-with-single-library=<bool>', nargs.ArgBool(None, 1,'Put all PETSc code into the single -lpetsc library')) 40525d6f2eSBarry Smith help.addArgument('PETSc', '-with-ios=<bool>', nargs.ArgBool(None, 0, 'Build an iPhone/iPad version of PETSc library')) 41f8833479SBarry Smith return 42f8833479SBarry Smith 43f8833479SBarry Smith def setupDependencies(self, framework): 44f8833479SBarry Smith config.base.Configure.setupDependencies(self, framework) 45f8833479SBarry Smith self.setCompilers = framework.require('config.setCompilers', self) 46f8833479SBarry Smith self.arch = framework.require('PETSc.utilities.arch', self.setCompilers) 47f8833479SBarry Smith self.petscdir = framework.require('PETSc.utilities.petscdir', self.setCompilers) 48f8833479SBarry Smith self.languages = framework.require('PETSc.utilities.languages', self.setCompilers) 49f8833479SBarry Smith self.debugging = framework.require('PETSc.utilities.debugging', self.setCompilers) 50a2b1cf82SBarry Smith self.CHUD = framework.require('PETSc.utilities.CHUD', self) 51f8833479SBarry Smith self.compilers = framework.require('config.compilers', self) 52f8833479SBarry Smith self.types = framework.require('config.types', self) 53f8833479SBarry Smith self.headers = framework.require('config.headers', self) 54f8833479SBarry Smith self.functions = framework.require('config.functions', self) 55f8833479SBarry Smith self.libraries = framework.require('config.libraries', self) 56cd37d877SShri Abhyankar self.atomics = framework.require('config.atomics', self) 579552296fSBarry Smith self.blasLapack = framework.require('config.packages.BlasLapack',self) 58f8833479SBarry Smith if os.path.isdir(os.path.join('config', 'PETSc')): 59f8833479SBarry Smith for d in ['utilities', 'packages']: 60f8833479SBarry Smith for utility in os.listdir(os.path.join('config', 'PETSc', d)): 61f8833479SBarry Smith (utilityName, ext) = os.path.splitext(utility) 62f8833479SBarry Smith if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__': 63f8833479SBarry Smith utilityObj = self.framework.require('PETSc.'+d+'.'+utilityName, self) 64f8833479SBarry Smith utilityObj.headerPrefix = self.headerPrefix 65f1ecedd2SMatthew Knepley utilityObj.archProvider = self.arch 66fdfda77fSMatthew Knepley utilityObj.languageProvider = self.languages 67fdfda77fSMatthew Knepley utilityObj.installDirProvider = self.petscdir 68f8833479SBarry Smith setattr(self, utilityName.lower(), utilityObj) 698cf378d1SBarry Smith 70d37554e4SMatthew G Knepley for package in config.packages.all: 71d37554e4SMatthew G Knepley if not package == 'PETSc': 72d37554e4SMatthew G Knepley packageObj = framework.require('config.packages.'+package, self) 73d37554e4SMatthew G Knepley packageObj.archProvider = self.arch 74d37554e4SMatthew G Knepley packageObj.languageProvider = self.languages 75d37554e4SMatthew G Knepley packageObj.installDirProvider = self.petscdir 76d37554e4SMatthew G Knepley setattr(self, package.lower(), packageObj) 77d37554e4SMatthew G Knepley # Force blaslapack to depend on scalarType so precision is set before BlasLapack is built 786d2d6fe1SBarry Smith framework.require('PETSc.utilities.scalarTypes', self.f2cblaslapack) 796d2d6fe1SBarry Smith self.f2cblaslapack.precisionProvider = self.scalartypes 808cf378d1SBarry Smith framework.require('PETSc.utilities.scalarTypes', self.blaslapack) 81f8833479SBarry Smith self.blaslapack.precisionProvider = self.scalartypes 82f8833479SBarry Smith 83f8833479SBarry Smith self.compilers.headerPrefix = self.headerPrefix 84f8833479SBarry Smith self.types.headerPrefix = self.headerPrefix 85f8833479SBarry Smith self.headers.headerPrefix = self.headerPrefix 86f8833479SBarry Smith self.functions.headerPrefix = self.headerPrefix 87f8833479SBarry Smith self.libraries.headerPrefix = self.headerPrefix 88f8833479SBarry Smith self.blaslapack.headerPrefix = self.headerPrefix 89f8833479SBarry Smith self.mpi.headerPrefix = self.headerPrefix 90a8b45ee7SBarry Smith headersC = map(lambda name: name+'.h', ['setjmp','dos', 'endian', 'fcntl', 'float', 'io', 'limits', 'malloc', 'pwd', 'search', 'strings', 91ba61063dSBarry Smith 'unistd', 'sys/sysinfo', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource', 92b4bb646cSSatish Balay 'sys/systeminfo', 'sys/times', 'sys/utsname','string', 'stdlib','memory', 93f8833479SBarry Smith 'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types', 9424edbb7eSSatish Balay 'WindowsX', 'cxxabi','float','ieeefp','stdint','fenv','sched','pthread']) 95f8833479SBarry Smith functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 'getpwuid', 96f8833479SBarry Smith 'gettimeofday', 'getwd', 'memalign', 'memmove', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize', 9738ecfe64SSatish Balay 'readlink', 'realpath', 'sigaction', 'signal', 'sigset', 'usleep', 'sleep', '_sleep', 'socket', 98a6d0e24fSJed Brown 'times', 'gethostbyname', 'uname','snprintf','_snprintf','_fullpath','lseek','_lseek','time','fork','stricmp', 99a6d0e24fSJed Brown 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror', 10064ffe704SBarry Smith '_intel_fast_memcpy','_intel_fast_memset'] 101f8833479SBarry Smith libraries1 = [(['socket', 'nsl'], 'socket'), (['fpe'], 'handle_sigfpes')] 102f8833479SBarry Smith self.headers.headers.extend(headersC) 103f8833479SBarry Smith self.functions.functions.extend(functions) 104f8833479SBarry Smith self.libraries.libraries.extend(libraries1) 1057d421530SBarry Smith 106f8833479SBarry Smith return 107f8833479SBarry Smith 108262119f8SBarry Smith def DumpPkgconfig(self): 109262119f8SBarry Smith ''' Create a pkg-config file ''' 110262119f8SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')): 111262119f8SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')) 112262119f8SBarry Smith fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig','PETSc.pc'),'w') 113262119f8SBarry Smith if self.framework.argDB['prefix']: 114262119f8SBarry Smith installdir = self.framework.argDB['prefix'] 115262119f8SBarry Smith fd.write('prefix='+installdir+'\n') 116262119f8SBarry Smith fd.write('exec_prefix=${prefix}\n') 117262119f8SBarry Smith fd.write('includedir=${prefix}/include\n') 118262119f8SBarry Smith fd.write('libdir='+os.path.join(installdir,'lib')+'\n') 119262119f8SBarry Smith else: 120262119f8SBarry Smith fd.write('prefix='+self.petscdir.dir+'\n') 121262119f8SBarry Smith fd.write('exec_prefix=${prefix}\n') 122262119f8SBarry Smith fd.write('includedir=${prefix}/include\n') 123262119f8SBarry Smith fd.write('libdir='+os.path.join(self.petscdir.dir,self.arch.arch,'lib')+'\n') 124262119f8SBarry Smith 125262119f8SBarry Smith self.setCompilers.pushLanguage('C') 126262119f8SBarry Smith fd.write('ccompiler='+self.setCompilers.getCompiler()+'\n') 127262119f8SBarry Smith self.setCompilers.popLanguage() 128262119f8SBarry Smith if hasattr(self.compilers, 'C++'): 129262119f8SBarry Smith self.setCompilers.pushLanguage('C++') 130262119f8SBarry Smith fd.write('cxxcompiler='+self.setCompilers.getCompiler()+'\n') 131262119f8SBarry Smith self.setCompilers.popLanguage() 132262119f8SBarry Smith if hasattr(self.compilers, 'FC'): 133262119f8SBarry Smith self.setCompilers.pushLanguage('FC') 134262119f8SBarry Smith fd.write('fcompiler='+self.setCompilers.getCompiler()+'\n') 135262119f8SBarry Smith self.setCompilers.popLanguage() 1369552296fSBarry Smith fd.write('blaslapacklibs='+self.libraries.toStringNoDupes(self.blaslapack.lib)+'\n') 137262119f8SBarry Smith 138262119f8SBarry Smith fd.write('\n') 139262119f8SBarry Smith fd.write('Name: PETSc\n') 140262119f8SBarry Smith fd.write('Description: Library to solve ODEs and algebraic equations\n') 141262119f8SBarry Smith fd.write('Version: 3.3\n') # should figure this out from petscversion.h file 142262119f8SBarry Smith 143262119f8SBarry Smith fd.write('Cflags: '+self.allincludes+'\n') 144262119f8SBarry Smith 145262119f8SBarry Smith if self.framework.argDB['prefix']: 146262119f8SBarry Smith fd.write('Libs: '+self.alllibs.replace(os.path.join(self.petscdir.dir,self.arch.arch),self.framework.argDB['prefix'])+'\n') 147262119f8SBarry Smith else: 148262119f8SBarry Smith fd.write('Libs: '+self.alllibs+'\n') 149262119f8SBarry Smith fd.close() 150262119f8SBarry Smith return 151262119f8SBarry Smith 152f8833479SBarry Smith def Dump(self): 153f8833479SBarry Smith ''' Actually put the values into the configuration files ''' 154f8833479SBarry Smith # eventually everything between -- should be gone 155f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 156f8833479SBarry Smith 157f8833479SBarry Smith # Sometimes we need C compiler, even if built with C++ 158f8833479SBarry Smith self.setCompilers.pushLanguage('C') 159f8833479SBarry Smith self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 160f8833479SBarry Smith self.setCompilers.popLanguage() 161f8833479SBarry Smith 162f8833479SBarry Smith # C preprocessor values 163a2b1cf82SBarry Smith self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS+self.CHUD.CPPFLAGS) 164f8833479SBarry Smith 165f8833479SBarry Smith # compiler values 166f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 167f8833479SBarry Smith self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 168f8833479SBarry Smith self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 169f8833479SBarry Smith self.setCompilers.popLanguage() 170f8833479SBarry Smith # .o or .obj 171f8833479SBarry Smith self.addMakeMacro('CC_SUFFIX','o') 172f8833479SBarry Smith 173f8833479SBarry Smith # executable linker values 174f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 175f8833479SBarry Smith pcc_linker = self.setCompilers.getLinker() 176f8833479SBarry Smith self.addMakeMacro('PCC_LINKER',pcc_linker) 177c84a332bSSatish Balay self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 178f8833479SBarry Smith self.setCompilers.popLanguage() 179f8833479SBarry Smith # '' for Unix, .exe for Windows 180f8833479SBarry Smith self.addMakeMacro('CC_LINKER_SUFFIX','') 181f8833479SBarry Smith 182f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 183f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 184f8833479SBarry Smith # need FPPFLAGS in config/setCompilers 185f8833479SBarry Smith self.addDefine('HAVE_FORTRAN','1') 186f8833479SBarry Smith self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS) 187f8833479SBarry Smith 188f8833479SBarry Smith # compiler values 189f8833479SBarry Smith self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 190f8833479SBarry Smith self.setCompilers.popLanguage() 191f8833479SBarry Smith # .o or .obj 192f8833479SBarry Smith self.addMakeMacro('FC_SUFFIX','o') 193f8833479SBarry Smith 194f8833479SBarry Smith # executable linker values 195f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 196f8833479SBarry Smith # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker 197f8833479SBarry Smith fc_linker = self.setCompilers.getLinker() 198f8833479SBarry Smith if config.setCompilers.Configure.isNAG(fc_linker): 199f8833479SBarry Smith self.addMakeMacro('FC_LINKER',pcc_linker) 200f8833479SBarry Smith else: 201f8833479SBarry Smith self.addMakeMacro('FC_LINKER',fc_linker) 2026d53d35eSSatish Balay self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 2033feacd00SBarry Smith # apple requires this shared library linker flag on SOME versions of the os 2043feacd00SBarry Smith if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 2053feacd00SBarry Smith self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 206bb82cf9cSSatish Balay self.setCompilers.popLanguage() 2075d631499SMatthew Knepley 2085d631499SMatthew Knepley # F90 Modules 2095d631499SMatthew Knepley if self.setCompilers.fortranModuleIncludeFlag: 2105d631499SMatthew Knepley self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag) 2116ddd6694SSatish Balay else: # for non-f90 compilers like g77 2126ddd6694SSatish Balay self.addMakeMacro('FC_MODULE_FLAG', '-I') 213a324c51cSMatthew G Knepley if self.setCompilers.fortranModuleIncludeFlag: 214a324c51cSMatthew G Knepley self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag) 215f8833479SBarry Smith else: 216f8833479SBarry Smith self.addMakeMacro('FC','') 217f8833479SBarry Smith 21846a3958fSBarry Smith if hasattr(self.compilers, 'CUDAC'): 2197ff2890cSSatish Balay self.setCompilers.pushLanguage('CUDA') 220d93a25ecSSatish Balay self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags()) 2217ff2890cSSatish Balay self.setCompilers.popLanguage() 2227ff2890cSSatish Balay 223f8833479SBarry Smith # shared library linker values 224f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 225f8833479SBarry Smith # need to fix BuildSystem to collect these separately 226f8833479SBarry Smith self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 22770db8aa6SSatish Balay self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 228f8833479SBarry Smith self.setCompilers.popLanguage() 229f8833479SBarry Smith # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 230f8833479SBarry Smith # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 231f8833479SBarry Smith if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 232f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', '') 23346bc77b6SBarry Smith self.addDefine('SLSUFFIX','""') 234f8833479SBarry Smith else: 235f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 23646bc77b6SBarry Smith self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"') 237bb82cf9cSSatish Balay 23823e93537SBarry Smith self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}') 239bb82cf9cSSatish Balay 240f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 241f8833479SBarry Smith 242f8833479SBarry Smith # CONLY or CPP. We should change the PETSc makefiles to do this better 243f8833479SBarry Smith if self.languages.clanguage == 'C': lang = 'CONLY' 244f8833479SBarry Smith else: lang = 'CXXONLY' 245f8833479SBarry Smith self.addMakeMacro('PETSC_LANGUAGE',lang) 246f8833479SBarry Smith 247f8833479SBarry Smith # real or complex 248f8833479SBarry Smith self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 249f8833479SBarry Smith # double or float 250f8833479SBarry Smith self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 251f8833479SBarry Smith 252f8833479SBarry Smith if self.framework.argDB['with-batch']: 253f8833479SBarry Smith self.addMakeMacro('PETSC_WITH_BATCH','1') 254f8833479SBarry Smith 255f8833479SBarry Smith # Test for compiler-specific macros that need to be defined. 256b409243cSBarry Smith if self.setCompilers.isCrayVector('CC'): 257b409243cSBarry Smith self.addDefine('HAVE_CRAY_VECTOR','1') 258f8833479SBarry Smith 259f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 260df1a78b3SMatthew G Knepley if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket') and self.headers.haveHeader('netinet/in.h'): 261f8833479SBarry Smith self.addDefine('USE_SOCKET_VIEWER','1') 26280e3883bSBarry Smith if self.checkCompile('#include <sys/socket.h>','setsockopt(0,SOL_SOCKET,SO_REUSEADDR,0,0)'): 26380e3883bSBarry Smith self.addDefine('HAVE_SO_REUSEADDR','1') 264f8833479SBarry Smith 265f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 266a6cc6bb1SBarry Smith # print include and lib for makefiles 267f8833479SBarry Smith self.framework.packages.reverse() 268a6cc6bb1SBarry Smith includes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')] 269996b3231SBarry Smith libs = [] 270f8833479SBarry Smith for i in self.framework.packages: 271898a086dSBarry Smith if i.useddirectly: 272898a086dSBarry Smith self.addDefine('HAVE_'+i.PACKAGE, 1) # ONLY list package if it is used directly by PETSc (and not only by another package) 273f8833479SBarry Smith if not isinstance(i.lib, list): 274f8833479SBarry Smith i.lib = [i.lib] 275ac9e4c42SSatish Balay libs.extend(i.lib) 27634cdeb2aSSatish Balay self.addMakeMacro(i.PACKAGE+'_LIB', self.libraries.toStringNoDupes(i.lib)) 277f8833479SBarry Smith if hasattr(i,'include'): 278f8833479SBarry Smith if not isinstance(i.include,list): 279f8833479SBarry Smith i.include = [i.include] 280ac9e4c42SSatish Balay includes.extend(i.include) 28134cdeb2aSSatish Balay self.addMakeMacro(i.PACKAGE+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 2822df986feSBarry Smith if self.framework.argDB['with-single-library']: 283262119f8SBarry Smith self.alllibs = self.libraries.toStringNoDupes(['-L'+os.path.join(self.petscdir.dir,self.arch.arch,'lib'),' -lpetsc']+libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS 284262119f8SBarry Smith self.addMakeMacro('PETSC_WITH_EXTERNAL_LIB',self.alllibs) 285*91bb3077SSatish Balay else: 286*91bb3077SSatish Balay self.alllibs = self.libraries.toStringNoDupes(['-L'+os.path.join(self.petscdir.dir,self.arch.arch,'lib'),'-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys']+libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS 28723e93537SBarry Smith self.addMakeMacro('PETSC_EXTERNAL_LIB_BASIC',self.libraries.toStringNoDupes(libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS) 28823e93537SBarry Smith self.PETSC_EXTERNAL_LIB_BASIC = self.libraries.toStringNoDupes(libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS 289262119f8SBarry Smith self.allincludes = self.headers.toStringNoDupes(includes) 290262119f8SBarry Smith self.addMakeMacro('PETSC_CC_INCLUDES',self.allincludes) 291262119f8SBarry Smith self.PETSC_CC_INCLUDES = self.allincludes 292cbd5cc15SBarry Smith if hasattr(self.compilers, 'FC'): 293208c3fd5SBarry Smith if self.compilers.fortranIsF90: 29443a63bfbSSatish Balay self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes,includes)) 29530d43657SSatish Balay else: 29630d43657SSatish Balay self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes)) 297f8833479SBarry Smith 2981b1e03dfSSatish Balay self.addMakeMacro('DESTDIR',self.installdir) 299c6f99f23SBarry Smith self.addDefine('LIB_DIR','"'+os.path.join(self.installdir,'lib')+'"') 300f8833479SBarry Smith 3010f3b21c2SBarry Smith if self.framework.argDB['with-single-library']: 3020f3b21c2SBarry Smith # overrides the values set in conf/variables 3030f3b21c2SBarry Smith self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 30457cb31baSSatish Balay self.addMakeMacro('SHLIBS','libpetsc') 305bccf1c12SBarry Smith self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 306797063a9SSatish Balay self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 307797063a9SSatish Balay self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 308bb84e0fdSBarry Smith self.addDefine('USE_SINGLE_LIBRARY', '1') 3092df986feSBarry Smith if self.sharedlibraries.useShared: 310ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 311ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 312ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 313ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 314ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 315ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 316ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 317fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 318ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 319ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 3202df986feSBarry Smith else: 321ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 322ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 323ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}') 324ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}') 325ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}') 326ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}') 327ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 328fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 329ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 330ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}') 3310f3b21c2SBarry Smith 332f8833479SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 333f8833479SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 334f8833479SBarry Smith 335f8833479SBarry Smith # add a makefile entry for configure options 336f8833479SBarry Smith self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 337f8833479SBarry Smith return 338f8833479SBarry Smith 339f8833479SBarry Smith def dumpConfigInfo(self): 340f8833479SBarry Smith import time 341f8833479SBarry Smith fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 342f8833479SBarry Smith fd.write('static const char *petscconfigureruntime = "'+time.ctime(time.time())+'";\n') 343f8833479SBarry Smith fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 344f8833479SBarry Smith fd.close() 345f8833479SBarry Smith return 346f8833479SBarry Smith 3472a4161d9SMatthew G Knepley def dumpMachineInfo(self): 3482a4161d9SMatthew G Knepley import platform 3492a4161d9SMatthew G Knepley import time 35040373944SSatish Balay import script 3512a4161d9SMatthew G Knepley fd = file(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w') 3522a4161d9SMatthew G Knepley fd.write('static const char *petscmachineinfo = \"\\n\"\n') 3532a4161d9SMatthew G Knepley fd.write('\"-----------------------------------------\\n\"\n') 3542a4161d9SMatthew G Knepley fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (time.ctime(time.time()), platform.node())) 35560acdfe7SSatish Balay fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform())) 35660acdfe7SSatish Balay fd.write('\"Using PETSc directory: %s\\n\"\n' % (self.petscdir.dir)) 35760acdfe7SSatish Balay fd.write('\"Using PETSc arch: %s\\n\"\n' % (self.arch.arch)) 358cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3592a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerinfo = \"\\n\"\n') 3602a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 36160acdfe7SSatish Balay fd.write('\"Using C compiler: %s %s ${COPTFLAGS} ${CFLAGS}\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags())) 3622a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 3638782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 3642a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 36560acdfe7SSatish Balay fd.write('\"Using Fortran compiler: %s %s ${FOPTFLAGS} ${FFLAGS} %s\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags(), self.setCompilers.CPPFLAGS)) 3662a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 367cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3682a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n') 369ac448642SSatish 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.PETSC_CC_INCLUDES.replace('\\ ','\\\\ '))) 370cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3712a4161d9SMatthew G Knepley fd.write('static const char *petsclinkerinfo = \"\\n\"\n') 3722a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 37360acdfe7SSatish Balay fd.write('\"Using C linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 3742a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 3758782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 3762a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 37760acdfe7SSatish Balay fd.write('\"Using Fortran linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 3782a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 379ad782ac6SSatish Balay if self.framework.argDB['with-single-library']: 380ad782ac6SSatish Balay petsclib = '-lpetsc' 381ad782ac6SSatish Balay else: 382ad782ac6SSatish Balay petsclib = '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys' 383ac448642SSatish Balay fd.write('\"Using libraries: %s%s -L%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'), petsclib, self.PETSC_EXTERNAL_LIB_BASIC.replace('\\ ','\\\\ '))) 384cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3852a4161d9SMatthew G Knepley fd.close() 3862a4161d9SMatthew G Knepley return 387b2843cf1SBarry Smith 388511a6afcSJed Brown def dumpCMakeConfig(self): 389511a6afcSJed Brown ''' 39034ed7027SBarry Smith Writes configuration-specific values to ${PETSC_ARCH}/conf/PETScConfig.cmake. 391511a6afcSJed Brown This file is private to PETSc and should not be included by third parties 392511a6afcSJed Brown (a suitable file can be produced later by CMake, but this is not it). 393511a6afcSJed Brown ''' 394511a6afcSJed Brown def cmakeset(fd,key,val=True): 395511a6afcSJed Brown if val == True: val = 'YES' 396511a6afcSJed Brown if val == False: val = 'NO' 397511a6afcSJed Brown fd.write('set (' + key + ' ' + val + ')\n') 398511a6afcSJed Brown def ensurelist(a): 399826d9344SJed Brown if isinstance(a,list): 400826d9344SJed Brown return a 401826d9344SJed Brown else: 402826d9344SJed Brown return [a] 403511a6afcSJed Brown def libpath(lib): 404511a6afcSJed Brown 'Returns a search path if that is what this item provides, else "" which will be cleaned out later' 4051b1c0b30SJed Brown if not isinstance(lib,str): return '' 406511a6afcSJed Brown if lib.startswith('-L'): return lib[2:] 407511a6afcSJed Brown if lib.startswith('-R'): return lib[2:] 408511a6afcSJed Brown if lib.startswith('-Wl,-rpath,'): 409511a6afcSJed Brown # This case occurs when an external package needs a specific system library that is normally provided by the compiler. 410511a6afcSJed Brown # In other words, the -L path is builtin to the wrapper or compiler, here we provide it so that CMake can locate the 411511a6afcSJed Brown # corresponding library. 412511a6afcSJed Brown return lib[len('-Wl,-rpath,'):] 413511a6afcSJed Brown if lib.startswith('-'): return '' 414511a6afcSJed Brown return os.path.dirname(lib) 415511a6afcSJed Brown def cleanlib(lib): 416511a6afcSJed Brown 'Returns a library name if that is what this item provides, else "" which will be cleaned out later' 41742e8629dSMatthew G Knepley if not isinstance(lib,str): return '' 418511a6afcSJed Brown if lib.startswith('-l'): return lib[2:] 419511a6afcSJed Brown if lib.startswith('-Wl') or lib.startswith('-L'): return '' 420511a6afcSJed Brown lib = os.path.splitext(os.path.basename(lib))[0] 421511a6afcSJed Brown if lib.startswith('lib'): return lib[3:] 422511a6afcSJed Brown return lib 423511a6afcSJed Brown def nub(lst): 42406e8c1ddSJed Brown 'Return a list containing the first occurrence of each unique element' 425511a6afcSJed Brown unique = [] 426511a6afcSJed Brown for elem in lst: 427511a6afcSJed Brown if elem not in unique and elem != '': 428511a6afcSJed Brown unique.append(elem) 429511a6afcSJed Brown return unique 43050937898SJed Brown try: reversed # reversed was added in Python-2.4 43150937898SJed Brown except NameError: 43250937898SJed Brown def reversed(lst): return lst[::-1] 43306e8c1ddSJed Brown def nublast(lst): 43406e8c1ddSJed Brown 'Return a list containing the last occurrence of each unique entry in a list' 43550937898SJed Brown return reversed(nub(reversed(lst))) 436511a6afcSJed Brown def cmakeexpand(varname): 437511a6afcSJed Brown return r'"${' + varname + r'}"' 438582751aaSJed Brown def uniqextend(lst,new): 439511a6afcSJed Brown for x in ensurelist(new): 440582751aaSJed Brown if x not in lst: 441582751aaSJed Brown lst.append(x) 442511a6afcSJed Brown def notstandardinclude(path): 443040257f2SJed Brown return path not in '/usr/include'.split() # /usr/local/include is not automatically included on FreeBSD 444511a6afcSJed Brown def writeMacroDefinitions(fd): 445511a6afcSJed Brown if self.mpi.usingMPIUni: 446511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_MPIUNI') 447511a6afcSJed Brown for pkg in self.framework.packages: 448511a6afcSJed Brown if pkg.useddirectly: 449511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_' + pkg.PACKAGE) 450a23e9343SMatthew G Knepley for pair in pkg.defines.items(): 451440af75fSJed Brown if pair[0].startswith('HAVE_') and pair[1]: 452a23e9343SMatthew G Knepley cmakeset(fd, self.framework.getFullDefineName(pkg, pair[0]), pair[1]) 453511a6afcSJed Brown for name,val in self.functions.defines.items(): 454511a6afcSJed Brown cmakeset(fd,'PETSC_'+name,val) 455511a6afcSJed Brown for dct in [self.defines, self.libraryoptions.defines]: 456511a6afcSJed Brown for k,v in dct.items(): 457511a6afcSJed Brown if k.startswith('USE_'): 458511a6afcSJed Brown cmakeset(fd,'PETSC_' + k, v) 459511a6afcSJed Brown cmakeset(fd,'PETSC_USE_COMPLEX', self.scalartypes.scalartype == 'complex') 460ce63c4c1SBarry Smith cmakeset(fd,'PETSC_USE_REAL_' + self.scalartypes.precision.upper()) 461511a6afcSJed Brown cmakeset(fd,'PETSC_CLANGUAGE_'+self.languages.clanguage) 462511a6afcSJed Brown if hasattr(self.compilers, 'FC'): 463511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_FORTRAN') 464511a6afcSJed Brown if self.compilers.fortranIsF90: 465511a6afcSJed Brown cmakeset(fd,'PETSC_USING_F90') 466876d5c60SBarry Smith if self.compilers.fortranIsF2003: 467876d5c60SBarry Smith cmakeset(fd,'PETSC_USING_F2003') 46813c0a95cSJed Brown if hasattr(self.compilers, 'CXX'): 46913c0a95cSJed Brown cmakeset(fd,'PETSC_HAVE_CXX') 470511a6afcSJed Brown if self.sharedlibraries.useShared: 471511a6afcSJed Brown cmakeset(fd,'BUILD_SHARED_LIBS') 472511a6afcSJed Brown def writeBuildFlags(fd): 47306e8c1ddSJed Brown def extendby(lib): 47406e8c1ddSJed Brown libs = ensurelist(lib) 47506e8c1ddSJed Brown lib_paths.extend(map(libpath,libs)) 47606e8c1ddSJed Brown lib_libs.extend(map(cleanlib,libs)) 477511a6afcSJed Brown lib_paths = [] 478511a6afcSJed Brown lib_libs = [] 479511a6afcSJed Brown includes = [] 480511a6afcSJed Brown libvars = [] 481511a6afcSJed Brown for pkg in self.framework.packages: 48206e8c1ddSJed Brown extendby(pkg.lib) 483040257f2SJed Brown uniqextend(includes,pkg.include) 48406e8c1ddSJed Brown extendby(self.libraries.math) 48506e8c1ddSJed Brown extendby(self.libraries.rt) 48606e8c1ddSJed Brown extendby(self.compilers.flibs) 48706e8c1ddSJed Brown extendby(self.compilers.cxxlibs) 48806e8c1ddSJed Brown extendby(self.compilers.LIBS.split()) 48906e8c1ddSJed Brown for libname in nublast(lib_libs): 490511a6afcSJed Brown libvar = 'PETSC_' + libname.upper() + '_LIB' 4914c0032a9SSatish Balay addpath = '' 49206e8c1ddSJed Brown for lpath in nublast(lib_paths): 4934c0032a9SSatish Balay addpath += '"' + str(lpath) + '" ' 4944c0032a9SSatish Balay fd.write('find_library (' + libvar + ' ' + libname + ' HINTS ' + addpath + ')\n') 495511a6afcSJed Brown libvars.append(libvar) 496511a6afcSJed Brown fd.write('mark_as_advanced (' + ' '.join(libvars) + ')\n') 497511a6afcSJed Brown fd.write('set (PETSC_PACKAGE_LIBS ' + ' '.join(map(cmakeexpand,libvars)) + ')\n') 498040257f2SJed Brown includes = filter(notstandardinclude,includes) 499040257f2SJed Brown fd.write('set (PETSC_PACKAGE_INCLUDES ' + ' '.join(map(lambda i: '"'+i+'"',includes)) + ')\n') 500511a6afcSJed Brown fd = open(os.path.join(self.arch.arch,'conf','PETScConfig.cmake'), 'w') 501511a6afcSJed Brown writeMacroDefinitions(fd) 502511a6afcSJed Brown writeBuildFlags(fd) 503511a6afcSJed Brown fd.close() 504511a6afcSJed Brown return 505511a6afcSJed Brown 5068b0282a9SJed Brown def dumpCMakeLists(self): 5078b0282a9SJed Brown import sys 5088b0282a9SJed Brown if sys.version_info >= (2,5): 5098b0282a9SJed Brown import cmakegen 5108b0282a9SJed Brown try: 511a98e69d2SJed Brown cmakegen.main(self.petscdir.dir, log=self.framework.log) 5128b0282a9SJed Brown except (OSError), e: 5138b0282a9SJed Brown self.framework.logPrint('Generating CMakeLists.txt failed:\n' + str(e)) 514aac20692SSatish Balay else: 515aac20692SSatish Balay self.framework.logPrint('Skipping cmakegen due to old python version: ' +str(sys.version_info) ) 5168b0282a9SJed Brown 5178b0282a9SJed Brown def cmakeBoot(self): 5188b0282a9SJed Brown import sys 519ae937f1dSJed Brown self.cmakeboot_success = False 5200b7111d2SJed Brown if sys.version_info >= (2,5) and hasattr(self.cmake,'cmake'): 521356464bcSMatthew G Knepley try: 5228b0282a9SJed Brown import cmakeboot 523ae937f1dSJed Brown self.cmakeboot_success = cmakeboot.main(petscdir=self.petscdir.dir,petscarch=self.arch.arch,argDB=self.argDB,framework=self.framework,log=self.framework.log) 5248b0282a9SJed Brown except (OSError), e: 5258b0282a9SJed Brown self.framework.logPrint('Booting CMake in PETSC_ARCH failed:\n' + str(e)) 526356464bcSMatthew G Knepley except (ImportError, KeyError), e: 527356464bcSMatthew G Knepley self.framework.logPrint('Importing cmakeboot failed:\n' + str(e)) 5289b12c9c7SJed Brown if self.cmakeboot_success: 5299b12c9c7SJed Brown if self.framework.argDB['with-cuda']: # Our CMake build does not support CUDA at this time 5309b12c9c7SJed Brown self.framework.logPrint('CMake configured successfully, but could not be used by default because --with-cuda was used\n') 531800adc4dSSatish Balay elif hasattr(self.compilers, 'FC') and self.compilers.fortranIsF90 and not self.setCompilers.fortranModuleOutputFlag: 53291f9b906SSatish Balay self.framework.logPrint('CMake configured successfully, but could not be used by default because of missing fortranModuleOutputFlag\n') 5339b12c9c7SJed Brown else: 5349b12c9c7SJed Brown self.framework.logPrint('CMake configured successfully, using as default build\n') 535f7b66a64SJed Brown self.addMakeMacro('PETSC_BUILD_USING_CMAKE',1) 536aac20692SSatish Balay else: 5379b12c9c7SJed Brown self.framework.logPrint('CMake configuration was unsuccessful\n') 5389b12c9c7SJed Brown else: 539aac20692SSatish Balay self.framework.logPrint('Skipping cmakeboot due to old python version: ' +str(sys.version_info) ) 540356464bcSMatthew G Knepley return 5418b0282a9SJed Brown 542b2843cf1SBarry Smith def configurePrefetch(self): 543b2843cf1SBarry Smith '''Sees if there are any prefetch functions supported''' 544525d6f2eSBarry Smith if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-ios']: 54593f78423SSatish Balay self.addDefine('Prefetch(a,b,c)', ' ') 54693f78423SSatish Balay return 547ec284106SBarry Smith self.pushLanguage(self.languages.clanguage) 54810699583SJed Brown if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'): 54950d8bf02SJed Brown # The Intel Intrinsics manual [1] specifies the prototype 55050d8bf02SJed Brown # 55150d8bf02SJed Brown # void _mm_prefetch(char const *a, int sel); 55250d8bf02SJed Brown # 55350d8bf02SJed Brown # but other vendors seem to insist on using subtly different 55450d8bf02SJed Brown # prototypes, including void* for the pointer, and an enum for 55550d8bf02SJed Brown # sel. These are both reasonable changes, but negatively impact 55650d8bf02SJed Brown # portability. 55750d8bf02SJed Brown # 55850d8bf02SJed Brown # [1] http://software.intel.com/file/6373 55950d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 56050d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))') 56150d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 56250d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 56350d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 56450d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 56550d8bf02SJed Brown elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'): 56650d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 56750d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))') 56850d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 56950d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 57050d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 57150d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 57210699583SJed Brown elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 57310699583SJed Brown # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality) 57410699583SJed Brown # 57510699583SJed Brown # The value of rw is a compile-time constant one or zero; one 57610699583SJed Brown # means that the prefetch is preparing for a write to the memory 57710699583SJed Brown # address and zero, the default, means that the prefetch is 57810699583SJed Brown # preparing for a read. The value locality must be a compile-time 57910699583SJed Brown # constant integer between zero and three. A value of zero means 58010699583SJed Brown # that the data has no temporal locality, so it need not be left 58110699583SJed Brown # in the cache after the access. A value of three means that the 58210699583SJed Brown # data has a high degree of temporal locality and should be left 58310699583SJed Brown # in all levels of cache possible. Values of one and two mean, 58410699583SJed Brown # respectively, a low or moderate degree of temporal locality. 58510699583SJed Brown # 58610699583SJed Brown # Here we adopt Intel's x86/x86-64 naming scheme for the locality 58710699583SJed Brown # hints. Using macros for these values in necessary since some 58810699583SJed Brown # compilers require an enum. 58910699583SJed Brown self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))') 59010699583SJed Brown self.addDefine('PREFETCH_HINT_NTA', '0') 59110699583SJed Brown self.addDefine('PREFETCH_HINT_T0', '3') 59210699583SJed Brown self.addDefine('PREFETCH_HINT_T1', '2') 59310699583SJed Brown self.addDefine('PREFETCH_HINT_T2', '1') 594b2843cf1SBarry Smith else: 595b2843cf1SBarry Smith self.addDefine('Prefetch(a,b,c)', ' ') 5967d490b44SBarry Smith self.popLanguage() 597b2843cf1SBarry Smith 59873fca5a0SBarry Smith def configureFeatureTestMacros(self): 59973fca5a0SBarry Smith '''Checks if certain feature test macros are support''' 6006028a65fSShri Abhyankar if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <sysctl.h>',''): 60173fca5a0SBarry Smith self.addDefine('_POSIX_C_SOURCE_200112L', '1') 60209bc878fSSatish Balay if self.checkCompile('#define _BSD_SOURCE\n#include<stdlib.h>',''): 60373fca5a0SBarry Smith self.addDefine('_BSD_SOURCE', '1') 604ea0fecefSShri Abhyankar if self.checkCompile('#define _GNU_SOURCE\n#include <sched.h>','cpu_set_t mset;\nCPU_ZERO(&mset);'): 605ea0fecefSShri Abhyankar self.addDefine('_GNU_SOURCE', '1') 60673fca5a0SBarry Smith 60709bc878fSSatish Balay def configureAtoll(self): 60809bc878fSSatish Balay '''Checks if atoll exists''' 60909bc878fSSatish Balay if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <stdlib.h>','long v = atoll("25")') or self.checkCompile ('#include <stdlib.h>','long v = atoll("25")'): 61009bc878fSSatish Balay self.addDefine('HAVE_ATOLL', '1') 61109bc878fSSatish Balay 6122400fdedSBarry Smith def configureUnused(self): 6132400fdedSBarry Smith '''Sees if __attribute((unused)) is supported''' 6141adaff47SSean Farley if self.framework.argDB['with-ios']: 6152400fdedSBarry Smith self.addDefine('UNUSED', ' ') 6162400fdedSBarry Smith return 6172400fdedSBarry Smith self.pushLanguage(self.languages.clanguage) 618edf21b64SSatish Balay if self.checkLink('__attribute((unused)) static int myfunc(__attribute((unused)) void *name){ return 1;}', 'int i = 0;\nint j = myfunc(&i);\ntypedef void* atype;\n__attribute((unused)) atype a;\n'): 6192400fdedSBarry Smith self.addDefine('UNUSED', '__attribute((unused))') 6202400fdedSBarry Smith else: 6212400fdedSBarry Smith self.addDefine('UNUSED', ' ') 6222400fdedSBarry Smith self.popLanguage() 6232400fdedSBarry Smith 6249800092aSJed Brown def configureExpect(self): 6259800092aSJed Brown '''Sees if the __builtin_expect directive is supported''' 6269800092aSJed Brown self.pushLanguage(self.languages.clanguage) 6279800092aSJed Brown if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'): 6289800092aSJed Brown self.addDefine('HAVE_BUILTIN_EXPECT', 1) 6299800092aSJed Brown self.popLanguage() 6309800092aSJed Brown 63153c77d0aSJed Brown def configureFunctionName(self): 6321ec50b02SJed Brown '''Sees if the compiler supports __func__ or a variant. Falls back 6331ec50b02SJed Brown on __FUNCT__ which PETSc source defines, but most users do not, thus 6341ec50b02SJed Brown stack traces through user code are better when the compiler's 6351ec50b02SJed Brown variant is used.''' 6361ec50b02SJed Brown def getFunctionName(lang): 6371ec50b02SJed Brown name = '__FUNCT__' 6381ec50b02SJed Brown self.pushLanguage(lang) 63953c77d0aSJed Brown if self.checkLink('', "if (__func__[0] != 'm') return 1;"): 6401ec50b02SJed Brown name = '__func__' 64153c77d0aSJed Brown elif self.checkLink('', "if (__FUNCTION__[0] != 'm') return 1;"): 6421ec50b02SJed Brown name = '__FUNCTION__' 6431ec50b02SJed Brown self.popLanguage() 6441ec50b02SJed Brown return name 6451ec50b02SJed Brown langs = [] 646628773c9SSatish Balay 647628773c9SSatish Balay self.addDefine('FUNCTION_NAME_C', getFunctionName('C')) 648628773c9SSatish Balay if hasattr(self.compilers, 'CXX'): 649628773c9SSatish Balay self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx')) 65012607bf0SSatish Balay else: 65112607bf0SSatish Balay self.addDefine('FUNCTION_NAME_CXX', '__FUNCT__') 65253c77d0aSJed Brown 653753ebd1dSJed Brown def configureIntptrt(self): 654753ebd1dSJed Brown '''Determine what to use for uintptr_t''' 655753ebd1dSJed Brown def staticAssertSizeMatchesVoidStar(inc,typename): 656753ebd1dSJed Brown # The declaration is an error if either array size is negative. 657753ebd1dSJed 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 658d26187a0SJed Brown return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n' 659979939cdSSatish Balay + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename)) 660753ebd1dSJed Brown self.pushLanguage(self.languages.clanguage) 661753ebd1dSJed Brown if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'): 662753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'uintptr_t') 663753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long long'): 664753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned long long') 665753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'): 666753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'size_t') 667c82284b1SJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long'): 668c82284b1SJed Brown self.addDefine('UINTPTR_T', 'unsigned long') 6692d1b7972SSatish Balay elif staticAssertSizeMatchesVoidStar('','unsigned'): 670753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned') 671d26187a0SJed Brown else: 672d26187a0SJed Brown raise RuntimeError('Could not find any unsigned integer type matching void*') 673753ebd1dSJed Brown self.popLanguage() 674753ebd1dSJed Brown 675f8833479SBarry Smith def configureInline(self): 676f8833479SBarry Smith '''Get a generic inline keyword, depending on the language''' 677f8833479SBarry Smith if self.languages.clanguage == 'C': 678f8833479SBarry Smith self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword) 679f8833479SBarry Smith self.addDefine('RESTRICT', self.compilers.cRestrict) 680f8833479SBarry Smith elif self.languages.clanguage == 'Cxx': 681f8833479SBarry Smith self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword) 682f8833479SBarry Smith self.addDefine('RESTRICT', self.compilers.cxxRestrict) 683bfef2c86SBarry Smith 684bfef2c86SBarry Smith if self.checkCompile('#include <dlfcn.h>\n void *ptr = RTLD_DEFAULT;'): 685bfef2c86SBarry Smith self.addDefine('RTLD_DEFAULT','1') 686f8833479SBarry Smith return 687f8833479SBarry Smith 688f8833479SBarry Smith def configureSolaris(self): 689f8833479SBarry Smith '''Solaris specific stuff''' 690f8833479SBarry Smith if os.path.isdir(os.path.join('/usr','ucblib')): 691f8833479SBarry Smith try: 692f8833479SBarry Smith flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 693f8833479SBarry Smith except AttributeError: 694f8833479SBarry Smith flag = None 695f8833479SBarry Smith if flag is None: 696f8833479SBarry Smith self.compilers.LIBS += ' -L/usr/ucblib' 697f8833479SBarry Smith else: 698f8833479SBarry Smith self.compilers.LIBS += ' '+flag+'/usr/ucblib' 699f8833479SBarry Smith return 700f8833479SBarry Smith 701f8833479SBarry Smith def configureLinux(self): 702f8833479SBarry Smith '''Linux specific stuff''' 7039f15855cSMatthew G Knepley # TODO: Test for this by mallocing an odd number of floats and checking the address 704f8833479SBarry Smith self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 705f8833479SBarry Smith return 706f8833479SBarry Smith 707f8833479SBarry Smith def configureWin32(self): 708f8833479SBarry Smith '''Win32 non-cygwin specific stuff''' 709f8833479SBarry Smith kernel32=0 710f8833479SBarry Smith if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 711f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 712f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 713f8833479SBarry Smith kernel32=1 714f8833479SBarry Smith elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 715f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 716f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 717f8833479SBarry Smith kernel32=1 718f8833479SBarry Smith if kernel32: 719eed94e11SSatish Balay if self.framework.argDB['with-windows-graphics']: 720eed94e11SSatish Balay self.addDefine('USE_WINDOWS_GRAPHICS',1) 721f8833479SBarry Smith if self.checkLink('#include <Windows.h>','LoadLibrary(0)'): 722f8833479SBarry Smith self.addDefine('HAVE_LOADLIBRARY',1) 723b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'): 724b50f6d9eSLisandro Dalcin self.addDefine('HAVE_GETPROCADDRESS',1) 725b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','FreeLibrary(0)'): 726b50f6d9eSLisandro Dalcin self.addDefine('HAVE_FREELIBRARY',1) 727a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','GetLastError()'): 728a21658a3SLisandro Dalcin self.addDefine('HAVE_GETLASTERROR',1) 729a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','SetLastError(0)'): 730a21658a3SLisandro Dalcin self.addDefine('HAVE_SETLASTERROR',1) 731f8833479SBarry Smith if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'): 732f8833479SBarry Smith self.addDefine('USE_NT_TIME',1) 733f8833479SBarry Smith if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 734f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 735f8833479SBarry Smith elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 736f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 737f8833479SBarry Smith 738f8833479SBarry Smith if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'): 739f8833479SBarry Smith self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);') 740f8833479SBarry Smith if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'): 741f8833479SBarry Smith self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);') 742f8833479SBarry Smith 743f8833479SBarry Smith self.types.check('int32_t', 'int') 744f8833479SBarry Smith if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 745f8833479SBarry Smith self.addTypedef('int', 'uid_t') 746f8833479SBarry Smith self.addTypedef('int', 'gid_t') 747f8833479SBarry Smith if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 748f8833479SBarry Smith self.framework.addDefine('R_OK', '04') 749f8833479SBarry Smith self.framework.addDefine('W_OK', '02') 750f8833479SBarry Smith self.framework.addDefine('X_OK', '01') 751f8833479SBarry Smith if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 752f8833479SBarry Smith self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 753f8833479SBarry Smith self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 754f8833479SBarry Smith if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 755f8833479SBarry Smith self.addDefine('HAVE_LARGE_INTEGER_U',1) 756f8833479SBarry Smith 757f8833479SBarry Smith # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 758ef2cfba3SSatish Balay if self.checkCompile('#include <Windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'): 759f8833479SBarry Smith self.addDefine('HAVE_O_BINARY',1) 760f8833479SBarry Smith 761f8833479SBarry Smith if self.compilers.CC.find('win32fe') >= 0: 762f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\';\'') 763f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'\\\\\'') 764f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 765f8833479SBarry Smith self.addDefine('CANNOT_START_DEBUGGER',1) 766f8833479SBarry Smith else: 767f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\':\'') 768f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 769f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'/\'') 770bfef2c86SBarry Smith 771f8833479SBarry Smith return 772f8833479SBarry Smith 773f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 774569865ddSSatish Balay def configureDefaultArch(self): 775569865ddSSatish Balay conffile = os.path.join('conf', 'petscvariables') 776569865ddSSatish Balay if self.framework.argDB['with-default-arch']: 777569865ddSSatish Balay fd = file(conffile, 'w') 778569865ddSSatish Balay fd.write('PETSC_ARCH='+self.arch.arch+'\n') 779da93591fSBarry Smith fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 7803435dde8SSatish Balay fd.write('include '+os.path.join(self.petscdir.dir,self.arch.arch,'conf','petscvariables')+'\n') 781569865ddSSatish Balay fd.close() 782569865ddSSatish Balay self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 783569865ddSSatish Balay elif os.path.isfile(conffile): 784569865ddSSatish Balay try: 785569865ddSSatish Balay os.unlink(conffile) 786569865ddSSatish Balay except: 787569865ddSSatish Balay raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 788569865ddSSatish Balay return 789569865ddSSatish Balay 790569865ddSSatish Balay#----------------------------------------------------------------------------------------------------- 791f8833479SBarry Smith def configureScript(self): 792f8833479SBarry Smith '''Output a script in the conf directory which will reproduce the configuration''' 793f8833479SBarry Smith import nargs 794495bf1a9SSatish Balay import sys 795495bf1a9SSatish Balay scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py') 796f8833479SBarry Smith args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 797f8833479SBarry Smith if 'configModules' in args: 7981063a081SSatish Balay if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 799f8833479SBarry Smith del args['configModules'] 800f8833479SBarry Smith if 'optionsModule' in args: 801c1486898SMatthew Knepley if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions': 802f8833479SBarry Smith del args['optionsModule'] 803f8833479SBarry Smith if not 'PETSC_ARCH' in args: 8041063a081SSatish Balay args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 805f8833479SBarry Smith f = file(scriptName, 'w') 806495bf1a9SSatish Balay f.write('#!'+sys.executable+'\n') 807f8833479SBarry Smith f.write('if __name__ == \'__main__\':\n') 808f8833479SBarry Smith f.write(' import sys\n') 8097561c02cSSatish Balay f.write(' import os\n') 8107561c02cSSatish Balay f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 811f8833479SBarry Smith f.write(' import configure\n') 8121063a081SSatish Balay # pretty print repr(args.values()) 8131063a081SSatish Balay f.write(' configure_options = [\n') 8148bec23c5SJed Brown for itm in sorted(args.values()): 8151063a081SSatish Balay f.write(' \''+str(itm)+'\',\n') 8161063a081SSatish Balay f.write(' ]\n') 817f8833479SBarry Smith f.write(' configure.petsc_configure(configure_options)\n') 818f8833479SBarry Smith f.close() 819f8833479SBarry Smith try: 820f8833479SBarry Smith os.chmod(scriptName, 0775) 821f8833479SBarry Smith except OSError, e: 822f8833479SBarry Smith self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 823f8833479SBarry Smith self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 824f8833479SBarry Smith return 825f8833479SBarry Smith 826f8833479SBarry Smith def configureInstall(self): 827f8833479SBarry Smith '''Setup the directories for installation''' 828f8833479SBarry Smith if self.framework.argDB['prefix']: 829f8833479SBarry Smith self.installdir = self.framework.argDB['prefix'] 830824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\ 831824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 832315b77e6SSatish Balay '-@echo "========================================="']) 833f8833479SBarry Smith else: 834b559b537SSatish Balay self.installdir = os.path.join(self.petscdir.dir,self.arch.arch) 835824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\ 836824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\ 837315b77e6SSatish Balay '-@echo "========================================="']) 838f8833479SBarry Smith return 839f8833479SBarry Smith 840f8833479SBarry Smith def configureGCOV(self): 841f8833479SBarry Smith if self.framework.argDB['with-gcov']: 842f8833479SBarry Smith self.addDefine('USE_GCOV','1') 843f8833479SBarry Smith return 844f8833479SBarry Smith 845f8833479SBarry Smith def configureFortranFlush(self): 846f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 847f8833479SBarry Smith for baseName in ['flush','flush_']: 848f8833479SBarry Smith if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1): 849f8833479SBarry Smith self.addDefine('HAVE_'+baseName.upper(), 1) 850f8833479SBarry Smith return 851f8833479SBarry Smith 85228bb2e72SSatish Balay def postProcessPackages(self): 85328bb2e72SSatish Balay postPackages=[] 85428bb2e72SSatish Balay for i in self.framework.packages: 85528bb2e72SSatish Balay if hasattr(i,'postProcess'): postPackages.append(i) 85628bb2e72SSatish Balay if postPackages: 857e64d19dfSSatish Balay # ctetgen needs petsc conf files. so attempt to create them early 858a77eb93bSSatish Balay self.framework.dumpConfFiles() 85928bb2e72SSatish Balay for i in postPackages: i.postProcess() 86028bb2e72SSatish Balay return 861f8833479SBarry Smith 862f8833479SBarry Smith def configure(self): 863f8833479SBarry Smith if not os.path.samefile(self.petscdir.dir, os.getcwd()): 864f8833479SBarry Smith raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 865550489e3SMatthew 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): 8663552d8fbSSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 867c16c35a9SSatish Balay if self.framework.argDB['prefix'] and os.path.isdir(self.framework.argDB['prefix']) and os.path.samefile(self.framework.argDB['prefix'],os.path.join(self.petscdir.dir,self.arch.arch)): 868c16c35a9SSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!') 869f16c1317SJed Brown self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 870f16c1317SJed Brown self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 871f16c1317SJed Brown self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables') 872f16c1317SJed Brown self.framework.makeRuleHeader = os.path.join(self.arch.arch,'conf','petscrules') 873f8833479SBarry Smith if self.libraries.math is None: 874f8833479SBarry Smith raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 875f8833479SBarry Smith if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 876f8833479SBarry Smith raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 877f8833479SBarry Smith self.executeTest(self.configureInline) 878b2843cf1SBarry Smith self.executeTest(self.configurePrefetch) 8792400fdedSBarry Smith self.executeTest(self.configureUnused) 8809800092aSJed Brown self.executeTest(self.configureExpect); 88153c77d0aSJed Brown self.executeTest(self.configureFunctionName); 882753ebd1dSJed Brown self.executeTest(self.configureIntptrt); 883f8833479SBarry Smith self.executeTest(self.configureSolaris) 884f8833479SBarry Smith self.executeTest(self.configureLinux) 885f8833479SBarry Smith self.executeTest(self.configureWin32) 886569865ddSSatish Balay self.executeTest(self.configureDefaultArch) 887f8833479SBarry Smith self.executeTest(self.configureScript) 888f8833479SBarry Smith self.executeTest(self.configureInstall) 889f8833479SBarry Smith self.executeTest(self.configureGCOV) 890f8833479SBarry Smith self.executeTest(self.configureFortranFlush) 89173fca5a0SBarry Smith self.executeTest(self.configureFeatureTestMacros) 89209bc878fSSatish Balay self.executeTest(self.configureAtoll) 893f8833479SBarry Smith # dummy rules, always needed except for remote builds 894f8833479SBarry Smith self.addMakeRule('remote','') 895f8833479SBarry Smith self.addMakeRule('remoteclean','') 896f8833479SBarry Smith 897f8833479SBarry Smith self.Dump() 898f8833479SBarry Smith self.dumpConfigInfo() 8992a4161d9SMatthew G Knepley self.dumpMachineInfo() 90028bb2e72SSatish Balay self.postProcessPackages() 901511a6afcSJed Brown self.dumpCMakeConfig() 9028b0282a9SJed Brown self.dumpCMakeLists() 9038b0282a9SJed Brown self.cmakeBoot() 904262119f8SBarry Smith self.DumpPkgconfig() 905f8833479SBarry Smith self.framework.log.write('================================================================================\n') 906f8833479SBarry Smith self.logClear() 907f8833479SBarry Smith return 908