1import config.base 2 3import os 4import re 5 6# The sorted() builtin is not available with python-2.3 7try: sorted 8except NameError: 9 def sorted(lst): 10 lst.sort() 11 return lst 12 13class Configure(config.base.Configure): 14 def __init__(self, framework): 15 config.base.Configure.__init__(self, framework) 16 self.headerPrefix = 'PETSC' 17 self.substPrefix = 'PETSC' 18 return 19 20 def __str2__(self): 21 desc = [] 22 desc.append('xxx=========================================================================xxx') 23 if self.getMakeMacro('PETSC_BUILD_USING_CMAKE'): 24 build_type = 'cmake build' 25 else: 26 build_type = 'legacy build' 27 desc.append(' Configure stage complete. Now build PETSc libraries with (%s):' % build_type) 28 desc.append(' make PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' all') 29 desc.append(' or (experimental with python):') 30 desc.append(' PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' ./config/builder.py') 31 desc.append('xxx=========================================================================xxx') 32 return '\n'.join(desc)+'\n' 33 34 def setupHelp(self, help): 35 import nargs 36 help.addArgument('PETSc', '-prefix=<dir>', nargs.Arg(None, '', 'Specifiy location to install PETSc (eg. /usr/local)')) 37 help.addArgument('Windows','-with-windows-graphics=<bool>', nargs.ArgBool(None, 1,'Enable check for Windows Graphics')) 38 help.addArgument('PETSc', '-with-default-arch=<bool>', nargs.ArgBool(None, 1, 'Allow using the last configured arch without setting PETSC_ARCH')) 39 help.addArgument('PETSc','-with-single-library=<bool>', nargs.ArgBool(None, 1,'Put all PETSc code into the single -lpetsc library')) 40 help.addArgument('PETSc', '-with-ios=<bool>', nargs.ArgBool(None, 0, 'Build an iPhone/iPad version of PETSc library')) 41 return 42 43 def setupDependencies(self, framework): 44 config.base.Configure.setupDependencies(self, framework) 45 self.setCompilers = framework.require('config.setCompilers', self) 46 self.arch = framework.require('PETSc.utilities.arch', self.setCompilers) 47 self.petscdir = framework.require('PETSc.utilities.petscdir', self.setCompilers) 48 self.languages = framework.require('PETSc.utilities.languages',self.setCompilers) 49 self.debugging = framework.require('PETSc.utilities.debugging',self.setCompilers) 50 self.CHUD = framework.require('PETSc.utilities.CHUD', self) 51 self.compilers = framework.require('config.compilers', self) 52 self.types = framework.require('config.types', self) 53 self.headers = framework.require('config.headers', self) 54 self.functions = framework.require('config.functions', self) 55 self.libraries = framework.require('config.libraries', self) 56 self.atomics = framework.require('config.atomics', self) 57 if os.path.isdir(os.path.join('config', 'PETSc')): 58 for d in ['utilities', 'packages']: 59 for utility in os.listdir(os.path.join('config', 'PETSc', d)): 60 (utilityName, ext) = os.path.splitext(utility) 61 if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__': 62 utilityObj = self.framework.require('PETSc.'+d+'.'+utilityName, self) 63 utilityObj.headerPrefix = self.headerPrefix 64 utilityObj.archProvider = self.arch 65 utilityObj.languageProvider = self.languages 66 utilityObj.installDirProvider = self.petscdir 67 setattr(self, utilityName.lower(), utilityObj) 68 69 for package in config.packages.all: 70 if not package == 'PETSc': 71 packageObj = framework.require('config.packages.'+package, self) 72 packageObj.archProvider = self.arch 73 packageObj.languageProvider = self.languages 74 packageObj.installDirProvider = self.petscdir 75 setattr(self, package.lower(), packageObj) 76 # Force blaslapack to depend on scalarType so precision is set before BlasLapack is built 77 framework.require('PETSc.utilities.scalarTypes', self.f2cblaslapack) 78 self.f2cblaslapack.precisionProvider = self.scalartypes 79 framework.require('PETSc.utilities.scalarTypes', self.blaslapack) 80 self.blaslapack.precisionProvider = self.scalartypes 81 82 self.compilers.headerPrefix = self.headerPrefix 83 self.types.headerPrefix = self.headerPrefix 84 self.headers.headerPrefix = self.headerPrefix 85 self.functions.headerPrefix = self.headerPrefix 86 self.libraries.headerPrefix = self.headerPrefix 87 self.blaslapack.headerPrefix = self.headerPrefix 88 self.mpi.headerPrefix = self.headerPrefix 89 headersC = map(lambda name: name+'.h', ['setjmp','dos', 'endian', 'fcntl', 'float', 'io', 'limits', 'malloc', 'pwd', 'search', 'strings', 90 'unistd', 'sys/sysinfo', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource', 91 'sys/systeminfo', 'sys/times', 'sys/utsname','string', 'stdlib','memory', 92 'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types', 93 'WindowsX', 'cxxabi','float','ieeefp','stdint','fenv','sched','pthread']) 94 functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 'getpwuid', 95 'gettimeofday', 'getwd', 'memalign', 'memmove', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize', 96 'readlink', 'realpath', 'sigaction', 'signal', 'sigset', 'usleep', 'sleep', '_sleep', 'socket', 97 'times', 'gethostbyname', 'uname','snprintf','_snprintf','_fullpath','lseek','_lseek','time','fork','stricmp', 98 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror', 99 '_intel_fast_memcpy','_intel_fast_memset'] 100 libraries1 = [(['socket', 'nsl'], 'socket'), (['fpe'], 'handle_sigfpes')] 101 self.headers.headers.extend(headersC) 102 self.functions.functions.extend(functions) 103 self.libraries.libraries.extend(libraries1) 104 105 return 106 107 def Dump(self): 108 ''' Actually put the values into the configuration files ''' 109 # eventually everything between -- should be gone 110#----------------------------------------------------------------------------------------------------- 111 112 # Sometimes we need C compiler, even if built with C++ 113 self.setCompilers.pushLanguage('C') 114 self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 115 self.setCompilers.popLanguage() 116 117 # C preprocessor values 118 self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS+self.CHUD.CPPFLAGS) 119 120 # compiler values 121 self.setCompilers.pushLanguage(self.languages.clanguage) 122 self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 123 self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 124 self.setCompilers.popLanguage() 125 # .o or .obj 126 self.addMakeMacro('CC_SUFFIX','o') 127 128 # executable linker values 129 self.setCompilers.pushLanguage(self.languages.clanguage) 130 pcc_linker = self.setCompilers.getLinker() 131 self.addMakeMacro('PCC_LINKER',pcc_linker) 132 self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 133 self.setCompilers.popLanguage() 134 # '' for Unix, .exe for Windows 135 self.addMakeMacro('CC_LINKER_SUFFIX','') 136 137 if hasattr(self.compilers, 'FC'): 138 self.setCompilers.pushLanguage('FC') 139 # need FPPFLAGS in config/setCompilers 140 self.addDefine('HAVE_FORTRAN','1') 141 self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS) 142 143 # compiler values 144 self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 145 self.setCompilers.popLanguage() 146 # .o or .obj 147 self.addMakeMacro('FC_SUFFIX','o') 148 149 # executable linker values 150 self.setCompilers.pushLanguage('FC') 151 # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker 152 fc_linker = self.setCompilers.getLinker() 153 if config.setCompilers.Configure.isNAG(fc_linker): 154 self.addMakeMacro('FC_LINKER',pcc_linker) 155 else: 156 self.addMakeMacro('FC_LINKER',fc_linker) 157 self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 158 # apple requires this shared library linker flag on SOME versions of the os 159 if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 160 self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 161 self.setCompilers.popLanguage() 162 163 # F90 Modules 164 if self.setCompilers.fortranModuleIncludeFlag: 165 self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag) 166 else: # for non-f90 compilers like g77 167 self.addMakeMacro('FC_MODULE_FLAG', '-I') 168 if self.setCompilers.fortranModuleIncludeFlag: 169 self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag) 170 else: 171 self.addMakeMacro('FC','') 172 173 if hasattr(self.compilers, 'CUDAC'): 174 self.setCompilers.pushLanguage('CUDA') 175 self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags()) 176 self.setCompilers.popLanguage() 177 178 # shared library linker values 179 self.setCompilers.pushLanguage(self.languages.clanguage) 180 # need to fix BuildSystem to collect these separately 181 self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 182 self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 183 self.setCompilers.popLanguage() 184 # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 185 # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 186 if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 187 self.addMakeMacro('SL_LINKER_SUFFIX', '') 188 self.addDefine('SLSUFFIX','""') 189 else: 190 self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 191 self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"') 192 193 self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}') 194 195#----------------------------------------------------------------------------------------------------- 196 197 # CONLY or CPP. We should change the PETSc makefiles to do this better 198 if self.languages.clanguage == 'C': lang = 'CONLY' 199 else: lang = 'CXXONLY' 200 self.addMakeMacro('PETSC_LANGUAGE',lang) 201 202 # real or complex 203 self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 204 # double or float 205 self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 206 207 if self.framework.argDB['with-batch']: 208 self.addMakeMacro('PETSC_WITH_BATCH','1') 209 210 # Test for compiler-specific macros that need to be defined. 211 if self.setCompilers.isCrayVector('CC'): 212 self.addDefine('HAVE_CRAY_VECTOR','1') 213 214#----------------------------------------------------------------------------------------------------- 215 if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket') and self.headers.haveHeader('netinet/in.h'): 216 self.addDefine('USE_SOCKET_VIEWER','1') 217 if self.checkCompile('#include <sys/socket.h>','setsockopt(0,SOL_SOCKET,SO_REUSEADDR,0,0)'): 218 self.addDefine('HAVE_SO_REUSEADDR','1') 219 220#----------------------------------------------------------------------------------------------------- 221 # print include and lib for makefiles 222 self.framework.packages.reverse() 223 includes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')] 224 libs = [] 225 for i in self.framework.packages: 226 if i.useddirectly: 227 self.addDefine('HAVE_'+i.PACKAGE, 1) # ONLY list package if it is used directly by PETSc (and not only by another package) 228 if not isinstance(i.lib, list): 229 i.lib = [i.lib] 230 libs.extend(i.lib) 231 self.addMakeMacro(i.PACKAGE+'_LIB', self.libraries.toStringNoDupes(i.lib)) 232 if hasattr(i,'include'): 233 if not isinstance(i.include,list): 234 i.include = [i.include] 235 includes.extend(i.include) 236 self.addMakeMacro(i.PACKAGE+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 237 if self.framework.argDB['with-single-library']: 238 self.addMakeMacro('PETSC_WITH_EXTERNAL_LIB',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) 239 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) 240 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 241 self.addMakeMacro('PETSC_CC_INCLUDES',self.headers.toStringNoDupes(includes)) 242 self.PETSC_CC_INCLUDES = self.headers.toStringNoDupes(includes) 243 if hasattr(self.compilers, 'FC'): 244 if self.compilers.fortranIsF90: 245 self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes,includes)) 246 else: 247 self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes)) 248 249 self.addMakeMacro('DESTDIR',self.installdir) 250 self.addDefine('LIB_DIR','"'+os.path.join(self.installdir,'lib')+'"') 251 252 if self.framework.argDB['with-single-library']: 253 # overrides the values set in conf/variables 254 self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 255 self.addMakeMacro('SHLIBS','libpetsc') 256 self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 257 self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 258 self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 259 self.addDefine('USE_SINGLE_LIBRARY', '1') 260 if self.sharedlibraries.useShared: 261 self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 262 self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 263 self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 264 self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 265 self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 266 self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 267 self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 268 self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 269 self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 270 self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 271 else: 272 self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 273 self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 274 self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}') 275 self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}') 276 self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}') 277 self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}') 278 self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 279 self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 280 self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 281 self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}') 282 283 if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 284 os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 285 286 # add a makefile entry for configure options 287 self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 288 return 289 290 def dumpConfigInfo(self): 291 import time 292 fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 293 fd.write('static const char *petscconfigureruntime = "'+time.ctime(time.time())+'";\n') 294 fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 295 fd.close() 296 return 297 298 def dumpMachineInfo(self): 299 import platform 300 import time 301 import script 302 fd = file(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w') 303 fd.write('static const char *petscmachineinfo = \"\\n\"\n') 304 fd.write('\"-----------------------------------------\\n\"\n') 305 fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (time.ctime(time.time()), platform.node())) 306 fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform())) 307 fd.write('\"Using PETSc directory: %s\\n\"\n' % (self.petscdir.dir)) 308 fd.write('\"Using PETSc arch: %s\\n\"\n' % (self.arch.arch)) 309 fd.write('\"-----------------------------------------\\n\";\n') 310 fd.write('static const char *petsccompilerinfo = \"\\n\"\n') 311 self.setCompilers.pushLanguage(self.languages.clanguage) 312 fd.write('\"Using C compiler: %s %s ${COPTFLAGS} ${CFLAGS}\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags())) 313 self.setCompilers.popLanguage() 314 if hasattr(self.compilers, 'FC'): 315 self.setCompilers.pushLanguage('FC') 316 fd.write('\"Using Fortran compiler: %s %s ${FOPTFLAGS} ${FFLAGS} %s\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags(), self.setCompilers.CPPFLAGS)) 317 self.setCompilers.popLanguage() 318 fd.write('\"-----------------------------------------\\n\";\n') 319 fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n') 320 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('\\ ','\\\\ '))) 321 fd.write('\"-----------------------------------------\\n\";\n') 322 fd.write('static const char *petsclinkerinfo = \"\\n\"\n') 323 self.setCompilers.pushLanguage(self.languages.clanguage) 324 fd.write('\"Using C linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 325 self.setCompilers.popLanguage() 326 if hasattr(self.compilers, 'FC'): 327 self.setCompilers.pushLanguage('FC') 328 fd.write('\"Using Fortran linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 329 self.setCompilers.popLanguage() 330 if self.framework.argDB['with-single-library']: 331 petsclib = '-lpetsc' 332 else: 333 petsclib = '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys' 334 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('\\ ','\\\\ '))) 335 fd.write('\"-----------------------------------------\\n\";\n') 336 fd.close() 337 return 338 339 def dumpCMakeConfig(self): 340 ''' 341 Writes configuration-specific values to ${PETSC_ARCH}/conf/PETScConfig.cmake. 342 This file is private to PETSc and should not be included by third parties 343 (a suitable file can be produced later by CMake, but this is not it). 344 ''' 345 def cmakeset(fd,key,val=True): 346 if val == True: val = 'YES' 347 if val == False: val = 'NO' 348 fd.write('set (' + key + ' ' + val + ')\n') 349 def ensurelist(a): 350 if isinstance(a,list): 351 return a 352 else: 353 return [a] 354 def libpath(lib): 355 'Returns a search path if that is what this item provides, else "" which will be cleaned out later' 356 if not isinstance(lib,str): return '' 357 if lib.startswith('-L'): return lib[2:] 358 if lib.startswith('-R'): return lib[2:] 359 if lib.startswith('-Wl,-rpath,'): 360 # This case occurs when an external package needs a specific system library that is normally provided by the compiler. 361 # In other words, the -L path is builtin to the wrapper or compiler, here we provide it so that CMake can locate the 362 # corresponding library. 363 return lib[len('-Wl,-rpath,'):] 364 if lib.startswith('-'): return '' 365 return os.path.dirname(lib) 366 def cleanlib(lib): 367 'Returns a library name if that is what this item provides, else "" which will be cleaned out later' 368 if not isinstance(lib,str): return '' 369 if lib.startswith('-l'): return lib[2:] 370 if lib.startswith('-Wl') or lib.startswith('-L'): return '' 371 lib = os.path.splitext(os.path.basename(lib))[0] 372 if lib.startswith('lib'): return lib[3:] 373 return lib 374 def nub(lst): 375 'Return a list containing the first occurrence of each unique element' 376 unique = [] 377 for elem in lst: 378 if elem not in unique and elem != '': 379 unique.append(elem) 380 return unique 381 try: reversed # reversed was added in Python-2.4 382 except NameError: 383 def reversed(lst): return lst[::-1] 384 def nublast(lst): 385 'Return a list containing the last occurrence of each unique entry in a list' 386 return reversed(nub(reversed(lst))) 387 def cmakeexpand(varname): 388 return r'"${' + varname + r'}"' 389 def uniqextend(lst,new): 390 for x in ensurelist(new): 391 if x not in lst: 392 lst.append(x) 393 def notstandardinclude(path): 394 return path not in '/usr/include'.split() # /usr/local/include is not automatically included on FreeBSD 395 def writeMacroDefinitions(fd): 396 if self.mpi.usingMPIUni: 397 cmakeset(fd,'PETSC_HAVE_MPIUNI') 398 for pkg in self.framework.packages: 399 if pkg.useddirectly: 400 cmakeset(fd,'PETSC_HAVE_' + pkg.PACKAGE) 401 for pair in pkg.defines.items(): 402 if pair[0].startswith('HAVE_') and pair[1]: 403 cmakeset(fd, self.framework.getFullDefineName(pkg, pair[0]), pair[1]) 404 for name,val in self.functions.defines.items(): 405 cmakeset(fd,'PETSC_'+name,val) 406 for dct in [self.defines, self.libraryoptions.defines]: 407 for k,v in dct.items(): 408 if k.startswith('USE_'): 409 cmakeset(fd,'PETSC_' + k, v) 410 cmakeset(fd,'PETSC_USE_COMPLEX', self.scalartypes.scalartype == 'complex') 411 cmakeset(fd,'PETSC_USE_REAL_' + self.scalartypes.precision.upper()) 412 cmakeset(fd,'PETSC_CLANGUAGE_'+self.languages.clanguage) 413 if hasattr(self.compilers, 'FC'): 414 cmakeset(fd,'PETSC_HAVE_FORTRAN') 415 if self.compilers.fortranIsF90: 416 cmakeset(fd,'PETSC_USING_F90') 417 if self.compilers.fortranIsF2003: 418 cmakeset(fd,'PETSC_USING_F2003') 419 if hasattr(self.compilers, 'CXX'): 420 cmakeset(fd,'PETSC_HAVE_CXX') 421 if self.sharedlibraries.useShared: 422 cmakeset(fd,'BUILD_SHARED_LIBS') 423 def writeBuildFlags(fd): 424 def extendby(lib): 425 libs = ensurelist(lib) 426 lib_paths.extend(map(libpath,libs)) 427 lib_libs.extend(map(cleanlib,libs)) 428 lib_paths = [] 429 lib_libs = [] 430 includes = [] 431 libvars = [] 432 for pkg in self.framework.packages: 433 extendby(pkg.lib) 434 uniqextend(includes,pkg.include) 435 extendby(self.libraries.math) 436 extendby(self.libraries.rt) 437 extendby(self.compilers.flibs) 438 extendby(self.compilers.cxxlibs) 439 extendby(self.compilers.LIBS.split()) 440 for libname in nublast(lib_libs): 441 libvar = 'PETSC_' + libname.upper() + '_LIB' 442 addpath = '' 443 for lpath in nublast(lib_paths): 444 addpath += '"' + str(lpath) + '" ' 445 fd.write('find_library (' + libvar + ' ' + libname + ' HINTS ' + addpath + ')\n') 446 libvars.append(libvar) 447 fd.write('mark_as_advanced (' + ' '.join(libvars) + ')\n') 448 fd.write('set (PETSC_PACKAGE_LIBS ' + ' '.join(map(cmakeexpand,libvars)) + ')\n') 449 includes = filter(notstandardinclude,includes) 450 fd.write('set (PETSC_PACKAGE_INCLUDES ' + ' '.join(map(lambda i: '"'+i+'"',includes)) + ')\n') 451 fd = open(os.path.join(self.arch.arch,'conf','PETScConfig.cmake'), 'w') 452 writeMacroDefinitions(fd) 453 writeBuildFlags(fd) 454 fd.close() 455 return 456 457 def dumpCMakeLists(self): 458 import sys 459 if sys.version_info >= (2,5): 460 import cmakegen 461 try: 462 cmakegen.main(self.petscdir.dir, log=self.framework.log) 463 except (OSError), e: 464 self.framework.logPrint('Generating CMakeLists.txt failed:\n' + str(e)) 465 else: 466 self.framework.logPrint('Skipping cmakegen due to old python version: ' +str(sys.version_info) ) 467 468 def cmakeBoot(self): 469 import sys 470 self.cmakeboot_success = False 471 if sys.version_info >= (2,5) and hasattr(self.cmake,'cmake'): 472 try: 473 import cmakeboot 474 self.cmakeboot_success = cmakeboot.main(petscdir=self.petscdir.dir,petscarch=self.arch.arch,argDB=self.argDB,framework=self.framework,log=self.framework.log) 475 except (OSError), e: 476 self.framework.logPrint('Booting CMake in PETSC_ARCH failed:\n' + str(e)) 477 except (ImportError, KeyError), e: 478 self.framework.logPrint('Importing cmakeboot failed:\n' + str(e)) 479 if self.cmakeboot_success: 480 if self.framework.argDB['with-cuda']: # Our CMake build does not support CUDA at this time 481 self.framework.logPrint('CMake configured successfully, but could not be used by default because --with-cuda was used\n') 482 elif hasattr(self.compilers, 'FC') and self.compilers.fortranIsF90 and not self.setCompilers.fortranModuleOutputFlag: 483 self.framework.logPrint('CMake configured successfully, but could not be used by default because of missing fortranModuleOutputFlag\n') 484 else: 485 self.framework.logPrint('CMake configured successfully, using as default build\n') 486 self.addMakeMacro('PETSC_BUILD_USING_CMAKE',1) 487 else: 488 self.framework.logPrint('CMake configuration was unsuccessful\n') 489 else: 490 self.framework.logPrint('Skipping cmakeboot due to old python version: ' +str(sys.version_info) ) 491 return 492 493 def configurePrefetch(self): 494 '''Sees if there are any prefetch functions supported''' 495 if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-ios']: 496 self.addDefine('Prefetch(a,b,c)', ' ') 497 return 498 self.pushLanguage(self.languages.clanguage) 499 if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'): 500 # The Intel Intrinsics manual [1] specifies the prototype 501 # 502 # void _mm_prefetch(char const *a, int sel); 503 # 504 # but other vendors seem to insist on using subtly different 505 # prototypes, including void* for the pointer, and an enum for 506 # sel. These are both reasonable changes, but negatively impact 507 # portability. 508 # 509 # [1] http://software.intel.com/file/6373 510 self.addDefine('HAVE_XMMINTRIN_H', 1) 511 self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))') 512 self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 513 self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 514 self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 515 self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 516 elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'): 517 self.addDefine('HAVE_XMMINTRIN_H', 1) 518 self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))') 519 self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 520 self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 521 self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 522 self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 523 elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 524 # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality) 525 # 526 # The value of rw is a compile-time constant one or zero; one 527 # means that the prefetch is preparing for a write to the memory 528 # address and zero, the default, means that the prefetch is 529 # preparing for a read. The value locality must be a compile-time 530 # constant integer between zero and three. A value of zero means 531 # that the data has no temporal locality, so it need not be left 532 # in the cache after the access. A value of three means that the 533 # data has a high degree of temporal locality and should be left 534 # in all levels of cache possible. Values of one and two mean, 535 # respectively, a low or moderate degree of temporal locality. 536 # 537 # Here we adopt Intel's x86/x86-64 naming scheme for the locality 538 # hints. Using macros for these values in necessary since some 539 # compilers require an enum. 540 self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))') 541 self.addDefine('PREFETCH_HINT_NTA', '0') 542 self.addDefine('PREFETCH_HINT_T0', '3') 543 self.addDefine('PREFETCH_HINT_T1', '2') 544 self.addDefine('PREFETCH_HINT_T2', '1') 545 else: 546 self.addDefine('Prefetch(a,b,c)', ' ') 547 self.popLanguage() 548 549 def configureFeatureTestMacros(self): 550 '''Checks if certain feature test macros are support''' 551 if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <sysctl.h>',''): 552 self.addDefine('_POSIX_C_SOURCE_200112L', '1') 553 if self.checkCompile('#define _BSD_SOURCE\n#include<stdlib.h>',''): 554 self.addDefine('_BSD_SOURCE', '1') 555 if self.checkCompile('#define _GNU_SOURCE\n#include <sched.h>','cpu_set_t mset;\nCPU_ZERO(&mset);'): 556 self.addDefine('_GNU_SOURCE', '1') 557 558 def configureAtoll(self): 559 '''Checks if atoll exists''' 560 if self.checkCompile('#define _POSIX_C_SOURCE 200112L\n#include <stdlib.h>','long v = atoll("25")') or self.checkCompile ('#include <stdlib.h>','long v = atoll("25")'): 561 self.addDefine('HAVE_ATOLL', '1') 562 563 def configureUnused(self): 564 '''Sees if __attribute((unused)) is supported''' 565 if self.framework.argDB['with-ios']: 566 self.addDefine('UNUSED', ' ') 567 return 568 self.pushLanguage(self.languages.clanguage) 569 if self.checkLink('__attribute((unused)) static int myfunc(void){ return 1;}', 'int i = myfunc();\ntypedef void* atype;\n__attribute((unused)) atype a;\n'): 570 self.addDefine('UNUSED', '__attribute((unused))') 571 else: 572 self.addDefine('UNUSED', ' ') 573 self.popLanguage() 574 575 def configureExpect(self): 576 '''Sees if the __builtin_expect directive is supported''' 577 self.pushLanguage(self.languages.clanguage) 578 if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'): 579 self.addDefine('HAVE_BUILTIN_EXPECT', 1) 580 self.popLanguage() 581 582 def configureFunctionName(self): 583 '''Sees if the compiler supports __func__ or a variant. Falls back 584 on __FUNCT__ which PETSc source defines, but most users do not, thus 585 stack traces through user code are better when the compiler's 586 variant is used.''' 587 def getFunctionName(lang): 588 name = '__FUNCT__' 589 self.pushLanguage(lang) 590 if self.checkLink('', "if (__func__[0] != 'm') return 1;"): 591 name = '__func__' 592 elif self.checkLink('', "if (__FUNCTION__[0] != 'm') return 1;"): 593 name = '__FUNCTION__' 594 self.popLanguage() 595 return name 596 langs = [] 597 598 self.addDefine('FUNCTION_NAME_C', getFunctionName('C')) 599 if hasattr(self.compilers, 'CXX'): 600 self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx')) 601 else: 602 self.addDefine('FUNCTION_NAME_CXX', '__FUNCT__') 603 604 def configureIntptrt(self): 605 '''Determine what to use for uintptr_t''' 606 def staticAssertSizeMatchesVoidStar(inc,typename): 607 # The declaration is an error if either array size is negative. 608 # It should be okay to use an int that is too large, but it would be very unlikely for this to be the case 609 return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n' 610 + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename)) 611 self.pushLanguage(self.languages.clanguage) 612 if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'): 613 self.addDefine('UINTPTR_T', 'uintptr_t') 614 elif staticAssertSizeMatchesVoidStar('','unsigned long long'): 615 self.addDefine('UINTPTR_T', 'unsigned long long') 616 elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'): 617 self.addDefine('UINTPTR_T', 'size_t') 618 elif staticAssertSizeMatchesVoidStar('','unsigned long'): 619 self.addDefine('UINTPTR_T', 'unsigned long') 620 elif staticAssertSizeMatchesVoidStar('','unsigned'): 621 self.addDefine('UINTPTR_T', 'unsigned') 622 else: 623 raise RuntimeError('Could not find any unsigned integer type matching void*') 624 self.popLanguage() 625 626 def configureInline(self): 627 '''Get a generic inline keyword, depending on the language''' 628 if self.languages.clanguage == 'C': 629 self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword) 630 self.addDefine('RESTRICT', self.compilers.cRestrict) 631 elif self.languages.clanguage == 'Cxx': 632 self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword) 633 self.addDefine('RESTRICT', self.compilers.cxxRestrict) 634 635 if self.checkCompile('#include <dlfcn.h>\n void *ptr = RTLD_DEFAULT;'): 636 self.addDefine('RTLD_DEFAULT','1') 637 return 638 639 def configureSolaris(self): 640 '''Solaris specific stuff''' 641 if os.path.isdir(os.path.join('/usr','ucblib')): 642 try: 643 flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 644 except AttributeError: 645 flag = None 646 if flag is None: 647 self.compilers.LIBS += ' -L/usr/ucblib' 648 else: 649 self.compilers.LIBS += ' '+flag+'/usr/ucblib' 650 return 651 652 def configureLinux(self): 653 '''Linux specific stuff''' 654 # TODO: Test for this by mallocing an odd number of floats and checking the address 655 self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 656 return 657 658 def configureWin32(self): 659 '''Win32 non-cygwin specific stuff''' 660 kernel32=0 661 if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 662 self.addDefine('HAVE_WINDOWS_H',1) 663 self.addDefine('HAVE_GETCOMPUTERNAME',1) 664 kernel32=1 665 elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 666 self.addDefine('HAVE_WINDOWS_H',1) 667 self.addDefine('HAVE_GETCOMPUTERNAME',1) 668 kernel32=1 669 if kernel32: 670 if self.framework.argDB['with-windows-graphics']: 671 self.addDefine('USE_WINDOWS_GRAPHICS',1) 672 if self.checkLink('#include <Windows.h>','LoadLibrary(0)'): 673 self.addDefine('HAVE_LOADLIBRARY',1) 674 if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'): 675 self.addDefine('HAVE_GETPROCADDRESS',1) 676 if self.checkLink('#include <Windows.h>','FreeLibrary(0)'): 677 self.addDefine('HAVE_FREELIBRARY',1) 678 if self.checkLink('#include <Windows.h>','GetLastError()'): 679 self.addDefine('HAVE_GETLASTERROR',1) 680 if self.checkLink('#include <Windows.h>','SetLastError(0)'): 681 self.addDefine('HAVE_SETLASTERROR',1) 682 if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'): 683 self.addDefine('USE_NT_TIME',1) 684 if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 685 self.addDefine('HAVE_GET_USER_NAME',1) 686 elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 687 self.addDefine('HAVE_GET_USER_NAME',1) 688 689 if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'): 690 self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);') 691 if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'): 692 self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);') 693 694 self.types.check('int32_t', 'int') 695 if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 696 self.addTypedef('int', 'uid_t') 697 self.addTypedef('int', 'gid_t') 698 if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 699 self.framework.addDefine('R_OK', '04') 700 self.framework.addDefine('W_OK', '02') 701 self.framework.addDefine('X_OK', '01') 702 if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 703 self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 704 self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 705 if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 706 self.addDefine('HAVE_LARGE_INTEGER_U',1) 707 708 # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 709 if self.checkCompile('#include <Windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'): 710 self.addDefine('HAVE_O_BINARY',1) 711 712 if self.compilers.CC.find('win32fe') >= 0: 713 self.addDefine('PATH_SEPARATOR','\';\'') 714 self.addDefine('DIR_SEPARATOR','\'\\\\\'') 715 self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 716 self.addDefine('CANNOT_START_DEBUGGER',1) 717 else: 718 self.addDefine('PATH_SEPARATOR','\':\'') 719 self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 720 self.addDefine('DIR_SEPARATOR','\'/\'') 721 722 return 723 724#----------------------------------------------------------------------------------------------------- 725 def configureDefaultArch(self): 726 conffile = os.path.join('conf', 'petscvariables') 727 if self.framework.argDB['with-default-arch']: 728 fd = file(conffile, 'w') 729 fd.write('PETSC_ARCH='+self.arch.arch+'\n') 730 fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 731 fd.write('include '+os.path.join(self.petscdir.dir,self.arch.arch,'conf','petscvariables')+'\n') 732 fd.close() 733 self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 734 elif os.path.isfile(conffile): 735 try: 736 os.unlink(conffile) 737 except: 738 raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 739 return 740 741#----------------------------------------------------------------------------------------------------- 742 def configureScript(self): 743 '''Output a script in the conf directory which will reproduce the configuration''' 744 import nargs 745 import sys 746 scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py') 747 args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 748 if 'configModules' in args: 749 if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 750 del args['configModules'] 751 if 'optionsModule' in args: 752 if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions': 753 del args['optionsModule'] 754 if not 'PETSC_ARCH' in args: 755 args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 756 f = file(scriptName, 'w') 757 f.write('#!'+sys.executable+'\n') 758 f.write('if __name__ == \'__main__\':\n') 759 f.write(' import sys\n') 760 f.write(' import os\n') 761 f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 762 f.write(' import configure\n') 763 # pretty print repr(args.values()) 764 f.write(' configure_options = [\n') 765 for itm in sorted(args.values()): 766 f.write(' \''+str(itm)+'\',\n') 767 f.write(' ]\n') 768 f.write(' configure.petsc_configure(configure_options)\n') 769 f.close() 770 try: 771 os.chmod(scriptName, 0775) 772 except OSError, e: 773 self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 774 self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 775 return 776 777 def configureInstall(self): 778 '''Setup the directories for installation''' 779 if self.framework.argDB['prefix']: 780 self.installdir = self.framework.argDB['prefix'] 781 self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\ 782 '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 783 '-@echo "========================================="']) 784 else: 785 self.installdir = os.path.join(self.petscdir.dir,self.arch.arch) 786 self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\ 787 '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\ 788 '-@echo "========================================="']) 789 return 790 791 def configureGCOV(self): 792 if self.framework.argDB['with-gcov']: 793 self.addDefine('USE_GCOV','1') 794 return 795 796 def configureFortranFlush(self): 797 if hasattr(self.compilers, 'FC'): 798 for baseName in ['flush','flush_']: 799 if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1): 800 self.addDefine('HAVE_'+baseName.upper(), 1) 801 return 802 803 def postProcessPackages(self): 804 postPackages=[] 805 for i in self.framework.packages: 806 if hasattr(i,'postProcess'): postPackages.append(i) 807 if postPackages: 808 # prometheus needs petsc conf files. so attempt to create them early 809 self.framework.dumpConfFiles() 810 for i in postPackages: i.postProcess() 811 return 812 813 def configure(self): 814 if not os.path.samefile(self.petscdir.dir, os.getcwd()): 815 raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 816 if self.framework.argDB['prefix'] and os.path.isdir(self.framework.argDB['prefix']) and os.path.samefile(self.framework.argDB['prefix'],self.petscdir.dir): 817 raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 818 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)): 819 raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!') 820 self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 821 self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 822 self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables') 823 self.framework.makeRuleHeader = os.path.join(self.arch.arch,'conf','petscrules') 824 if self.libraries.math is None: 825 raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 826 if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 827 raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 828 self.executeTest(self.configureInline) 829 self.executeTest(self.configurePrefetch) 830 self.executeTest(self.configureUnused) 831 self.executeTest(self.configureExpect); 832 self.executeTest(self.configureFunctionName); 833 self.executeTest(self.configureIntptrt); 834 self.executeTest(self.configureSolaris) 835 self.executeTest(self.configureLinux) 836 self.executeTest(self.configureWin32) 837 self.executeTest(self.configureDefaultArch) 838 self.executeTest(self.configureScript) 839 self.executeTest(self.configureInstall) 840 self.executeTest(self.configureGCOV) 841 self.executeTest(self.configureFortranFlush) 842 self.executeTest(self.configureFeatureTestMacros) 843 self.executeTest(self.configureAtoll) 844 # dummy rules, always needed except for remote builds 845 self.addMakeRule('remote','') 846 self.addMakeRule('remoteclean','') 847 848 self.Dump() 849 self.dumpConfigInfo() 850 self.dumpMachineInfo() 851 self.postProcessPackages() 852 self.dumpCMakeConfig() 853 self.dumpCMakeLists() 854 self.cmakeBoot() 855 self.framework.log.write('================================================================================\n') 856 self.logClear() 857 return 858