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