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') 23ac1d0f13SJed Brown if self.make.getMakeMacro('MAKE_IS_GNUMAKE'): 249481793eSSatish Balay build_type = 'gnumake build' 259481793eSSatish Balay elif self.getMakeMacro('PETSC_BUILD_USING_CMAKE'): 26b3618d6dSSatish Balay build_type = 'cmake build' 27b3618d6dSSatish Balay else: 28b3618d6dSSatish Balay build_type = 'legacy build' 29b3618d6dSSatish Balay desc.append(' Configure stage complete. Now build PETSc libraries with (%s):' % build_type) 30b3618d6dSSatish Balay desc.append(' make PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' all') 31a8a678f1SSatish Balay desc.append(' or (experimental with python):') 32c77b0880SMatthew G Knepley desc.append(' PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' ./config/builder.py') 33a0022257SSatish Balay desc.append('xxx=========================================================================xxx') 347c939e48SSatish Balay return '\n'.join(desc)+'\n' 35f8833479SBarry Smith 36f8833479SBarry Smith def setupHelp(self, help): 37f8833479SBarry Smith import nargs 38ce0b2093SBarry Smith help.addArgument('PETSc', '-prefix=<dir>', nargs.Arg(None, '', 'Specifiy location to install PETSc (eg. /usr/local)')) 39eed94e11SSatish Balay help.addArgument('Windows','-with-windows-graphics=<bool>', nargs.ArgBool(None, 1,'Enable check for Windows Graphics')) 40569865ddSSatish Balay help.addArgument('PETSc', '-with-default-arch=<bool>', nargs.ArgBool(None, 1, 'Allow using the last configured arch without setting PETSC_ARCH')) 4157cb31baSSatish Balay help.addArgument('PETSc','-with-single-library=<bool>', nargs.ArgBool(None, 1,'Put all PETSc code into the single -lpetsc library')) 42525d6f2eSBarry Smith help.addArgument('PETSc', '-with-ios=<bool>', nargs.ArgBool(None, 0, 'Build an iPhone/iPad version of PETSc library')) 43f8833479SBarry Smith return 44f8833479SBarry Smith 45f8833479SBarry Smith def setupDependencies(self, framework): 46f8833479SBarry Smith config.base.Configure.setupDependencies(self, framework) 47f8833479SBarry Smith self.setCompilers = framework.require('config.setCompilers', self) 48f8833479SBarry Smith self.arch = framework.require('PETSc.utilities.arch', self.setCompilers) 49f8833479SBarry Smith self.petscdir = framework.require('PETSc.utilities.petscdir', self.setCompilers) 50*edb8ae0cSSatish Balay self.installdir = framework.require('PETSc.utilities.installDir',self) 51f8833479SBarry Smith self.languages = framework.require('PETSc.utilities.languages', self.setCompilers) 52f8833479SBarry Smith self.debugging = framework.require('PETSc.utilities.debugging', self.setCompilers) 53a2b1cf82SBarry Smith self.CHUD = framework.require('PETSc.utilities.CHUD', self) 54f8833479SBarry Smith self.compilers = framework.require('config.compilers', self) 55f8833479SBarry Smith self.types = framework.require('config.types', self) 56f8833479SBarry Smith self.headers = framework.require('config.headers', self) 57f8833479SBarry Smith self.functions = framework.require('config.functions', self) 58f8833479SBarry Smith self.libraries = framework.require('config.libraries', self) 59cd37d877SShri Abhyankar self.atomics = framework.require('config.atomics', self) 609481793eSSatish Balay self.make = framework.require('config.packages.make', self) 619552296fSBarry Smith self.blasLapack = framework.require('config.packages.BlasLapack',self) 62f8833479SBarry Smith if os.path.isdir(os.path.join('config', 'PETSc')): 63f8833479SBarry Smith for d in ['utilities', 'packages']: 64f8833479SBarry Smith for utility in os.listdir(os.path.join('config', 'PETSc', d)): 65f8833479SBarry Smith (utilityName, ext) = os.path.splitext(utility) 66f8833479SBarry Smith if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__': 67f8833479SBarry Smith utilityObj = self.framework.require('PETSc.'+d+'.'+utilityName, self) 68f8833479SBarry Smith utilityObj.headerPrefix = self.headerPrefix 69f1ecedd2SMatthew Knepley utilityObj.archProvider = self.arch 70fdfda77fSMatthew Knepley utilityObj.languageProvider = self.languages 71*edb8ae0cSSatish Balay utilityObj.installDirProvider = self.installdir 72f8833479SBarry Smith setattr(self, utilityName.lower(), utilityObj) 738cf378d1SBarry Smith 74d37554e4SMatthew G Knepley for package in config.packages.all: 75d37554e4SMatthew G Knepley if not package == 'PETSc': 76d37554e4SMatthew G Knepley packageObj = framework.require('config.packages.'+package, self) 77d37554e4SMatthew G Knepley packageObj.archProvider = self.arch 78d37554e4SMatthew G Knepley packageObj.languageProvider = self.languages 79*edb8ae0cSSatish Balay packageObj.installDirProvider = self.installdir 80d37554e4SMatthew G Knepley setattr(self, package.lower(), packageObj) 81d37554e4SMatthew G Knepley # Force blaslapack to depend on scalarType so precision is set before BlasLapack is built 826d2d6fe1SBarry Smith framework.require('PETSc.utilities.scalarTypes', self.f2cblaslapack) 836d2d6fe1SBarry Smith self.f2cblaslapack.precisionProvider = self.scalartypes 848cf378d1SBarry Smith framework.require('PETSc.utilities.scalarTypes', self.blaslapack) 85f8833479SBarry Smith self.blaslapack.precisionProvider = self.scalartypes 86f8833479SBarry Smith 87f8833479SBarry Smith self.compilers.headerPrefix = self.headerPrefix 88f8833479SBarry Smith self.types.headerPrefix = self.headerPrefix 89f8833479SBarry Smith self.headers.headerPrefix = self.headerPrefix 90f8833479SBarry Smith self.functions.headerPrefix = self.headerPrefix 91f8833479SBarry Smith self.libraries.headerPrefix = self.headerPrefix 92f8833479SBarry Smith self.blaslapack.headerPrefix = self.headerPrefix 93f8833479SBarry Smith self.mpi.headerPrefix = self.headerPrefix 94a8b45ee7SBarry Smith headersC = map(lambda name: name+'.h', ['setjmp','dos', 'endian', 'fcntl', 'float', 'io', 'limits', 'malloc', 'pwd', 'search', 'strings', 95ba61063dSBarry Smith 'unistd', 'sys/sysinfo', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource', 96b4bb646cSSatish Balay 'sys/systeminfo', 'sys/times', 'sys/utsname','string', 'stdlib','memory', 97f8833479SBarry Smith 'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types', 98e4773d96SSatish Balay 'WindowsX', 'cxxabi','float','ieeefp','stdint','sched','pthread','mathimf']) 9945082d64SJed Brown functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 100f8833479SBarry Smith 'gettimeofday', 'getwd', 'memalign', 'memmove', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize', 10138ecfe64SSatish Balay 'readlink', 'realpath', 'sigaction', 'signal', 'sigset', 'usleep', 'sleep', '_sleep', 'socket', 102473bb0d5SSatish Balay 'times', 'gethostbyname', 'uname','snprintf','_snprintf','lseek','_lseek','time','fork','stricmp', 103ac7218bbSSatish Balay 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror','get_nprocs','sysctlbyname', 10464ffe704SBarry Smith '_intel_fast_memcpy','_intel_fast_memset'] 105f8833479SBarry Smith libraries1 = [(['socket', 'nsl'], 'socket'), (['fpe'], 'handle_sigfpes')] 106f8833479SBarry Smith self.headers.headers.extend(headersC) 107f8833479SBarry Smith self.functions.functions.extend(functions) 108f8833479SBarry Smith self.libraries.libraries.extend(libraries1) 1097d421530SBarry Smith 110f8833479SBarry Smith return 111f8833479SBarry Smith 112262119f8SBarry Smith def DumpPkgconfig(self): 113262119f8SBarry Smith ''' Create a pkg-config file ''' 114262119f8SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')): 115262119f8SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')) 116262119f8SBarry Smith fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig','PETSc.pc'),'w') 117262119f8SBarry Smith if self.framework.argDB['prefix']: 118262119f8SBarry Smith installdir = self.framework.argDB['prefix'] 119262119f8SBarry Smith fd.write('prefix='+installdir+'\n') 120262119f8SBarry Smith fd.write('exec_prefix=${prefix}\n') 121262119f8SBarry Smith fd.write('includedir=${prefix}/include\n') 122262119f8SBarry Smith fd.write('libdir='+os.path.join(installdir,'lib')+'\n') 123262119f8SBarry Smith else: 124262119f8SBarry Smith fd.write('prefix='+self.petscdir.dir+'\n') 125262119f8SBarry Smith fd.write('exec_prefix=${prefix}\n') 126262119f8SBarry Smith fd.write('includedir=${prefix}/include\n') 127262119f8SBarry Smith fd.write('libdir='+os.path.join(self.petscdir.dir,self.arch.arch,'lib')+'\n') 128262119f8SBarry Smith 129262119f8SBarry Smith self.setCompilers.pushLanguage('C') 130262119f8SBarry Smith fd.write('ccompiler='+self.setCompilers.getCompiler()+'\n') 131262119f8SBarry Smith self.setCompilers.popLanguage() 132262119f8SBarry Smith if hasattr(self.compilers, 'C++'): 133262119f8SBarry Smith self.setCompilers.pushLanguage('C++') 134262119f8SBarry Smith fd.write('cxxcompiler='+self.setCompilers.getCompiler()+'\n') 135262119f8SBarry Smith self.setCompilers.popLanguage() 136262119f8SBarry Smith if hasattr(self.compilers, 'FC'): 137262119f8SBarry Smith self.setCompilers.pushLanguage('FC') 138262119f8SBarry Smith fd.write('fcompiler='+self.setCompilers.getCompiler()+'\n') 139262119f8SBarry Smith self.setCompilers.popLanguage() 1409552296fSBarry Smith fd.write('blaslapacklibs='+self.libraries.toStringNoDupes(self.blaslapack.lib)+'\n') 141262119f8SBarry Smith 142262119f8SBarry Smith fd.write('\n') 143262119f8SBarry Smith fd.write('Name: PETSc\n') 144262119f8SBarry Smith fd.write('Description: Library to solve ODEs and algebraic equations\n') 145351d3a41SMatthew G Knepley fd.write('Version: %s\n' % self.petscdir.version) 146262119f8SBarry Smith 147262119f8SBarry Smith fd.write('Cflags: '+self.allincludes+'\n') 148262119f8SBarry Smith 149473a3ab2SBarry Smith plibs = self.libraries.toStringNoDupes(['-L'+os.path.join(self.petscdir.dir,self.arch.arch,'lib'),' -lpetsc']) 150262119f8SBarry Smith if self.framework.argDB['prefix']: 151473a3ab2SBarry Smith fd.write('Libs: '+plibs.replace(os.path.join(self.petscdir.dir,self.arch.arch),self.framework.argDB['prefix'])+'\n') 152262119f8SBarry Smith else: 153473a3ab2SBarry Smith fd.write('Libs: '+plibs+'\n') 154473a3ab2SBarry Smith fd.write('Libs.private: '+' '.join(self.packagelibs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))) 155473a3ab2SBarry Smith 156262119f8SBarry Smith fd.close() 157262119f8SBarry Smith return 158262119f8SBarry Smith 159351d3a41SMatthew G Knepley def DumpModule(self): 160351d3a41SMatthew G Knepley ''' Create a module file ''' 161351d3a41SMatthew G Knepley if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','modules')): 162351d3a41SMatthew G Knepley os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','modules')) 163351d3a41SMatthew G Knepley if self.framework.argDB['prefix']: 164351d3a41SMatthew G Knepley installdir = self.framework.argDB['prefix'] 16555d606a3SSatish Balay installarch = '' 16655d606a3SSatish Balay installpath = os.path.join(installdir,'bin') 1670a8310baSBarry Smith fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','modules',self.petscdir.version),'w') 168351d3a41SMatthew G Knepley else: 169351d3a41SMatthew G Knepley installdir = self.petscdir.dir 17055d606a3SSatish Balay installarch = self.arch.arch 17155d606a3SSatish Balay installpath = os.path.join(installdir,installarch,'bin')+':'+os.path.join(installdir,'bin') 17255d606a3SSatish Balay fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','modules',self.petscdir.version+'-'+self.arch.arch),'w') 173351d3a41SMatthew G Knepley fd.write('''\ 174351d3a41SMatthew G Knepley#%%Module 175351d3a41SMatthew G Knepley 176351d3a41SMatthew G Knepleyproc ModulesHelp { } { 177351d3a41SMatthew G Knepley puts stderr "This module sets the path and environment variables for petsc-%s" 178351d3a41SMatthew G Knepley puts stderr " see http://www.mcs.anl.gov/petsc/ for more information " 179351d3a41SMatthew G Knepley puts stderr "" 180351d3a41SMatthew G Knepley} 181351d3a41SMatthew G Knepleymodule-whatis "PETSc - Portable, Extensible Toolkit for Scientific Computation" 182351d3a41SMatthew G Knepley 183351d3a41SMatthew G Knepleyset petsc_dir %s 184351d3a41SMatthew G Knepleyset petsc_arch %s 185351d3a41SMatthew G Knepley 186351d3a41SMatthew G Knepleysetenv PETSC_ARCH $petsc_arch 187351d3a41SMatthew G Knepleysetenv PETSC_DIR $petsc_dir 18855d606a3SSatish Balayprepend-path PATH %s 18955d606a3SSatish Balay''' % (self.petscdir.version, installdir, installarch, installpath)) 190351d3a41SMatthew G Knepley fd.close() 191351d3a41SMatthew G Knepley return 192351d3a41SMatthew G Knepley 193f8833479SBarry Smith def Dump(self): 194f8833479SBarry Smith ''' Actually put the values into the configuration files ''' 195f8833479SBarry Smith # eventually everything between -- should be gone 196f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 197f8833479SBarry Smith 198f8833479SBarry Smith # Sometimes we need C compiler, even if built with C++ 199f8833479SBarry Smith self.setCompilers.pushLanguage('C') 200f8833479SBarry Smith self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 201f8833479SBarry Smith self.setCompilers.popLanguage() 202f8833479SBarry Smith 203f8833479SBarry Smith # C preprocessor values 204a2b1cf82SBarry Smith self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS+self.CHUD.CPPFLAGS) 205f8833479SBarry Smith 206f8833479SBarry Smith # compiler values 207f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 208f8833479SBarry Smith self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 209f8833479SBarry Smith self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 210f8833479SBarry Smith self.setCompilers.popLanguage() 211f8833479SBarry Smith # .o or .obj 212f8833479SBarry Smith self.addMakeMacro('CC_SUFFIX','o') 213f8833479SBarry Smith 214f8833479SBarry Smith # executable linker values 215f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 216f8833479SBarry Smith pcc_linker = self.setCompilers.getLinker() 217f8833479SBarry Smith self.addMakeMacro('PCC_LINKER',pcc_linker) 218c84a332bSSatish Balay self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 219f8833479SBarry Smith self.setCompilers.popLanguage() 220f8833479SBarry Smith # '' for Unix, .exe for Windows 221f8833479SBarry Smith self.addMakeMacro('CC_LINKER_SUFFIX','') 222f8833479SBarry Smith 223f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 224f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 225f8833479SBarry Smith # need FPPFLAGS in config/setCompilers 226f8833479SBarry Smith self.addDefine('HAVE_FORTRAN','1') 227f8833479SBarry Smith self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS) 228f8833479SBarry Smith 229f8833479SBarry Smith # compiler values 230f8833479SBarry Smith self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 231f8833479SBarry Smith self.setCompilers.popLanguage() 232f8833479SBarry Smith # .o or .obj 233f8833479SBarry Smith self.addMakeMacro('FC_SUFFIX','o') 234f8833479SBarry Smith 235f8833479SBarry Smith # executable linker values 236f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 237f8833479SBarry Smith # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker 238f8833479SBarry Smith fc_linker = self.setCompilers.getLinker() 239f8833479SBarry Smith if config.setCompilers.Configure.isNAG(fc_linker): 240f8833479SBarry Smith self.addMakeMacro('FC_LINKER',pcc_linker) 241f8833479SBarry Smith else: 242f8833479SBarry Smith self.addMakeMacro('FC_LINKER',fc_linker) 2436d53d35eSSatish Balay self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 2443feacd00SBarry Smith # apple requires this shared library linker flag on SOME versions of the os 2453feacd00SBarry Smith if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 2463feacd00SBarry Smith self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 247bb82cf9cSSatish Balay self.setCompilers.popLanguage() 2485d631499SMatthew Knepley 2495d631499SMatthew Knepley # F90 Modules 2505d631499SMatthew Knepley if self.setCompilers.fortranModuleIncludeFlag: 2515d631499SMatthew Knepley self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag) 2526ddd6694SSatish Balay else: # for non-f90 compilers like g77 2536ddd6694SSatish Balay self.addMakeMacro('FC_MODULE_FLAG', '-I') 254a324c51cSMatthew G Knepley if self.setCompilers.fortranModuleIncludeFlag: 255a324c51cSMatthew G Knepley self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag) 256f8833479SBarry Smith else: 257f8833479SBarry Smith self.addMakeMacro('FC','') 258f8833479SBarry Smith 25946a3958fSBarry Smith if hasattr(self.compilers, 'CUDAC'): 2607ff2890cSSatish Balay self.setCompilers.pushLanguage('CUDA') 261d93a25ecSSatish Balay self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags()) 2627ff2890cSSatish Balay self.setCompilers.popLanguage() 2637ff2890cSSatish Balay 264f8833479SBarry Smith # shared library linker values 265f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 266f8833479SBarry Smith # need to fix BuildSystem to collect these separately 267f8833479SBarry Smith self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 26870db8aa6SSatish Balay self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 269f8833479SBarry Smith self.setCompilers.popLanguage() 270f8833479SBarry Smith # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 271f8833479SBarry Smith # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 272f8833479SBarry Smith if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 273f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', '') 27446bc77b6SBarry Smith self.addDefine('SLSUFFIX','""') 275f8833479SBarry Smith else: 276f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 27746bc77b6SBarry Smith self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"') 278bb82cf9cSSatish Balay 27923e93537SBarry Smith self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}') 280bb82cf9cSSatish Balay 281f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 282f8833479SBarry Smith 283f8833479SBarry Smith # CONLY or CPP. We should change the PETSc makefiles to do this better 284f8833479SBarry Smith if self.languages.clanguage == 'C': lang = 'CONLY' 285f8833479SBarry Smith else: lang = 'CXXONLY' 286f8833479SBarry Smith self.addMakeMacro('PETSC_LANGUAGE',lang) 287f8833479SBarry Smith 288f8833479SBarry Smith # real or complex 289f8833479SBarry Smith self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 290f8833479SBarry Smith # double or float 291f8833479SBarry Smith self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 292f8833479SBarry Smith 293f8833479SBarry Smith if self.framework.argDB['with-batch']: 294f8833479SBarry Smith self.addMakeMacro('PETSC_WITH_BATCH','1') 295f8833479SBarry Smith 296f8833479SBarry Smith # Test for compiler-specific macros that need to be defined. 297b409243cSBarry Smith if self.setCompilers.isCrayVector('CC'): 298b409243cSBarry Smith self.addDefine('HAVE_CRAY_VECTOR','1') 299f8833479SBarry Smith 300f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 301df1a78b3SMatthew G Knepley if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket') and self.headers.haveHeader('netinet/in.h'): 302f8833479SBarry Smith self.addDefine('USE_SOCKET_VIEWER','1') 30380e3883bSBarry Smith if self.checkCompile('#include <sys/socket.h>','setsockopt(0,SOL_SOCKET,SO_REUSEADDR,0,0)'): 30480e3883bSBarry Smith self.addDefine('HAVE_SO_REUSEADDR','1') 305f8833479SBarry Smith 306f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 307a6cc6bb1SBarry Smith # print include and lib for makefiles 308f8833479SBarry Smith self.framework.packages.reverse() 309a6cc6bb1SBarry Smith includes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')] 310996b3231SBarry Smith libs = [] 311f8833479SBarry Smith for i in self.framework.packages: 312898a086dSBarry Smith if i.useddirectly: 313eeb16384SBarry Smith self.addDefine('HAVE_'+i.PACKAGE.replace('-','_'), 1) # ONLY list package if it is used directly by PETSc (and not only by another package) 314f8833479SBarry Smith if not isinstance(i.lib, list): 315f8833479SBarry Smith i.lib = [i.lib] 316ac9e4c42SSatish Balay libs.extend(i.lib) 317eeb16384SBarry Smith self.addMakeMacro(i.PACKAGE.replace('-','_')+'_LIB', self.libraries.toStringNoDupes(i.lib)) 318f8833479SBarry Smith if hasattr(i,'include'): 319f8833479SBarry Smith if not isinstance(i.include,list): 320f8833479SBarry Smith i.include = [i.include] 321ac9e4c42SSatish Balay includes.extend(i.include) 322eeb16384SBarry Smith self.addMakeMacro(i.PACKAGE.replace('-','_')+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 323473a3ab2SBarry Smith self.packagelibs = libs 3242df986feSBarry Smith if self.framework.argDB['with-single-library']: 325262119f8SBarry 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 326262119f8SBarry Smith self.addMakeMacro('PETSC_WITH_EXTERNAL_LIB',self.alllibs) 32791bb3077SSatish Balay else: 32891bb3077SSatish 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 32923e93537SBarry 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) 33023e93537SBarry 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 331262119f8SBarry Smith self.allincludes = self.headers.toStringNoDupes(includes) 332262119f8SBarry Smith self.addMakeMacro('PETSC_CC_INCLUDES',self.allincludes) 333262119f8SBarry Smith self.PETSC_CC_INCLUDES = self.allincludes 334cbd5cc15SBarry Smith if hasattr(self.compilers, 'FC'): 335208c3fd5SBarry Smith if self.compilers.fortranIsF90: 33643a63bfbSSatish Balay self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes,includes)) 33730d43657SSatish Balay else: 33830d43657SSatish Balay self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes)) 339f8833479SBarry Smith 3401b1e03dfSSatish Balay self.addMakeMacro('DESTDIR',self.installdir) 341c6f99f23SBarry Smith self.addDefine('LIB_DIR','"'+os.path.join(self.installdir,'lib')+'"') 342f8833479SBarry Smith 3430f3b21c2SBarry Smith if self.framework.argDB['with-single-library']: 3440f3b21c2SBarry Smith # overrides the values set in conf/variables 3450f3b21c2SBarry Smith self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 34657cb31baSSatish Balay self.addMakeMacro('SHLIBS','libpetsc') 347bccf1c12SBarry Smith self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 348797063a9SSatish Balay self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 349797063a9SSatish Balay self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 350bb84e0fdSBarry Smith self.addDefine('USE_SINGLE_LIBRARY', '1') 3512df986feSBarry Smith if self.sharedlibraries.useShared: 352ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 353ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 354ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 355ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 356ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 357ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 358ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 359fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 360ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 361ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 3622df986feSBarry Smith else: 363ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 364ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 365ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}') 366ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}') 367ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}') 368ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}') 369ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 370fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 371ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 372ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}') 3730f3b21c2SBarry Smith 374f8833479SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 375f8833479SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 376f8833479SBarry Smith 377f8833479SBarry Smith # add a makefile entry for configure options 378f8833479SBarry Smith self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 379f8833479SBarry Smith return 380f8833479SBarry Smith 381f8833479SBarry Smith def dumpConfigInfo(self): 382f8833479SBarry Smith import time 383f8833479SBarry Smith fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 384f8833479SBarry Smith fd.write('static const char *petscconfigureruntime = "'+time.ctime(time.time())+'";\n') 385f8833479SBarry Smith fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 386f8833479SBarry Smith fd.close() 387f8833479SBarry Smith return 388f8833479SBarry Smith 3892a4161d9SMatthew G Knepley def dumpMachineInfo(self): 3902a4161d9SMatthew G Knepley import platform 3912a4161d9SMatthew G Knepley import time 39240373944SSatish Balay import script 393ca77dbeeSGeoffrey Irving def escape(s): 394ca77dbeeSGeoffrey Irving return s.replace('"',r'\"').replace(r'\ ',r'\\ ') 3952a4161d9SMatthew G Knepley fd = file(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w') 3962a4161d9SMatthew G Knepley fd.write('static const char *petscmachineinfo = \"\\n\"\n') 3972a4161d9SMatthew G Knepley fd.write('\"-----------------------------------------\\n\"\n') 3982a4161d9SMatthew G Knepley fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (time.ctime(time.time()), platform.node())) 39960acdfe7SSatish Balay fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform())) 400ca77dbeeSGeoffrey Irving fd.write('\"Using PETSc directory: %s\\n\"\n' % (escape(self.petscdir.dir))) 401ca77dbeeSGeoffrey Irving fd.write('\"Using PETSc arch: %s\\n\"\n' % (escape(self.arch.arch))) 402cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4032a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerinfo = \"\\n\"\n') 4042a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 405ca77dbeeSGeoffrey Irving fd.write('\"Using C compiler: %s %s ${COPTFLAGS} ${CFLAGS}\\n\"\n' % (escape(self.setCompilers.getCompiler()), escape(self.setCompilers.getCompilerFlags()))) 4062a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 4078782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 4082a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 409ca77dbeeSGeoffrey Irving fd.write('\"Using Fortran compiler: %s %s ${FOPTFLAGS} ${FFLAGS} %s\\n\"\n' % (escape(self.setCompilers.getCompiler()), escape(self.setCompilers.getCompilerFlags()), escape(self.setCompilers.CPPFLAGS))) 4102a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 411cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4122a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n') 413ca77dbeeSGeoffrey Irving fd.write('\"Using include paths: %s %s %s\\n\"\n' % ('-I'+escape(os.path.join(self.petscdir.dir, self.arch.arch, 'include')), '-I'+escape(os.path.join(self.petscdir.dir, 'include')), escape(self.PETSC_CC_INCLUDES))) 414cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4152a4161d9SMatthew G Knepley fd.write('static const char *petsclinkerinfo = \"\\n\"\n') 4162a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 417ca77dbeeSGeoffrey Irving fd.write('\"Using C linker: %s\\n\"\n' % (escape(self.setCompilers.getLinker()))) 4182a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 4198782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 4202a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 421ca77dbeeSGeoffrey Irving fd.write('\"Using Fortran linker: %s\\n\"\n' % (escape(self.setCompilers.getLinker()))) 4222a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 423ad782ac6SSatish Balay if self.framework.argDB['with-single-library']: 424ad782ac6SSatish Balay petsclib = '-lpetsc' 425ad782ac6SSatish Balay else: 426ad782ac6SSatish Balay petsclib = '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys' 427ca77dbeeSGeoffrey Irving fd.write('\"Using libraries: %s%s -L%s %s %s\\n\"\n' % (escape(self.setCompilers.CSharedLinkerFlag), escape(os.path.join(self.petscdir.dir, self.arch.arch, 'lib')), escape(os.path.join(self.petscdir.dir, self.arch.arch, 'lib')), escape(petsclib), escape(self.PETSC_EXTERNAL_LIB_BASIC))) 428cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4292a4161d9SMatthew G Knepley fd.close() 4302a4161d9SMatthew G Knepley return 431b2843cf1SBarry Smith 432511a6afcSJed Brown def dumpCMakeConfig(self): 433511a6afcSJed Brown ''' 43434ed7027SBarry Smith Writes configuration-specific values to ${PETSC_ARCH}/conf/PETScConfig.cmake. 435511a6afcSJed Brown This file is private to PETSc and should not be included by third parties 436511a6afcSJed Brown (a suitable file can be produced later by CMake, but this is not it). 437511a6afcSJed Brown ''' 438511a6afcSJed Brown def cmakeset(fd,key,val=True): 439511a6afcSJed Brown if val == True: val = 'YES' 440511a6afcSJed Brown if val == False: val = 'NO' 441511a6afcSJed Brown fd.write('set (' + key + ' ' + val + ')\n') 442511a6afcSJed Brown def ensurelist(a): 443826d9344SJed Brown if isinstance(a,list): 444826d9344SJed Brown return a 445826d9344SJed Brown else: 446826d9344SJed Brown return [a] 447511a6afcSJed Brown def libpath(lib): 448511a6afcSJed Brown 'Returns a search path if that is what this item provides, else "" which will be cleaned out later' 4491b1c0b30SJed Brown if not isinstance(lib,str): return '' 450511a6afcSJed Brown if lib.startswith('-L'): return lib[2:] 451511a6afcSJed Brown if lib.startswith('-R'): return lib[2:] 452511a6afcSJed Brown if lib.startswith('-Wl,-rpath,'): 453511a6afcSJed Brown # This case occurs when an external package needs a specific system library that is normally provided by the compiler. 454511a6afcSJed Brown # In other words, the -L path is builtin to the wrapper or compiler, here we provide it so that CMake can locate the 455511a6afcSJed Brown # corresponding library. 456511a6afcSJed Brown return lib[len('-Wl,-rpath,'):] 457511a6afcSJed Brown if lib.startswith('-'): return '' 458511a6afcSJed Brown return os.path.dirname(lib) 459511a6afcSJed Brown def cleanlib(lib): 460511a6afcSJed Brown 'Returns a library name if that is what this item provides, else "" which will be cleaned out later' 46142e8629dSMatthew G Knepley if not isinstance(lib,str): return '' 462511a6afcSJed Brown if lib.startswith('-l'): return lib[2:] 463511a6afcSJed Brown if lib.startswith('-Wl') or lib.startswith('-L'): return '' 464511a6afcSJed Brown lib = os.path.splitext(os.path.basename(lib))[0] 465511a6afcSJed Brown if lib.startswith('lib'): return lib[3:] 466511a6afcSJed Brown return lib 467511a6afcSJed Brown def nub(lst): 46806e8c1ddSJed Brown 'Return a list containing the first occurrence of each unique element' 469511a6afcSJed Brown unique = [] 470511a6afcSJed Brown for elem in lst: 471511a6afcSJed Brown if elem not in unique and elem != '': 472511a6afcSJed Brown unique.append(elem) 473511a6afcSJed Brown return unique 47450937898SJed Brown try: reversed # reversed was added in Python-2.4 47550937898SJed Brown except NameError: 47650937898SJed Brown def reversed(lst): return lst[::-1] 47706e8c1ddSJed Brown def nublast(lst): 47806e8c1ddSJed Brown 'Return a list containing the last occurrence of each unique entry in a list' 47950937898SJed Brown return reversed(nub(reversed(lst))) 480511a6afcSJed Brown def cmakeexpand(varname): 481511a6afcSJed Brown return r'"${' + varname + r'}"' 482582751aaSJed Brown def uniqextend(lst,new): 483511a6afcSJed Brown for x in ensurelist(new): 484582751aaSJed Brown if x not in lst: 485582751aaSJed Brown lst.append(x) 486511a6afcSJed Brown def notstandardinclude(path): 487040257f2SJed Brown return path not in '/usr/include'.split() # /usr/local/include is not automatically included on FreeBSD 488511a6afcSJed Brown def writeMacroDefinitions(fd): 489511a6afcSJed Brown if self.mpi.usingMPIUni: 490511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_MPIUNI') 491511a6afcSJed Brown for pkg in self.framework.packages: 492511a6afcSJed Brown if pkg.useddirectly: 493eeb16384SBarry Smith cmakeset(fd,'PETSC_HAVE_' + pkg.PACKAGE.replace('-','_')) 494a23e9343SMatthew G Knepley for pair in pkg.defines.items(): 495440af75fSJed Brown if pair[0].startswith('HAVE_') and pair[1]: 496a23e9343SMatthew G Knepley cmakeset(fd, self.framework.getFullDefineName(pkg, pair[0]), pair[1]) 497511a6afcSJed Brown for name,val in self.functions.defines.items(): 498511a6afcSJed Brown cmakeset(fd,'PETSC_'+name,val) 499511a6afcSJed Brown for dct in [self.defines, self.libraryoptions.defines]: 500511a6afcSJed Brown for k,v in dct.items(): 501511a6afcSJed Brown if k.startswith('USE_'): 502511a6afcSJed Brown cmakeset(fd,'PETSC_' + k, v) 503511a6afcSJed Brown cmakeset(fd,'PETSC_USE_COMPLEX', self.scalartypes.scalartype == 'complex') 504ce63c4c1SBarry Smith cmakeset(fd,'PETSC_USE_REAL_' + self.scalartypes.precision.upper()) 505511a6afcSJed Brown cmakeset(fd,'PETSC_CLANGUAGE_'+self.languages.clanguage) 506511a6afcSJed Brown if hasattr(self.compilers, 'FC'): 507511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_FORTRAN') 508511a6afcSJed Brown if self.compilers.fortranIsF90: 509511a6afcSJed Brown cmakeset(fd,'PETSC_USING_F90') 510876d5c60SBarry Smith if self.compilers.fortranIsF2003: 511876d5c60SBarry Smith cmakeset(fd,'PETSC_USING_F2003') 51213c0a95cSJed Brown if hasattr(self.compilers, 'CXX'): 51313c0a95cSJed Brown cmakeset(fd,'PETSC_HAVE_CXX') 514511a6afcSJed Brown if self.sharedlibraries.useShared: 515511a6afcSJed Brown cmakeset(fd,'BUILD_SHARED_LIBS') 516511a6afcSJed Brown def writeBuildFlags(fd): 51706e8c1ddSJed Brown def extendby(lib): 51806e8c1ddSJed Brown libs = ensurelist(lib) 51906e8c1ddSJed Brown lib_paths.extend(map(libpath,libs)) 52006e8c1ddSJed Brown lib_libs.extend(map(cleanlib,libs)) 521511a6afcSJed Brown lib_paths = [] 522511a6afcSJed Brown lib_libs = [] 523511a6afcSJed Brown includes = [] 524511a6afcSJed Brown libvars = [] 525511a6afcSJed Brown for pkg in self.framework.packages: 52606e8c1ddSJed Brown extendby(pkg.lib) 527040257f2SJed Brown uniqextend(includes,pkg.include) 52806e8c1ddSJed Brown extendby(self.libraries.math) 52906e8c1ddSJed Brown extendby(self.libraries.rt) 53006e8c1ddSJed Brown extendby(self.compilers.flibs) 53106e8c1ddSJed Brown extendby(self.compilers.cxxlibs) 53206e8c1ddSJed Brown extendby(self.compilers.LIBS.split()) 53306e8c1ddSJed Brown for libname in nublast(lib_libs): 534511a6afcSJed Brown libvar = 'PETSC_' + libname.upper() + '_LIB' 5354c0032a9SSatish Balay addpath = '' 53606e8c1ddSJed Brown for lpath in nublast(lib_paths): 5374c0032a9SSatish Balay addpath += '"' + str(lpath) + '" ' 5384c0032a9SSatish Balay fd.write('find_library (' + libvar + ' ' + libname + ' HINTS ' + addpath + ')\n') 539511a6afcSJed Brown libvars.append(libvar) 540511a6afcSJed Brown fd.write('mark_as_advanced (' + ' '.join(libvars) + ')\n') 541511a6afcSJed Brown fd.write('set (PETSC_PACKAGE_LIBS ' + ' '.join(map(cmakeexpand,libvars)) + ')\n') 542040257f2SJed Brown includes = filter(notstandardinclude,includes) 543040257f2SJed Brown fd.write('set (PETSC_PACKAGE_INCLUDES ' + ' '.join(map(lambda i: '"'+i+'"',includes)) + ')\n') 544511a6afcSJed Brown fd = open(os.path.join(self.arch.arch,'conf','PETScConfig.cmake'), 'w') 545511a6afcSJed Brown writeMacroDefinitions(fd) 546511a6afcSJed Brown writeBuildFlags(fd) 547511a6afcSJed Brown fd.close() 548511a6afcSJed Brown return 549511a6afcSJed Brown 5508b0282a9SJed Brown def dumpCMakeLists(self): 5518b0282a9SJed Brown import sys 552994b4dadSSatish Balay if sys.version_info >= (2,4): 5538b0282a9SJed Brown import cmakegen 5548b0282a9SJed Brown try: 555a98e69d2SJed Brown cmakegen.main(self.petscdir.dir, log=self.framework.log) 5568b0282a9SJed Brown except (OSError), e: 5578b0282a9SJed Brown self.framework.logPrint('Generating CMakeLists.txt failed:\n' + str(e)) 558aac20692SSatish Balay else: 559aac20692SSatish Balay self.framework.logPrint('Skipping cmakegen due to old python version: ' +str(sys.version_info) ) 5608b0282a9SJed Brown 5618b0282a9SJed Brown def cmakeBoot(self): 5628b0282a9SJed Brown import sys 563ae937f1dSJed Brown self.cmakeboot_success = False 564994b4dadSSatish Balay if sys.version_info >= (2,4) and hasattr(self.cmake,'cmake'): 565356464bcSMatthew G Knepley try: 5668b0282a9SJed Brown import cmakeboot 567ae937f1dSJed Brown self.cmakeboot_success = cmakeboot.main(petscdir=self.petscdir.dir,petscarch=self.arch.arch,argDB=self.argDB,framework=self.framework,log=self.framework.log) 5688b0282a9SJed Brown except (OSError), e: 5698b0282a9SJed Brown self.framework.logPrint('Booting CMake in PETSC_ARCH failed:\n' + str(e)) 570356464bcSMatthew G Knepley except (ImportError, KeyError), e: 571356464bcSMatthew G Knepley self.framework.logPrint('Importing cmakeboot failed:\n' + str(e)) 5729b12c9c7SJed Brown if self.cmakeboot_success: 5732f730bc2SKarl Rupp if hasattr(self.compilers, 'FC') and self.compilers.fortranIsF90 and not self.setCompilers.fortranModuleOutputFlag: 57491f9b906SSatish Balay self.framework.logPrint('CMake configured successfully, but could not be used by default because of missing fortranModuleOutputFlag\n') 5759b12c9c7SJed Brown else: 5769b12c9c7SJed Brown self.framework.logPrint('CMake configured successfully, using as default build\n') 577f7b66a64SJed Brown self.addMakeMacro('PETSC_BUILD_USING_CMAKE',1) 578aac20692SSatish Balay else: 5799b12c9c7SJed Brown self.framework.logPrint('CMake configuration was unsuccessful\n') 5809b12c9c7SJed Brown else: 581aac20692SSatish Balay self.framework.logPrint('Skipping cmakeboot due to old python version: ' +str(sys.version_info) ) 582356464bcSMatthew G Knepley return 5838b0282a9SJed Brown 584b2843cf1SBarry Smith def configurePrefetch(self): 585b2843cf1SBarry Smith '''Sees if there are any prefetch functions supported''' 586525d6f2eSBarry Smith if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-ios']: 58793f78423SSatish Balay self.addDefine('Prefetch(a,b,c)', ' ') 58893f78423SSatish Balay return 589ec284106SBarry Smith self.pushLanguage(self.languages.clanguage) 59010699583SJed Brown if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'): 59150d8bf02SJed Brown # The Intel Intrinsics manual [1] specifies the prototype 59250d8bf02SJed Brown # 59350d8bf02SJed Brown # void _mm_prefetch(char const *a, int sel); 59450d8bf02SJed Brown # 59550d8bf02SJed Brown # but other vendors seem to insist on using subtly different 59650d8bf02SJed Brown # prototypes, including void* for the pointer, and an enum for 59750d8bf02SJed Brown # sel. These are both reasonable changes, but negatively impact 59850d8bf02SJed Brown # portability. 59950d8bf02SJed Brown # 60050d8bf02SJed Brown # [1] http://software.intel.com/file/6373 60150d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 60250d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))') 60350d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 60450d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 60550d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 60650d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 60750d8bf02SJed Brown elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'): 60850d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 60950d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))') 61050d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 61150d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 61250d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 61350d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 61410699583SJed Brown elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 61510699583SJed Brown # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality) 61610699583SJed Brown # 61710699583SJed Brown # The value of rw is a compile-time constant one or zero; one 61810699583SJed Brown # means that the prefetch is preparing for a write to the memory 61910699583SJed Brown # address and zero, the default, means that the prefetch is 62010699583SJed Brown # preparing for a read. The value locality must be a compile-time 62110699583SJed Brown # constant integer between zero and three. A value of zero means 62210699583SJed Brown # that the data has no temporal locality, so it need not be left 62310699583SJed Brown # in the cache after the access. A value of three means that the 62410699583SJed Brown # data has a high degree of temporal locality and should be left 62510699583SJed Brown # in all levels of cache possible. Values of one and two mean, 62610699583SJed Brown # respectively, a low or moderate degree of temporal locality. 62710699583SJed Brown # 62810699583SJed Brown # Here we adopt Intel's x86/x86-64 naming scheme for the locality 62910699583SJed Brown # hints. Using macros for these values in necessary since some 63010699583SJed Brown # compilers require an enum. 63110699583SJed Brown self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))') 63210699583SJed Brown self.addDefine('PREFETCH_HINT_NTA', '0') 63310699583SJed Brown self.addDefine('PREFETCH_HINT_T0', '3') 63410699583SJed Brown self.addDefine('PREFETCH_HINT_T1', '2') 63510699583SJed Brown self.addDefine('PREFETCH_HINT_T2', '1') 636b2843cf1SBarry Smith else: 637b2843cf1SBarry Smith self.addDefine('Prefetch(a,b,c)', ' ') 6387d490b44SBarry Smith self.popLanguage() 639b2843cf1SBarry Smith 64073fca5a0SBarry Smith def configureFeatureTestMacros(self): 64173fca5a0SBarry Smith '''Checks if certain feature test macros are support''' 6426028a65fSShri Abhyankar if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <sysctl.h>',''): 64373fca5a0SBarry Smith self.addDefine('_POSIX_C_SOURCE_200112L', '1') 64409bc878fSSatish Balay if self.checkCompile('#define _BSD_SOURCE\n#include<stdlib.h>',''): 64573fca5a0SBarry Smith self.addDefine('_BSD_SOURCE', '1') 646ea0fecefSShri Abhyankar if self.checkCompile('#define _GNU_SOURCE\n#include <sched.h>','cpu_set_t mset;\nCPU_ZERO(&mset);'): 647ea0fecefSShri Abhyankar self.addDefine('_GNU_SOURCE', '1') 64873fca5a0SBarry Smith 64909bc878fSSatish Balay def configureAtoll(self): 65009bc878fSSatish Balay '''Checks if atoll exists''' 651436b02dcSSatish 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")'): 65209bc878fSSatish Balay self.addDefine('HAVE_ATOLL', '1') 65309bc878fSSatish Balay 6542400fdedSBarry Smith def configureUnused(self): 6552400fdedSBarry Smith '''Sees if __attribute((unused)) is supported''' 6561adaff47SSean Farley if self.framework.argDB['with-ios']: 6572400fdedSBarry Smith self.addDefine('UNUSED', ' ') 6582400fdedSBarry Smith return 6592400fdedSBarry Smith self.pushLanguage(self.languages.clanguage) 660edf21b64SSatish 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'): 6612400fdedSBarry Smith self.addDefine('UNUSED', '__attribute((unused))') 6622400fdedSBarry Smith else: 6632400fdedSBarry Smith self.addDefine('UNUSED', ' ') 6642400fdedSBarry Smith self.popLanguage() 6652400fdedSBarry Smith 6661ef8df7fSJed Brown def configureDeprecated(self): 6671ef8df7fSJed Brown '''Check if __attribute((deprecated)) is supported''' 6681ef8df7fSJed Brown self.pushLanguage(self.languages.clanguage) 66959a26b54SJed Brown ## Recent versions of gcc and clang support __attribute((deprecated("string argument"))), which is very useful, but 67059a26b54SJed Brown ## Intel has conspired to make a supremely environment-sensitive compiler. The Intel compiler looks at the gcc 67159a26b54SJed Brown ## executable in the environment to determine the language compatibility that it should attempt to emulate. Some 67259a26b54SJed Brown ## important Cray installations have built PETSc using the Intel compiler, but with a newer gcc module loaded (e.g., 67359a26b54SJed Brown ## 4.7). Thus at PETSc configure time, the Intel compiler decides to support the string argument, but the the gcc 67459a26b54SJed Brown ## found in the default user environment is older and does not support the argument. If GCC and Intel were cool 67559a26b54SJed Brown ## like Clang and supported __has_attribute, we could avoid configure tests entirely, but they don't. And that is 67659a26b54SJed Brown ## why we can't have nice things. 67759a26b54SJed Brown # 67859a26b54SJed Brown # if self.checkCompile("""__attribute((deprecated("Why you shouldn't use myfunc"))) static int myfunc(void) { return 1;}""", ''): 67959a26b54SJed Brown # self.addDefine('DEPRECATED(why)', '__attribute((deprecated(why)))') 68059a26b54SJed Brown if self.checkCompile("""__attribute((deprecated)) static int myfunc(void) { return 1;}""", ''): 68159a26b54SJed Brown self.addDefine('DEPRECATED(why)', '__attribute((deprecated))') 6821ef8df7fSJed Brown else: 68347644db9SJed Brown self.addDefine('DEPRECATED(why)', ' ') 6841ef8df7fSJed Brown self.popLanguage() 6851ef8df7fSJed Brown 6869800092aSJed Brown def configureExpect(self): 6879800092aSJed Brown '''Sees if the __builtin_expect directive is supported''' 6889800092aSJed Brown self.pushLanguage(self.languages.clanguage) 6899800092aSJed Brown if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'): 6909800092aSJed Brown self.addDefine('HAVE_BUILTIN_EXPECT', 1) 6919800092aSJed Brown self.popLanguage() 6929800092aSJed Brown 69353c77d0aSJed Brown def configureFunctionName(self): 6941ec50b02SJed Brown '''Sees if the compiler supports __func__ or a variant. Falls back 6951ec50b02SJed Brown on __FUNCT__ which PETSc source defines, but most users do not, thus 6961ec50b02SJed Brown stack traces through user code are better when the compiler's 6971ec50b02SJed Brown variant is used.''' 6981ec50b02SJed Brown def getFunctionName(lang): 6991ec50b02SJed Brown name = '__FUNCT__' 7001ec50b02SJed Brown self.pushLanguage(lang) 70153c77d0aSJed Brown if self.checkLink('', "if (__func__[0] != 'm') return 1;"): 7021ec50b02SJed Brown name = '__func__' 70353c77d0aSJed Brown elif self.checkLink('', "if (__FUNCTION__[0] != 'm') return 1;"): 7041ec50b02SJed Brown name = '__FUNCTION__' 7051ec50b02SJed Brown self.popLanguage() 7061ec50b02SJed Brown return name 7071ec50b02SJed Brown langs = [] 708628773c9SSatish Balay 709628773c9SSatish Balay self.addDefine('FUNCTION_NAME_C', getFunctionName('C')) 710628773c9SSatish Balay if hasattr(self.compilers, 'CXX'): 711628773c9SSatish Balay self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx')) 71212607bf0SSatish Balay else: 71312607bf0SSatish Balay self.addDefine('FUNCTION_NAME_CXX', '__FUNCT__') 71453c77d0aSJed Brown 715753ebd1dSJed Brown def configureIntptrt(self): 716753ebd1dSJed Brown '''Determine what to use for uintptr_t''' 717753ebd1dSJed Brown def staticAssertSizeMatchesVoidStar(inc,typename): 718753ebd1dSJed Brown # The declaration is an error if either array size is negative. 719753ebd1dSJed 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 720d26187a0SJed Brown return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n' 721979939cdSSatish Balay + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename)) 722753ebd1dSJed Brown self.pushLanguage(self.languages.clanguage) 723753ebd1dSJed Brown if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'): 724753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'uintptr_t') 725753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long long'): 726753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned long long') 727753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'): 728753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'size_t') 729c82284b1SJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long'): 730c82284b1SJed Brown self.addDefine('UINTPTR_T', 'unsigned long') 7312d1b7972SSatish Balay elif staticAssertSizeMatchesVoidStar('','unsigned'): 732753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned') 733d26187a0SJed Brown else: 734d26187a0SJed Brown raise RuntimeError('Could not find any unsigned integer type matching void*') 735753ebd1dSJed Brown self.popLanguage() 736753ebd1dSJed Brown 737ed938b00SJed Brown def configureRTLDDefault(self): 738bfef2c86SBarry Smith if self.checkCompile('#include <dlfcn.h>\n void *ptr = RTLD_DEFAULT;'): 739bfef2c86SBarry Smith self.addDefine('RTLD_DEFAULT','1') 740f8833479SBarry Smith return 741f8833479SBarry Smith 742f8833479SBarry Smith def configureSolaris(self): 743f8833479SBarry Smith '''Solaris specific stuff''' 744f8833479SBarry Smith if os.path.isdir(os.path.join('/usr','ucblib')): 745f8833479SBarry Smith try: 746f8833479SBarry Smith flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 747f8833479SBarry Smith except AttributeError: 748f8833479SBarry Smith flag = None 749f8833479SBarry Smith if flag is None: 750f8833479SBarry Smith self.compilers.LIBS += ' -L/usr/ucblib' 751f8833479SBarry Smith else: 752f8833479SBarry Smith self.compilers.LIBS += ' '+flag+'/usr/ucblib' 753f8833479SBarry Smith return 754f8833479SBarry Smith 755f8833479SBarry Smith def configureLinux(self): 756f8833479SBarry Smith '''Linux specific stuff''' 7579f15855cSMatthew G Knepley # TODO: Test for this by mallocing an odd number of floats and checking the address 758f8833479SBarry Smith self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 759f8833479SBarry Smith return 760f8833479SBarry Smith 761f8833479SBarry Smith def configureWin32(self): 762f8833479SBarry Smith '''Win32 non-cygwin specific stuff''' 763f8833479SBarry Smith kernel32=0 764f8833479SBarry Smith if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 765f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 766f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 767f8833479SBarry Smith kernel32=1 768f8833479SBarry Smith elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 769f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 770f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 771f8833479SBarry Smith kernel32=1 772f8833479SBarry Smith if kernel32: 773eed94e11SSatish Balay if self.framework.argDB['with-windows-graphics']: 774eed94e11SSatish Balay self.addDefine('USE_WINDOWS_GRAPHICS',1) 775f8833479SBarry Smith if self.checkLink('#include <Windows.h>','LoadLibrary(0)'): 776f8833479SBarry Smith self.addDefine('HAVE_LOADLIBRARY',1) 777b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'): 778b50f6d9eSLisandro Dalcin self.addDefine('HAVE_GETPROCADDRESS',1) 779b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','FreeLibrary(0)'): 780b50f6d9eSLisandro Dalcin self.addDefine('HAVE_FREELIBRARY',1) 781a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','GetLastError()'): 782a21658a3SLisandro Dalcin self.addDefine('HAVE_GETLASTERROR',1) 783a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','SetLastError(0)'): 784a21658a3SLisandro Dalcin self.addDefine('HAVE_SETLASTERROR',1) 785f8833479SBarry Smith if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'): 786bea725cfSBarry Smith self.addDefine('USE_MICROSOFT_TIME',1) 787f8833479SBarry Smith if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 788f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 789f8833479SBarry Smith elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 790f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 791f8833479SBarry Smith 792f8833479SBarry Smith if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'): 793f8833479SBarry Smith self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);') 794f8833479SBarry Smith if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'): 795f8833479SBarry Smith self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);') 796f8833479SBarry Smith 797f8833479SBarry Smith self.types.check('int32_t', 'int') 798f8833479SBarry Smith if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 799f8833479SBarry Smith self.addTypedef('int', 'uid_t') 800f8833479SBarry Smith self.addTypedef('int', 'gid_t') 801f8833479SBarry Smith if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 802f8833479SBarry Smith self.framework.addDefine('R_OK', '04') 803f8833479SBarry Smith self.framework.addDefine('W_OK', '02') 804f8833479SBarry Smith self.framework.addDefine('X_OK', '01') 805f8833479SBarry Smith if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 806f8833479SBarry Smith self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 807f8833479SBarry Smith self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 808f8833479SBarry Smith if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 809f8833479SBarry Smith self.addDefine('HAVE_LARGE_INTEGER_U',1) 810f8833479SBarry Smith 811f8833479SBarry Smith # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 812ef2cfba3SSatish Balay if self.checkCompile('#include <Windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'): 813f8833479SBarry Smith self.addDefine('HAVE_O_BINARY',1) 814f8833479SBarry Smith 815f8833479SBarry Smith if self.compilers.CC.find('win32fe') >= 0: 816f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\';\'') 817f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'\\\\\'') 818f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 819f8833479SBarry Smith self.addDefine('CANNOT_START_DEBUGGER',1) 820f8833479SBarry Smith else: 821f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\':\'') 822f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 823f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'/\'') 824bfef2c86SBarry Smith 825f8833479SBarry Smith return 826f8833479SBarry Smith 827f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 828b10d012aSSatish Balay def configureCygwinBrokenPipe(self): 829b10d012aSSatish Balay '''Cygwin version <= 1.7.18 had issues with pipes and long commands invoked from gnu-make 830b10d012aSSatish Balay http://cygwin.com/ml/cygwin/2013-05/msg00340.html ''' 831b10d012aSSatish Balay if config.setCompilers.Configure.isCygwin(): 832b10d012aSSatish Balay import platform 833b10d012aSSatish Balay import re 834b10d012aSSatish Balay r=re.compile("([0-9]+).([0-9]+).([0-9]+)") 835b10d012aSSatish Balay m=r.match(platform.release()) 836b10d012aSSatish Balay major=int(m.group(1)) 837b10d012aSSatish Balay minor=int(m.group(2)) 838b10d012aSSatish Balay subminor=int(m.group(3)) 839b10d012aSSatish Balay if ((major < 1) or (major == 1 and minor < 7) or (major == 1 and minor == 7 and subminor <= 18)): 840b10d012aSSatish Balay self.addMakeMacro('PETSC_CYGWIN_BROKEN_PIPE','1') 841b10d012aSSatish Balay return 842b10d012aSSatish Balay 843b10d012aSSatish Balay#----------------------------------------------------------------------------------------------------- 844569865ddSSatish Balay def configureDefaultArch(self): 845569865ddSSatish Balay conffile = os.path.join('conf', 'petscvariables') 846569865ddSSatish Balay if self.framework.argDB['with-default-arch']: 847569865ddSSatish Balay fd = file(conffile, 'w') 848569865ddSSatish Balay fd.write('PETSC_ARCH='+self.arch.arch+'\n') 849da93591fSBarry Smith fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 8503435dde8SSatish Balay fd.write('include '+os.path.join(self.petscdir.dir,self.arch.arch,'conf','petscvariables')+'\n') 851569865ddSSatish Balay fd.close() 852569865ddSSatish Balay self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 853569865ddSSatish Balay elif os.path.isfile(conffile): 854569865ddSSatish Balay try: 855569865ddSSatish Balay os.unlink(conffile) 856569865ddSSatish Balay except: 857569865ddSSatish Balay raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 858569865ddSSatish Balay return 859569865ddSSatish Balay 860569865ddSSatish Balay#----------------------------------------------------------------------------------------------------- 861f8833479SBarry Smith def configureScript(self): 862f8833479SBarry Smith '''Output a script in the conf directory which will reproduce the configuration''' 863f8833479SBarry Smith import nargs 864495bf1a9SSatish Balay import sys 865495bf1a9SSatish Balay scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py') 866f8833479SBarry Smith args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 867f8833479SBarry Smith if 'configModules' in args: 8681063a081SSatish Balay if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 869f8833479SBarry Smith del args['configModules'] 870f8833479SBarry Smith if 'optionsModule' in args: 871c1486898SMatthew Knepley if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions': 872f8833479SBarry Smith del args['optionsModule'] 873f8833479SBarry Smith if not 'PETSC_ARCH' in args: 8741063a081SSatish Balay args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 875f8833479SBarry Smith f = file(scriptName, 'w') 876495bf1a9SSatish Balay f.write('#!'+sys.executable+'\n') 877f8833479SBarry Smith f.write('if __name__ == \'__main__\':\n') 878f8833479SBarry Smith f.write(' import sys\n') 8797561c02cSSatish Balay f.write(' import os\n') 8807561c02cSSatish Balay f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 881f8833479SBarry Smith f.write(' import configure\n') 8821063a081SSatish Balay # pretty print repr(args.values()) 8831063a081SSatish Balay f.write(' configure_options = [\n') 8848bec23c5SJed Brown for itm in sorted(args.values()): 8851063a081SSatish Balay f.write(' \''+str(itm)+'\',\n') 8861063a081SSatish Balay f.write(' ]\n') 887f8833479SBarry Smith f.write(' configure.petsc_configure(configure_options)\n') 888f8833479SBarry Smith f.close() 889f8833479SBarry Smith try: 890f8833479SBarry Smith os.chmod(scriptName, 0775) 891f8833479SBarry Smith except OSError, e: 892f8833479SBarry Smith self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 893f8833479SBarry Smith self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 894f8833479SBarry Smith return 895f8833479SBarry Smith 896f8833479SBarry Smith def configureInstall(self): 897f8833479SBarry Smith '''Setup the directories for installation''' 898f8833479SBarry Smith if self.framework.argDB['prefix']: 899f8833479SBarry Smith self.installdir = self.framework.argDB['prefix'] 900824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\ 901824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 902315b77e6SSatish Balay '-@echo "========================================="']) 903f8833479SBarry Smith else: 904b559b537SSatish Balay self.installdir = os.path.join(self.petscdir.dir,self.arch.arch) 905824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\ 906824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\ 907315b77e6SSatish Balay '-@echo "========================================="']) 908f8833479SBarry Smith return 909f8833479SBarry Smith 910f8833479SBarry Smith def configureGCOV(self): 911f8833479SBarry Smith if self.framework.argDB['with-gcov']: 912f8833479SBarry Smith self.addDefine('USE_GCOV','1') 913f8833479SBarry Smith return 914f8833479SBarry Smith 915f8833479SBarry Smith def configureFortranFlush(self): 916f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 917f8833479SBarry Smith for baseName in ['flush','flush_']: 918f8833479SBarry Smith if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1): 919f8833479SBarry Smith self.addDefine('HAVE_'+baseName.upper(), 1) 920f8833479SBarry Smith return 921f8833479SBarry Smith 92228bb2e72SSatish Balay def postProcessPackages(self): 92328bb2e72SSatish Balay postPackages=[] 92428bb2e72SSatish Balay for i in self.framework.packages: 92528bb2e72SSatish Balay if hasattr(i,'postProcess'): postPackages.append(i) 92628bb2e72SSatish Balay if postPackages: 927e64d19dfSSatish Balay # ctetgen needs petsc conf files. so attempt to create them early 928a77eb93bSSatish Balay self.framework.dumpConfFiles() 92928bb2e72SSatish Balay for i in postPackages: i.postProcess() 93028bb2e72SSatish Balay return 931f8833479SBarry Smith 932f8833479SBarry Smith def configure(self): 933f8833479SBarry Smith if not os.path.samefile(self.petscdir.dir, os.getcwd()): 934f8833479SBarry Smith raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 935550489e3SMatthew 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): 9363552d8fbSSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 937c16c35a9SSatish 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)): 938c16c35a9SSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!') 939f16c1317SJed Brown self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 940f16c1317SJed Brown self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 941f16c1317SJed Brown self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables') 942f16c1317SJed Brown self.framework.makeRuleHeader = os.path.join(self.arch.arch,'conf','petscrules') 943f8833479SBarry Smith if self.libraries.math is None: 944f8833479SBarry Smith raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 945f8833479SBarry Smith if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 946f8833479SBarry Smith raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 947ed938b00SJed Brown self.executeTest(self.configureRTLDDefault) 948b2843cf1SBarry Smith self.executeTest(self.configurePrefetch) 9492400fdedSBarry Smith self.executeTest(self.configureUnused) 9501ef8df7fSJed Brown self.executeTest(self.configureDeprecated) 9519800092aSJed Brown self.executeTest(self.configureExpect); 95253c77d0aSJed Brown self.executeTest(self.configureFunctionName); 953753ebd1dSJed Brown self.executeTest(self.configureIntptrt); 954f8833479SBarry Smith self.executeTest(self.configureSolaris) 955f8833479SBarry Smith self.executeTest(self.configureLinux) 956f8833479SBarry Smith self.executeTest(self.configureWin32) 957b10d012aSSatish Balay self.executeTest(self.configureCygwinBrokenPipe) 958569865ddSSatish Balay self.executeTest(self.configureDefaultArch) 959f8833479SBarry Smith self.executeTest(self.configureScript) 960f8833479SBarry Smith self.executeTest(self.configureInstall) 961f8833479SBarry Smith self.executeTest(self.configureGCOV) 962f8833479SBarry Smith self.executeTest(self.configureFortranFlush) 96373fca5a0SBarry Smith self.executeTest(self.configureFeatureTestMacros) 96409bc878fSSatish Balay self.executeTest(self.configureAtoll) 965f8833479SBarry Smith # dummy rules, always needed except for remote builds 966f8833479SBarry Smith self.addMakeRule('remote','') 967f8833479SBarry Smith self.addMakeRule('remoteclean','') 968f8833479SBarry Smith 969f8833479SBarry Smith self.Dump() 970f8833479SBarry Smith self.dumpConfigInfo() 9712a4161d9SMatthew G Knepley self.dumpMachineInfo() 97228bb2e72SSatish Balay self.postProcessPackages() 973511a6afcSJed Brown self.dumpCMakeConfig() 9748b0282a9SJed Brown self.dumpCMakeLists() 9758b0282a9SJed Brown self.cmakeBoot() 976262119f8SBarry Smith self.DumpPkgconfig() 977351d3a41SMatthew G Knepley self.DumpModule() 978f8833479SBarry Smith self.framework.log.write('================================================================================\n') 979f8833479SBarry Smith self.logClear() 980f8833479SBarry Smith return 981