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