1f8833479SBarry Smithimport config.base 2f8833479SBarry Smith 3f8833479SBarry Smithimport os 46dd73af6SBarry Smithimport sys 5f8833479SBarry Smithimport re 6492432c8SJed Brownimport pickle 7f8833479SBarry Smith 8f8833479SBarry Smithclass Configure(config.base.Configure): 9f8833479SBarry Smith def __init__(self, framework): 10f8833479SBarry Smith config.base.Configure.__init__(self, framework) 11f8833479SBarry Smith self.headerPrefix = 'PETSC' 12f8833479SBarry Smith self.substPrefix = 'PETSC' 13aa5c8b8eSBarry Smith self.installed = 0 # 1 indicates that Configure itself has already compiled and installed PETSc 14f8833479SBarry Smith return 15f8833479SBarry Smith 167c939e48SSatish Balay def __str2__(self): 177c939e48SSatish Balay desc = [] 18aa5c8b8eSBarry Smith if not self.installed: 19a0022257SSatish Balay desc.append('xxx=========================================================================xxx') 20dc0529c6SBarry Smith desc.append(' Configure stage complete. Now build PETSc libraries with:') 21b3618d6dSSatish Balay desc.append(' make PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' all') 22a0022257SSatish Balay desc.append('xxx=========================================================================xxx') 23aa5c8b8eSBarry Smith else: 24aa5c8b8eSBarry Smith desc.append('xxx=========================================================================xxx') 25aa5c8b8eSBarry Smith desc.append(' Installation complete. You do not need to run make to compile or install the software') 26aa5c8b8eSBarry Smith desc.append('xxx=========================================================================xxx') 277c939e48SSatish Balay return '\n'.join(desc)+'\n' 28f8833479SBarry Smith 29f8833479SBarry Smith def setupHelp(self, help): 30f8833479SBarry Smith import nargs 31ce0b2093SBarry Smith help.addArgument('PETSc', '-prefix=<dir>', nargs.Arg(None, '', 'Specifiy location to install PETSc (eg. /usr/local)')) 327deb5ab3SBarry Smith help.addArgument('PETSc', '-with-prefetch=<bool>', nargs.ArgBool(None, 1,'Enable checking for prefetch instructions')) 33eed94e11SSatish Balay help.addArgument('Windows','-with-windows-graphics=<bool>', nargs.ArgBool(None, 1,'Enable check for Windows Graphics')) 34569865ddSSatish Balay help.addArgument('PETSc', '-with-default-arch=<bool>', nargs.ArgBool(None, 1, 'Allow using the last configured arch without setting PETSC_ARCH')) 3557cb31baSSatish Balay help.addArgument('PETSc','-with-single-library=<bool>', nargs.ArgBool(None, 1,'Put all PETSc code into the single -lpetsc library')) 36cb297985SSatish Balay help.addArgument('PETSc','-with-fortran-bindings=<bool>', nargs.ArgBool(None, 1,'Build PETSc fortran bindings in the library and corresponding module files')) 37525d6f2eSBarry Smith help.addArgument('PETSc', '-with-ios=<bool>', nargs.ArgBool(None, 0, 'Build an iPhone/iPad version of PETSc library')) 388fd71741SJason Sarich 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')) 3913f9d092SSatish Balay help.addArgument('PETSc', '-with-display=<x11display>', nargs.Arg(None, '', 'Specifiy DISPLAY env variable for use with matlab test)')) 402c30b4dfSSatish Balay help.addArgument('PETSc', '-with-package-scripts=<pyscripts>',nargs.ArgFileList(None,None,'Specify configure package scripts for user provided packages')) 41f8833479SBarry Smith return 42f8833479SBarry Smith 436dd73af6SBarry Smith def registerPythonFile(self,filename,directory): 446dd73af6SBarry Smith ''' Add a python file to the framework and registers its headerprefix, ... externalpackagedir 456dd73af6SBarry Smith directory is the directory where the file relative to the BuildSystem or config path in python notation with . ''' 466dd73af6SBarry Smith (utilityName, ext) = os.path.splitext(filename) 476dd73af6SBarry Smith if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__': 486dd73af6SBarry Smith if directory: directory = directory+'.' 496dd73af6SBarry Smith utilityObj = self.framework.require(directory+utilityName, self) 506dd73af6SBarry Smith utilityObj.headerPrefix = self.headerPrefix 516dd73af6SBarry Smith utilityObj.archProvider = self.arch 526dd73af6SBarry Smith utilityObj.languageProvider = self.languages 536dd73af6SBarry Smith utilityObj.installDirProvider = self.installdir 546dd73af6SBarry Smith utilityObj.externalPackagesDirProvider = self.externalpackagesdir 556dd73af6SBarry Smith utilityObj.precisionProvider = self.scalartypes 566dd73af6SBarry Smith utilityObj.indexProvider = self.indexTypes 576dd73af6SBarry Smith setattr(self, utilityName.lower(), utilityObj) 5851294b80SMatthew G. Knepley return utilityObj 5951294b80SMatthew G. Knepley return None 606dd73af6SBarry Smith 61f8833479SBarry Smith def setupDependencies(self, framework): 62f8833479SBarry Smith config.base.Configure.setupDependencies(self, framework) 63dca78d2bSSatish Balay self.programs = framework.require('config.programs', self) 64f8833479SBarry Smith self.setCompilers = framework.require('config.setCompilers', self) 6530b8aa07SMatthew G. Knepley self.compilers = framework.require('config.compilers', self) 669d310bb7SBarry Smith self.arch = framework.require('PETSc.options.arch', self.setCompilers) 679d310bb7SBarry Smith self.petscdir = framework.require('PETSc.options.petscdir', self.arch) 689d310bb7SBarry Smith self.installdir = framework.require('PETSc.options.installDir', self) 696dd73af6SBarry Smith self.scalartypes = framework.require('PETSc.options.scalarTypes', self) 706dd73af6SBarry Smith self.indexTypes = framework.require('PETSc.options.indexTypes', self) 719d310bb7SBarry Smith self.languages = framework.require('PETSc.options.languages', self.setCompilers) 7230b8aa07SMatthew G. Knepley self.indexTypes = framework.require('PETSc.options.indexTypes', self.compilers) 73f8833479SBarry Smith self.compilers = framework.require('config.compilers', self) 74f8833479SBarry Smith self.types = framework.require('config.types', self) 75f8833479SBarry Smith self.headers = framework.require('config.headers', self) 76f8833479SBarry Smith self.functions = framework.require('config.functions', self) 77f8833479SBarry Smith self.libraries = framework.require('config.libraries', self) 78cd37d877SShri Abhyankar self.atomics = framework.require('config.atomics', self) 799481793eSSatish Balay self.make = framework.require('config.packages.make', self) 809552296fSBarry Smith self.blasLapack = framework.require('config.packages.BlasLapack',self) 819d310bb7SBarry Smith self.externalpackagesdir = framework.require('PETSc.options.externalpackagesdir',self) 82e6b0c433SBarry Smith self.mpi = framework.require('config.packages.MPI',self) 8349d43ecaSSatish Balay 8409a6cbfcSBernhard M. Wiedemann for utility in sorted(os.listdir(os.path.join('config','PETSc','options'))): 856dd73af6SBarry Smith self.registerPythonFile(utility,'PETSc.options') 869d310bb7SBarry Smith 8709a6cbfcSBernhard M. Wiedemann for utility in sorted(os.listdir(os.path.join('config','BuildSystem','config','utilities'))): 886dd73af6SBarry Smith self.registerPythonFile(utility,'config.utilities') 8906e08bc7SBarry Smith 9009a6cbfcSBernhard M. Wiedemann for package in sorted(os.listdir(os.path.join('config', 'BuildSystem', 'config', 'packages'))): 9151294b80SMatthew G. Knepley obj = self.registerPythonFile(package,'config.packages') 9251294b80SMatthew G. Knepley if obj: 9351294b80SMatthew G. Knepley obj.archProvider = self.framework.requireModule(obj.archProvider, obj) 9451294b80SMatthew G. Knepley obj.languageProvider = self.framework.requireModule(obj.languageProvider, obj) 9551294b80SMatthew G. Knepley obj.installDirProvider = self.framework.requireModule(obj.installDirProvider, obj) 9651294b80SMatthew G. Knepley obj.externalPackagesDirProvider = self.framework.requireModule(obj.externalPackagesDirProvider, obj) 9751294b80SMatthew G. Knepley obj.precisionProvider = self.framework.requireModule(obj.precisionProvider, obj) 9851294b80SMatthew G. Knepley obj.indexProvider = self.framework.requireModule(obj.indexProvider, obj) 996dd73af6SBarry Smith 1005faf1eacSMatthew G. Knepley # Force blaslapack and opencl to depend on scalarType so precision is set before BlasLapack is built 1019d310bb7SBarry Smith framework.require('PETSc.options.scalarTypes', self.f2cblaslapack) 1029d310bb7SBarry Smith framework.require('PETSc.options.scalarTypes', self.fblaslapack) 1039d310bb7SBarry Smith framework.require('PETSc.options.scalarTypes', self.blaslapack) 1045faf1eacSMatthew G. Knepley framework.require('PETSc.options.scalarTypes', self.opencl) 105f8833479SBarry Smith 106dca78d2bSSatish Balay self.programs.headerPrefix = self.headerPrefix 107f8833479SBarry Smith self.compilers.headerPrefix = self.headerPrefix 108f8833479SBarry Smith self.types.headerPrefix = self.headerPrefix 109f8833479SBarry Smith self.headers.headerPrefix = self.headerPrefix 110f8833479SBarry Smith self.functions.headerPrefix = self.headerPrefix 111f8833479SBarry Smith self.libraries.headerPrefix = self.headerPrefix 1126dd73af6SBarry Smith 1132c30b4dfSSatish Balay # Register user provided package scripts 1142c30b4dfSSatish Balay if 'with-package-scripts' in self.framework.argDB: 1152c30b4dfSSatish Balay for script in self.framework.argDB['with-package-scripts']: 1162c30b4dfSSatish Balay if os.path.splitext(script)[1] != '.py': 1172c30b4dfSSatish Balay raise RuntimeError('Only python scripts compatible with configure package script format should be specified! Invalid option -with-package-scripts='+script) 1182c30b4dfSSatish Balay self.framework.logPrint('User is registering a new package script: '+script) 1192c30b4dfSSatish Balay dname,fname = os.path.split(script) 1202c30b4dfSSatish Balay if dname: sys.path.append(dname) 1212c30b4dfSSatish Balay self.registerPythonFile(fname,'') 1226dd73af6SBarry Smith 1236dd73af6SBarry Smith # test for a variety of basic headers and functions 124*2475b7caSBarry Smith headersC = map(lambda name: name+'.h', ['setjmp','dos', 'endian', 'fcntl', 'float', 'io', 'malloc', 'pwd', 'strings', 125ba61063dSBarry Smith 'unistd', 'sys/sysinfo', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource', 126*2475b7caSBarry Smith 'sys/systeminfo', 'sys/times', 'sys/utsname', 127f8833479SBarry Smith 'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types', 128*2475b7caSBarry Smith 'WindowsX', 'float','ieeefp','stdint','pthread','inttypes','immintrin','zmmintrin']) 12945082d64SJed Brown functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 130*2475b7caSBarry Smith 'getwd', 'memalign', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize', 131*2475b7caSBarry Smith 'readlink', 'realpath', 'usleep', 'sleep', '_sleep', 'socket', 132*2475b7caSBarry Smith 'uname','snprintf','_snprintf','lseek','_lseek','time','fork','stricmp', 133*2475b7caSBarry Smith 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror', 1340787ed6cSSatish Balay '_set_output_format','_mkdir'] 135f8833479SBarry Smith libraries1 = [(['socket', 'nsl'], 'socket'), (['fpe'], 'handle_sigfpes')] 136f8833479SBarry Smith self.headers.headers.extend(headersC) 137f8833479SBarry Smith self.functions.functions.extend(functions) 138f8833479SBarry Smith self.libraries.libraries.extend(libraries1) 1397d421530SBarry Smith 140f8833479SBarry Smith return 141f8833479SBarry Smith 142262119f8SBarry Smith def DumpPkgconfig(self): 143262119f8SBarry Smith ''' Create a pkg-config file ''' 144262119f8SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')): 145262119f8SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')) 146262119f8SBarry Smith fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig','PETSc.pc'),'w') 1475e3311eeSJed Brown cflags_inc = ['-I${includedir}'] 148262119f8SBarry Smith if self.framework.argDB['prefix']: 1495bb5b263SMatthew G. Knepley fd.write('prefix='+self.installdir.dir+'\n') 150262119f8SBarry Smith else: 151e1e675deSJed Brown fd.write('prefix='+os.path.join(self.petscdir.dir, self.arch.arch)+'\n') 152e1e675deSJed Brown cflags_inc.append('-I' + os.path.join(self.petscdir.dir, 'include')) 153262119f8SBarry Smith fd.write('exec_prefix=${prefix}\n') 154262119f8SBarry Smith fd.write('includedir=${prefix}/include\n') 1555e3311eeSJed Brown fd.write('libdir=${prefix}/lib\n') 156262119f8SBarry Smith 157262119f8SBarry Smith self.setCompilers.pushLanguage('C') 158262119f8SBarry Smith fd.write('ccompiler='+self.setCompilers.getCompiler()+'\n') 159756c7f9fSJed Brown fd.write('cflags_extra='+self.setCompilers.getCompilerFlags().strip()+'\n') 160756c7f9fSJed Brown fd.write('cflags_dep='+self.compilers.dependenciesGenerationFlag.get('C','')+'\n') 161756c7f9fSJed Brown fd.write('ldflag_rpath='+self.setCompilers.CSharedLinkerFlag+'\n') 162262119f8SBarry Smith self.setCompilers.popLanguage() 16303e383c8SJed Brown if hasattr(self.compilers, 'CXX'): 164262119f8SBarry Smith self.setCompilers.pushLanguage('C++') 165262119f8SBarry Smith fd.write('cxxcompiler='+self.setCompilers.getCompiler()+'\n') 166756c7f9fSJed Brown fd.write('cxxflags_extra='+self.setCompilers.getCompilerFlags().strip()+'\n') 167262119f8SBarry Smith self.setCompilers.popLanguage() 168262119f8SBarry Smith if hasattr(self.compilers, 'FC'): 169262119f8SBarry Smith self.setCompilers.pushLanguage('FC') 170262119f8SBarry Smith fd.write('fcompiler='+self.setCompilers.getCompiler()+'\n') 171756c7f9fSJed Brown fd.write('fflags_extra='+self.setCompilers.getCompilerFlags().strip()+'\n') 172262119f8SBarry Smith self.setCompilers.popLanguage() 173262119f8SBarry Smith 174262119f8SBarry Smith fd.write('\n') 175262119f8SBarry Smith fd.write('Name: PETSc\n') 176262119f8SBarry Smith fd.write('Description: Library to solve ODEs and algebraic equations\n') 177351d3a41SMatthew G Knepley fd.write('Version: %s\n' % self.petscdir.version) 1785e3311eeSJed Brown fd.write('Cflags: ' + ' '.join([self.setCompilers.CPPFLAGS] + cflags_inc) + '\n') 17937371b91SJed Brown fd.write('Libs: '+self.libraries.toStringNoDupes(['-L${libdir}', self.petsclib], with_rpath=False)+'\n') 1808ebf8858SJed Brown # Remove RPATH flags from library list. User can add them using 1818ebf8858SJed Brown # pkg-config --variable=ldflag_rpath and pkg-config --libs-only-L 182de8f682fSSatish Balay 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') 183473a3ab2SBarry Smith 184262119f8SBarry Smith fd.close() 185262119f8SBarry Smith return 186262119f8SBarry Smith 187351d3a41SMatthew G Knepley def DumpModule(self): 188351d3a41SMatthew G Knepley ''' Create a module file ''' 189af0996ceSBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules')): 190af0996ceSBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules')) 191af0996ceSBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules','petsc')): 192af0996ceSBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules','petsc')) 193351d3a41SMatthew G Knepley if self.framework.argDB['prefix']: 1945bb5b263SMatthew G. Knepley installdir = self.installdir.dir 19555d606a3SSatish Balay installarch = '' 19655d606a3SSatish Balay installpath = os.path.join(installdir,'bin') 197351d3a41SMatthew G Knepley else: 198351d3a41SMatthew G Knepley installdir = self.petscdir.dir 19955d606a3SSatish Balay installarch = self.arch.arch 20055d606a3SSatish Balay installpath = os.path.join(installdir,installarch,'bin')+':'+os.path.join(installdir,'bin') 201af0996ceSBarry Smith fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules','petsc',self.petscdir.version),'w') 202351d3a41SMatthew G Knepley fd.write('''\ 203351d3a41SMatthew G Knepley#%%Module 204351d3a41SMatthew G Knepley 205351d3a41SMatthew G Knepleyproc ModulesHelp { } { 206351d3a41SMatthew G Knepley puts stderr "This module sets the path and environment variables for petsc-%s" 207a8d69d7bSBarry Smith puts stderr " see https://www.mcs.anl.gov/petsc/ for more information " 208351d3a41SMatthew G Knepley puts stderr "" 209351d3a41SMatthew G Knepley} 210351d3a41SMatthew G Knepleymodule-whatis "PETSc - Portable, Extensible Toolkit for Scientific Computation" 211351d3a41SMatthew G Knepley 212dd486775SJed Brownset petsc_dir "%s" 213dd486775SJed Brownset petsc_arch "%s" 214351d3a41SMatthew G Knepley 215dd486775SJed Brownsetenv PETSC_ARCH "$petsc_arch" 216dd486775SJed Brownsetenv PETSC_DIR "$petsc_dir" 217dd486775SJed Brownprepend-path PATH "%s" 21855d606a3SSatish Balay''' % (self.petscdir.version, installdir, installarch, installpath)) 219351d3a41SMatthew G Knepley fd.close() 220351d3a41SMatthew G Knepley return 221351d3a41SMatthew G Knepley 222f8833479SBarry Smith def Dump(self): 223f8833479SBarry Smith ''' Actually put the values into the configuration files ''' 224f8833479SBarry Smith # eventually everything between -- should be gone 22517f368bcSBarry Smith if self.mpi.usingMPIUni: 22617f368bcSBarry Smith # 22717f368bcSBarry Smith # Remove any MPI/MPICH include files that may have been put here by previous runs of ./configure 2287908f030SMatthew G. Knepley 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) 22917f368bcSBarry Smith 2305f27b2e0SBarry Smith self.setCompilers.pushLanguage('C') 2315f27b2e0SBarry Smith compiler = self.setCompilers.getCompiler() 232c9872b61SBarry Smith if compiler.endswith('mpicc') or compiler.endswith('mpiicc'): 2335f27b2e0SBarry Smith try: 2345f27b2e0SBarry Smith output = self.executeShellCommand(compiler + ' -show', log = self.log)[0] 2355f27b2e0SBarry Smith compiler = output.split(' ')[0] 2365f27b2e0SBarry Smith self.addDefine('MPICC_SHOW','"'+output.strip().replace('\n','\\\\n')+'"') 2375f27b2e0SBarry Smith except: 238c9872b61SBarry Smith self.addDefine('MPICC_SHOW','"Unavailable"') 239c9872b61SBarry Smith else: 240c9872b61SBarry Smith self.addDefine('MPICC_SHOW','"Unavailable"') 2415f27b2e0SBarry Smith self.setCompilers.popLanguage() 242f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 243f8833479SBarry Smith 244f8833479SBarry Smith # Sometimes we need C compiler, even if built with C++ 245f8833479SBarry Smith self.setCompilers.pushLanguage('C') 246f8833479SBarry Smith self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 247f8833479SBarry Smith self.setCompilers.popLanguage() 248f8833479SBarry Smith 24934f774f6SJed Brown # And sometimes we need a C++ compiler even when PETSc is built with C 25034f774f6SJed Brown if hasattr(self.compilers, 'CXX'): 25134f774f6SJed Brown self.setCompilers.pushLanguage('Cxx') 25229921a8fSScott Kruger self.addDefine('HAVE_CXX','1') 25334f774f6SJed Brown self.addMakeMacro('CXX_FLAGS',self.setCompilers.getCompilerFlags()) 2542f4326f3SSatish Balay cxx_linker = self.setCompilers.getLinker() 2552f4326f3SSatish Balay self.addMakeMacro('CXX_LINKER',cxx_linker) 2562f4326f3SSatish Balay self.addMakeMacro('CXX_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 25734f774f6SJed Brown self.setCompilers.popLanguage() 25834f774f6SJed Brown 259f8833479SBarry Smith # C preprocessor values 2601315f054SBarry Smith self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS) 261f8833479SBarry Smith 262f8833479SBarry Smith # compiler values 263f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 264f8833479SBarry Smith self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 265f8833479SBarry Smith self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 266f8833479SBarry Smith self.setCompilers.popLanguage() 267f8833479SBarry Smith # .o or .obj 268f8833479SBarry Smith self.addMakeMacro('CC_SUFFIX','o') 269f8833479SBarry Smith 270f8833479SBarry Smith # executable linker values 271f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 272f8833479SBarry Smith pcc_linker = self.setCompilers.getLinker() 273f8833479SBarry Smith self.addMakeMacro('PCC_LINKER',pcc_linker) 274c84a332bSSatish Balay self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 275f8833479SBarry Smith self.setCompilers.popLanguage() 276f8833479SBarry Smith # '' for Unix, .exe for Windows 277f8833479SBarry Smith self.addMakeMacro('CC_LINKER_SUFFIX','') 278f8833479SBarry Smith 279f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 280cb297985SSatish Balay if self.framework.argDB['with-fortran-bindings']: 281cb297985SSatish Balay self.addDefine('HAVE_FORTRAN','1') 282f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 283f8833479SBarry Smith # need FPPFLAGS in config/setCompilers 284f8833479SBarry Smith self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS) 285f8833479SBarry Smith 286f8833479SBarry Smith # compiler values 287f8833479SBarry Smith self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 288f8833479SBarry Smith self.setCompilers.popLanguage() 289f8833479SBarry Smith # .o or .obj 290f8833479SBarry Smith self.addMakeMacro('FC_SUFFIX','o') 291f8833479SBarry Smith 292f8833479SBarry Smith # executable linker values 293f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 294f8833479SBarry Smith # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker 295f8833479SBarry Smith fc_linker = self.setCompilers.getLinker() 2967fca349cSMatthew G. Knepley if config.setCompilers.Configure.isNAG(fc_linker, self.log): 297f8833479SBarry Smith self.addMakeMacro('FC_LINKER',pcc_linker) 298f8833479SBarry Smith else: 299f8833479SBarry Smith self.addMakeMacro('FC_LINKER',fc_linker) 3006d53d35eSSatish Balay self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 3013feacd00SBarry Smith # apple requires this shared library linker flag on SOME versions of the os 3023feacd00SBarry Smith if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 3033feacd00SBarry Smith self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 304bb82cf9cSSatish Balay self.setCompilers.popLanguage() 3055d631499SMatthew Knepley 3065d631499SMatthew Knepley # F90 Modules 3075d631499SMatthew Knepley if self.setCompilers.fortranModuleIncludeFlag: 3085d631499SMatthew Knepley self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag) 3096ddd6694SSatish Balay else: # for non-f90 compilers like g77 3106ddd6694SSatish Balay self.addMakeMacro('FC_MODULE_FLAG', '-I') 311a324c51cSMatthew G Knepley if self.setCompilers.fortranModuleIncludeFlag: 312a324c51cSMatthew G Knepley self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag) 313f8833479SBarry Smith else: 314f8833479SBarry Smith self.addMakeMacro('FC','') 315f8833479SBarry Smith 31646a3958fSBarry Smith if hasattr(self.compilers, 'CUDAC'): 3177ff2890cSSatish Balay self.setCompilers.pushLanguage('CUDA') 318d93a25ecSSatish Balay self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags()) 3197ff2890cSSatish Balay self.setCompilers.popLanguage() 3207ff2890cSSatish Balay 321f8833479SBarry Smith # shared library linker values 322f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 323f8833479SBarry Smith # need to fix BuildSystem to collect these separately 324f8833479SBarry Smith self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 32570db8aa6SSatish Balay self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 326f8833479SBarry Smith self.setCompilers.popLanguage() 327f8833479SBarry Smith # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 328f8833479SBarry Smith # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 329f8833479SBarry Smith if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 330f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', '') 33146bc77b6SBarry Smith self.addDefine('SLSUFFIX','""') 332f8833479SBarry Smith else: 333f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 33446bc77b6SBarry Smith self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"') 335bb82cf9cSSatish Balay 33623e93537SBarry Smith self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}') 337bb82cf9cSSatish Balay 338f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 339f8833479SBarry Smith 340f8833479SBarry Smith # CONLY or CPP. We should change the PETSc makefiles to do this better 341f8833479SBarry Smith if self.languages.clanguage == 'C': lang = 'CONLY' 342f8833479SBarry Smith else: lang = 'CXXONLY' 343f8833479SBarry Smith self.addMakeMacro('PETSC_LANGUAGE',lang) 344f8833479SBarry Smith 345f8833479SBarry Smith # real or complex 346f8833479SBarry Smith self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 347f8833479SBarry Smith # double or float 348f8833479SBarry Smith self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 349f8833479SBarry Smith 350f8833479SBarry Smith if self.framework.argDB['with-batch']: 351f8833479SBarry Smith self.addMakeMacro('PETSC_WITH_BATCH','1') 352f8833479SBarry Smith 353f8833479SBarry Smith # Test for compiler-specific macros that need to be defined. 3547fca349cSMatthew G. Knepley if self.setCompilers.isCrayVector('CC', self.log): 355b409243cSBarry Smith self.addDefine('HAVE_CRAY_VECTOR','1') 356f8833479SBarry Smith 357f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 358df1a78b3SMatthew G Knepley if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket') and self.headers.haveHeader('netinet/in.h'): 359f8833479SBarry Smith self.addDefine('USE_SOCKET_VIEWER','1') 36080e3883bSBarry Smith if self.checkCompile('#include <sys/socket.h>','setsockopt(0,SOL_SOCKET,SO_REUSEADDR,0,0)'): 36180e3883bSBarry Smith self.addDefine('HAVE_SO_REUSEADDR','1') 362f8833479SBarry Smith 363f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 364a6cc6bb1SBarry Smith # print include and lib for makefiles 365f8833479SBarry Smith self.framework.packages.reverse() 3665a21677cSJed Brown petscincludes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')] 3675a21677cSJed Brown petscincludes_install = [os.path.join(self.installdir.dir, 'include')] if self.framework.argDB['prefix'] else petscincludes 3685a21677cSJed Brown includes = [] 369de8f682fSSatish Balay self.packagelibs = [] 370f8833479SBarry Smith for i in self.framework.packages: 371*2475b7caSBarry Smith if i.useddirectly and not i.required: 372eeb16384SBarry Smith self.addDefine('HAVE_'+i.PACKAGE.replace('-','_'), 1) # ONLY list package if it is used directly by PETSc (and not only by another package) 373f8833479SBarry Smith if not isinstance(i.lib, list): 374f8833479SBarry Smith i.lib = [i.lib] 375de8f682fSSatish Balay if i.linkedbypetsc: self.packagelibs.extend(i.lib) 376eeb16384SBarry Smith self.addMakeMacro(i.PACKAGE.replace('-','_')+'_LIB', self.libraries.toStringNoDupes(i.lib)) 377f8833479SBarry Smith if hasattr(i,'include'): 378f8833479SBarry Smith if not isinstance(i.include,list): 379f8833479SBarry Smith i.include = [i.include] 380ac9e4c42SSatish Balay includes.extend(i.include) 381eeb16384SBarry Smith self.addMakeMacro(i.PACKAGE.replace('-','_')+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 3822df986feSBarry Smith if self.framework.argDB['with-single-library']: 383e282ce78SJed Brown self.petsclib = '-lpetsc' 38491bb3077SSatish Balay else: 385e282ce78SJed Brown self.petsclib = '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys' 386de8f682fSSatish Balay self.complibs = self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split() 3875a21677cSJed Brown self.PETSC_WITH_EXTERNAL_LIB = self.libraries.toStringNoDupes(['-L${PETSC_DIR}/${PETSC_ARCH}/lib', self.petsclib]+self.packagelibs+self.complibs) 388de8f682fSSatish Balay self.PETSC_EXTERNAL_LIB_BASIC = self.libraries.toStringNoDupes(self.packagelibs+self.complibs) 389de8f682fSSatish Balay 390de8f682fSSatish Balay self.addMakeMacro('PETSC_EXTERNAL_LIB_BASIC',self.PETSC_EXTERNAL_LIB_BASIC) 3915a21677cSJed Brown allincludes = petscincludes + includes 3925a21677cSJed Brown allincludes_install = petscincludes_install + includes 3935a21677cSJed Brown self.PETSC_CC_INCLUDES = self.headers.toStringNoDupes(allincludes) 3945a21677cSJed Brown self.PETSC_CC_INCLUDES_INSTALL = self.headers.toStringNoDupes(allincludes_install) 3955a21677cSJed Brown self.addMakeMacro('PETSC_CC_INCLUDES',self.PETSC_CC_INCLUDES) 3965a21677cSJed Brown self.addMakeMacro('PETSC_CC_INCLUDES_INSTALL', self.PETSC_CC_INCLUDES_INSTALL) 397cbd5cc15SBarry Smith if hasattr(self.compilers, 'FC'): 3985a21677cSJed Brown def modinc(includes): 3995a21677cSJed Brown return includes if self.compilers.fortranIsF90 else [] 4005a21677cSJed Brown self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(allincludes,modinc(allincludes))) 4015a21677cSJed Brown self.addMakeMacro('PETSC_FC_INCLUDES_INSTALL',self.headers.toStringNoDupes(allincludes_install,modinc(allincludes_install))) 402f8833479SBarry Smith 4035bb5b263SMatthew G. Knepley self.addDefine('LIB_DIR','"'+os.path.join(self.installdir.dir,'lib')+'"') 404f8833479SBarry Smith 4050f3b21c2SBarry Smith if self.framework.argDB['with-single-library']: 4060f3b21c2SBarry Smith # overrides the values set in conf/variables 4070f3b21c2SBarry Smith self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 40857cb31baSSatish Balay self.addMakeMacro('SHLIBS','libpetsc') 409bccf1c12SBarry Smith self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 410797063a9SSatish Balay self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 411797063a9SSatish Balay self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 412b0a7d7e7SSatish Balay self.addMakeMacro('PETSC_TAO_LIB_BASIC','-lpetsc') 413de8f682fSSatish Balay self.addMakeMacro('PETSC_WITH_EXTERNAL_LIB',self.PETSC_WITH_EXTERNAL_LIB) 414bb84e0fdSBarry Smith self.addDefine('USE_SINGLE_LIBRARY', '1') 4152df986feSBarry Smith if self.sharedlibraries.useShared: 416ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 417ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 418ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 419ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 420ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 421ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 422ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 423b0a7d7e7SSatish Balay self.addMakeMacro('PETSC_TAO_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 424fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 425ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 426ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 4272df986feSBarry Smith else: 428ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 429ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 430ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}') 431ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}') 432ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}') 433ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}') 434ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 435b0a7d7e7SSatish Balay self.addMakeMacro('PETSC_TAO_LIB','${PETSC_WITH_EXTERNAL_LIB}') 436fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 437ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 438ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}') 4390f3b21c2SBarry Smith 440f8833479SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 441f8833479SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 442f8833479SBarry Smith 44313f9d092SSatish Balay# add a makefile endtry for display 44413f9d092SSatish Balay if self.framework.argDB['with-display']: 44513f9d092SSatish Balay self.addMakeMacro('DISPLAY',self.framework.argDB['with-display']) 44613f9d092SSatish Balay 447f8833479SBarry Smith # add a makefile entry for configure options 448f8833479SBarry Smith self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 449f8833479SBarry Smith return 450f8833479SBarry Smith 451f8833479SBarry Smith def dumpConfigInfo(self): 452f8833479SBarry Smith import time 453c6ef1b5bSJed Brown fd = open(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 454f8833479SBarry Smith fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 455f8833479SBarry Smith fd.close() 456f8833479SBarry Smith return 457f8833479SBarry Smith 4582a4161d9SMatthew G Knepley def dumpMachineInfo(self): 4592a4161d9SMatthew G Knepley import platform 460a970bd74SBernhard M. Wiedemann import datetime 4612a4161d9SMatthew G Knepley import time 46240373944SSatish Balay import script 463ca77dbeeSGeoffrey Irving def escape(s): 464ca77dbeeSGeoffrey Irving return s.replace('"',r'\"').replace(r'\ ',r'\\ ') 465c6ef1b5bSJed Brown fd = open(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w') 4662a4161d9SMatthew G Knepley fd.write('static const char *petscmachineinfo = \"\\n\"\n') 4672a4161d9SMatthew G Knepley fd.write('\"-----------------------------------------\\n\"\n') 468a970bd74SBernhard M. Wiedemann buildhost = platform.node() 469a970bd74SBernhard M. Wiedemann if os.environ.get('SOURCE_DATE_EPOCH'): 470a970bd74SBernhard M. Wiedemann buildhost = "reproducible" 471a970bd74SBernhard M. Wiedemann buildtime = datetime.datetime.utcfromtimestamp(int(os.environ.get('SOURCE_DATE_EPOCH', time.time()))) 472a970bd74SBernhard M. Wiedemann fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (buildtime, buildhost)) 47360acdfe7SSatish Balay fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform())) 4745188cb68SSatish Balay fd.write('\"Using PETSc directory: %s\\n\"\n' % (escape(self.installdir.petscDir))) 4755188cb68SSatish Balay fd.write('\"Using PETSc arch: %s\\n\"\n' % (escape(self.installdir.petscArch))) 476cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4772a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerinfo = \"\\n\"\n') 4782a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 4795f27b2e0SBarry Smith fd.write('\"Using C compiler: %s %s \\n\"\n' % (escape(self.setCompilers.getCompiler()), escape(self.setCompilers.getCompilerFlags()))) 4802a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 4818782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 4822a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 4835f27b2e0SBarry Smith fd.write('\"Using Fortran compiler: %s %s %s\\n\"\n' % (escape(self.setCompilers.getCompiler()), escape(self.setCompilers.getCompilerFlags()), escape(self.setCompilers.CPPFLAGS))) 4842a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 485cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4862a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n') 4875a21677cSJed Brown fd.write('\"Using include paths: %s\\n\"\n' % (escape(self.PETSC_CC_INCLUDES_INSTALL.replace('${PETSC_DIR}', self.installdir.petscDir)))) 488cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4892a4161d9SMatthew G Knepley fd.write('static const char *petsclinkerinfo = \"\\n\"\n') 4902a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 491ca77dbeeSGeoffrey Irving fd.write('\"Using C linker: %s\\n\"\n' % (escape(self.setCompilers.getLinker()))) 4922a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 4938782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 4942a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 495ca77dbeeSGeoffrey Irving fd.write('\"Using Fortran linker: %s\\n\"\n' % (escape(self.setCompilers.getLinker()))) 4962a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 4975188cb68SSatish Balay 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))) 498cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4992a4161d9SMatthew G Knepley fd.close() 5002a4161d9SMatthew G Knepley return 501b2843cf1SBarry Smith 502b2843cf1SBarry Smith def configurePrefetch(self): 503b2843cf1SBarry Smith '''Sees if there are any prefetch functions supported''' 5047fca349cSMatthew G. Knepley if config.setCompilers.Configure.isSolaris(self.log) or self.framework.argDB['with-ios'] or not self.framework.argDB['with-prefetch']: 50593f78423SSatish Balay self.addDefine('Prefetch(a,b,c)', ' ') 50693f78423SSatish Balay return 507ec284106SBarry Smith self.pushLanguage(self.languages.clanguage) 50810699583SJed Brown if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'): 50950d8bf02SJed Brown # The Intel Intrinsics manual [1] specifies the prototype 51050d8bf02SJed Brown # 51150d8bf02SJed Brown # void _mm_prefetch(char const *a, int sel); 51250d8bf02SJed Brown # 51350d8bf02SJed Brown # but other vendors seem to insist on using subtly different 51450d8bf02SJed Brown # prototypes, including void* for the pointer, and an enum for 51550d8bf02SJed Brown # sel. These are both reasonable changes, but negatively impact 51650d8bf02SJed Brown # portability. 51750d8bf02SJed Brown # 518a8d69d7bSBarry Smith # [1] https://software.intel.com/file/6373 51950d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 52050d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))') 52150d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 52250d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 52350d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 52450d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 52550d8bf02SJed Brown elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'): 52650d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 52750d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))') 52850d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 52950d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 53050d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 53150d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 53210699583SJed Brown elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 53310699583SJed Brown # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality) 53410699583SJed Brown # 53510699583SJed Brown # The value of rw is a compile-time constant one or zero; one 53610699583SJed Brown # means that the prefetch is preparing for a write to the memory 53710699583SJed Brown # address and zero, the default, means that the prefetch is 53810699583SJed Brown # preparing for a read. The value locality must be a compile-time 53910699583SJed Brown # constant integer between zero and three. A value of zero means 54010699583SJed Brown # that the data has no temporal locality, so it need not be left 54110699583SJed Brown # in the cache after the access. A value of three means that the 54210699583SJed Brown # data has a high degree of temporal locality and should be left 54310699583SJed Brown # in all levels of cache possible. Values of one and two mean, 54410699583SJed Brown # respectively, a low or moderate degree of temporal locality. 54510699583SJed Brown # 54610699583SJed Brown # Here we adopt Intel's x86/x86-64 naming scheme for the locality 54710699583SJed Brown # hints. Using macros for these values in necessary since some 54810699583SJed Brown # compilers require an enum. 54910699583SJed Brown self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))') 55010699583SJed Brown self.addDefine('PREFETCH_HINT_NTA', '0') 55110699583SJed Brown self.addDefine('PREFETCH_HINT_T0', '3') 55210699583SJed Brown self.addDefine('PREFETCH_HINT_T1', '2') 55310699583SJed Brown self.addDefine('PREFETCH_HINT_T2', '1') 554b2843cf1SBarry Smith else: 555b2843cf1SBarry Smith self.addDefine('Prefetch(a,b,c)', ' ') 5567d490b44SBarry Smith self.popLanguage() 557b2843cf1SBarry Smith 55809bc878fSSatish Balay def configureAtoll(self): 55909bc878fSSatish Balay '''Checks if atoll exists''' 560436b02dcSSatish Balay 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")'): 56109bc878fSSatish Balay self.addDefine('HAVE_ATOLL', '1') 56209bc878fSSatish Balay 5632400fdedSBarry Smith def configureUnused(self): 5642400fdedSBarry Smith '''Sees if __attribute((unused)) is supported''' 5651adaff47SSean Farley if self.framework.argDB['with-ios']: 5662400fdedSBarry Smith self.addDefine('UNUSED', ' ') 5672400fdedSBarry Smith return 5682400fdedSBarry Smith self.pushLanguage(self.languages.clanguage) 569edf21b64SSatish Balay 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'): 5702400fdedSBarry Smith self.addDefine('UNUSED', '__attribute((unused))') 5712400fdedSBarry Smith else: 5722400fdedSBarry Smith self.addDefine('UNUSED', ' ') 5732400fdedSBarry Smith self.popLanguage() 5742400fdedSBarry Smith 57598ed35c3SBarry Smith def configureIsatty(self): 57698ed35c3SBarry Smith '''Check if the Unix C function isatty() works correctly 57798ed35c3SBarry Smith Actually just assumes it does not work correctly on batch systems''' 57898ed35c3SBarry Smith if not self.framework.argDB['with-batch']: 57998ed35c3SBarry Smith self.addDefine('USE_ISATTY',1) 58098ed35c3SBarry Smith 5811ef8df7fSJed Brown def configureDeprecated(self): 5821ef8df7fSJed Brown '''Check if __attribute((deprecated)) is supported''' 5831ef8df7fSJed Brown self.pushLanguage(self.languages.clanguage) 58459a26b54SJed Brown ## Recent versions of gcc and clang support __attribute((deprecated("string argument"))), which is very useful, but 58559a26b54SJed Brown ## Intel has conspired to make a supremely environment-sensitive compiler. The Intel compiler looks at the gcc 58659a26b54SJed Brown ## executable in the environment to determine the language compatibility that it should attempt to emulate. Some 58759a26b54SJed Brown ## important Cray installations have built PETSc using the Intel compiler, but with a newer gcc module loaded (e.g., 588df3898eeSBarry Smith ## 4.7). Thus at PETSc configure time, the Intel compiler decides to support the string argument, but the gcc 58959a26b54SJed Brown ## found in the default user environment is older and does not support the argument. If GCC and Intel were cool 59059a26b54SJed Brown ## like Clang and supported __has_attribute, we could avoid configure tests entirely, but they don't. And that is 59159a26b54SJed Brown ## why we can't have nice things. 59259a26b54SJed Brown # 59359a26b54SJed Brown # if self.checkCompile("""__attribute((deprecated("Why you shouldn't use myfunc"))) static int myfunc(void) { return 1;}""", ''): 59425ef9dfeSBarry Smith # self.addDefine('DEPRECATED_FUNCTION(why)', '__attribute((deprecated(why)))') 59525ef9dfeSBarry Smith # self.addDefine('DEPRECATED_TYPEDEF(why)', '__attribute((deprecated(why)))') 59659a26b54SJed Brown if self.checkCompile("""__attribute((deprecated)) static int myfunc(void) { return 1;}""", ''): 59725ef9dfeSBarry Smith self.addDefine('DEPRECATED_FUNCTION(why)', '__attribute((deprecated))') 59825ef9dfeSBarry Smith self.addDefine('DEPRECATED_TYPEDEF(why)', '__attribute((deprecated))') 5991ef8df7fSJed Brown else: 60025ef9dfeSBarry Smith self.addDefine('DEPRECATED_FUNCTION(why)', ' ') 60125ef9dfeSBarry Smith self.addDefine('DEPRECATED_TYPEDEF(why)', ' ') 602a8678870SSatish Balay if self.checkCompile("""enum E {oldval __attribute((deprecated)), newval };""", ''): 603933a48e8SSatish Balay self.addDefine('DEPRECATED_ENUM(why)', '__attribute((deprecated))') 604933a48e8SSatish Balay else: 605933a48e8SSatish Balay self.addDefine('DEPRECATED_ENUM(why)', ' ') 60605de396fSBarry Smith # I was unable to make a CPP macro that takes the old and new values as seperate arguments and builds the message needed by _Pragma 60705de396fSBarry Smith # hence the deprecation message is handled as it is 60805de396fSBarry Smith if self.checkCompile('#define TEST _Pragma("GCC warning \"Testing _Pragma\"") value'): 60905de396fSBarry Smith self.addDefine('DEPRECATED_MACRO(why)', '_Pragma(why)') 61005de396fSBarry Smith else: 61105de396fSBarry Smith self.addDefine('DEPRECATED_MACRO(why)', ' ') 6121ef8df7fSJed Brown self.popLanguage() 6131ef8df7fSJed Brown 61418f41590SBarry Smith def configureAlign(self): 6157b7fc14bSLisandro Dalcin '''Check if __attribute(aligned) is supported''' 6167b7fc14bSLisandro Dalcin code = '''\ 617752d89a4SSatish Balaystruct mystruct {int myint;} __attribute((aligned(16))); 6187b7fc14bSLisandro Dalcinchar assert_aligned[(sizeof(struct mystruct)==16)*2-1]; 619752d89a4SSatish Balay''' 620752d89a4SSatish Balay self.pushLanguage(self.languages.clanguage) 6217b7fc14bSLisandro Dalcin if self.checkCompile(code): 622752d89a4SSatish Balay self.addDefine('ATTRIBUTEALIGNED(size)', '__attribute((aligned(size)))') 623752d89a4SSatish Balay self.addDefine('HAVE_ATTRIBUTEALIGNED', 1) 624752d89a4SSatish Balay else: 6257b7fc14bSLisandro Dalcin self.framework.logPrint('Incorrect attribute(aligned)') 626752d89a4SSatish Balay self.addDefine('ATTRIBUTEALIGNED(size)', ' ') 6277b7fc14bSLisandro Dalcin self.popLanguage() 628752d89a4SSatish Balay return 62918f41590SBarry Smith 6309800092aSJed Brown def configureExpect(self): 6319800092aSJed Brown '''Sees if the __builtin_expect directive is supported''' 6329800092aSJed Brown self.pushLanguage(self.languages.clanguage) 6339800092aSJed Brown if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'): 6349800092aSJed Brown self.addDefine('HAVE_BUILTIN_EXPECT', 1) 6359800092aSJed Brown self.popLanguage() 6369800092aSJed Brown 63753c77d0aSJed Brown def configureFunctionName(self): 638fbfcfee5SBarry Smith '''Sees if the compiler supports __func__ or a variant.''' 6391ec50b02SJed Brown def getFunctionName(lang): 640fbfcfee5SBarry Smith name = '"unknown"' 6411ec50b02SJed Brown self.pushLanguage(lang) 642b6ff4c76SKarl Rupp for fname in ['__func__','__FUNCTION__','__extension__ __func__']: 6430117e5a1SSatish Balay code = "if ("+fname+"[0] != 'm') return 1;" 6440117e5a1SSatish Balay if self.checkCompile('',code) and self.checkLink('',code): 6450117e5a1SSatish Balay name = fname 6460117e5a1SSatish Balay break 6471ec50b02SJed Brown self.popLanguage() 6481ec50b02SJed Brown return name 6491ec50b02SJed Brown langs = [] 650628773c9SSatish Balay 651628773c9SSatish Balay self.addDefine('FUNCTION_NAME_C', getFunctionName('C')) 6525f6e5f85SSatish Balay if hasattr(self.compilers, 'CXX'): 653628773c9SSatish Balay self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx')) 65453c77d0aSJed Brown 655753ebd1dSJed Brown def configureIntptrt(self): 656753ebd1dSJed Brown '''Determine what to use for uintptr_t''' 657753ebd1dSJed Brown def staticAssertSizeMatchesVoidStar(inc,typename): 658753ebd1dSJed Brown # The declaration is an error if either array size is negative. 659753ebd1dSJed Brown # It should be okay to use an int that is too large, but it would be very unlikely for this to be the case 660d26187a0SJed Brown return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n' 661979939cdSSatish Balay + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename)) 662753ebd1dSJed Brown self.pushLanguage(self.languages.clanguage) 663753ebd1dSJed Brown if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'): 664753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'uintptr_t') 665753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long long'): 666753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned long long') 667753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'): 668753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'size_t') 669c82284b1SJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long'): 670c82284b1SJed Brown self.addDefine('UINTPTR_T', 'unsigned long') 6712d1b7972SSatish Balay elif staticAssertSizeMatchesVoidStar('','unsigned'): 672753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned') 673d26187a0SJed Brown else: 674d26187a0SJed Brown raise RuntimeError('Could not find any unsigned integer type matching void*') 675753ebd1dSJed Brown self.popLanguage() 676753ebd1dSJed Brown 677ed938b00SJed Brown def configureRTLDDefault(self): 678bfef2c86SBarry Smith if self.checkCompile('#include <dlfcn.h>\n void *ptr = RTLD_DEFAULT;'): 679bfef2c86SBarry Smith self.addDefine('RTLD_DEFAULT','1') 680f8833479SBarry Smith return 681f8833479SBarry Smith 682f8833479SBarry Smith def configureSolaris(self): 683f8833479SBarry Smith '''Solaris specific stuff''' 684f8833479SBarry Smith if os.path.isdir(os.path.join('/usr','ucblib')): 685f8833479SBarry Smith try: 686f8833479SBarry Smith flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 687f8833479SBarry Smith except AttributeError: 688f8833479SBarry Smith flag = None 689f8833479SBarry Smith if flag is None: 690f8833479SBarry Smith self.compilers.LIBS += ' -L/usr/ucblib' 691f8833479SBarry Smith else: 692f8833479SBarry Smith self.compilers.LIBS += ' '+flag+'/usr/ucblib' 693f8833479SBarry Smith return 694f8833479SBarry Smith 695f8833479SBarry Smith def configureLinux(self): 696f8833479SBarry Smith '''Linux specific stuff''' 6979f15855cSMatthew G Knepley # TODO: Test for this by mallocing an odd number of floats and checking the address 698f8833479SBarry Smith self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 699f8833479SBarry Smith return 700f8833479SBarry Smith 701f8833479SBarry Smith def configureWin32(self): 702f8833479SBarry Smith '''Win32 non-cygwin specific stuff''' 703f8833479SBarry Smith kernel32=0 704f8833479SBarry Smith if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 705f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 706f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 707f8833479SBarry Smith kernel32=1 708f8833479SBarry Smith elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 709f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 710f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 711f8833479SBarry Smith kernel32=1 712f8833479SBarry Smith if kernel32: 713eed94e11SSatish Balay if self.framework.argDB['with-windows-graphics']: 714eed94e11SSatish Balay self.addDefine('USE_WINDOWS_GRAPHICS',1) 715f8833479SBarry Smith if self.checkLink('#include <Windows.h>','LoadLibrary(0)'): 716f8833479SBarry Smith self.addDefine('HAVE_LOADLIBRARY',1) 717b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'): 718b50f6d9eSLisandro Dalcin self.addDefine('HAVE_GETPROCADDRESS',1) 719b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','FreeLibrary(0)'): 720b50f6d9eSLisandro Dalcin self.addDefine('HAVE_FREELIBRARY',1) 721a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','GetLastError()'): 722a21658a3SLisandro Dalcin self.addDefine('HAVE_GETLASTERROR',1) 723a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','SetLastError(0)'): 724a21658a3SLisandro Dalcin self.addDefine('HAVE_SETLASTERROR',1) 725f8833479SBarry Smith if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'): 726bea725cfSBarry Smith self.addDefine('USE_MICROSOFT_TIME',1) 727f8833479SBarry Smith if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 728f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 729f8833479SBarry Smith elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 730f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 731f8833479SBarry Smith 732f8833479SBarry Smith if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'): 733f8833479SBarry Smith self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);') 734f8833479SBarry Smith if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'): 735f8833479SBarry Smith self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);') 736f8833479SBarry Smith 737f8833479SBarry Smith self.types.check('int32_t', 'int') 738f8833479SBarry Smith if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 739f8833479SBarry Smith self.addTypedef('int', 'uid_t') 740f8833479SBarry Smith self.addTypedef('int', 'gid_t') 741f8833479SBarry Smith if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 742f8833479SBarry Smith self.framework.addDefine('R_OK', '04') 743f8833479SBarry Smith self.framework.addDefine('W_OK', '02') 744f8833479SBarry Smith self.framework.addDefine('X_OK', '01') 745f8833479SBarry Smith if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 746f8833479SBarry Smith self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 747f8833479SBarry Smith self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 748f8833479SBarry Smith if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 749f8833479SBarry Smith self.addDefine('HAVE_LARGE_INTEGER_U',1) 750f8833479SBarry Smith 751f8833479SBarry Smith # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 752ef2cfba3SSatish Balay if self.checkCompile('#include <Windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'): 753f8833479SBarry Smith self.addDefine('HAVE_O_BINARY',1) 754f8833479SBarry Smith 755f8833479SBarry Smith if self.compilers.CC.find('win32fe') >= 0: 756ad4212abSSatish Balay self.addDefine('HAVE_WINDOWS_COMPILERS',1) 757f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'\\\\\'') 758f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 759f8833479SBarry Smith self.addDefine('CANNOT_START_DEBUGGER',1) 7605188cb68SSatish Balay (petscdir,error,status) = self.executeShellCommand('cygpath -w '+self.installdir.petscDir, log = self.log) 76134531a4dSSatish Balay self.addDefine('DIR','"'+petscdir.replace('\\','\\\\')+'"') 7625188cb68SSatish Balay (petscdir,error,status) = self.executeShellCommand('cygpath -m '+self.installdir.petscDir, log = self.log) 763e433681fSSatish Balay self.addMakeMacro('wPETSC_DIR',petscdir) 764f8833479SBarry Smith else: 765f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 766f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'/\'') 7675188cb68SSatish Balay self.addDefine('DIR','"'+self.installdir.petscDir+'"') 7685188cb68SSatish Balay self.addMakeMacro('wPETSC_DIR',self.installdir.petscDir) 7695188cb68SSatish Balay self.addDefine('ARCH','"'+self.installdir.petscArch+'"') 770f8833479SBarry Smith return 771f8833479SBarry Smith 772f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 773b10d012aSSatish Balay def configureCygwinBrokenPipe(self): 774b10d012aSSatish Balay '''Cygwin version <= 1.7.18 had issues with pipes and long commands invoked from gnu-make 775b10d012aSSatish Balay http://cygwin.com/ml/cygwin/2013-05/msg00340.html ''' 7767fca349cSMatthew G. Knepley if config.setCompilers.Configure.isCygwin(self.log): 777b10d012aSSatish Balay import platform 778b10d012aSSatish Balay import re 779b10d012aSSatish Balay r=re.compile("([0-9]+).([0-9]+).([0-9]+)") 780b10d012aSSatish Balay m=r.match(platform.release()) 781b10d012aSSatish Balay major=int(m.group(1)) 782b10d012aSSatish Balay minor=int(m.group(2)) 783b10d012aSSatish Balay subminor=int(m.group(3)) 784b10d012aSSatish Balay if ((major < 1) or (major == 1 and minor < 7) or (major == 1 and minor == 7 and subminor <= 18)): 785b10d012aSSatish Balay self.addMakeMacro('PETSC_CYGWIN_BROKEN_PIPE','1') 786b10d012aSSatish Balay return 787b10d012aSSatish Balay 788b10d012aSSatish Balay#----------------------------------------------------------------------------------------------------- 789569865ddSSatish Balay def configureDefaultArch(self): 790af0996ceSBarry Smith conffile = os.path.join('lib','petsc','conf', 'petscvariables') 791569865ddSSatish Balay if self.framework.argDB['with-default-arch']: 792c6ef1b5bSJed Brown fd = open(conffile, 'w') 793569865ddSSatish Balay fd.write('PETSC_ARCH='+self.arch.arch+'\n') 794da93591fSBarry Smith fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 795b9b902edSJed Brown fd.write('include '+os.path.join('$(PETSC_DIR)','$(PETSC_ARCH)','lib','petsc','conf','petscvariables')+'\n') 796569865ddSSatish Balay fd.close() 797569865ddSSatish Balay self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 798569865ddSSatish Balay elif os.path.isfile(conffile): 799569865ddSSatish Balay try: 800569865ddSSatish Balay os.unlink(conffile) 801569865ddSSatish Balay except: 802569865ddSSatish Balay raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 803569865ddSSatish Balay return 804569865ddSSatish Balay 805569865ddSSatish Balay#----------------------------------------------------------------------------------------------------- 806f8833479SBarry Smith def configureScript(self): 807f8833479SBarry Smith '''Output a script in the conf directory which will reproduce the configuration''' 808f8833479SBarry Smith import nargs 809495bf1a9SSatish Balay import sys 810af0996ceSBarry Smith scriptName = os.path.join(self.arch.arch,'lib','petsc','conf', 'reconfigure-'+self.arch.arch+'.py') 811f8833479SBarry Smith args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 812e97fc2efSSatish Balay if 'with-clean' in args: 813e97fc2efSSatish Balay del args['with-clean'] 814d418e2d7SSatish Balay if 'force' in args: 815d418e2d7SSatish Balay del args['force'] 816f8833479SBarry Smith if 'configModules' in args: 8171063a081SSatish Balay if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 818f8833479SBarry Smith del args['configModules'] 819f8833479SBarry Smith if 'optionsModule' in args: 82023a19ef1SSatish Balay if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'config.compilerOptions': 821f8833479SBarry Smith del args['optionsModule'] 822f8833479SBarry Smith if not 'PETSC_ARCH' in args: 8231063a081SSatish Balay args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 824c6ef1b5bSJed Brown f = open(scriptName, 'w') 825495bf1a9SSatish Balay f.write('#!'+sys.executable+'\n') 826f8833479SBarry Smith f.write('if __name__ == \'__main__\':\n') 827f8833479SBarry Smith f.write(' import sys\n') 8287561c02cSSatish Balay f.write(' import os\n') 8297561c02cSSatish Balay f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 830f8833479SBarry Smith f.write(' import configure\n') 8311063a081SSatish Balay # pretty print repr(args.values()) 8321063a081SSatish Balay f.write(' configure_options = [\n') 8338bec23c5SJed Brown for itm in sorted(args.values()): 8341063a081SSatish Balay f.write(' \''+str(itm)+'\',\n') 8351063a081SSatish Balay f.write(' ]\n') 836f8833479SBarry Smith f.write(' configure.petsc_configure(configure_options)\n') 837f8833479SBarry Smith f.close() 838f8833479SBarry Smith try: 8395b6bfdb9SJed Brown os.chmod(scriptName, 0o775) 8405b6bfdb9SJed Brown except OSError as e: 841f8833479SBarry Smith self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 842f8833479SBarry Smith self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 843f8833479SBarry Smith return 844f8833479SBarry Smith 845f8833479SBarry Smith def configureInstall(self): 846f8833479SBarry Smith '''Setup the directories for installation''' 847f8833479SBarry Smith if self.framework.argDB['prefix']: 848ede33fe4SSatish Balay self.addMakeRule('print_mesg_after_build','',['-@echo "Now to install the libraries do:"',\ 849d093bd8dSBarry Smith '-@echo "'+self.installdir.installSudo+'make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 850315b77e6SSatish Balay '-@echo "========================================="']) 851f8833479SBarry Smith else: 852ede33fe4SSatish Balay self.addMakeRule('print_mesg_after_build','',['-@echo "Now to check if the libraries are working do:"',\ 8530cd68fe6SJed Brown '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} check"',\ 854315b77e6SSatish Balay '-@echo "========================================="']) 855f8833479SBarry Smith return 856f8833479SBarry Smith 857f8833479SBarry Smith def configureGCOV(self): 858f8833479SBarry Smith if self.framework.argDB['with-gcov']: 859f8833479SBarry Smith self.addDefine('USE_GCOV','1') 860f8833479SBarry Smith return 861f8833479SBarry Smith 86228bb2e72SSatish Balay def postProcessPackages(self): 86328bb2e72SSatish Balay postPackages=[] 86428bb2e72SSatish Balay for i in self.framework.packages: 86528bb2e72SSatish Balay if hasattr(i,'postProcess'): postPackages.append(i) 86628bb2e72SSatish Balay if postPackages: 867e64d19dfSSatish Balay # ctetgen needs petsc conf files. so attempt to create them early 868a77eb93bSSatish Balay self.framework.dumpConfFiles() 869d9293e7bSBarry Smith # tacky fix for dependency of Aluimia on Pflotran; requested via petsc-dev Matt provide a correct fix 870d9293e7bSBarry Smith for i in postPackages: 871d9293e7bSBarry Smith if i.name.upper() in ['PFLOTRAN']: 872d9293e7bSBarry Smith i.postProcess() 873d9293e7bSBarry Smith postPackages.remove(i) 87428bb2e72SSatish Balay for i in postPackages: i.postProcess() 875aa5c8b8eSBarry Smith for i in postPackages: 876aa5c8b8eSBarry Smith if i.installedpetsc: 877aa5c8b8eSBarry Smith self.installed = 1 878aa5c8b8eSBarry Smith break 87928bb2e72SSatish Balay return 880f8833479SBarry Smith 881f8833479SBarry Smith def configure(self): 882f8833479SBarry Smith if not os.path.samefile(self.petscdir.dir, os.getcwd()): 883f8833479SBarry Smith raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 884550489e3SMatthew G Knepley if self.framework.argDB['prefix'] and os.path.isdir(self.framework.argDB['prefix']) and os.path.samefile(self.framework.argDB['prefix'],self.petscdir.dir): 8853552d8fbSSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 8868fd0dbdbSBarry Smith if self.framework.argDB['prefix'] and self.framework.argDB['prefix'].find(' ') > -1: 8878fd0dbdbSBarry Smith 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') 888c16c35a9SSatish Balay 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)): 889c16c35a9SSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!') 890f16c1317SJed Brown self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 891f16c1317SJed Brown self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 8929c735a01SStefano Zampini self.framework.pkgheader = os.path.join(self.arch.arch,'include','petscpkg_version.h') 893af0996ceSBarry Smith self.framework.makeMacroHeader = os.path.join(self.arch.arch,'lib','petsc','conf','petscvariables') 894af0996ceSBarry Smith self.framework.makeRuleHeader = os.path.join(self.arch.arch,'lib','petsc','conf','petscrules') 895f8833479SBarry Smith if self.libraries.math is None: 896f8833479SBarry Smith raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 897f8833479SBarry Smith if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 898f8833479SBarry Smith raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 899ed938b00SJed Brown self.executeTest(self.configureRTLDDefault) 900b2843cf1SBarry Smith self.executeTest(self.configurePrefetch) 9012400fdedSBarry Smith self.executeTest(self.configureUnused) 9021ef8df7fSJed Brown self.executeTest(self.configureDeprecated) 90398ed35c3SBarry Smith self.executeTest(self.configureIsatty) 9049800092aSJed Brown self.executeTest(self.configureExpect); 90518f41590SBarry Smith self.executeTest(self.configureAlign); 90653c77d0aSJed Brown self.executeTest(self.configureFunctionName); 907753ebd1dSJed Brown self.executeTest(self.configureIntptrt); 908f8833479SBarry Smith self.executeTest(self.configureSolaris) 909f8833479SBarry Smith self.executeTest(self.configureLinux) 910f8833479SBarry Smith self.executeTest(self.configureWin32) 911b10d012aSSatish Balay self.executeTest(self.configureCygwinBrokenPipe) 912569865ddSSatish Balay self.executeTest(self.configureDefaultArch) 913f8833479SBarry Smith self.executeTest(self.configureScript) 914f8833479SBarry Smith self.executeTest(self.configureInstall) 915f8833479SBarry Smith self.executeTest(self.configureGCOV) 91609bc878fSSatish Balay self.executeTest(self.configureAtoll) 917f8833479SBarry Smith 918f8833479SBarry Smith self.Dump() 919f8833479SBarry Smith self.dumpConfigInfo() 9202a4161d9SMatthew G Knepley self.dumpMachineInfo() 92140277576SBarry Smith # need to save the current state of BuildSystem so that postProcess() packages can read it in and perhaps run make install 92240277576SBarry Smith self.framework.storeSubstitutions(self.framework.argDB) 923492432c8SJed Brown self.framework.argDB['configureCache'] = pickle.dumps(self.framework) 92440277576SBarry Smith self.framework.argDB.save(force = True) 925262119f8SBarry Smith self.DumpPkgconfig() 926351d3a41SMatthew G Knepley self.DumpModule() 927f7ad81e1SBarry Smith self.postProcessPackages() 928f8833479SBarry Smith self.framework.log.write('================================================================================\n') 929f8833479SBarry Smith self.logClear() 930f8833479SBarry Smith return 931