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') 141*351d3a41SMatthew G Knepley fd.write('Version: %s\n' % self.petscdir.version) 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 152*351d3a41SMatthew G Knepley def DumpModule(self): 153*351d3a41SMatthew G Knepley ''' Create a module file ''' 154*351d3a41SMatthew G Knepley if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','modules')): 155*351d3a41SMatthew G Knepley os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','modules')) 156*351d3a41SMatthew G Knepley if self.framework.argDB['prefix']: 157*351d3a41SMatthew G Knepley installdir = self.framework.argDB['prefix'] 158*351d3a41SMatthew G Knepley else: 159*351d3a41SMatthew G Knepley installdir = self.petscdir.dir 160*351d3a41SMatthew G Knepley fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','modules','PETSc.mod'),'w') 161*351d3a41SMatthew G Knepley fd.write('''\ 162*351d3a41SMatthew G Knepley#%%Module 163*351d3a41SMatthew G Knepley 164*351d3a41SMatthew G Knepleyproc ModulesHelp { } { 165*351d3a41SMatthew G Knepley puts stderr "This module sets the path and environment variables for petsc-%s" 166*351d3a41SMatthew G Knepley puts stderr " see http://www.mcs.anl.gov/petsc/ for more information " 167*351d3a41SMatthew G Knepley puts stderr "" 168*351d3a41SMatthew G Knepley} 169*351d3a41SMatthew G Knepleymodule-whatis "PETSc - Portable, Extensible Toolkit for Scientific Computation" 170*351d3a41SMatthew G Knepley 171*351d3a41SMatthew G Knepleyset petsc_dir %s 172*351d3a41SMatthew G Knepleyset petsc_arch %s 173*351d3a41SMatthew G Knepley 174*351d3a41SMatthew G Knepleysetenv PETSC_ARCH $petsc_arch 175*351d3a41SMatthew G Knepleysetenv PETSC_DIR $petsc_dir 176*351d3a41SMatthew G Knepleyprepend-path PATH $petsc_dir/$petsc_arch/bin 177*351d3a41SMatthew G Knepley''' % (self.petscdir.version, installdir, self.arch.arch)) 178*351d3a41SMatthew G Knepley fd.close() 179*351d3a41SMatthew G Knepley return 180*351d3a41SMatthew G Knepley 181f8833479SBarry Smith def Dump(self): 182f8833479SBarry Smith ''' Actually put the values into the configuration files ''' 183f8833479SBarry Smith # eventually everything between -- should be gone 184f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 185f8833479SBarry Smith 186f8833479SBarry Smith # Sometimes we need C compiler, even if built with C++ 187f8833479SBarry Smith self.setCompilers.pushLanguage('C') 188f8833479SBarry Smith self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 189f8833479SBarry Smith self.setCompilers.popLanguage() 190f8833479SBarry Smith 191f8833479SBarry Smith # C preprocessor values 192a2b1cf82SBarry Smith self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS+self.CHUD.CPPFLAGS) 193f8833479SBarry Smith 194f8833479SBarry Smith # compiler values 195f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 196f8833479SBarry Smith self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 197f8833479SBarry Smith self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 198f8833479SBarry Smith self.setCompilers.popLanguage() 199f8833479SBarry Smith # .o or .obj 200f8833479SBarry Smith self.addMakeMacro('CC_SUFFIX','o') 201f8833479SBarry Smith 202f8833479SBarry Smith # executable linker values 203f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 204f8833479SBarry Smith pcc_linker = self.setCompilers.getLinker() 205f8833479SBarry Smith self.addMakeMacro('PCC_LINKER',pcc_linker) 206c84a332bSSatish Balay self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 207f8833479SBarry Smith self.setCompilers.popLanguage() 208f8833479SBarry Smith # '' for Unix, .exe for Windows 209f8833479SBarry Smith self.addMakeMacro('CC_LINKER_SUFFIX','') 210f8833479SBarry Smith 211f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 212f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 213f8833479SBarry Smith # need FPPFLAGS in config/setCompilers 214f8833479SBarry Smith self.addDefine('HAVE_FORTRAN','1') 215f8833479SBarry Smith self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS) 216f8833479SBarry Smith 217f8833479SBarry Smith # compiler values 218f8833479SBarry Smith self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 219f8833479SBarry Smith self.setCompilers.popLanguage() 220f8833479SBarry Smith # .o or .obj 221f8833479SBarry Smith self.addMakeMacro('FC_SUFFIX','o') 222f8833479SBarry Smith 223f8833479SBarry Smith # executable linker values 224f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 225f8833479SBarry Smith # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker 226f8833479SBarry Smith fc_linker = self.setCompilers.getLinker() 227f8833479SBarry Smith if config.setCompilers.Configure.isNAG(fc_linker): 228f8833479SBarry Smith self.addMakeMacro('FC_LINKER',pcc_linker) 229f8833479SBarry Smith else: 230f8833479SBarry Smith self.addMakeMacro('FC_LINKER',fc_linker) 2316d53d35eSSatish Balay self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 2323feacd00SBarry Smith # apple requires this shared library linker flag on SOME versions of the os 2333feacd00SBarry Smith if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 2343feacd00SBarry Smith self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 235bb82cf9cSSatish Balay self.setCompilers.popLanguage() 2365d631499SMatthew Knepley 2375d631499SMatthew Knepley # F90 Modules 2385d631499SMatthew Knepley if self.setCompilers.fortranModuleIncludeFlag: 2395d631499SMatthew Knepley self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag) 2406ddd6694SSatish Balay else: # for non-f90 compilers like g77 2416ddd6694SSatish Balay self.addMakeMacro('FC_MODULE_FLAG', '-I') 242a324c51cSMatthew G Knepley if self.setCompilers.fortranModuleIncludeFlag: 243a324c51cSMatthew G Knepley self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag) 244f8833479SBarry Smith else: 245f8833479SBarry Smith self.addMakeMacro('FC','') 246f8833479SBarry Smith 24746a3958fSBarry Smith if hasattr(self.compilers, 'CUDAC'): 2487ff2890cSSatish Balay self.setCompilers.pushLanguage('CUDA') 249d93a25ecSSatish Balay self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags()) 2507ff2890cSSatish Balay self.setCompilers.popLanguage() 2517ff2890cSSatish Balay 252f8833479SBarry Smith # shared library linker values 253f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 254f8833479SBarry Smith # need to fix BuildSystem to collect these separately 255f8833479SBarry Smith self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 25670db8aa6SSatish Balay self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 257f8833479SBarry Smith self.setCompilers.popLanguage() 258f8833479SBarry Smith # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 259f8833479SBarry Smith # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 260f8833479SBarry Smith if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 261f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', '') 26246bc77b6SBarry Smith self.addDefine('SLSUFFIX','""') 263f8833479SBarry Smith else: 264f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 26546bc77b6SBarry Smith self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"') 266bb82cf9cSSatish Balay 26723e93537SBarry Smith self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}') 268bb82cf9cSSatish Balay 269f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 270f8833479SBarry Smith 271f8833479SBarry Smith # CONLY or CPP. We should change the PETSc makefiles to do this better 272f8833479SBarry Smith if self.languages.clanguage == 'C': lang = 'CONLY' 273f8833479SBarry Smith else: lang = 'CXXONLY' 274f8833479SBarry Smith self.addMakeMacro('PETSC_LANGUAGE',lang) 275f8833479SBarry Smith 276f8833479SBarry Smith # real or complex 277f8833479SBarry Smith self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 278f8833479SBarry Smith # double or float 279f8833479SBarry Smith self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 280f8833479SBarry Smith 281f8833479SBarry Smith if self.framework.argDB['with-batch']: 282f8833479SBarry Smith self.addMakeMacro('PETSC_WITH_BATCH','1') 283f8833479SBarry Smith 284f8833479SBarry Smith # Test for compiler-specific macros that need to be defined. 285b409243cSBarry Smith if self.setCompilers.isCrayVector('CC'): 286b409243cSBarry Smith self.addDefine('HAVE_CRAY_VECTOR','1') 287f8833479SBarry Smith 288f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 289df1a78b3SMatthew G Knepley if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket') and self.headers.haveHeader('netinet/in.h'): 290f8833479SBarry Smith self.addDefine('USE_SOCKET_VIEWER','1') 29180e3883bSBarry Smith if self.checkCompile('#include <sys/socket.h>','setsockopt(0,SOL_SOCKET,SO_REUSEADDR,0,0)'): 29280e3883bSBarry Smith self.addDefine('HAVE_SO_REUSEADDR','1') 293f8833479SBarry Smith 294f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 295a6cc6bb1SBarry Smith # print include and lib for makefiles 296f8833479SBarry Smith self.framework.packages.reverse() 297a6cc6bb1SBarry Smith includes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')] 298996b3231SBarry Smith libs = [] 299f8833479SBarry Smith for i in self.framework.packages: 300898a086dSBarry Smith if i.useddirectly: 301eeb16384SBarry Smith self.addDefine('HAVE_'+i.PACKAGE.replace('-','_'), 1) # ONLY list package if it is used directly by PETSc (and not only by another package) 302f8833479SBarry Smith if not isinstance(i.lib, list): 303f8833479SBarry Smith i.lib = [i.lib] 304ac9e4c42SSatish Balay libs.extend(i.lib) 305eeb16384SBarry Smith self.addMakeMacro(i.PACKAGE.replace('-','_')+'_LIB', self.libraries.toStringNoDupes(i.lib)) 306f8833479SBarry Smith if hasattr(i,'include'): 307f8833479SBarry Smith if not isinstance(i.include,list): 308f8833479SBarry Smith i.include = [i.include] 309ac9e4c42SSatish Balay includes.extend(i.include) 310eeb16384SBarry Smith self.addMakeMacro(i.PACKAGE.replace('-','_')+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 3112df986feSBarry Smith if self.framework.argDB['with-single-library']: 312262119f8SBarry 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 313262119f8SBarry Smith self.addMakeMacro('PETSC_WITH_EXTERNAL_LIB',self.alllibs) 31491bb3077SSatish Balay else: 31591bb3077SSatish 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 31623e93537SBarry 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) 31723e93537SBarry 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 318262119f8SBarry Smith self.allincludes = self.headers.toStringNoDupes(includes) 319262119f8SBarry Smith self.addMakeMacro('PETSC_CC_INCLUDES',self.allincludes) 320262119f8SBarry Smith self.PETSC_CC_INCLUDES = self.allincludes 321cbd5cc15SBarry Smith if hasattr(self.compilers, 'FC'): 322208c3fd5SBarry Smith if self.compilers.fortranIsF90: 32343a63bfbSSatish Balay self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes,includes)) 32430d43657SSatish Balay else: 32530d43657SSatish Balay self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes)) 326f8833479SBarry Smith 3271b1e03dfSSatish Balay self.addMakeMacro('DESTDIR',self.installdir) 328c6f99f23SBarry Smith self.addDefine('LIB_DIR','"'+os.path.join(self.installdir,'lib')+'"') 329f8833479SBarry Smith 3300f3b21c2SBarry Smith if self.framework.argDB['with-single-library']: 3310f3b21c2SBarry Smith # overrides the values set in conf/variables 3320f3b21c2SBarry Smith self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 33357cb31baSSatish Balay self.addMakeMacro('SHLIBS','libpetsc') 334bccf1c12SBarry Smith self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 335797063a9SSatish Balay self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 336797063a9SSatish Balay self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 337bb84e0fdSBarry Smith self.addDefine('USE_SINGLE_LIBRARY', '1') 3382df986feSBarry Smith if self.sharedlibraries.useShared: 339ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 340ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 341ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 342ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 343ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 344ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 345ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 346fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 347ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 348ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 3492df986feSBarry Smith else: 350ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 351ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 352ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}') 353ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}') 354ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}') 355ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}') 356ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 357fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 358ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 359ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}') 3600f3b21c2SBarry Smith 361f8833479SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 362f8833479SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 363f8833479SBarry Smith 364f8833479SBarry Smith # add a makefile entry for configure options 365f8833479SBarry Smith self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 366f8833479SBarry Smith return 367f8833479SBarry Smith 368f8833479SBarry Smith def dumpConfigInfo(self): 369f8833479SBarry Smith import time 370f8833479SBarry Smith fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 371f8833479SBarry Smith fd.write('static const char *petscconfigureruntime = "'+time.ctime(time.time())+'";\n') 372f8833479SBarry Smith fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 373f8833479SBarry Smith fd.close() 374f8833479SBarry Smith return 375f8833479SBarry Smith 3762a4161d9SMatthew G Knepley def dumpMachineInfo(self): 3772a4161d9SMatthew G Knepley import platform 3782a4161d9SMatthew G Knepley import time 37940373944SSatish Balay import script 3802a4161d9SMatthew G Knepley fd = file(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w') 3812a4161d9SMatthew G Knepley fd.write('static const char *petscmachineinfo = \"\\n\"\n') 3822a4161d9SMatthew G Knepley fd.write('\"-----------------------------------------\\n\"\n') 3832a4161d9SMatthew G Knepley fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (time.ctime(time.time()), platform.node())) 38460acdfe7SSatish Balay fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform())) 38560acdfe7SSatish Balay fd.write('\"Using PETSc directory: %s\\n\"\n' % (self.petscdir.dir)) 38660acdfe7SSatish Balay fd.write('\"Using PETSc arch: %s\\n\"\n' % (self.arch.arch)) 387cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3882a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerinfo = \"\\n\"\n') 3892a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 39060acdfe7SSatish Balay fd.write('\"Using C compiler: %s %s ${COPTFLAGS} ${CFLAGS}\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags())) 3912a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 3928782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 3932a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 39460acdfe7SSatish Balay fd.write('\"Using Fortran compiler: %s %s ${FOPTFLAGS} ${FFLAGS} %s\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags(), self.setCompilers.CPPFLAGS)) 3952a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 396cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3972a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n') 398ac448642SSatish 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('\\ ','\\\\ '))) 399cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4002a4161d9SMatthew G Knepley fd.write('static const char *petsclinkerinfo = \"\\n\"\n') 4012a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 40260acdfe7SSatish Balay fd.write('\"Using C linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 4032a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 4048782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 4052a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 40660acdfe7SSatish Balay fd.write('\"Using Fortran linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 4072a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 408ad782ac6SSatish Balay if self.framework.argDB['with-single-library']: 409ad782ac6SSatish Balay petsclib = '-lpetsc' 410ad782ac6SSatish Balay else: 411ad782ac6SSatish Balay petsclib = '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys' 412ac448642SSatish 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('\\ ','\\\\ '))) 413cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4142a4161d9SMatthew G Knepley fd.close() 4152a4161d9SMatthew G Knepley return 416b2843cf1SBarry Smith 417511a6afcSJed Brown def dumpCMakeConfig(self): 418511a6afcSJed Brown ''' 41934ed7027SBarry Smith Writes configuration-specific values to ${PETSC_ARCH}/conf/PETScConfig.cmake. 420511a6afcSJed Brown This file is private to PETSc and should not be included by third parties 421511a6afcSJed Brown (a suitable file can be produced later by CMake, but this is not it). 422511a6afcSJed Brown ''' 423511a6afcSJed Brown def cmakeset(fd,key,val=True): 424511a6afcSJed Brown if val == True: val = 'YES' 425511a6afcSJed Brown if val == False: val = 'NO' 426511a6afcSJed Brown fd.write('set (' + key + ' ' + val + ')\n') 427511a6afcSJed Brown def ensurelist(a): 428826d9344SJed Brown if isinstance(a,list): 429826d9344SJed Brown return a 430826d9344SJed Brown else: 431826d9344SJed Brown return [a] 432511a6afcSJed Brown def libpath(lib): 433511a6afcSJed Brown 'Returns a search path if that is what this item provides, else "" which will be cleaned out later' 4341b1c0b30SJed Brown if not isinstance(lib,str): return '' 435511a6afcSJed Brown if lib.startswith('-L'): return lib[2:] 436511a6afcSJed Brown if lib.startswith('-R'): return lib[2:] 437511a6afcSJed Brown if lib.startswith('-Wl,-rpath,'): 438511a6afcSJed Brown # This case occurs when an external package needs a specific system library that is normally provided by the compiler. 439511a6afcSJed Brown # In other words, the -L path is builtin to the wrapper or compiler, here we provide it so that CMake can locate the 440511a6afcSJed Brown # corresponding library. 441511a6afcSJed Brown return lib[len('-Wl,-rpath,'):] 442511a6afcSJed Brown if lib.startswith('-'): return '' 443511a6afcSJed Brown return os.path.dirname(lib) 444511a6afcSJed Brown def cleanlib(lib): 445511a6afcSJed Brown 'Returns a library name if that is what this item provides, else "" which will be cleaned out later' 44642e8629dSMatthew G Knepley if not isinstance(lib,str): return '' 447511a6afcSJed Brown if lib.startswith('-l'): return lib[2:] 448511a6afcSJed Brown if lib.startswith('-Wl') or lib.startswith('-L'): return '' 449511a6afcSJed Brown lib = os.path.splitext(os.path.basename(lib))[0] 450511a6afcSJed Brown if lib.startswith('lib'): return lib[3:] 451511a6afcSJed Brown return lib 452511a6afcSJed Brown def nub(lst): 45306e8c1ddSJed Brown 'Return a list containing the first occurrence of each unique element' 454511a6afcSJed Brown unique = [] 455511a6afcSJed Brown for elem in lst: 456511a6afcSJed Brown if elem not in unique and elem != '': 457511a6afcSJed Brown unique.append(elem) 458511a6afcSJed Brown return unique 45950937898SJed Brown try: reversed # reversed was added in Python-2.4 46050937898SJed Brown except NameError: 46150937898SJed Brown def reversed(lst): return lst[::-1] 46206e8c1ddSJed Brown def nublast(lst): 46306e8c1ddSJed Brown 'Return a list containing the last occurrence of each unique entry in a list' 46450937898SJed Brown return reversed(nub(reversed(lst))) 465511a6afcSJed Brown def cmakeexpand(varname): 466511a6afcSJed Brown return r'"${' + varname + r'}"' 467582751aaSJed Brown def uniqextend(lst,new): 468511a6afcSJed Brown for x in ensurelist(new): 469582751aaSJed Brown if x not in lst: 470582751aaSJed Brown lst.append(x) 471511a6afcSJed Brown def notstandardinclude(path): 472040257f2SJed Brown return path not in '/usr/include'.split() # /usr/local/include is not automatically included on FreeBSD 473511a6afcSJed Brown def writeMacroDefinitions(fd): 474511a6afcSJed Brown if self.mpi.usingMPIUni: 475511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_MPIUNI') 476511a6afcSJed Brown for pkg in self.framework.packages: 477511a6afcSJed Brown if pkg.useddirectly: 478eeb16384SBarry Smith cmakeset(fd,'PETSC_HAVE_' + pkg.PACKAGE.replace('-','_')) 479a23e9343SMatthew G Knepley for pair in pkg.defines.items(): 480440af75fSJed Brown if pair[0].startswith('HAVE_') and pair[1]: 481a23e9343SMatthew G Knepley cmakeset(fd, self.framework.getFullDefineName(pkg, pair[0]), pair[1]) 482511a6afcSJed Brown for name,val in self.functions.defines.items(): 483511a6afcSJed Brown cmakeset(fd,'PETSC_'+name,val) 484511a6afcSJed Brown for dct in [self.defines, self.libraryoptions.defines]: 485511a6afcSJed Brown for k,v in dct.items(): 486511a6afcSJed Brown if k.startswith('USE_'): 487511a6afcSJed Brown cmakeset(fd,'PETSC_' + k, v) 488511a6afcSJed Brown cmakeset(fd,'PETSC_USE_COMPLEX', self.scalartypes.scalartype == 'complex') 489ce63c4c1SBarry Smith cmakeset(fd,'PETSC_USE_REAL_' + self.scalartypes.precision.upper()) 490511a6afcSJed Brown cmakeset(fd,'PETSC_CLANGUAGE_'+self.languages.clanguage) 491511a6afcSJed Brown if hasattr(self.compilers, 'FC'): 492511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_FORTRAN') 493511a6afcSJed Brown if self.compilers.fortranIsF90: 494511a6afcSJed Brown cmakeset(fd,'PETSC_USING_F90') 495876d5c60SBarry Smith if self.compilers.fortranIsF2003: 496876d5c60SBarry Smith cmakeset(fd,'PETSC_USING_F2003') 49713c0a95cSJed Brown if hasattr(self.compilers, 'CXX'): 49813c0a95cSJed Brown cmakeset(fd,'PETSC_HAVE_CXX') 499511a6afcSJed Brown if self.sharedlibraries.useShared: 500511a6afcSJed Brown cmakeset(fd,'BUILD_SHARED_LIBS') 501511a6afcSJed Brown def writeBuildFlags(fd): 50206e8c1ddSJed Brown def extendby(lib): 50306e8c1ddSJed Brown libs = ensurelist(lib) 50406e8c1ddSJed Brown lib_paths.extend(map(libpath,libs)) 50506e8c1ddSJed Brown lib_libs.extend(map(cleanlib,libs)) 506511a6afcSJed Brown lib_paths = [] 507511a6afcSJed Brown lib_libs = [] 508511a6afcSJed Brown includes = [] 509511a6afcSJed Brown libvars = [] 510511a6afcSJed Brown for pkg in self.framework.packages: 51106e8c1ddSJed Brown extendby(pkg.lib) 512040257f2SJed Brown uniqextend(includes,pkg.include) 51306e8c1ddSJed Brown extendby(self.libraries.math) 51406e8c1ddSJed Brown extendby(self.libraries.rt) 51506e8c1ddSJed Brown extendby(self.compilers.flibs) 51606e8c1ddSJed Brown extendby(self.compilers.cxxlibs) 51706e8c1ddSJed Brown extendby(self.compilers.LIBS.split()) 51806e8c1ddSJed Brown for libname in nublast(lib_libs): 519511a6afcSJed Brown libvar = 'PETSC_' + libname.upper() + '_LIB' 5204c0032a9SSatish Balay addpath = '' 52106e8c1ddSJed Brown for lpath in nublast(lib_paths): 5224c0032a9SSatish Balay addpath += '"' + str(lpath) + '" ' 5234c0032a9SSatish Balay fd.write('find_library (' + libvar + ' ' + libname + ' HINTS ' + addpath + ')\n') 524511a6afcSJed Brown libvars.append(libvar) 525511a6afcSJed Brown fd.write('mark_as_advanced (' + ' '.join(libvars) + ')\n') 526511a6afcSJed Brown fd.write('set (PETSC_PACKAGE_LIBS ' + ' '.join(map(cmakeexpand,libvars)) + ')\n') 527040257f2SJed Brown includes = filter(notstandardinclude,includes) 528040257f2SJed Brown fd.write('set (PETSC_PACKAGE_INCLUDES ' + ' '.join(map(lambda i: '"'+i+'"',includes)) + ')\n') 529511a6afcSJed Brown fd = open(os.path.join(self.arch.arch,'conf','PETScConfig.cmake'), 'w') 530511a6afcSJed Brown writeMacroDefinitions(fd) 531511a6afcSJed Brown writeBuildFlags(fd) 532511a6afcSJed Brown fd.close() 533511a6afcSJed Brown return 534511a6afcSJed Brown 5358b0282a9SJed Brown def dumpCMakeLists(self): 5368b0282a9SJed Brown import sys 5378b0282a9SJed Brown if sys.version_info >= (2,5): 5388b0282a9SJed Brown import cmakegen 5398b0282a9SJed Brown try: 540a98e69d2SJed Brown cmakegen.main(self.petscdir.dir, log=self.framework.log) 5418b0282a9SJed Brown except (OSError), e: 5428b0282a9SJed Brown self.framework.logPrint('Generating CMakeLists.txt failed:\n' + str(e)) 543aac20692SSatish Balay else: 544aac20692SSatish Balay self.framework.logPrint('Skipping cmakegen due to old python version: ' +str(sys.version_info) ) 5458b0282a9SJed Brown 5468b0282a9SJed Brown def cmakeBoot(self): 5478b0282a9SJed Brown import sys 548ae937f1dSJed Brown self.cmakeboot_success = False 5490b7111d2SJed Brown if sys.version_info >= (2,5) and hasattr(self.cmake,'cmake'): 550356464bcSMatthew G Knepley try: 5518b0282a9SJed Brown import cmakeboot 552ae937f1dSJed Brown self.cmakeboot_success = cmakeboot.main(petscdir=self.petscdir.dir,petscarch=self.arch.arch,argDB=self.argDB,framework=self.framework,log=self.framework.log) 5538b0282a9SJed Brown except (OSError), e: 5548b0282a9SJed Brown self.framework.logPrint('Booting CMake in PETSC_ARCH failed:\n' + str(e)) 555356464bcSMatthew G Knepley except (ImportError, KeyError), e: 556356464bcSMatthew G Knepley self.framework.logPrint('Importing cmakeboot failed:\n' + str(e)) 5579b12c9c7SJed Brown if self.cmakeboot_success: 5589b12c9c7SJed Brown if self.framework.argDB['with-cuda']: # Our CMake build does not support CUDA at this time 5599b12c9c7SJed Brown self.framework.logPrint('CMake configured successfully, but could not be used by default because --with-cuda was used\n') 560800adc4dSSatish Balay elif hasattr(self.compilers, 'FC') and self.compilers.fortranIsF90 and not self.setCompilers.fortranModuleOutputFlag: 56191f9b906SSatish Balay self.framework.logPrint('CMake configured successfully, but could not be used by default because of missing fortranModuleOutputFlag\n') 5629b12c9c7SJed Brown else: 5639b12c9c7SJed Brown self.framework.logPrint('CMake configured successfully, using as default build\n') 564f7b66a64SJed Brown self.addMakeMacro('PETSC_BUILD_USING_CMAKE',1) 565aac20692SSatish Balay else: 5669b12c9c7SJed Brown self.framework.logPrint('CMake configuration was unsuccessful\n') 5679b12c9c7SJed Brown else: 568aac20692SSatish Balay self.framework.logPrint('Skipping cmakeboot due to old python version: ' +str(sys.version_info) ) 569356464bcSMatthew G Knepley return 5708b0282a9SJed Brown 571b2843cf1SBarry Smith def configurePrefetch(self): 572b2843cf1SBarry Smith '''Sees if there are any prefetch functions supported''' 573525d6f2eSBarry Smith if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-ios']: 57493f78423SSatish Balay self.addDefine('Prefetch(a,b,c)', ' ') 57593f78423SSatish Balay return 576ec284106SBarry Smith self.pushLanguage(self.languages.clanguage) 57710699583SJed Brown if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'): 57850d8bf02SJed Brown # The Intel Intrinsics manual [1] specifies the prototype 57950d8bf02SJed Brown # 58050d8bf02SJed Brown # void _mm_prefetch(char const *a, int sel); 58150d8bf02SJed Brown # 58250d8bf02SJed Brown # but other vendors seem to insist on using subtly different 58350d8bf02SJed Brown # prototypes, including void* for the pointer, and an enum for 58450d8bf02SJed Brown # sel. These are both reasonable changes, but negatively impact 58550d8bf02SJed Brown # portability. 58650d8bf02SJed Brown # 58750d8bf02SJed Brown # [1] http://software.intel.com/file/6373 58850d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 58950d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))') 59050d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 59150d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 59250d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 59350d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 59450d8bf02SJed Brown elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'): 59550d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 59650d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))') 59750d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 59850d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 59950d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 60050d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 60110699583SJed Brown elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 60210699583SJed Brown # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality) 60310699583SJed Brown # 60410699583SJed Brown # The value of rw is a compile-time constant one or zero; one 60510699583SJed Brown # means that the prefetch is preparing for a write to the memory 60610699583SJed Brown # address and zero, the default, means that the prefetch is 60710699583SJed Brown # preparing for a read. The value locality must be a compile-time 60810699583SJed Brown # constant integer between zero and three. A value of zero means 60910699583SJed Brown # that the data has no temporal locality, so it need not be left 61010699583SJed Brown # in the cache after the access. A value of three means that the 61110699583SJed Brown # data has a high degree of temporal locality and should be left 61210699583SJed Brown # in all levels of cache possible. Values of one and two mean, 61310699583SJed Brown # respectively, a low or moderate degree of temporal locality. 61410699583SJed Brown # 61510699583SJed Brown # Here we adopt Intel's x86/x86-64 naming scheme for the locality 61610699583SJed Brown # hints. Using macros for these values in necessary since some 61710699583SJed Brown # compilers require an enum. 61810699583SJed Brown self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))') 61910699583SJed Brown self.addDefine('PREFETCH_HINT_NTA', '0') 62010699583SJed Brown self.addDefine('PREFETCH_HINT_T0', '3') 62110699583SJed Brown self.addDefine('PREFETCH_HINT_T1', '2') 62210699583SJed Brown self.addDefine('PREFETCH_HINT_T2', '1') 623b2843cf1SBarry Smith else: 624b2843cf1SBarry Smith self.addDefine('Prefetch(a,b,c)', ' ') 6257d490b44SBarry Smith self.popLanguage() 626b2843cf1SBarry Smith 62773fca5a0SBarry Smith def configureFeatureTestMacros(self): 62873fca5a0SBarry Smith '''Checks if certain feature test macros are support''' 6296028a65fSShri Abhyankar if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <sysctl.h>',''): 63073fca5a0SBarry Smith self.addDefine('_POSIX_C_SOURCE_200112L', '1') 63109bc878fSSatish Balay if self.checkCompile('#define _BSD_SOURCE\n#include<stdlib.h>',''): 63273fca5a0SBarry Smith self.addDefine('_BSD_SOURCE', '1') 633ea0fecefSShri Abhyankar if self.checkCompile('#define _GNU_SOURCE\n#include <sched.h>','cpu_set_t mset;\nCPU_ZERO(&mset);'): 634ea0fecefSShri Abhyankar self.addDefine('_GNU_SOURCE', '1') 63573fca5a0SBarry Smith 63609bc878fSSatish Balay def configureAtoll(self): 63709bc878fSSatish Balay '''Checks if atoll exists''' 638436b02dcSSatish Balay if self.checkLink('#define _POSIX_C_SOURCE 200112L\n#include <stdlib.h>','long v = atoll("25")') or self.checkLink ('#include <stdlib.h>','long v = atoll("25")'): 63909bc878fSSatish Balay self.addDefine('HAVE_ATOLL', '1') 64009bc878fSSatish Balay 6412400fdedSBarry Smith def configureUnused(self): 6422400fdedSBarry Smith '''Sees if __attribute((unused)) is supported''' 6431adaff47SSean Farley if self.framework.argDB['with-ios']: 6442400fdedSBarry Smith self.addDefine('UNUSED', ' ') 6452400fdedSBarry Smith return 6462400fdedSBarry Smith self.pushLanguage(self.languages.clanguage) 647edf21b64SSatish 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'): 6482400fdedSBarry Smith self.addDefine('UNUSED', '__attribute((unused))') 6492400fdedSBarry Smith else: 6502400fdedSBarry Smith self.addDefine('UNUSED', ' ') 6512400fdedSBarry Smith self.popLanguage() 6522400fdedSBarry Smith 6539800092aSJed Brown def configureExpect(self): 6549800092aSJed Brown '''Sees if the __builtin_expect directive is supported''' 6559800092aSJed Brown self.pushLanguage(self.languages.clanguage) 6569800092aSJed Brown if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'): 6579800092aSJed Brown self.addDefine('HAVE_BUILTIN_EXPECT', 1) 6589800092aSJed Brown self.popLanguage() 6599800092aSJed Brown 66053c77d0aSJed Brown def configureFunctionName(self): 6611ec50b02SJed Brown '''Sees if the compiler supports __func__ or a variant. Falls back 6621ec50b02SJed Brown on __FUNCT__ which PETSc source defines, but most users do not, thus 6631ec50b02SJed Brown stack traces through user code are better when the compiler's 6641ec50b02SJed Brown variant is used.''' 6651ec50b02SJed Brown def getFunctionName(lang): 6661ec50b02SJed Brown name = '__FUNCT__' 6671ec50b02SJed Brown self.pushLanguage(lang) 66853c77d0aSJed Brown if self.checkLink('', "if (__func__[0] != 'm') return 1;"): 6691ec50b02SJed Brown name = '__func__' 67053c77d0aSJed Brown elif self.checkLink('', "if (__FUNCTION__[0] != 'm') return 1;"): 6711ec50b02SJed Brown name = '__FUNCTION__' 6721ec50b02SJed Brown self.popLanguage() 6731ec50b02SJed Brown return name 6741ec50b02SJed Brown langs = [] 675628773c9SSatish Balay 676628773c9SSatish Balay self.addDefine('FUNCTION_NAME_C', getFunctionName('C')) 677628773c9SSatish Balay if hasattr(self.compilers, 'CXX'): 678628773c9SSatish Balay self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx')) 67912607bf0SSatish Balay else: 68012607bf0SSatish Balay self.addDefine('FUNCTION_NAME_CXX', '__FUNCT__') 68153c77d0aSJed Brown 682753ebd1dSJed Brown def configureIntptrt(self): 683753ebd1dSJed Brown '''Determine what to use for uintptr_t''' 684753ebd1dSJed Brown def staticAssertSizeMatchesVoidStar(inc,typename): 685753ebd1dSJed Brown # The declaration is an error if either array size is negative. 686753ebd1dSJed 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 687d26187a0SJed Brown return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n' 688979939cdSSatish Balay + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename)) 689753ebd1dSJed Brown self.pushLanguage(self.languages.clanguage) 690753ebd1dSJed Brown if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'): 691753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'uintptr_t') 692753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long long'): 693753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned long long') 694753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'): 695753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'size_t') 696c82284b1SJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long'): 697c82284b1SJed Brown self.addDefine('UINTPTR_T', 'unsigned long') 6982d1b7972SSatish Balay elif staticAssertSizeMatchesVoidStar('','unsigned'): 699753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned') 700d26187a0SJed Brown else: 701d26187a0SJed Brown raise RuntimeError('Could not find any unsigned integer type matching void*') 702753ebd1dSJed Brown self.popLanguage() 703753ebd1dSJed Brown 704f8833479SBarry Smith def configureInline(self): 705f8833479SBarry Smith '''Get a generic inline keyword, depending on the language''' 706f8833479SBarry Smith if self.languages.clanguage == 'C': 707f8833479SBarry Smith self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword) 708f8833479SBarry Smith self.addDefine('RESTRICT', self.compilers.cRestrict) 709f8833479SBarry Smith elif self.languages.clanguage == 'Cxx': 710f8833479SBarry Smith self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword) 711f8833479SBarry Smith self.addDefine('RESTRICT', self.compilers.cxxRestrict) 712bfef2c86SBarry Smith 713bfef2c86SBarry Smith if self.checkCompile('#include <dlfcn.h>\n void *ptr = RTLD_DEFAULT;'): 714bfef2c86SBarry Smith self.addDefine('RTLD_DEFAULT','1') 715f8833479SBarry Smith return 716f8833479SBarry Smith 717f8833479SBarry Smith def configureSolaris(self): 718f8833479SBarry Smith '''Solaris specific stuff''' 719f8833479SBarry Smith if os.path.isdir(os.path.join('/usr','ucblib')): 720f8833479SBarry Smith try: 721f8833479SBarry Smith flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 722f8833479SBarry Smith except AttributeError: 723f8833479SBarry Smith flag = None 724f8833479SBarry Smith if flag is None: 725f8833479SBarry Smith self.compilers.LIBS += ' -L/usr/ucblib' 726f8833479SBarry Smith else: 727f8833479SBarry Smith self.compilers.LIBS += ' '+flag+'/usr/ucblib' 728f8833479SBarry Smith return 729f8833479SBarry Smith 730f8833479SBarry Smith def configureLinux(self): 731f8833479SBarry Smith '''Linux specific stuff''' 7329f15855cSMatthew G Knepley # TODO: Test for this by mallocing an odd number of floats and checking the address 733f8833479SBarry Smith self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 734f8833479SBarry Smith return 735f8833479SBarry Smith 736f8833479SBarry Smith def configureWin32(self): 737f8833479SBarry Smith '''Win32 non-cygwin specific stuff''' 738f8833479SBarry Smith kernel32=0 739f8833479SBarry Smith if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 740f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 741f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 742f8833479SBarry Smith kernel32=1 743f8833479SBarry Smith elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 744f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 745f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 746f8833479SBarry Smith kernel32=1 747f8833479SBarry Smith if kernel32: 748eed94e11SSatish Balay if self.framework.argDB['with-windows-graphics']: 749eed94e11SSatish Balay self.addDefine('USE_WINDOWS_GRAPHICS',1) 750f8833479SBarry Smith if self.checkLink('#include <Windows.h>','LoadLibrary(0)'): 751f8833479SBarry Smith self.addDefine('HAVE_LOADLIBRARY',1) 752b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'): 753b50f6d9eSLisandro Dalcin self.addDefine('HAVE_GETPROCADDRESS',1) 754b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','FreeLibrary(0)'): 755b50f6d9eSLisandro Dalcin self.addDefine('HAVE_FREELIBRARY',1) 756a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','GetLastError()'): 757a21658a3SLisandro Dalcin self.addDefine('HAVE_GETLASTERROR',1) 758a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','SetLastError(0)'): 759a21658a3SLisandro Dalcin self.addDefine('HAVE_SETLASTERROR',1) 760f8833479SBarry Smith if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'): 761f8833479SBarry Smith self.addDefine('USE_NT_TIME',1) 762f8833479SBarry Smith if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 763f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 764f8833479SBarry Smith elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 765f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 766f8833479SBarry Smith 767f8833479SBarry Smith if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'): 768f8833479SBarry Smith self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);') 769f8833479SBarry Smith if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'): 770f8833479SBarry Smith self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);') 771f8833479SBarry Smith 772f8833479SBarry Smith self.types.check('int32_t', 'int') 773f8833479SBarry Smith if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 774f8833479SBarry Smith self.addTypedef('int', 'uid_t') 775f8833479SBarry Smith self.addTypedef('int', 'gid_t') 776f8833479SBarry Smith if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 777f8833479SBarry Smith self.framework.addDefine('R_OK', '04') 778f8833479SBarry Smith self.framework.addDefine('W_OK', '02') 779f8833479SBarry Smith self.framework.addDefine('X_OK', '01') 780f8833479SBarry Smith if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 781f8833479SBarry Smith self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 782f8833479SBarry Smith self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 783f8833479SBarry Smith if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 784f8833479SBarry Smith self.addDefine('HAVE_LARGE_INTEGER_U',1) 785f8833479SBarry Smith 786f8833479SBarry Smith # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 787ef2cfba3SSatish Balay if self.checkCompile('#include <Windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'): 788f8833479SBarry Smith self.addDefine('HAVE_O_BINARY',1) 789f8833479SBarry Smith 790f8833479SBarry Smith if self.compilers.CC.find('win32fe') >= 0: 791f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\';\'') 792f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'\\\\\'') 793f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 794f8833479SBarry Smith self.addDefine('CANNOT_START_DEBUGGER',1) 795f8833479SBarry Smith else: 796f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\':\'') 797f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 798f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'/\'') 799bfef2c86SBarry Smith 800f8833479SBarry Smith return 801f8833479SBarry Smith 802f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 803569865ddSSatish Balay def configureDefaultArch(self): 804569865ddSSatish Balay conffile = os.path.join('conf', 'petscvariables') 805569865ddSSatish Balay if self.framework.argDB['with-default-arch']: 806569865ddSSatish Balay fd = file(conffile, 'w') 807569865ddSSatish Balay fd.write('PETSC_ARCH='+self.arch.arch+'\n') 808da93591fSBarry Smith fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 8093435dde8SSatish Balay fd.write('include '+os.path.join(self.petscdir.dir,self.arch.arch,'conf','petscvariables')+'\n') 810569865ddSSatish Balay fd.close() 811569865ddSSatish Balay self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 812569865ddSSatish Balay elif os.path.isfile(conffile): 813569865ddSSatish Balay try: 814569865ddSSatish Balay os.unlink(conffile) 815569865ddSSatish Balay except: 816569865ddSSatish Balay raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 817569865ddSSatish Balay return 818569865ddSSatish Balay 819569865ddSSatish Balay#----------------------------------------------------------------------------------------------------- 820f8833479SBarry Smith def configureScript(self): 821f8833479SBarry Smith '''Output a script in the conf directory which will reproduce the configuration''' 822f8833479SBarry Smith import nargs 823495bf1a9SSatish Balay import sys 824495bf1a9SSatish Balay scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py') 825f8833479SBarry Smith args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 826f8833479SBarry Smith if 'configModules' in args: 8271063a081SSatish Balay if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 828f8833479SBarry Smith del args['configModules'] 829f8833479SBarry Smith if 'optionsModule' in args: 830c1486898SMatthew Knepley if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions': 831f8833479SBarry Smith del args['optionsModule'] 832f8833479SBarry Smith if not 'PETSC_ARCH' in args: 8331063a081SSatish Balay args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 834f8833479SBarry Smith f = file(scriptName, 'w') 835495bf1a9SSatish Balay f.write('#!'+sys.executable+'\n') 836f8833479SBarry Smith f.write('if __name__ == \'__main__\':\n') 837f8833479SBarry Smith f.write(' import sys\n') 8387561c02cSSatish Balay f.write(' import os\n') 8397561c02cSSatish Balay f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 840f8833479SBarry Smith f.write(' import configure\n') 8411063a081SSatish Balay # pretty print repr(args.values()) 8421063a081SSatish Balay f.write(' configure_options = [\n') 8438bec23c5SJed Brown for itm in sorted(args.values()): 8441063a081SSatish Balay f.write(' \''+str(itm)+'\',\n') 8451063a081SSatish Balay f.write(' ]\n') 846f8833479SBarry Smith f.write(' configure.petsc_configure(configure_options)\n') 847f8833479SBarry Smith f.close() 848f8833479SBarry Smith try: 849f8833479SBarry Smith os.chmod(scriptName, 0775) 850f8833479SBarry Smith except OSError, e: 851f8833479SBarry Smith self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 852f8833479SBarry Smith self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 853f8833479SBarry Smith return 854f8833479SBarry Smith 855f8833479SBarry Smith def configureInstall(self): 856f8833479SBarry Smith '''Setup the directories for installation''' 857f8833479SBarry Smith if self.framework.argDB['prefix']: 858f8833479SBarry Smith self.installdir = self.framework.argDB['prefix'] 859824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\ 860824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 861315b77e6SSatish Balay '-@echo "========================================="']) 862f8833479SBarry Smith else: 863b559b537SSatish Balay self.installdir = os.path.join(self.petscdir.dir,self.arch.arch) 864824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\ 865824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\ 866315b77e6SSatish Balay '-@echo "========================================="']) 867f8833479SBarry Smith return 868f8833479SBarry Smith 869f8833479SBarry Smith def configureGCOV(self): 870f8833479SBarry Smith if self.framework.argDB['with-gcov']: 871f8833479SBarry Smith self.addDefine('USE_GCOV','1') 872f8833479SBarry Smith return 873f8833479SBarry Smith 874f8833479SBarry Smith def configureFortranFlush(self): 875f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 876f8833479SBarry Smith for baseName in ['flush','flush_']: 877f8833479SBarry Smith if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1): 878f8833479SBarry Smith self.addDefine('HAVE_'+baseName.upper(), 1) 879f8833479SBarry Smith return 880f8833479SBarry Smith 88128bb2e72SSatish Balay def postProcessPackages(self): 88228bb2e72SSatish Balay postPackages=[] 88328bb2e72SSatish Balay for i in self.framework.packages: 88428bb2e72SSatish Balay if hasattr(i,'postProcess'): postPackages.append(i) 88528bb2e72SSatish Balay if postPackages: 886e64d19dfSSatish Balay # ctetgen needs petsc conf files. so attempt to create them early 887a77eb93bSSatish Balay self.framework.dumpConfFiles() 88828bb2e72SSatish Balay for i in postPackages: i.postProcess() 88928bb2e72SSatish Balay return 890f8833479SBarry Smith 891f8833479SBarry Smith def configure(self): 892f8833479SBarry Smith if not os.path.samefile(self.petscdir.dir, os.getcwd()): 893f8833479SBarry Smith raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 894550489e3SMatthew 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): 8953552d8fbSSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 896c16c35a9SSatish 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)): 897c16c35a9SSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!') 898f16c1317SJed Brown self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 899f16c1317SJed Brown self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 900f16c1317SJed Brown self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables') 901f16c1317SJed Brown self.framework.makeRuleHeader = os.path.join(self.arch.arch,'conf','petscrules') 902f8833479SBarry Smith if self.libraries.math is None: 903f8833479SBarry Smith raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 904f8833479SBarry Smith if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 905f8833479SBarry Smith raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 906f8833479SBarry Smith self.executeTest(self.configureInline) 907b2843cf1SBarry Smith self.executeTest(self.configurePrefetch) 9082400fdedSBarry Smith self.executeTest(self.configureUnused) 9099800092aSJed Brown self.executeTest(self.configureExpect); 91053c77d0aSJed Brown self.executeTest(self.configureFunctionName); 911753ebd1dSJed Brown self.executeTest(self.configureIntptrt); 912f8833479SBarry Smith self.executeTest(self.configureSolaris) 913f8833479SBarry Smith self.executeTest(self.configureLinux) 914f8833479SBarry Smith self.executeTest(self.configureWin32) 915569865ddSSatish Balay self.executeTest(self.configureDefaultArch) 916f8833479SBarry Smith self.executeTest(self.configureScript) 917f8833479SBarry Smith self.executeTest(self.configureInstall) 918f8833479SBarry Smith self.executeTest(self.configureGCOV) 919f8833479SBarry Smith self.executeTest(self.configureFortranFlush) 92073fca5a0SBarry Smith self.executeTest(self.configureFeatureTestMacros) 92109bc878fSSatish Balay self.executeTest(self.configureAtoll) 922f8833479SBarry Smith # dummy rules, always needed except for remote builds 923f8833479SBarry Smith self.addMakeRule('remote','') 924f8833479SBarry Smith self.addMakeRule('remoteclean','') 925f8833479SBarry Smith 926f8833479SBarry Smith self.Dump() 927f8833479SBarry Smith self.dumpConfigInfo() 9282a4161d9SMatthew G Knepley self.dumpMachineInfo() 92928bb2e72SSatish Balay self.postProcessPackages() 930511a6afcSJed Brown self.dumpCMakeConfig() 9318b0282a9SJed Brown self.dumpCMakeLists() 9328b0282a9SJed Brown self.cmakeBoot() 933262119f8SBarry Smith self.DumpPkgconfig() 934*351d3a41SMatthew G Knepley self.DumpModule() 935f8833479SBarry Smith self.framework.log.write('================================================================================\n') 936f8833479SBarry Smith self.logClear() 937f8833479SBarry Smith return 938