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