1import config.base 2 3import os 4import sys 5import re 6import pickle 7 8class Configure(config.base.Configure): 9 def __init__(self, framework): 10 config.base.Configure.__init__(self, framework) 11 self.headerPrefix = 'PETSC' 12 self.substPrefix = 'PETSC' 13 self.installed = 0 # 1 indicates that Configure itself has already compiled and installed PETSc 14 return 15 16 def __str2__(self): 17 desc = [] 18 if not self.installed: 19 desc.append('xxx=========================================================================xxx') 20 desc.append(' Configure stage complete. Now build PETSc libraries with:') 21 desc.append(' make PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' all') 22 desc.append('xxx=========================================================================xxx') 23 else: 24 desc.append('xxx=========================================================================xxx') 25 desc.append(' Installation complete. You do not need to run make to compile or install the software') 26 desc.append('xxx=========================================================================xxx') 27 return '\n'.join(desc)+'\n' 28 29 def setupHelp(self, help): 30 import nargs 31 help.addArgument('PETSc', '-prefix=<dir>', nargs.Arg(None, '', 'Specifiy location to install PETSc (eg. /usr/local)')) 32 help.addArgument('PETSc', '-with-prefetch=<bool>', nargs.ArgBool(None, 1,'Enable checking for prefetch instructions')) 33 help.addArgument('Windows','-with-windows-graphics=<bool>', nargs.ArgBool(None, 1,'Enable check for Windows Graphics')) 34 help.addArgument('PETSc', '-with-default-arch=<bool>', nargs.ArgBool(None, 1, 'Allow using the last configured arch without setting PETSC_ARCH')) 35 help.addArgument('PETSc','-with-single-library=<bool>', nargs.ArgBool(None, 1,'Put all PETSc code into the single -lpetsc library')) 36 help.addArgument('PETSc','-with-fortran-bindings=<bool>', nargs.ArgBool(None, 1,'Build PETSc fortran bindings in the library and corresponding module files')) 37 help.addArgument('PETSc', '-with-ios=<bool>', nargs.ArgBool(None, 0, 'Build an iPhone/iPad version of PETSc library')) 38 help.addArgument('PETSc', '-with-xsdk-defaults', nargs.ArgBool(None, 0, 'Set the following as defaults for the xSDK standard: --enable-debug=1, --enable-shared=1, --with-precision=double, --with-index-size=32, locate blas/lapack automatically')) 39 help.addArgument('PETSc', '-with-display=<x11display>', nargs.Arg(None, '', 'Specifiy DISPLAY env variable for use with matlab test)')) 40 help.addArgument('PETSc', '-with-package-scripts=<pyscripts>',nargs.ArgFileList(None,None,'Specify configure package scripts for user provided packages')) 41 return 42 43 def registerPythonFile(self,filename,directory): 44 ''' Add a python file to the framework and registers its headerprefix, ... externalpackagedir 45 directory is the directory where the file relative to the BuildSystem or config path in python notation with . ''' 46 (utilityName, ext) = os.path.splitext(filename) 47 if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__': 48 if directory: directory = directory+'.' 49 utilityObj = self.framework.require(directory+utilityName, self) 50 utilityObj.headerPrefix = self.headerPrefix 51 utilityObj.archProvider = self.arch 52 utilityObj.languageProvider = self.languages 53 utilityObj.installDirProvider = self.installdir 54 utilityObj.externalPackagesDirProvider = self.externalpackagesdir 55 utilityObj.precisionProvider = self.scalartypes 56 utilityObj.indexProvider = self.indexTypes 57 setattr(self, utilityName.lower(), utilityObj) 58 return utilityObj 59 return None 60 61 def setupDependencies(self, framework): 62 config.base.Configure.setupDependencies(self, framework) 63 self.programs = framework.require('config.programs', self) 64 self.setCompilers = framework.require('config.setCompilers', self) 65 self.compilers = framework.require('config.compilers', self) 66 self.arch = framework.require('PETSc.options.arch', self.setCompilers) 67 self.petscdir = framework.require('PETSc.options.petscdir', self.arch) 68 self.installdir = framework.require('PETSc.options.installDir', self) 69 self.scalartypes = framework.require('PETSc.options.scalarTypes', self) 70 self.indexTypes = framework.require('PETSc.options.indexTypes', self) 71 self.languages = framework.require('PETSc.options.languages', self.setCompilers) 72 self.indexTypes = framework.require('PETSc.options.indexTypes', self.compilers) 73 self.compilers = framework.require('config.compilers', self) 74 self.types = framework.require('config.types', self) 75 self.headers = framework.require('config.headers', self) 76 self.functions = framework.require('config.functions', self) 77 self.libraries = framework.require('config.libraries', self) 78 self.atomics = framework.require('config.atomics', self) 79 self.make = framework.require('config.packages.make', self) 80 self.blasLapack = framework.require('config.packages.BlasLapack',self) 81 self.externalpackagesdir = framework.require('PETSc.options.externalpackagesdir',self) 82 self.mpi = framework.require('config.packages.MPI',self) 83 84 for utility in sorted(os.listdir(os.path.join('config','PETSc','options'))): 85 self.registerPythonFile(utility,'PETSc.options') 86 87 for utility in sorted(os.listdir(os.path.join('config','BuildSystem','config','utilities'))): 88 self.registerPythonFile(utility,'config.utilities') 89 90 for package in sorted(os.listdir(os.path.join('config', 'BuildSystem', 'config', 'packages'))): 91 obj = self.registerPythonFile(package,'config.packages') 92 if obj: 93 obj.archProvider = self.framework.requireModule(obj.archProvider, obj) 94 obj.languageProvider = self.framework.requireModule(obj.languageProvider, obj) 95 obj.installDirProvider = self.framework.requireModule(obj.installDirProvider, obj) 96 obj.externalPackagesDirProvider = self.framework.requireModule(obj.externalPackagesDirProvider, obj) 97 obj.precisionProvider = self.framework.requireModule(obj.precisionProvider, obj) 98 obj.indexProvider = self.framework.requireModule(obj.indexProvider, obj) 99 100 # Force blaslapack and opencl to depend on scalarType so precision is set before BlasLapack is built 101 framework.require('PETSc.options.scalarTypes', self.f2cblaslapack) 102 framework.require('PETSc.options.scalarTypes', self.fblaslapack) 103 framework.require('PETSc.options.scalarTypes', self.blaslapack) 104 framework.require('PETSc.options.scalarTypes', self.opencl) 105 106 self.programs.headerPrefix = self.headerPrefix 107 self.compilers.headerPrefix = self.headerPrefix 108 self.types.headerPrefix = self.headerPrefix 109 self.headers.headerPrefix = self.headerPrefix 110 self.functions.headerPrefix = self.headerPrefix 111 self.libraries.headerPrefix = self.headerPrefix 112 113 # Register user provided package scripts 114 if 'with-package-scripts' in self.framework.argDB: 115 for script in self.framework.argDB['with-package-scripts']: 116 if os.path.splitext(script)[1] != '.py': 117 raise RuntimeError('Only python scripts compatible with configure package script format should be specified! Invalid option -with-package-scripts='+script) 118 self.framework.logPrint('User is registering a new package script: '+script) 119 dname,fname = os.path.split(script) 120 if dname: sys.path.append(dname) 121 self.registerPythonFile(fname,'') 122 123 # test for a variety of basic headers and functions 124 headersC = map(lambda name: name+'.h', ['setjmp','dos', 'fcntl', 'float', 'io', 'malloc', 'pwd', 'strings', 125 'unistd', 'sys/sysinfo', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource', 126 'sys/systeminfo', 'sys/times', 'sys/utsname', 127 'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types', 128 'WindowsX', 'float','ieeefp','stdint','pthread','inttypes','immintrin','zmmintrin']) 129 functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 130 'getwd', 'memalign', 'popen', 'PXFGETARG', 'rand', 'getpagesize', 131 'readlink', 'realpath', 'usleep', 'sleep', '_sleep', 132 'uname','snprintf','_snprintf','lseek','_lseek','time','fork','stricmp', 133 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror', 134 '_set_output_format','_mkdir','socket','gethostbyname'] 135 libraries = [(['fpe'], 'handle_sigfpes')] 136 librariessock = [(['socket', 'nsl'], 'socket')] 137 self.headers.headers.extend(headersC) 138 self.functions.functions.extend(functions) 139 self.libraries.libraries.extend(libraries) 140 if not hasattr(self,'socket'): 141 self.libraries.libraries.extend(librariessock) 142 return 143 144 def DumpPkgconfig(self): 145 ''' Create a pkg-config file ''' 146 if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')): 147 os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')) 148 fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig','PETSc.pc'),'w') 149 cflags_inc = ['-I${includedir}'] 150 if self.framework.argDB['prefix']: 151 fd.write('prefix='+self.installdir.dir+'\n') 152 else: 153 fd.write('prefix='+os.path.join(self.petscdir.dir, self.arch.arch)+'\n') 154 cflags_inc.append('-I' + os.path.join(self.petscdir.dir, 'include')) 155 fd.write('exec_prefix=${prefix}\n') 156 fd.write('includedir=${prefix}/include\n') 157 fd.write('libdir=${prefix}/lib\n') 158 159 self.setCompilers.pushLanguage('C') 160 fd.write('ccompiler='+self.setCompilers.getCompiler()+'\n') 161 fd.write('cflags_extra='+self.setCompilers.getCompilerFlags().strip()+'\n') 162 fd.write('cflags_dep='+self.compilers.dependenciesGenerationFlag.get('C','')+'\n') 163 fd.write('ldflag_rpath='+self.setCompilers.CSharedLinkerFlag+'\n') 164 self.setCompilers.popLanguage() 165 if hasattr(self.compilers, 'CXX'): 166 self.setCompilers.pushLanguage('C++') 167 fd.write('cxxcompiler='+self.setCompilers.getCompiler()+'\n') 168 fd.write('cxxflags_extra='+self.setCompilers.getCompilerFlags().strip()+'\n') 169 self.setCompilers.popLanguage() 170 if hasattr(self.compilers, 'FC'): 171 self.setCompilers.pushLanguage('FC') 172 fd.write('fcompiler='+self.setCompilers.getCompiler()+'\n') 173 fd.write('fflags_extra='+self.setCompilers.getCompilerFlags().strip()+'\n') 174 self.setCompilers.popLanguage() 175 176 fd.write('\n') 177 fd.write('Name: PETSc\n') 178 fd.write('Description: Library to solve ODEs and algebraic equations\n') 179 fd.write('Version: %s\n' % self.petscdir.version) 180 fd.write('Cflags: ' + ' '.join([self.setCompilers.CPPFLAGS] + cflags_inc) + '\n') 181 fd.write('Libs: '+self.libraries.toStringNoDupes(['-L${libdir}', self.petsclib], with_rpath=False)+'\n') 182 # Remove RPATH flags from library list. User can add them using 183 # pkg-config --variable=ldflag_rpath and pkg-config --libs-only-L 184 fd.write('Libs.private: '+self.libraries.toStringNoDupes([f for f in self.packagelibs+self.complibs if not f.startswith(self.setCompilers.CSharedLinkerFlag)], with_rpath=False)+'\n') 185 186 fd.close() 187 return 188 189 def DumpModule(self): 190 ''' Create a module file ''' 191 if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules')): 192 os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules')) 193 if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules','petsc')): 194 os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules','petsc')) 195 if self.framework.argDB['prefix']: 196 installdir = self.installdir.dir 197 installarch = '' 198 installpath = os.path.join(installdir,'bin') 199 else: 200 installdir = self.petscdir.dir 201 installarch = self.arch.arch 202 installpath = os.path.join(installdir,installarch,'bin')+':'+os.path.join(installdir,'bin') 203 fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules','petsc',self.petscdir.version),'w') 204 fd.write('''\ 205#%%Module 206 207proc ModulesHelp { } { 208 puts stderr "This module sets the path and environment variables for petsc-%s" 209 puts stderr " see https://www.mcs.anl.gov/petsc/ for more information " 210 puts stderr "" 211} 212module-whatis "PETSc - Portable, Extensible Toolkit for Scientific Computation" 213 214set petsc_dir "%s" 215set petsc_arch "%s" 216 217setenv PETSC_ARCH "$petsc_arch" 218setenv PETSC_DIR "$petsc_dir" 219prepend-path PATH "%s" 220''' % (self.petscdir.version, installdir, installarch, installpath)) 221 fd.close() 222 return 223 224 def Dump(self): 225 ''' Actually put the values into the configuration files ''' 226 # eventually everything between -- should be gone 227 if self.mpi.usingMPIUni: 228 # 229 # Remove any MPI/MPICH include files that may have been put here by previous runs of ./configure 230 self.executeShellCommand('rm -rf '+os.path.join(self.petscdir.dir,self.arch.arch,'include','mpi*')+' '+os.path.join(self.petscdir.dir,self.arch.arch,'include','opa*'), log = self.log) 231 232 self.setCompilers.pushLanguage('C') 233 compiler = self.setCompilers.getCompiler() 234 if compiler.endswith('mpicc') or compiler.endswith('mpiicc'): 235 try: 236 output = self.executeShellCommand(compiler + ' -show', log = self.log)[0] 237 compiler = output.split(' ')[0] 238 self.addDefine('MPICC_SHOW','"'+output.strip().replace('\n','\\\\n')+'"') 239 except: 240 self.addDefine('MPICC_SHOW','"Unavailable"') 241 else: 242 self.addDefine('MPICC_SHOW','"Unavailable"') 243 self.setCompilers.popLanguage() 244#----------------------------------------------------------------------------------------------------- 245 246 # Sometimes we need C compiler, even if built with C++ 247 self.setCompilers.pushLanguage('C') 248 self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 249 self.setCompilers.popLanguage() 250 251 # And sometimes we need a C++ compiler even when PETSc is built with C 252 if hasattr(self.compilers, 'CXX'): 253 self.setCompilers.pushLanguage('Cxx') 254 self.addDefine('HAVE_CXX','1') 255 self.addMakeMacro('CXX_FLAGS',self.setCompilers.getCompilerFlags()) 256 cxx_linker = self.setCompilers.getLinker() 257 self.addMakeMacro('CXX_LINKER',cxx_linker) 258 self.addMakeMacro('CXX_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 259 self.setCompilers.popLanguage() 260 261 # C preprocessor values 262 self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS) 263 264 # compiler values 265 self.setCompilers.pushLanguage(self.languages.clanguage) 266 self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 267 self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 268 self.setCompilers.popLanguage() 269 # .o or .obj 270 self.addMakeMacro('CC_SUFFIX','o') 271 272 # executable linker values 273 self.setCompilers.pushLanguage(self.languages.clanguage) 274 pcc_linker = self.setCompilers.getLinker() 275 self.addMakeMacro('PCC_LINKER',pcc_linker) 276 self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 277 self.setCompilers.popLanguage() 278 # '' for Unix, .exe for Windows 279 self.addMakeMacro('CC_LINKER_SUFFIX','') 280 281 if hasattr(self.compilers, 'FC'): 282 if self.framework.argDB['with-fortran-bindings']: 283 self.addDefine('HAVE_FORTRAN','1') 284 self.setCompilers.pushLanguage('FC') 285 # need FPPFLAGS in config/setCompilers 286 self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS) 287 288 # compiler values 289 self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 290 self.setCompilers.popLanguage() 291 # .o or .obj 292 self.addMakeMacro('FC_SUFFIX','o') 293 294 # executable linker values 295 self.setCompilers.pushLanguage('FC') 296 self.addMakeMacro('FC_LINKER',self.setCompilers.getLinker()) 297 self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 298 # apple requires this shared library linker flag on SOME versions of the os 299 if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 300 self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 301 self.setCompilers.popLanguage() 302 303 # F90 Modules 304 if self.setCompilers.fortranModuleIncludeFlag: 305 self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag) 306 else: # for non-f90 compilers like g77 307 self.addMakeMacro('FC_MODULE_FLAG', '-I') 308 if self.setCompilers.fortranModuleIncludeFlag: 309 self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag) 310 else: 311 self.addMakeMacro('FC','') 312 313 if hasattr(self.compilers, 'CUDAC'): 314 self.setCompilers.pushLanguage('CUDA') 315 self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags()) 316 self.setCompilers.popLanguage() 317 318 # shared library linker values 319 self.setCompilers.pushLanguage(self.languages.clanguage) 320 # need to fix BuildSystem to collect these separately 321 self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 322 self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 323 self.setCompilers.popLanguage() 324 # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 325 # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 326 if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 327 self.addMakeMacro('SL_LINKER_SUFFIX', '') 328 self.addDefine('SLSUFFIX','""') 329 else: 330 self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 331 self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"') 332 333 self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}') 334 335#----------------------------------------------------------------------------------------------------- 336 337 # CONLY or CPP. We should change the PETSc makefiles to do this better 338 if self.languages.clanguage == 'C': lang = 'CONLY' 339 else: lang = 'CXXONLY' 340 self.addMakeMacro('PETSC_LANGUAGE',lang) 341 342 # real or complex 343 self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 344 # double or float 345 self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 346 347 if self.framework.argDB['with-batch']: 348 self.addMakeMacro('PETSC_WITH_BATCH','1') 349 350 # Test for compiler-specific macros that need to be defined. 351 if self.setCompilers.isCrayVector('CC', self.log): 352 self.addDefine('HAVE_CRAY_VECTOR','1') 353 354#----------------------------------------------------------------------------------------------------- 355 if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket') and self.headers.haveHeader('netinet/in.h'): 356 self.addDefine('USE_SOCKET_VIEWER','1') 357 if self.checkCompile('#include <sys/socket.h>','setsockopt(0,SOL_SOCKET,SO_REUSEADDR,0,0)'): 358 self.addDefine('HAVE_SO_REUSEADDR','1') 359 360#----------------------------------------------------------------------------------------------------- 361 # print include and lib for makefiles 362 self.framework.packages.reverse() 363 petscincludes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')] 364 petscincludes_install = [os.path.join(self.installdir.dir, 'include')] if self.framework.argDB['prefix'] else petscincludes 365 includes = [] 366 self.packagelibs = [] 367 for i in self.framework.packages: 368 if not i.required: 369 self.addDefine('HAVE_'+i.PACKAGE.replace('-','_'), 1) # ONLY list package if it is used directly by PETSc (and not only by another package) 370 if not isinstance(i.lib, list): 371 i.lib = [i.lib] 372 if i.linkedbypetsc: self.packagelibs.extend(i.lib) 373 self.addMakeMacro(i.PACKAGE.replace('-','_')+'_LIB', self.libraries.toStringNoDupes(i.lib)) 374 if hasattr(i,'include'): 375 if not isinstance(i.include,list): 376 i.include = [i.include] 377 includes.extend(i.include) 378 self.addMakeMacro(i.PACKAGE.replace('-','_')+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 379 if self.framework.argDB['with-single-library']: 380 self.petsclib = '-lpetsc' 381 else: 382 self.petsclib = '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys' 383 self.complibs = self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split() 384 self.PETSC_WITH_EXTERNAL_LIB = self.libraries.toStringNoDupes(['-L${PETSC_DIR}/${PETSC_ARCH}/lib', self.petsclib]+self.packagelibs+self.complibs) 385 self.PETSC_EXTERNAL_LIB_BASIC = self.libraries.toStringNoDupes(self.packagelibs+self.complibs) 386 387 self.addMakeMacro('PETSC_EXTERNAL_LIB_BASIC',self.PETSC_EXTERNAL_LIB_BASIC) 388 allincludes = petscincludes + includes 389 allincludes_install = petscincludes_install + includes 390 self.PETSC_CC_INCLUDES = self.headers.toStringNoDupes(allincludes) 391 self.PETSC_CC_INCLUDES_INSTALL = self.headers.toStringNoDupes(allincludes_install) 392 self.addMakeMacro('PETSC_CC_INCLUDES',self.PETSC_CC_INCLUDES) 393 self.addMakeMacro('PETSC_CC_INCLUDES_INSTALL', self.PETSC_CC_INCLUDES_INSTALL) 394 if hasattr(self.compilers, 'FC'): 395 def modinc(includes): 396 return includes if self.compilers.fortranIsF90 else [] 397 self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(allincludes,modinc(allincludes))) 398 self.addMakeMacro('PETSC_FC_INCLUDES_INSTALL',self.headers.toStringNoDupes(allincludes_install,modinc(allincludes_install))) 399 400 self.addDefine('LIB_DIR','"'+os.path.join(self.installdir.dir,'lib')+'"') 401 402 if self.framework.argDB['with-single-library']: 403 # overrides the values set in conf/variables 404 self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 405 self.addMakeMacro('SHLIBS','libpetsc') 406 self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 407 self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 408 self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 409 self.addMakeMacro('PETSC_TAO_LIB_BASIC','-lpetsc') 410 self.addMakeMacro('PETSC_WITH_EXTERNAL_LIB',self.PETSC_WITH_EXTERNAL_LIB) 411 self.addDefine('USE_SINGLE_LIBRARY', '1') 412 if self.sharedlibraries.useShared: 413 self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 414 self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 415 self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 416 self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 417 self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 418 self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 419 self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 420 self.addMakeMacro('PETSC_TAO_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 421 self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 422 self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 423 self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 424 else: 425 self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 426 self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 427 self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}') 428 self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}') 429 self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}') 430 self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}') 431 self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 432 self.addMakeMacro('PETSC_TAO_LIB','${PETSC_WITH_EXTERNAL_LIB}') 433 self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 434 self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 435 self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}') 436 437 if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 438 os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 439 440# add a makefile endtry for display 441 if self.framework.argDB['with-display']: 442 self.addMakeMacro('DISPLAY',self.framework.argDB['with-display']) 443 444 # add a makefile entry for configure options 445 self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 446 return 447 448 def dumpConfigInfo(self): 449 import time 450 fd = open(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 451 fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 452 fd.close() 453 return 454 455 def dumpMachineInfo(self): 456 import platform 457 import datetime 458 import time 459 import script 460 def escape(s): 461 return s.replace('"',r'\"').replace(r'\ ',r'\\ ') 462 fd = open(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w') 463 fd.write('static const char *petscmachineinfo = \"\\n\"\n') 464 fd.write('\"-----------------------------------------\\n\"\n') 465 buildhost = platform.node() 466 if os.environ.get('SOURCE_DATE_EPOCH'): 467 buildhost = "reproducible" 468 buildtime = datetime.datetime.utcfromtimestamp(int(os.environ.get('SOURCE_DATE_EPOCH', time.time()))) 469 fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (buildtime, buildhost)) 470 fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform())) 471 fd.write('\"Using PETSc directory: %s\\n\"\n' % (escape(self.installdir.petscDir))) 472 fd.write('\"Using PETSc arch: %s\\n\"\n' % (escape(self.installdir.petscArch))) 473 fd.write('\"-----------------------------------------\\n\";\n') 474 fd.write('static const char *petsccompilerinfo = \"\\n\"\n') 475 self.setCompilers.pushLanguage(self.languages.clanguage) 476 fd.write('\"Using C compiler: %s %s \\n\"\n' % (escape(self.setCompilers.getCompiler()), escape(self.setCompilers.getCompilerFlags()))) 477 self.setCompilers.popLanguage() 478 if hasattr(self.compilers, 'FC'): 479 self.setCompilers.pushLanguage('FC') 480 fd.write('\"Using Fortran compiler: %s %s %s\\n\"\n' % (escape(self.setCompilers.getCompiler()), escape(self.setCompilers.getCompilerFlags()), escape(self.setCompilers.CPPFLAGS))) 481 self.setCompilers.popLanguage() 482 fd.write('\"-----------------------------------------\\n\";\n') 483 fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n') 484 fd.write('\"Using include paths: %s\\n\"\n' % (escape(self.PETSC_CC_INCLUDES_INSTALL.replace('${PETSC_DIR}', self.installdir.petscDir)))) 485 fd.write('\"-----------------------------------------\\n\";\n') 486 fd.write('static const char *petsclinkerinfo = \"\\n\"\n') 487 self.setCompilers.pushLanguage(self.languages.clanguage) 488 fd.write('\"Using C linker: %s\\n\"\n' % (escape(self.setCompilers.getLinker()))) 489 self.setCompilers.popLanguage() 490 if hasattr(self.compilers, 'FC'): 491 self.setCompilers.pushLanguage('FC') 492 fd.write('\"Using Fortran linker: %s\\n\"\n' % (escape(self.setCompilers.getLinker()))) 493 self.setCompilers.popLanguage() 494 fd.write('\"Using libraries: %s%s -L%s %s %s\\n\"\n' % (escape(self.setCompilers.CSharedLinkerFlag), escape(os.path.join(self.installdir.petscDir, self.installdir.petscArch, 'lib')), escape(os.path.join(self.installdir.petscDir, self.installdir.petscArch, 'lib')), escape(self.petsclib), escape(self.PETSC_EXTERNAL_LIB_BASIC))) 495 fd.write('\"-----------------------------------------\\n\";\n') 496 fd.close() 497 return 498 499 def configurePrefetch(self): 500 '''Sees if there are any prefetch functions supported''' 501 if config.setCompilers.Configure.isSolaris(self.log) or self.framework.argDB['with-ios'] or not self.framework.argDB['with-prefetch']: 502 self.addDefine('Prefetch(a,b,c)', ' ') 503 return 504 self.pushLanguage(self.languages.clanguage) 505 if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'): 506 # The Intel Intrinsics manual [1] specifies the prototype 507 # 508 # void _mm_prefetch(char const *a, int sel); 509 # 510 # but other vendors seem to insist on using subtly different 511 # prototypes, including void* for the pointer, and an enum for 512 # sel. These are both reasonable changes, but negatively impact 513 # portability. 514 # 515 # [1] https://software.intel.com/file/6373 516 self.addDefine('HAVE_XMMINTRIN_H', 1) 517 self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))') 518 self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 519 self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 520 self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 521 self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 522 elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'): 523 self.addDefine('HAVE_XMMINTRIN_H', 1) 524 self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))') 525 self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 526 self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 527 self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 528 self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 529 elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 530 # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality) 531 # 532 # The value of rw is a compile-time constant one or zero; one 533 # means that the prefetch is preparing for a write to the memory 534 # address and zero, the default, means that the prefetch is 535 # preparing for a read. The value locality must be a compile-time 536 # constant integer between zero and three. A value of zero means 537 # that the data has no temporal locality, so it need not be left 538 # in the cache after the access. A value of three means that the 539 # data has a high degree of temporal locality and should be left 540 # in all levels of cache possible. Values of one and two mean, 541 # respectively, a low or moderate degree of temporal locality. 542 # 543 # Here we adopt Intel's x86/x86-64 naming scheme for the locality 544 # hints. Using macros for these values in necessary since some 545 # compilers require an enum. 546 self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))') 547 self.addDefine('PREFETCH_HINT_NTA', '0') 548 self.addDefine('PREFETCH_HINT_T0', '3') 549 self.addDefine('PREFETCH_HINT_T1', '2') 550 self.addDefine('PREFETCH_HINT_T2', '1') 551 else: 552 self.addDefine('Prefetch(a,b,c)', ' ') 553 self.popLanguage() 554 555 def configureAtoll(self): 556 '''Checks if atoll exists''' 557 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")'): 558 self.addDefine('HAVE_ATOLL', '1') 559 560 def configureUnused(self): 561 '''Sees if __attribute((unused)) is supported''' 562 if self.framework.argDB['with-ios']: 563 self.addDefine('UNUSED', ' ') 564 return 565 self.pushLanguage(self.languages.clanguage) 566 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'): 567 self.addDefine('UNUSED', '__attribute((unused))') 568 else: 569 self.addDefine('UNUSED', ' ') 570 self.popLanguage() 571 572 def configureIsatty(self): 573 '''Check if the Unix C function isatty() works correctly 574 Actually just assumes it does not work correctly on batch systems''' 575 if not self.framework.argDB['with-batch']: 576 self.addDefine('USE_ISATTY',1) 577 578 def configureDeprecated(self): 579 '''Check if __attribute((deprecated)) is supported''' 580 self.pushLanguage(self.languages.clanguage) 581 ## Recent versions of gcc and clang support __attribute((deprecated("string argument"))), which is very useful, but 582 ## Intel has conspired to make a supremely environment-sensitive compiler. The Intel compiler looks at the gcc 583 ## executable in the environment to determine the language compatibility that it should attempt to emulate. Some 584 ## important Cray installations have built PETSc using the Intel compiler, but with a newer gcc module loaded (e.g., 585 ## 4.7). Thus at PETSc configure time, the Intel compiler decides to support the string argument, but the gcc 586 ## found in the default user environment is older and does not support the argument. If GCC and Intel were cool 587 ## like Clang and supported __has_attribute, we could avoid configure tests entirely, but they don't. And that is 588 ## why we can't have nice things. 589 # 590 # if self.checkCompile("""__attribute((deprecated("Why you shouldn't use myfunc"))) static int myfunc(void) { return 1;}""", ''): 591 # self.addDefine('DEPRECATED_FUNCTION(why)', '__attribute((deprecated(why)))') 592 # self.addDefine('DEPRECATED_TYPEDEF(why)', '__attribute((deprecated(why)))') 593 if self.checkCompile("""__attribute((deprecated)) static int myfunc(void) { return 1;}""", ''): 594 self.addDefine('DEPRECATED_FUNCTION(why)', '__attribute((deprecated))') 595 self.addDefine('DEPRECATED_TYPEDEF(why)', '__attribute((deprecated))') 596 else: 597 self.addDefine('DEPRECATED_FUNCTION(why)', ' ') 598 self.addDefine('DEPRECATED_TYPEDEF(why)', ' ') 599 if self.checkCompile("""enum E {oldval __attribute((deprecated)), newval };""", ''): 600 self.addDefine('DEPRECATED_ENUM(why)', '__attribute((deprecated))') 601 else: 602 self.addDefine('DEPRECATED_ENUM(why)', ' ') 603 # I was unable to make a CPP macro that takes the old and new values as seperate arguments and builds the message needed by _Pragma 604 # hence the deprecation message is handled as it is 605 if self.checkCompile('#define TEST _Pragma("GCC warning \"Testing _Pragma\"") value'): 606 self.addDefine('DEPRECATED_MACRO(why)', '_Pragma(why)') 607 else: 608 self.addDefine('DEPRECATED_MACRO(why)', ' ') 609 self.popLanguage() 610 611 def configureAlign(self): 612 '''Check if __attribute(aligned) is supported''' 613 code = '''\ 614struct mystruct {int myint;} __attribute((aligned(16))); 615char assert_aligned[(sizeof(struct mystruct)==16)*2-1]; 616''' 617 self.pushLanguage(self.languages.clanguage) 618 if self.checkCompile(code): 619 self.addDefine('ATTRIBUTEALIGNED(size)', '__attribute((aligned(size)))') 620 self.addDefine('HAVE_ATTRIBUTEALIGNED', 1) 621 else: 622 self.framework.logPrint('Incorrect attribute(aligned)') 623 self.addDefine('ATTRIBUTEALIGNED(size)', ' ') 624 self.popLanguage() 625 return 626 627 def configureExpect(self): 628 '''Sees if the __builtin_expect directive is supported''' 629 self.pushLanguage(self.languages.clanguage) 630 if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'): 631 self.addDefine('HAVE_BUILTIN_EXPECT', 1) 632 self.popLanguage() 633 634 def configureFunctionName(self): 635 '''Sees if the compiler supports __func__ or a variant.''' 636 def getFunctionName(lang): 637 name = '"unknown"' 638 self.pushLanguage(lang) 639 for fname in ['__func__','__FUNCTION__','__extension__ __func__']: 640 code = "if ("+fname+"[0] != 'm') return 1;" 641 if self.checkCompile('',code) and self.checkLink('',code): 642 name = fname 643 break 644 self.popLanguage() 645 return name 646 langs = [] 647 648 self.addDefine('FUNCTION_NAME_C', getFunctionName('C')) 649 if hasattr(self.compilers, 'CXX'): 650 self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx')) 651 652 def configureIntptrt(self): 653 '''Determine what to use for uintptr_t''' 654 def staticAssertSizeMatchesVoidStar(inc,typename): 655 # The declaration is an error if either array size is negative. 656 # It should be okay to use an int that is too large, but it would be very unlikely for this to be the case 657 return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n' 658 + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename)) 659 self.pushLanguage(self.languages.clanguage) 660 if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'): 661 self.addDefine('UINTPTR_T', 'uintptr_t') 662 elif staticAssertSizeMatchesVoidStar('','unsigned long long'): 663 self.addDefine('UINTPTR_T', 'unsigned long long') 664 elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'): 665 self.addDefine('UINTPTR_T', 'size_t') 666 elif staticAssertSizeMatchesVoidStar('','unsigned long'): 667 self.addDefine('UINTPTR_T', 'unsigned long') 668 elif staticAssertSizeMatchesVoidStar('','unsigned'): 669 self.addDefine('UINTPTR_T', 'unsigned') 670 else: 671 raise RuntimeError('Could not find any unsigned integer type matching void*') 672 self.popLanguage() 673 674 def configureRTLDDefault(self): 675 if self.checkCompile('#include <dlfcn.h>\n void *ptr = RTLD_DEFAULT;'): 676 self.addDefine('RTLD_DEFAULT','1') 677 return 678 679 def configureSolaris(self): 680 '''Solaris specific stuff''' 681 if os.path.isdir(os.path.join('/usr','ucblib')): 682 try: 683 flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 684 except AttributeError: 685 flag = None 686 if flag is None: 687 self.compilers.LIBS += ' -L/usr/ucblib' 688 else: 689 self.compilers.LIBS += ' '+flag+'/usr/ucblib' 690 return 691 692 def configureLinux(self): 693 '''Linux specific stuff''' 694 # TODO: Test for this by mallocing an odd number of floats and checking the address 695 self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 696 return 697 698 def configureWin32(self): 699 '''Win32 non-cygwin specific stuff''' 700 kernel32=0 701 if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 702 self.addDefine('HAVE_WINDOWS_H',1) 703 self.addDefine('HAVE_GETCOMPUTERNAME',1) 704 kernel32=1 705 elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 706 self.addDefine('HAVE_WINDOWS_H',1) 707 self.addDefine('HAVE_GETCOMPUTERNAME',1) 708 kernel32=1 709 if kernel32: 710 if self.framework.argDB['with-windows-graphics']: 711 self.addDefine('USE_WINDOWS_GRAPHICS',1) 712 if self.checkLink('#include <Windows.h>','LoadLibrary(0)'): 713 self.addDefine('HAVE_LOADLIBRARY',1) 714 if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'): 715 self.addDefine('HAVE_GETPROCADDRESS',1) 716 if self.checkLink('#include <Windows.h>','FreeLibrary(0)'): 717 self.addDefine('HAVE_FREELIBRARY',1) 718 if self.checkLink('#include <Windows.h>','GetLastError()'): 719 self.addDefine('HAVE_GETLASTERROR',1) 720 if self.checkLink('#include <Windows.h>','SetLastError(0)'): 721 self.addDefine('HAVE_SETLASTERROR',1) 722 if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'): 723 self.addDefine('USE_MICROSOFT_TIME',1) 724 if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 725 self.addDefine('HAVE_GET_USER_NAME',1) 726 elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 727 self.addDefine('HAVE_GET_USER_NAME',1) 728 729 if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'): 730 self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);') 731 if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'): 732 self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);') 733 734 self.types.check('int32_t', 'int') 735 if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 736 self.addTypedef('int', 'uid_t') 737 self.addTypedef('int', 'gid_t') 738 if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 739 self.framework.addDefine('R_OK', '04') 740 self.framework.addDefine('W_OK', '02') 741 self.framework.addDefine('X_OK', '01') 742 if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 743 self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 744 self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 745 if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 746 self.addDefine('HAVE_LARGE_INTEGER_U',1) 747 748 # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 749 if self.checkCompile('#include <Windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'): 750 self.addDefine('HAVE_O_BINARY',1) 751 752 if self.compilers.CC.find('win32fe') >= 0: 753 self.addDefine('HAVE_WINDOWS_COMPILERS',1) 754 self.addDefine('DIR_SEPARATOR','\'\\\\\'') 755 self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 756 self.addDefine('CANNOT_START_DEBUGGER',1) 757 (petscdir,error,status) = self.executeShellCommand('cygpath -w '+self.installdir.petscDir, log = self.log) 758 self.addDefine('DIR','"'+petscdir.replace('\\','\\\\')+'"') 759 (petscdir,error,status) = self.executeShellCommand('cygpath -m '+self.installdir.petscDir, log = self.log) 760 self.addMakeMacro('wPETSC_DIR',petscdir) 761 else: 762 self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 763 self.addDefine('DIR_SEPARATOR','\'/\'') 764 self.addDefine('DIR','"'+self.installdir.petscDir+'"') 765 self.addMakeMacro('wPETSC_DIR',self.installdir.petscDir) 766 self.addDefine('ARCH','"'+self.installdir.petscArch+'"') 767 return 768 769#----------------------------------------------------------------------------------------------------- 770 def configureCygwinBrokenPipe(self): 771 '''Cygwin version <= 1.7.18 had issues with pipes and long commands invoked from gnu-make 772 http://cygwin.com/ml/cygwin/2013-05/msg00340.html ''' 773 if config.setCompilers.Configure.isCygwin(self.log): 774 import platform 775 import re 776 r=re.compile("([0-9]+).([0-9]+).([0-9]+)") 777 m=r.match(platform.release()) 778 major=int(m.group(1)) 779 minor=int(m.group(2)) 780 subminor=int(m.group(3)) 781 if ((major < 1) or (major == 1 and minor < 7) or (major == 1 and minor == 7 and subminor <= 18)): 782 self.addMakeMacro('PETSC_CYGWIN_BROKEN_PIPE','1') 783 return 784 785#----------------------------------------------------------------------------------------------------- 786 def configureDefaultArch(self): 787 conffile = os.path.join('lib','petsc','conf', 'petscvariables') 788 if self.framework.argDB['with-default-arch']: 789 fd = open(conffile, 'w') 790 fd.write('PETSC_ARCH='+self.arch.arch+'\n') 791 fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 792 fd.write('include '+os.path.join('$(PETSC_DIR)','$(PETSC_ARCH)','lib','petsc','conf','petscvariables')+'\n') 793 fd.close() 794 self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 795 elif os.path.isfile(conffile): 796 try: 797 os.unlink(conffile) 798 except: 799 raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 800 return 801 802#----------------------------------------------------------------------------------------------------- 803 def configureScript(self): 804 '''Output a script in the conf directory which will reproduce the configuration''' 805 import nargs 806 import sys 807 scriptName = os.path.join(self.arch.arch,'lib','petsc','conf', 'reconfigure-'+self.arch.arch+'.py') 808 args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 809 if 'with-clean' in args: 810 del args['with-clean'] 811 if 'force' in args: 812 del args['force'] 813 if 'configModules' in args: 814 if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 815 del args['configModules'] 816 if 'optionsModule' in args: 817 if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'config.compilerOptions': 818 del args['optionsModule'] 819 if not 'PETSC_ARCH' in args: 820 args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 821 f = open(scriptName, 'w') 822 f.write('#!'+sys.executable+'\n') 823 f.write('if __name__ == \'__main__\':\n') 824 f.write(' import sys\n') 825 f.write(' import os\n') 826 f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 827 f.write(' import configure\n') 828 # pretty print repr(args.values()) 829 f.write(' configure_options = [\n') 830 for itm in sorted(args.values()): 831 f.write(' \''+str(itm)+'\',\n') 832 f.write(' ]\n') 833 f.write(' configure.petsc_configure(configure_options)\n') 834 f.close() 835 try: 836 os.chmod(scriptName, 0o775) 837 except OSError as e: 838 self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 839 self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 840 return 841 842 def configureInstall(self): 843 '''Setup the directories for installation''' 844 if self.framework.argDB['prefix']: 845 self.addMakeRule('print_mesg_after_build','',['-@echo "Now to install the libraries do:"',\ 846 '-@echo "'+self.installdir.installSudo+'make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 847 '-@echo "========================================="']) 848 else: 849 self.addMakeRule('print_mesg_after_build','',['-@echo "Now to check if the libraries are working do:"',\ 850 '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} check"',\ 851 '-@echo "========================================="']) 852 return 853 854 def configureGCOV(self): 855 if self.framework.argDB['with-gcov']: 856 self.addDefine('USE_GCOV','1') 857 return 858 859 def postProcessPackages(self): 860 postPackages=[] 861 for i in self.framework.packages: 862 if hasattr(i,'postProcess'): postPackages.append(i) 863 if postPackages: 864 # ctetgen needs petsc conf files. so attempt to create them early 865 self.framework.dumpConfFiles() 866 # tacky fix for dependency of Aluimia on Pflotran; requested via petsc-dev Matt provide a correct fix 867 for i in postPackages: 868 if i.name.upper() in ['PFLOTRAN']: 869 i.postProcess() 870 postPackages.remove(i) 871 for i in postPackages: i.postProcess() 872 for i in postPackages: 873 if i.installedpetsc: 874 self.installed = 1 875 break 876 return 877 878 def configure(self): 879 if 'package-prefix-hash' in self.argDB: 880 # turn off prefix if it was only used to for installing external packages. 881 self.framework.argDB['prefix'] = '' 882 self.dir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 883 self.installdir.dir = self.dir 884 self.installdir.petscDir = self.petscdir.dir 885 self.petscDir = self.petscdir.dir 886 self.petscArch = self.arch.arch 887 self.addMakeMacro('PREFIXDIR',self.dir) 888 self.confDir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 889 890 if not os.path.samefile(self.petscdir.dir, os.getcwd()): 891 raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 892 if self.framework.argDB['prefix'] and os.path.isdir(self.framework.argDB['prefix']) and os.path.samefile(self.framework.argDB['prefix'],self.petscdir.dir): 893 raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 894 if self.framework.argDB['prefix'] and self.framework.argDB['prefix'].find(' ') > -1: 895 raise RuntimeError('Your --prefix '+self.framework.argDB['prefix']+' has spaces in it; this is not allowed.\n Use a --prefix that does not have spaces in it') 896 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)): 897 raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!') 898 self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 899 self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 900 self.framework.pkgheader = os.path.join(self.arch.arch,'include','petscpkg_version.h') 901 self.framework.makeMacroHeader = os.path.join(self.arch.arch,'lib','petsc','conf','petscvariables') 902 self.framework.makeRuleHeader = os.path.join(self.arch.arch,'lib','petsc','conf','petscrules') 903 if self.libraries.math is None: 904 raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 905 if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 906 raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 907 self.executeTest(self.configureRTLDDefault) 908 self.executeTest(self.configurePrefetch) 909 self.executeTest(self.configureUnused) 910 self.executeTest(self.configureDeprecated) 911 self.executeTest(self.configureIsatty) 912 self.executeTest(self.configureExpect); 913 self.executeTest(self.configureAlign); 914 self.executeTest(self.configureFunctionName); 915 self.executeTest(self.configureIntptrt); 916 self.executeTest(self.configureSolaris) 917 self.executeTest(self.configureLinux) 918 self.executeTest(self.configureWin32) 919 self.executeTest(self.configureCygwinBrokenPipe) 920 self.executeTest(self.configureDefaultArch) 921 self.executeTest(self.configureScript) 922 self.executeTest(self.configureInstall) 923 self.executeTest(self.configureGCOV) 924 self.executeTest(self.configureAtoll) 925 926 self.Dump() 927 self.dumpConfigInfo() 928 self.dumpMachineInfo() 929 # need to save the current state of BuildSystem so that postProcess() packages can read it in and perhaps run make install 930 self.framework.storeSubstitutions(self.framework.argDB) 931 self.framework.argDB['configureCache'] = pickle.dumps(self.framework) 932 self.framework.argDB.save(force = True) 933 self.DumpPkgconfig() 934 self.DumpModule() 935 self.postProcessPackages() 936 self.framework.log.write('================================================================================\n') 937 self.logClear() 938 return 939