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) 57f8833479SBarry Smith if os.path.isdir(os.path.join('config', 'PETSc')): 58f8833479SBarry Smith for d in ['utilities', 'packages']: 59f8833479SBarry Smith for utility in os.listdir(os.path.join('config', 'PETSc', d)): 60f8833479SBarry Smith (utilityName, ext) = os.path.splitext(utility) 61f8833479SBarry Smith if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__': 62f8833479SBarry Smith utilityObj = self.framework.require('PETSc.'+d+'.'+utilityName, self) 63f8833479SBarry Smith utilityObj.headerPrefix = self.headerPrefix 64f1ecedd2SMatthew Knepley utilityObj.archProvider = self.arch 65fdfda77fSMatthew Knepley utilityObj.languageProvider = self.languages 66fdfda77fSMatthew Knepley utilityObj.installDirProvider = self.petscdir 67f8833479SBarry Smith setattr(self, utilityName.lower(), utilityObj) 688cf378d1SBarry Smith 69d37554e4SMatthew G Knepley for package in config.packages.all: 70d37554e4SMatthew G Knepley if not package == 'PETSc': 71d37554e4SMatthew G Knepley packageObj = framework.require('config.packages.'+package, self) 72d37554e4SMatthew G Knepley packageObj.archProvider = self.arch 73d37554e4SMatthew G Knepley packageObj.languageProvider = self.languages 74d37554e4SMatthew G Knepley packageObj.installDirProvider = self.petscdir 75d37554e4SMatthew G Knepley setattr(self, package.lower(), packageObj) 76d37554e4SMatthew G Knepley # Force blaslapack to depend on scalarType so precision is set before BlasLapack is built 776d2d6fe1SBarry Smith framework.require('PETSc.utilities.scalarTypes', self.f2cblaslapack) 786d2d6fe1SBarry Smith self.f2cblaslapack.precisionProvider = self.scalartypes 798cf378d1SBarry Smith framework.require('PETSc.utilities.scalarTypes', self.blaslapack) 80f8833479SBarry Smith self.blaslapack.precisionProvider = self.scalartypes 81f8833479SBarry Smith 82f8833479SBarry Smith self.compilers.headerPrefix = self.headerPrefix 83f8833479SBarry Smith self.types.headerPrefix = self.headerPrefix 84f8833479SBarry Smith self.headers.headerPrefix = self.headerPrefix 85f8833479SBarry Smith self.functions.headerPrefix = self.headerPrefix 86f8833479SBarry Smith self.libraries.headerPrefix = self.headerPrefix 87f8833479SBarry Smith self.blaslapack.headerPrefix = self.headerPrefix 88f8833479SBarry Smith self.mpi.headerPrefix = self.headerPrefix 89a8b45ee7SBarry Smith headersC = map(lambda name: name+'.h', ['setjmp','dos', 'endian', 'fcntl', 'float', 'io', 'limits', 'malloc', 'pwd', 'search', 'strings', 90ba61063dSBarry Smith 'unistd', 'sys/sysinfo', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource', 91b4bb646cSSatish Balay 'sys/systeminfo', 'sys/times', 'sys/utsname','string', 'stdlib','memory', 92f8833479SBarry Smith 'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types', 9324edbb7eSSatish Balay 'WindowsX', 'cxxabi','float','ieeefp','stdint','fenv','sched','pthread']) 94f8833479SBarry Smith functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 'getpwuid', 95f8833479SBarry Smith 'gettimeofday', 'getwd', 'memalign', 'memmove', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize', 9638ecfe64SSatish Balay 'readlink', 'realpath', 'sigaction', 'signal', 'sigset', 'usleep', 'sleep', '_sleep', 'socket', 97a6d0e24fSJed Brown 'times', 'gethostbyname', 'uname','snprintf','_snprintf','_fullpath','lseek','_lseek','time','fork','stricmp', 98a6d0e24fSJed Brown 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror', 9964ffe704SBarry Smith '_intel_fast_memcpy','_intel_fast_memset'] 100f8833479SBarry Smith libraries1 = [(['socket', 'nsl'], 'socket'), (['fpe'], 'handle_sigfpes')] 101f8833479SBarry Smith self.headers.headers.extend(headersC) 102f8833479SBarry Smith self.functions.functions.extend(functions) 103f8833479SBarry Smith self.libraries.libraries.extend(libraries1) 1047d421530SBarry Smith 105f8833479SBarry Smith return 106f8833479SBarry Smith 107*262119f8SBarry Smith def DumpPkgconfig(self): 108*262119f8SBarry Smith ''' Create a pkg-config file ''' 109*262119f8SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')): 110*262119f8SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')) 111*262119f8SBarry Smith fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig','PETSc.pc'),'w') 112*262119f8SBarry Smith if self.framework.argDB['prefix']: 113*262119f8SBarry Smith installdir = self.framework.argDB['prefix'] 114*262119f8SBarry Smith fd.write('prefix='+installdir+'\n') 115*262119f8SBarry Smith fd.write('exec_prefix=${prefix}\n') 116*262119f8SBarry Smith fd.write('includedir=${prefix}/include\n') 117*262119f8SBarry Smith fd.write('libdir='+os.path.join(installdir,'lib')+'\n') 118*262119f8SBarry Smith else: 119*262119f8SBarry Smith fd.write('prefix='+self.petscdir.dir+'\n') 120*262119f8SBarry Smith fd.write('exec_prefix=${prefix}\n') 121*262119f8SBarry Smith fd.write('includedir=${prefix}/include\n') 122*262119f8SBarry Smith fd.write('libdir='+os.path.join(self.petscdir.dir,self.arch.arch,'lib')+'\n') 123*262119f8SBarry Smith 124*262119f8SBarry Smith self.setCompilers.pushLanguage('C') 125*262119f8SBarry Smith fd.write('ccompiler='+self.setCompilers.getCompiler()+'\n') 126*262119f8SBarry Smith self.setCompilers.popLanguage() 127*262119f8SBarry Smith if hasattr(self.compilers, 'C++'): 128*262119f8SBarry Smith self.setCompilers.pushLanguage('C++') 129*262119f8SBarry Smith fd.write('cxxcompiler='+self.setCompilers.getCompiler()+'\n') 130*262119f8SBarry Smith self.setCompilers.popLanguage() 131*262119f8SBarry Smith if hasattr(self.compilers, 'FC'): 132*262119f8SBarry Smith self.setCompilers.pushLanguage('FC') 133*262119f8SBarry Smith fd.write('fcompiler='+self.setCompilers.getCompiler()+'\n') 134*262119f8SBarry Smith self.setCompilers.popLanguage() 135*262119f8SBarry Smith 136*262119f8SBarry Smith fd.write('\n') 137*262119f8SBarry Smith fd.write('Name: PETSc\n') 138*262119f8SBarry Smith fd.write('Description: Library to solve ODEs and algebraic equations\n') 139*262119f8SBarry Smith fd.write('Version: 3.3\n') # should figure this out from petscversion.h file 140*262119f8SBarry Smith 141*262119f8SBarry Smith fd.write('Cflags: '+self.allincludes+'\n') 142*262119f8SBarry Smith 143*262119f8SBarry Smith if self.framework.argDB['prefix']: 144*262119f8SBarry Smith fd.write('Libs: '+self.alllibs.replace(os.path.join(self.petscdir.dir,self.arch.arch),self.framework.argDB['prefix'])+'\n') 145*262119f8SBarry Smith else: 146*262119f8SBarry Smith fd.write('Libs: '+self.alllibs+'\n') 147*262119f8SBarry Smith fd.close() 148*262119f8SBarry Smith return 149*262119f8SBarry Smith 150f8833479SBarry Smith def Dump(self): 151f8833479SBarry Smith ''' Actually put the values into the configuration files ''' 152f8833479SBarry Smith # eventually everything between -- should be gone 153f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 154f8833479SBarry Smith 155f8833479SBarry Smith # Sometimes we need C compiler, even if built with C++ 156f8833479SBarry Smith self.setCompilers.pushLanguage('C') 157f8833479SBarry Smith self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 158f8833479SBarry Smith self.setCompilers.popLanguage() 159f8833479SBarry Smith 160f8833479SBarry Smith # C preprocessor values 161a2b1cf82SBarry Smith self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS+self.CHUD.CPPFLAGS) 162f8833479SBarry Smith 163f8833479SBarry Smith # compiler values 164f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 165f8833479SBarry Smith self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 166f8833479SBarry Smith self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 167f8833479SBarry Smith self.setCompilers.popLanguage() 168f8833479SBarry Smith # .o or .obj 169f8833479SBarry Smith self.addMakeMacro('CC_SUFFIX','o') 170f8833479SBarry Smith 171f8833479SBarry Smith # executable linker values 172f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 173f8833479SBarry Smith pcc_linker = self.setCompilers.getLinker() 174f8833479SBarry Smith self.addMakeMacro('PCC_LINKER',pcc_linker) 175c84a332bSSatish Balay self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 176f8833479SBarry Smith self.setCompilers.popLanguage() 177f8833479SBarry Smith # '' for Unix, .exe for Windows 178f8833479SBarry Smith self.addMakeMacro('CC_LINKER_SUFFIX','') 179f8833479SBarry Smith 180f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 181f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 182f8833479SBarry Smith # need FPPFLAGS in config/setCompilers 183f8833479SBarry Smith self.addDefine('HAVE_FORTRAN','1') 184f8833479SBarry Smith self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS) 185f8833479SBarry Smith 186f8833479SBarry Smith # compiler values 187f8833479SBarry Smith self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 188f8833479SBarry Smith self.setCompilers.popLanguage() 189f8833479SBarry Smith # .o or .obj 190f8833479SBarry Smith self.addMakeMacro('FC_SUFFIX','o') 191f8833479SBarry Smith 192f8833479SBarry Smith # executable linker values 193f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 194f8833479SBarry Smith # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker 195f8833479SBarry Smith fc_linker = self.setCompilers.getLinker() 196f8833479SBarry Smith if config.setCompilers.Configure.isNAG(fc_linker): 197f8833479SBarry Smith self.addMakeMacro('FC_LINKER',pcc_linker) 198f8833479SBarry Smith else: 199f8833479SBarry Smith self.addMakeMacro('FC_LINKER',fc_linker) 2006d53d35eSSatish Balay self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 2013feacd00SBarry Smith # apple requires this shared library linker flag on SOME versions of the os 2023feacd00SBarry Smith if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 2033feacd00SBarry Smith self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 204bb82cf9cSSatish Balay self.setCompilers.popLanguage() 2055d631499SMatthew Knepley 2065d631499SMatthew Knepley # F90 Modules 2075d631499SMatthew Knepley if self.setCompilers.fortranModuleIncludeFlag: 2085d631499SMatthew Knepley self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag) 2096ddd6694SSatish Balay else: # for non-f90 compilers like g77 2106ddd6694SSatish Balay self.addMakeMacro('FC_MODULE_FLAG', '-I') 211a324c51cSMatthew G Knepley if self.setCompilers.fortranModuleIncludeFlag: 212a324c51cSMatthew G Knepley self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag) 213f8833479SBarry Smith else: 214f8833479SBarry Smith self.addMakeMacro('FC','') 215f8833479SBarry Smith 21646a3958fSBarry Smith if hasattr(self.compilers, 'CUDAC'): 2177ff2890cSSatish Balay self.setCompilers.pushLanguage('CUDA') 218d93a25ecSSatish Balay self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags()) 2197ff2890cSSatish Balay self.setCompilers.popLanguage() 2207ff2890cSSatish Balay 221f8833479SBarry Smith # shared library linker values 222f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 223f8833479SBarry Smith # need to fix BuildSystem to collect these separately 224f8833479SBarry Smith self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 22570db8aa6SSatish Balay self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 226f8833479SBarry Smith self.setCompilers.popLanguage() 227f8833479SBarry Smith # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 228f8833479SBarry Smith # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 229f8833479SBarry Smith if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 230f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', '') 23146bc77b6SBarry Smith self.addDefine('SLSUFFIX','""') 232f8833479SBarry Smith else: 233f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 23446bc77b6SBarry Smith self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"') 235bb82cf9cSSatish Balay 23623e93537SBarry Smith self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}') 237bb82cf9cSSatish Balay 238f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 239f8833479SBarry Smith 240f8833479SBarry Smith # CONLY or CPP. We should change the PETSc makefiles to do this better 241f8833479SBarry Smith if self.languages.clanguage == 'C': lang = 'CONLY' 242f8833479SBarry Smith else: lang = 'CXXONLY' 243f8833479SBarry Smith self.addMakeMacro('PETSC_LANGUAGE',lang) 244f8833479SBarry Smith 245f8833479SBarry Smith # real or complex 246f8833479SBarry Smith self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 247f8833479SBarry Smith # double or float 248f8833479SBarry Smith self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 249f8833479SBarry Smith 250f8833479SBarry Smith if self.framework.argDB['with-batch']: 251f8833479SBarry Smith self.addMakeMacro('PETSC_WITH_BATCH','1') 252f8833479SBarry Smith 253f8833479SBarry Smith # Test for compiler-specific macros that need to be defined. 254b409243cSBarry Smith if self.setCompilers.isCrayVector('CC'): 255b409243cSBarry Smith self.addDefine('HAVE_CRAY_VECTOR','1') 256f8833479SBarry Smith 257f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 258df1a78b3SMatthew G Knepley if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket') and self.headers.haveHeader('netinet/in.h'): 259f8833479SBarry Smith self.addDefine('USE_SOCKET_VIEWER','1') 26080e3883bSBarry Smith if self.checkCompile('#include <sys/socket.h>','setsockopt(0,SOL_SOCKET,SO_REUSEADDR,0,0)'): 26180e3883bSBarry Smith self.addDefine('HAVE_SO_REUSEADDR','1') 262f8833479SBarry Smith 263f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 264a6cc6bb1SBarry Smith # print include and lib for makefiles 265f8833479SBarry Smith self.framework.packages.reverse() 266a6cc6bb1SBarry Smith includes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')] 267996b3231SBarry Smith libs = [] 268f8833479SBarry Smith for i in self.framework.packages: 269898a086dSBarry Smith if i.useddirectly: 270898a086dSBarry Smith self.addDefine('HAVE_'+i.PACKAGE, 1) # ONLY list package if it is used directly by PETSc (and not only by another package) 271f8833479SBarry Smith if not isinstance(i.lib, list): 272f8833479SBarry Smith i.lib = [i.lib] 273ac9e4c42SSatish Balay libs.extend(i.lib) 27434cdeb2aSSatish Balay self.addMakeMacro(i.PACKAGE+'_LIB', self.libraries.toStringNoDupes(i.lib)) 275f8833479SBarry Smith if hasattr(i,'include'): 276f8833479SBarry Smith if not isinstance(i.include,list): 277f8833479SBarry Smith i.include = [i.include] 278ac9e4c42SSatish Balay includes.extend(i.include) 27934cdeb2aSSatish Balay self.addMakeMacro(i.PACKAGE+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 2802df986feSBarry Smith if self.framework.argDB['with-single-library']: 281*262119f8SBarry 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 282*262119f8SBarry Smith self.addMakeMacro('PETSC_WITH_EXTERNAL_LIB',self.alllibs) 28323e93537SBarry 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) 28423e93537SBarry 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 285*262119f8SBarry Smith self.allincludes = self.headers.toStringNoDupes(includes) 286*262119f8SBarry Smith self.addMakeMacro('PETSC_CC_INCLUDES',self.allincludes) 287*262119f8SBarry Smith self.PETSC_CC_INCLUDES = self.allincludes 288cbd5cc15SBarry Smith if hasattr(self.compilers, 'FC'): 289208c3fd5SBarry Smith if self.compilers.fortranIsF90: 29043a63bfbSSatish Balay self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes,includes)) 29130d43657SSatish Balay else: 29230d43657SSatish Balay self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes)) 293f8833479SBarry Smith 2941b1e03dfSSatish Balay self.addMakeMacro('DESTDIR',self.installdir) 295c6f99f23SBarry Smith self.addDefine('LIB_DIR','"'+os.path.join(self.installdir,'lib')+'"') 296f8833479SBarry Smith 2970f3b21c2SBarry Smith if self.framework.argDB['with-single-library']: 2980f3b21c2SBarry Smith # overrides the values set in conf/variables 2990f3b21c2SBarry Smith self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 30057cb31baSSatish Balay self.addMakeMacro('SHLIBS','libpetsc') 301bccf1c12SBarry Smith self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 302797063a9SSatish Balay self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 303797063a9SSatish Balay self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 304bb84e0fdSBarry Smith self.addDefine('USE_SINGLE_LIBRARY', '1') 3052df986feSBarry Smith if self.sharedlibraries.useShared: 306ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 307ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 308ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 309ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 310ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 311ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 312ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 313fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 314ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 315ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 3162df986feSBarry Smith else: 317ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 318ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 319ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}') 320ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}') 321ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}') 322ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}') 323ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 324fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 325ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 326ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}') 3270f3b21c2SBarry Smith 328f8833479SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 329f8833479SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 330f8833479SBarry Smith 331f8833479SBarry Smith # add a makefile entry for configure options 332f8833479SBarry Smith self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 333f8833479SBarry Smith return 334f8833479SBarry Smith 335f8833479SBarry Smith def dumpConfigInfo(self): 336f8833479SBarry Smith import time 337f8833479SBarry Smith fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 338f8833479SBarry Smith fd.write('static const char *petscconfigureruntime = "'+time.ctime(time.time())+'";\n') 339f8833479SBarry Smith fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 340f8833479SBarry Smith fd.close() 341f8833479SBarry Smith return 342f8833479SBarry Smith 3432a4161d9SMatthew G Knepley def dumpMachineInfo(self): 3442a4161d9SMatthew G Knepley import platform 3452a4161d9SMatthew G Knepley import time 34640373944SSatish Balay import script 3472a4161d9SMatthew G Knepley fd = file(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w') 3482a4161d9SMatthew G Knepley fd.write('static const char *petscmachineinfo = \"\\n\"\n') 3492a4161d9SMatthew G Knepley fd.write('\"-----------------------------------------\\n\"\n') 3502a4161d9SMatthew G Knepley fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (time.ctime(time.time()), platform.node())) 35160acdfe7SSatish Balay fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform())) 35260acdfe7SSatish Balay fd.write('\"Using PETSc directory: %s\\n\"\n' % (self.petscdir.dir)) 35360acdfe7SSatish Balay fd.write('\"Using PETSc arch: %s\\n\"\n' % (self.arch.arch)) 354cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3552a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerinfo = \"\\n\"\n') 3562a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 35760acdfe7SSatish Balay fd.write('\"Using C compiler: %s %s ${COPTFLAGS} ${CFLAGS}\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags())) 3582a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 3598782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 3602a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 36160acdfe7SSatish Balay fd.write('\"Using Fortran compiler: %s %s ${FOPTFLAGS} ${FFLAGS} %s\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags(), self.setCompilers.CPPFLAGS)) 3622a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 363cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3642a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n') 365ac448642SSatish 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('\\ ','\\\\ '))) 366cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3672a4161d9SMatthew G Knepley fd.write('static const char *petsclinkerinfo = \"\\n\"\n') 3682a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 36960acdfe7SSatish Balay fd.write('\"Using C linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 3702a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 3718782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 3722a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 37360acdfe7SSatish Balay fd.write('\"Using Fortran linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 3742a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 375ad782ac6SSatish Balay if self.framework.argDB['with-single-library']: 376ad782ac6SSatish Balay petsclib = '-lpetsc' 377ad782ac6SSatish Balay else: 378ad782ac6SSatish Balay petsclib = '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys' 379ac448642SSatish 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('\\ ','\\\\ '))) 380cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3812a4161d9SMatthew G Knepley fd.close() 3822a4161d9SMatthew G Knepley return 383b2843cf1SBarry Smith 384511a6afcSJed Brown def dumpCMakeConfig(self): 385511a6afcSJed Brown ''' 38634ed7027SBarry Smith Writes configuration-specific values to ${PETSC_ARCH}/conf/PETScConfig.cmake. 387511a6afcSJed Brown This file is private to PETSc and should not be included by third parties 388511a6afcSJed Brown (a suitable file can be produced later by CMake, but this is not it). 389511a6afcSJed Brown ''' 390511a6afcSJed Brown def cmakeset(fd,key,val=True): 391511a6afcSJed Brown if val == True: val = 'YES' 392511a6afcSJed Brown if val == False: val = 'NO' 393511a6afcSJed Brown fd.write('set (' + key + ' ' + val + ')\n') 394511a6afcSJed Brown def ensurelist(a): 395826d9344SJed Brown if isinstance(a,list): 396826d9344SJed Brown return a 397826d9344SJed Brown else: 398826d9344SJed Brown return [a] 399511a6afcSJed Brown def libpath(lib): 400511a6afcSJed Brown 'Returns a search path if that is what this item provides, else "" which will be cleaned out later' 4011b1c0b30SJed Brown if not isinstance(lib,str): return '' 402511a6afcSJed Brown if lib.startswith('-L'): return lib[2:] 403511a6afcSJed Brown if lib.startswith('-R'): return lib[2:] 404511a6afcSJed Brown if lib.startswith('-Wl,-rpath,'): 405511a6afcSJed Brown # This case occurs when an external package needs a specific system library that is normally provided by the compiler. 406511a6afcSJed Brown # In other words, the -L path is builtin to the wrapper or compiler, here we provide it so that CMake can locate the 407511a6afcSJed Brown # corresponding library. 408511a6afcSJed Brown return lib[len('-Wl,-rpath,'):] 409511a6afcSJed Brown if lib.startswith('-'): return '' 410511a6afcSJed Brown return os.path.dirname(lib) 411511a6afcSJed Brown def cleanlib(lib): 412511a6afcSJed Brown 'Returns a library name if that is what this item provides, else "" which will be cleaned out later' 41342e8629dSMatthew G Knepley if not isinstance(lib,str): return '' 414511a6afcSJed Brown if lib.startswith('-l'): return lib[2:] 415511a6afcSJed Brown if lib.startswith('-Wl') or lib.startswith('-L'): return '' 416511a6afcSJed Brown lib = os.path.splitext(os.path.basename(lib))[0] 417511a6afcSJed Brown if lib.startswith('lib'): return lib[3:] 418511a6afcSJed Brown return lib 419511a6afcSJed Brown def nub(lst): 42006e8c1ddSJed Brown 'Return a list containing the first occurrence of each unique element' 421511a6afcSJed Brown unique = [] 422511a6afcSJed Brown for elem in lst: 423511a6afcSJed Brown if elem not in unique and elem != '': 424511a6afcSJed Brown unique.append(elem) 425511a6afcSJed Brown return unique 42650937898SJed Brown try: reversed # reversed was added in Python-2.4 42750937898SJed Brown except NameError: 42850937898SJed Brown def reversed(lst): return lst[::-1] 42906e8c1ddSJed Brown def nublast(lst): 43006e8c1ddSJed Brown 'Return a list containing the last occurrence of each unique entry in a list' 43150937898SJed Brown return reversed(nub(reversed(lst))) 432511a6afcSJed Brown def cmakeexpand(varname): 433511a6afcSJed Brown return r'"${' + varname + r'}"' 434582751aaSJed Brown def uniqextend(lst,new): 435511a6afcSJed Brown for x in ensurelist(new): 436582751aaSJed Brown if x not in lst: 437582751aaSJed Brown lst.append(x) 438511a6afcSJed Brown def notstandardinclude(path): 439040257f2SJed Brown return path not in '/usr/include'.split() # /usr/local/include is not automatically included on FreeBSD 440511a6afcSJed Brown def writeMacroDefinitions(fd): 441511a6afcSJed Brown if self.mpi.usingMPIUni: 442511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_MPIUNI') 443511a6afcSJed Brown for pkg in self.framework.packages: 444511a6afcSJed Brown if pkg.useddirectly: 445511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_' + pkg.PACKAGE) 446a23e9343SMatthew G Knepley for pair in pkg.defines.items(): 447440af75fSJed Brown if pair[0].startswith('HAVE_') and pair[1]: 448a23e9343SMatthew G Knepley cmakeset(fd, self.framework.getFullDefineName(pkg, pair[0]), pair[1]) 449511a6afcSJed Brown for name,val in self.functions.defines.items(): 450511a6afcSJed Brown cmakeset(fd,'PETSC_'+name,val) 451511a6afcSJed Brown for dct in [self.defines, self.libraryoptions.defines]: 452511a6afcSJed Brown for k,v in dct.items(): 453511a6afcSJed Brown if k.startswith('USE_'): 454511a6afcSJed Brown cmakeset(fd,'PETSC_' + k, v) 455511a6afcSJed Brown cmakeset(fd,'PETSC_USE_COMPLEX', self.scalartypes.scalartype == 'complex') 456ce63c4c1SBarry Smith cmakeset(fd,'PETSC_USE_REAL_' + self.scalartypes.precision.upper()) 457511a6afcSJed Brown cmakeset(fd,'PETSC_CLANGUAGE_'+self.languages.clanguage) 458511a6afcSJed Brown if hasattr(self.compilers, 'FC'): 459511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_FORTRAN') 460511a6afcSJed Brown if self.compilers.fortranIsF90: 461511a6afcSJed Brown cmakeset(fd,'PETSC_USING_F90') 462876d5c60SBarry Smith if self.compilers.fortranIsF2003: 463876d5c60SBarry Smith cmakeset(fd,'PETSC_USING_F2003') 46413c0a95cSJed Brown if hasattr(self.compilers, 'CXX'): 46513c0a95cSJed Brown cmakeset(fd,'PETSC_HAVE_CXX') 466511a6afcSJed Brown if self.sharedlibraries.useShared: 467511a6afcSJed Brown cmakeset(fd,'BUILD_SHARED_LIBS') 468511a6afcSJed Brown def writeBuildFlags(fd): 46906e8c1ddSJed Brown def extendby(lib): 47006e8c1ddSJed Brown libs = ensurelist(lib) 47106e8c1ddSJed Brown lib_paths.extend(map(libpath,libs)) 47206e8c1ddSJed Brown lib_libs.extend(map(cleanlib,libs)) 473511a6afcSJed Brown lib_paths = [] 474511a6afcSJed Brown lib_libs = [] 475511a6afcSJed Brown includes = [] 476511a6afcSJed Brown libvars = [] 477511a6afcSJed Brown for pkg in self.framework.packages: 47806e8c1ddSJed Brown extendby(pkg.lib) 479040257f2SJed Brown uniqextend(includes,pkg.include) 48006e8c1ddSJed Brown extendby(self.libraries.math) 48106e8c1ddSJed Brown extendby(self.libraries.rt) 48206e8c1ddSJed Brown extendby(self.compilers.flibs) 48306e8c1ddSJed Brown extendby(self.compilers.cxxlibs) 48406e8c1ddSJed Brown extendby(self.compilers.LIBS.split()) 48506e8c1ddSJed Brown for libname in nublast(lib_libs): 486511a6afcSJed Brown libvar = 'PETSC_' + libname.upper() + '_LIB' 4874c0032a9SSatish Balay addpath = '' 48806e8c1ddSJed Brown for lpath in nublast(lib_paths): 4894c0032a9SSatish Balay addpath += '"' + str(lpath) + '" ' 4904c0032a9SSatish Balay fd.write('find_library (' + libvar + ' ' + libname + ' HINTS ' + addpath + ')\n') 491511a6afcSJed Brown libvars.append(libvar) 492511a6afcSJed Brown fd.write('mark_as_advanced (' + ' '.join(libvars) + ')\n') 493511a6afcSJed Brown fd.write('set (PETSC_PACKAGE_LIBS ' + ' '.join(map(cmakeexpand,libvars)) + ')\n') 494040257f2SJed Brown includes = filter(notstandardinclude,includes) 495040257f2SJed Brown fd.write('set (PETSC_PACKAGE_INCLUDES ' + ' '.join(map(lambda i: '"'+i+'"',includes)) + ')\n') 496511a6afcSJed Brown fd = open(os.path.join(self.arch.arch,'conf','PETScConfig.cmake'), 'w') 497511a6afcSJed Brown writeMacroDefinitions(fd) 498511a6afcSJed Brown writeBuildFlags(fd) 499511a6afcSJed Brown fd.close() 500511a6afcSJed Brown return 501511a6afcSJed Brown 5028b0282a9SJed Brown def dumpCMakeLists(self): 5038b0282a9SJed Brown import sys 5048b0282a9SJed Brown if sys.version_info >= (2,5): 5058b0282a9SJed Brown import cmakegen 5068b0282a9SJed Brown try: 507a98e69d2SJed Brown cmakegen.main(self.petscdir.dir, log=self.framework.log) 5088b0282a9SJed Brown except (OSError), e: 5098b0282a9SJed Brown self.framework.logPrint('Generating CMakeLists.txt failed:\n' + str(e)) 510aac20692SSatish Balay else: 511aac20692SSatish Balay self.framework.logPrint('Skipping cmakegen due to old python version: ' +str(sys.version_info) ) 5128b0282a9SJed Brown 5138b0282a9SJed Brown def cmakeBoot(self): 5148b0282a9SJed Brown import sys 515ae937f1dSJed Brown self.cmakeboot_success = False 5160b7111d2SJed Brown if sys.version_info >= (2,5) and hasattr(self.cmake,'cmake'): 517356464bcSMatthew G Knepley try: 5188b0282a9SJed Brown import cmakeboot 519ae937f1dSJed Brown self.cmakeboot_success = cmakeboot.main(petscdir=self.petscdir.dir,petscarch=self.arch.arch,argDB=self.argDB,framework=self.framework,log=self.framework.log) 5208b0282a9SJed Brown except (OSError), e: 5218b0282a9SJed Brown self.framework.logPrint('Booting CMake in PETSC_ARCH failed:\n' + str(e)) 522356464bcSMatthew G Knepley except (ImportError, KeyError), e: 523356464bcSMatthew G Knepley self.framework.logPrint('Importing cmakeboot failed:\n' + str(e)) 5249b12c9c7SJed Brown if self.cmakeboot_success: 5259b12c9c7SJed Brown if self.framework.argDB['with-cuda']: # Our CMake build does not support CUDA at this time 5269b12c9c7SJed Brown self.framework.logPrint('CMake configured successfully, but could not be used by default because --with-cuda was used\n') 527800adc4dSSatish Balay elif hasattr(self.compilers, 'FC') and self.compilers.fortranIsF90 and not self.setCompilers.fortranModuleOutputFlag: 52891f9b906SSatish Balay self.framework.logPrint('CMake configured successfully, but could not be used by default because of missing fortranModuleOutputFlag\n') 5299b12c9c7SJed Brown else: 5309b12c9c7SJed Brown self.framework.logPrint('CMake configured successfully, using as default build\n') 531f7b66a64SJed Brown self.addMakeMacro('PETSC_BUILD_USING_CMAKE',1) 532aac20692SSatish Balay else: 5339b12c9c7SJed Brown self.framework.logPrint('CMake configuration was unsuccessful\n') 5349b12c9c7SJed Brown else: 535aac20692SSatish Balay self.framework.logPrint('Skipping cmakeboot due to old python version: ' +str(sys.version_info) ) 536356464bcSMatthew G Knepley return 5378b0282a9SJed Brown 538b2843cf1SBarry Smith def configurePrefetch(self): 539b2843cf1SBarry Smith '''Sees if there are any prefetch functions supported''' 540525d6f2eSBarry Smith if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-ios']: 54193f78423SSatish Balay self.addDefine('Prefetch(a,b,c)', ' ') 54293f78423SSatish Balay return 543ec284106SBarry Smith self.pushLanguage(self.languages.clanguage) 54410699583SJed Brown if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'): 54550d8bf02SJed Brown # The Intel Intrinsics manual [1] specifies the prototype 54650d8bf02SJed Brown # 54750d8bf02SJed Brown # void _mm_prefetch(char const *a, int sel); 54850d8bf02SJed Brown # 54950d8bf02SJed Brown # but other vendors seem to insist on using subtly different 55050d8bf02SJed Brown # prototypes, including void* for the pointer, and an enum for 55150d8bf02SJed Brown # sel. These are both reasonable changes, but negatively impact 55250d8bf02SJed Brown # portability. 55350d8bf02SJed Brown # 55450d8bf02SJed Brown # [1] http://software.intel.com/file/6373 55550d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 55650d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))') 55750d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 55850d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 55950d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 56050d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 56150d8bf02SJed Brown elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'): 56250d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 56350d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))') 56450d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 56550d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 56650d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 56750d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 56810699583SJed Brown elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 56910699583SJed Brown # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality) 57010699583SJed Brown # 57110699583SJed Brown # The value of rw is a compile-time constant one or zero; one 57210699583SJed Brown # means that the prefetch is preparing for a write to the memory 57310699583SJed Brown # address and zero, the default, means that the prefetch is 57410699583SJed Brown # preparing for a read. The value locality must be a compile-time 57510699583SJed Brown # constant integer between zero and three. A value of zero means 57610699583SJed Brown # that the data has no temporal locality, so it need not be left 57710699583SJed Brown # in the cache after the access. A value of three means that the 57810699583SJed Brown # data has a high degree of temporal locality and should be left 57910699583SJed Brown # in all levels of cache possible. Values of one and two mean, 58010699583SJed Brown # respectively, a low or moderate degree of temporal locality. 58110699583SJed Brown # 58210699583SJed Brown # Here we adopt Intel's x86/x86-64 naming scheme for the locality 58310699583SJed Brown # hints. Using macros for these values in necessary since some 58410699583SJed Brown # compilers require an enum. 58510699583SJed Brown self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))') 58610699583SJed Brown self.addDefine('PREFETCH_HINT_NTA', '0') 58710699583SJed Brown self.addDefine('PREFETCH_HINT_T0', '3') 58810699583SJed Brown self.addDefine('PREFETCH_HINT_T1', '2') 58910699583SJed Brown self.addDefine('PREFETCH_HINT_T2', '1') 590b2843cf1SBarry Smith else: 591b2843cf1SBarry Smith self.addDefine('Prefetch(a,b,c)', ' ') 5927d490b44SBarry Smith self.popLanguage() 593b2843cf1SBarry Smith 59473fca5a0SBarry Smith def configureFeatureTestMacros(self): 59573fca5a0SBarry Smith '''Checks if certain feature test macros are support''' 5966028a65fSShri Abhyankar if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <sysctl.h>',''): 59773fca5a0SBarry Smith self.addDefine('_POSIX_C_SOURCE_200112L', '1') 59809bc878fSSatish Balay if self.checkCompile('#define _BSD_SOURCE\n#include<stdlib.h>',''): 59973fca5a0SBarry Smith self.addDefine('_BSD_SOURCE', '1') 600ea0fecefSShri Abhyankar if self.checkCompile('#define _GNU_SOURCE\n#include <sched.h>','cpu_set_t mset;\nCPU_ZERO(&mset);'): 601ea0fecefSShri Abhyankar self.addDefine('_GNU_SOURCE', '1') 60273fca5a0SBarry Smith 60309bc878fSSatish Balay def configureAtoll(self): 60409bc878fSSatish Balay '''Checks if atoll exists''' 60509bc878fSSatish 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")'): 60609bc878fSSatish Balay self.addDefine('HAVE_ATOLL', '1') 60709bc878fSSatish Balay 6082400fdedSBarry Smith def configureUnused(self): 6092400fdedSBarry Smith '''Sees if __attribute((unused)) is supported''' 6101adaff47SSean Farley if self.framework.argDB['with-ios']: 6112400fdedSBarry Smith self.addDefine('UNUSED', ' ') 6122400fdedSBarry Smith return 6132400fdedSBarry Smith self.pushLanguage(self.languages.clanguage) 614edf21b64SSatish 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'): 6152400fdedSBarry Smith self.addDefine('UNUSED', '__attribute((unused))') 6162400fdedSBarry Smith else: 6172400fdedSBarry Smith self.addDefine('UNUSED', ' ') 6182400fdedSBarry Smith self.popLanguage() 6192400fdedSBarry Smith 6209800092aSJed Brown def configureExpect(self): 6219800092aSJed Brown '''Sees if the __builtin_expect directive is supported''' 6229800092aSJed Brown self.pushLanguage(self.languages.clanguage) 6239800092aSJed Brown if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'): 6249800092aSJed Brown self.addDefine('HAVE_BUILTIN_EXPECT', 1) 6259800092aSJed Brown self.popLanguage() 6269800092aSJed Brown 62753c77d0aSJed Brown def configureFunctionName(self): 6281ec50b02SJed Brown '''Sees if the compiler supports __func__ or a variant. Falls back 6291ec50b02SJed Brown on __FUNCT__ which PETSc source defines, but most users do not, thus 6301ec50b02SJed Brown stack traces through user code are better when the compiler's 6311ec50b02SJed Brown variant is used.''' 6321ec50b02SJed Brown def getFunctionName(lang): 6331ec50b02SJed Brown name = '__FUNCT__' 6341ec50b02SJed Brown self.pushLanguage(lang) 63553c77d0aSJed Brown if self.checkLink('', "if (__func__[0] != 'm') return 1;"): 6361ec50b02SJed Brown name = '__func__' 63753c77d0aSJed Brown elif self.checkLink('', "if (__FUNCTION__[0] != 'm') return 1;"): 6381ec50b02SJed Brown name = '__FUNCTION__' 6391ec50b02SJed Brown self.popLanguage() 6401ec50b02SJed Brown return name 6411ec50b02SJed Brown langs = [] 642628773c9SSatish Balay 643628773c9SSatish Balay self.addDefine('FUNCTION_NAME_C', getFunctionName('C')) 644628773c9SSatish Balay if hasattr(self.compilers, 'CXX'): 645628773c9SSatish Balay self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx')) 64612607bf0SSatish Balay else: 64712607bf0SSatish Balay self.addDefine('FUNCTION_NAME_CXX', '__FUNCT__') 64853c77d0aSJed Brown 649753ebd1dSJed Brown def configureIntptrt(self): 650753ebd1dSJed Brown '''Determine what to use for uintptr_t''' 651753ebd1dSJed Brown def staticAssertSizeMatchesVoidStar(inc,typename): 652753ebd1dSJed Brown # The declaration is an error if either array size is negative. 653753ebd1dSJed 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 654d26187a0SJed Brown return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n' 655979939cdSSatish Balay + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename)) 656753ebd1dSJed Brown self.pushLanguage(self.languages.clanguage) 657753ebd1dSJed Brown if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'): 658753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'uintptr_t') 659753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long long'): 660753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned long long') 661753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'): 662753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'size_t') 663c82284b1SJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long'): 664c82284b1SJed Brown self.addDefine('UINTPTR_T', 'unsigned long') 6652d1b7972SSatish Balay elif staticAssertSizeMatchesVoidStar('','unsigned'): 666753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned') 667d26187a0SJed Brown else: 668d26187a0SJed Brown raise RuntimeError('Could not find any unsigned integer type matching void*') 669753ebd1dSJed Brown self.popLanguage() 670753ebd1dSJed Brown 671f8833479SBarry Smith def configureInline(self): 672f8833479SBarry Smith '''Get a generic inline keyword, depending on the language''' 673f8833479SBarry Smith if self.languages.clanguage == 'C': 674f8833479SBarry Smith self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword) 675f8833479SBarry Smith self.addDefine('RESTRICT', self.compilers.cRestrict) 676f8833479SBarry Smith elif self.languages.clanguage == 'Cxx': 677f8833479SBarry Smith self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword) 678f8833479SBarry Smith self.addDefine('RESTRICT', self.compilers.cxxRestrict) 679bfef2c86SBarry Smith 680bfef2c86SBarry Smith if self.checkCompile('#include <dlfcn.h>\n void *ptr = RTLD_DEFAULT;'): 681bfef2c86SBarry Smith self.addDefine('RTLD_DEFAULT','1') 682f8833479SBarry Smith return 683f8833479SBarry Smith 684f8833479SBarry Smith def configureSolaris(self): 685f8833479SBarry Smith '''Solaris specific stuff''' 686f8833479SBarry Smith if os.path.isdir(os.path.join('/usr','ucblib')): 687f8833479SBarry Smith try: 688f8833479SBarry Smith flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 689f8833479SBarry Smith except AttributeError: 690f8833479SBarry Smith flag = None 691f8833479SBarry Smith if flag is None: 692f8833479SBarry Smith self.compilers.LIBS += ' -L/usr/ucblib' 693f8833479SBarry Smith else: 694f8833479SBarry Smith self.compilers.LIBS += ' '+flag+'/usr/ucblib' 695f8833479SBarry Smith return 696f8833479SBarry Smith 697f8833479SBarry Smith def configureLinux(self): 698f8833479SBarry Smith '''Linux specific stuff''' 6999f15855cSMatthew G Knepley # TODO: Test for this by mallocing an odd number of floats and checking the address 700f8833479SBarry Smith self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 701f8833479SBarry Smith return 702f8833479SBarry Smith 703f8833479SBarry Smith def configureWin32(self): 704f8833479SBarry Smith '''Win32 non-cygwin specific stuff''' 705f8833479SBarry Smith kernel32=0 706f8833479SBarry Smith if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 707f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 708f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 709f8833479SBarry Smith kernel32=1 710f8833479SBarry Smith elif self.libraries.add('kernel32','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 if kernel32: 715eed94e11SSatish Balay if self.framework.argDB['with-windows-graphics']: 716eed94e11SSatish Balay self.addDefine('USE_WINDOWS_GRAPHICS',1) 717f8833479SBarry Smith if self.checkLink('#include <Windows.h>','LoadLibrary(0)'): 718f8833479SBarry Smith self.addDefine('HAVE_LOADLIBRARY',1) 719b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'): 720b50f6d9eSLisandro Dalcin self.addDefine('HAVE_GETPROCADDRESS',1) 721b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','FreeLibrary(0)'): 722b50f6d9eSLisandro Dalcin self.addDefine('HAVE_FREELIBRARY',1) 723a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','GetLastError()'): 724a21658a3SLisandro Dalcin self.addDefine('HAVE_GETLASTERROR',1) 725a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','SetLastError(0)'): 726a21658a3SLisandro Dalcin self.addDefine('HAVE_SETLASTERROR',1) 727f8833479SBarry Smith if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'): 728f8833479SBarry Smith self.addDefine('USE_NT_TIME',1) 729f8833479SBarry Smith if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 730f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 731f8833479SBarry Smith elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 732f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 733f8833479SBarry Smith 734f8833479SBarry Smith if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'): 735f8833479SBarry Smith self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);') 736f8833479SBarry Smith if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'): 737f8833479SBarry Smith self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);') 738f8833479SBarry Smith 739f8833479SBarry Smith self.types.check('int32_t', 'int') 740f8833479SBarry Smith if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 741f8833479SBarry Smith self.addTypedef('int', 'uid_t') 742f8833479SBarry Smith self.addTypedef('int', 'gid_t') 743f8833479SBarry Smith if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 744f8833479SBarry Smith self.framework.addDefine('R_OK', '04') 745f8833479SBarry Smith self.framework.addDefine('W_OK', '02') 746f8833479SBarry Smith self.framework.addDefine('X_OK', '01') 747f8833479SBarry Smith if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 748f8833479SBarry Smith self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 749f8833479SBarry Smith self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 750f8833479SBarry Smith if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 751f8833479SBarry Smith self.addDefine('HAVE_LARGE_INTEGER_U',1) 752f8833479SBarry Smith 753f8833479SBarry Smith # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 754ef2cfba3SSatish Balay if self.checkCompile('#include <Windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'): 755f8833479SBarry Smith self.addDefine('HAVE_O_BINARY',1) 756f8833479SBarry Smith 757f8833479SBarry Smith if self.compilers.CC.find('win32fe') >= 0: 758f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\';\'') 759f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'\\\\\'') 760f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 761f8833479SBarry Smith self.addDefine('CANNOT_START_DEBUGGER',1) 762f8833479SBarry Smith else: 763f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\':\'') 764f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 765f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'/\'') 766bfef2c86SBarry Smith 767f8833479SBarry Smith return 768f8833479SBarry Smith 769f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 770569865ddSSatish Balay def configureDefaultArch(self): 771569865ddSSatish Balay conffile = os.path.join('conf', 'petscvariables') 772569865ddSSatish Balay if self.framework.argDB['with-default-arch']: 773569865ddSSatish Balay fd = file(conffile, 'w') 774569865ddSSatish Balay fd.write('PETSC_ARCH='+self.arch.arch+'\n') 775da93591fSBarry Smith fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 7763435dde8SSatish Balay fd.write('include '+os.path.join(self.petscdir.dir,self.arch.arch,'conf','petscvariables')+'\n') 777569865ddSSatish Balay fd.close() 778569865ddSSatish Balay self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 779569865ddSSatish Balay elif os.path.isfile(conffile): 780569865ddSSatish Balay try: 781569865ddSSatish Balay os.unlink(conffile) 782569865ddSSatish Balay except: 783569865ddSSatish Balay raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 784569865ddSSatish Balay return 785569865ddSSatish Balay 786569865ddSSatish Balay#----------------------------------------------------------------------------------------------------- 787f8833479SBarry Smith def configureScript(self): 788f8833479SBarry Smith '''Output a script in the conf directory which will reproduce the configuration''' 789f8833479SBarry Smith import nargs 790495bf1a9SSatish Balay import sys 791495bf1a9SSatish Balay scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py') 792f8833479SBarry Smith args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 793f8833479SBarry Smith if 'configModules' in args: 7941063a081SSatish Balay if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 795f8833479SBarry Smith del args['configModules'] 796f8833479SBarry Smith if 'optionsModule' in args: 797c1486898SMatthew Knepley if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions': 798f8833479SBarry Smith del args['optionsModule'] 799f8833479SBarry Smith if not 'PETSC_ARCH' in args: 8001063a081SSatish Balay args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 801f8833479SBarry Smith f = file(scriptName, 'w') 802495bf1a9SSatish Balay f.write('#!'+sys.executable+'\n') 803f8833479SBarry Smith f.write('if __name__ == \'__main__\':\n') 804f8833479SBarry Smith f.write(' import sys\n') 8057561c02cSSatish Balay f.write(' import os\n') 8067561c02cSSatish Balay f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 807f8833479SBarry Smith f.write(' import configure\n') 8081063a081SSatish Balay # pretty print repr(args.values()) 8091063a081SSatish Balay f.write(' configure_options = [\n') 8108bec23c5SJed Brown for itm in sorted(args.values()): 8111063a081SSatish Balay f.write(' \''+str(itm)+'\',\n') 8121063a081SSatish Balay f.write(' ]\n') 813f8833479SBarry Smith f.write(' configure.petsc_configure(configure_options)\n') 814f8833479SBarry Smith f.close() 815f8833479SBarry Smith try: 816f8833479SBarry Smith os.chmod(scriptName, 0775) 817f8833479SBarry Smith except OSError, e: 818f8833479SBarry Smith self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 819f8833479SBarry Smith self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 820f8833479SBarry Smith return 821f8833479SBarry Smith 822f8833479SBarry Smith def configureInstall(self): 823f8833479SBarry Smith '''Setup the directories for installation''' 824f8833479SBarry Smith if self.framework.argDB['prefix']: 825f8833479SBarry Smith self.installdir = self.framework.argDB['prefix'] 826824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\ 827824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 828315b77e6SSatish Balay '-@echo "========================================="']) 829f8833479SBarry Smith else: 830b559b537SSatish Balay self.installdir = os.path.join(self.petscdir.dir,self.arch.arch) 831824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\ 832824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\ 833315b77e6SSatish Balay '-@echo "========================================="']) 834f8833479SBarry Smith return 835f8833479SBarry Smith 836f8833479SBarry Smith def configureGCOV(self): 837f8833479SBarry Smith if self.framework.argDB['with-gcov']: 838f8833479SBarry Smith self.addDefine('USE_GCOV','1') 839f8833479SBarry Smith return 840f8833479SBarry Smith 841f8833479SBarry Smith def configureFortranFlush(self): 842f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 843f8833479SBarry Smith for baseName in ['flush','flush_']: 844f8833479SBarry Smith if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1): 845f8833479SBarry Smith self.addDefine('HAVE_'+baseName.upper(), 1) 846f8833479SBarry Smith return 847f8833479SBarry Smith 84828bb2e72SSatish Balay def postProcessPackages(self): 84928bb2e72SSatish Balay postPackages=[] 85028bb2e72SSatish Balay for i in self.framework.packages: 85128bb2e72SSatish Balay if hasattr(i,'postProcess'): postPackages.append(i) 85228bb2e72SSatish Balay if postPackages: 853e64d19dfSSatish Balay # ctetgen needs petsc conf files. so attempt to create them early 854a77eb93bSSatish Balay self.framework.dumpConfFiles() 85528bb2e72SSatish Balay for i in postPackages: i.postProcess() 85628bb2e72SSatish Balay return 857f8833479SBarry Smith 858f8833479SBarry Smith def configure(self): 859f8833479SBarry Smith if not os.path.samefile(self.petscdir.dir, os.getcwd()): 860f8833479SBarry Smith raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 861550489e3SMatthew 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): 8623552d8fbSSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 863c16c35a9SSatish 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)): 864c16c35a9SSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!') 865f16c1317SJed Brown self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 866f16c1317SJed Brown self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 867f16c1317SJed Brown self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables') 868f16c1317SJed Brown self.framework.makeRuleHeader = os.path.join(self.arch.arch,'conf','petscrules') 869f8833479SBarry Smith if self.libraries.math is None: 870f8833479SBarry Smith raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 871f8833479SBarry Smith if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 872f8833479SBarry Smith raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 873f8833479SBarry Smith self.executeTest(self.configureInline) 874b2843cf1SBarry Smith self.executeTest(self.configurePrefetch) 8752400fdedSBarry Smith self.executeTest(self.configureUnused) 8769800092aSJed Brown self.executeTest(self.configureExpect); 87753c77d0aSJed Brown self.executeTest(self.configureFunctionName); 878753ebd1dSJed Brown self.executeTest(self.configureIntptrt); 879f8833479SBarry Smith self.executeTest(self.configureSolaris) 880f8833479SBarry Smith self.executeTest(self.configureLinux) 881f8833479SBarry Smith self.executeTest(self.configureWin32) 882569865ddSSatish Balay self.executeTest(self.configureDefaultArch) 883f8833479SBarry Smith self.executeTest(self.configureScript) 884f8833479SBarry Smith self.executeTest(self.configureInstall) 885f8833479SBarry Smith self.executeTest(self.configureGCOV) 886f8833479SBarry Smith self.executeTest(self.configureFortranFlush) 88773fca5a0SBarry Smith self.executeTest(self.configureFeatureTestMacros) 88809bc878fSSatish Balay self.executeTest(self.configureAtoll) 889f8833479SBarry Smith # dummy rules, always needed except for remote builds 890f8833479SBarry Smith self.addMakeRule('remote','') 891f8833479SBarry Smith self.addMakeRule('remoteclean','') 892f8833479SBarry Smith 893f8833479SBarry Smith self.Dump() 894f8833479SBarry Smith self.dumpConfigInfo() 8952a4161d9SMatthew G Knepley self.dumpMachineInfo() 89628bb2e72SSatish Balay self.postProcessPackages() 897511a6afcSJed Brown self.dumpCMakeConfig() 8988b0282a9SJed Brown self.dumpCMakeLists() 8998b0282a9SJed Brown self.cmakeBoot() 900*262119f8SBarry Smith self.DumpPkgconfig() 901f8833479SBarry Smith self.framework.log.write('================================================================================\n') 902f8833479SBarry Smith self.logClear() 903f8833479SBarry Smith return 904