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