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 124a8b45ee7SBarry Smith headersC = map(lambda name: name+'.h', ['setjmp','dos', 'endian', 'fcntl', 'float', 'io', 'limits', 'malloc', 'pwd', 'search', 'strings', 125ba61063dSBarry Smith 'unistd', 'sys/sysinfo', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource', 126a3aaec0aSJed Brown 'sys/systeminfo', 'sys/times', 'sys/utsname','string', 'stdlib', 127f8833479SBarry Smith 'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types', 128ffebf242SSatish Balay 'WindowsX', 'cxxabi','float','ieeefp','stdint','sched','pthread','inttypes','immintrin','zmmintrin']) 12945082d64SJed Brown functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 1309dcccc9aSSatish Balay 'gettimeofday', 'getwd', 'memalign', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize', 13138ecfe64SSatish Balay 'readlink', 'realpath', 'sigaction', 'signal', 'sigset', 'usleep', 'sleep', '_sleep', 'socket', 132473bb0d5SSatish Balay 'times', 'gethostbyname', 'uname','snprintf','_snprintf','lseek','_lseek','time','fork','stricmp', 133ac7218bbSSatish Balay 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror','get_nprocs','sysctlbyname', 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: 371898a086dSBarry Smith if i.useddirectly: 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('PATH_SEPARATOR','\';\'') 758f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'\\\\\'') 759f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 760f8833479SBarry Smith self.addDefine('CANNOT_START_DEBUGGER',1) 7615188cb68SSatish Balay (petscdir,error,status) = self.executeShellCommand('cygpath -w '+self.installdir.petscDir, log = self.log) 76234531a4dSSatish Balay self.addDefine('DIR','"'+petscdir.replace('\\','\\\\')+'"') 7635188cb68SSatish Balay (petscdir,error,status) = self.executeShellCommand('cygpath -m '+self.installdir.petscDir, log = self.log) 764e433681fSSatish Balay self.addMakeMacro('wPETSC_DIR',petscdir) 765f8833479SBarry Smith else: 766f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\':\'') 767f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 768f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'/\'') 7695188cb68SSatish Balay self.addDefine('DIR','"'+self.installdir.petscDir+'"') 7705188cb68SSatish Balay self.addMakeMacro('wPETSC_DIR',self.installdir.petscDir) 7715188cb68SSatish Balay self.addDefine('ARCH','"'+self.installdir.petscArch+'"') 772f8833479SBarry Smith return 773f8833479SBarry Smith 774f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 775b10d012aSSatish Balay def configureCygwinBrokenPipe(self): 776b10d012aSSatish Balay '''Cygwin version <= 1.7.18 had issues with pipes and long commands invoked from gnu-make 777b10d012aSSatish Balay http://cygwin.com/ml/cygwin/2013-05/msg00340.html ''' 7787fca349cSMatthew G. Knepley if config.setCompilers.Configure.isCygwin(self.log): 779b10d012aSSatish Balay import platform 780b10d012aSSatish Balay import re 781b10d012aSSatish Balay r=re.compile("([0-9]+).([0-9]+).([0-9]+)") 782b10d012aSSatish Balay m=r.match(platform.release()) 783b10d012aSSatish Balay major=int(m.group(1)) 784b10d012aSSatish Balay minor=int(m.group(2)) 785b10d012aSSatish Balay subminor=int(m.group(3)) 786b10d012aSSatish Balay if ((major < 1) or (major == 1 and minor < 7) or (major == 1 and minor == 7 and subminor <= 18)): 787b10d012aSSatish Balay self.addMakeMacro('PETSC_CYGWIN_BROKEN_PIPE','1') 788b10d012aSSatish Balay return 789b10d012aSSatish Balay 790b10d012aSSatish Balay#----------------------------------------------------------------------------------------------------- 791569865ddSSatish Balay def configureDefaultArch(self): 792af0996ceSBarry Smith conffile = os.path.join('lib','petsc','conf', 'petscvariables') 793569865ddSSatish Balay if self.framework.argDB['with-default-arch']: 794c6ef1b5bSJed Brown fd = open(conffile, 'w') 795569865ddSSatish Balay fd.write('PETSC_ARCH='+self.arch.arch+'\n') 796da93591fSBarry Smith fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 797b9b902edSJed Brown fd.write('include '+os.path.join('$(PETSC_DIR)','$(PETSC_ARCH)','lib','petsc','conf','petscvariables')+'\n') 798569865ddSSatish Balay fd.close() 799569865ddSSatish Balay self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 800569865ddSSatish Balay elif os.path.isfile(conffile): 801569865ddSSatish Balay try: 802569865ddSSatish Balay os.unlink(conffile) 803569865ddSSatish Balay except: 804569865ddSSatish Balay raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 805569865ddSSatish Balay return 806569865ddSSatish Balay 807569865ddSSatish Balay#----------------------------------------------------------------------------------------------------- 808f8833479SBarry Smith def configureScript(self): 809f8833479SBarry Smith '''Output a script in the conf directory which will reproduce the configuration''' 810f8833479SBarry Smith import nargs 811495bf1a9SSatish Balay import sys 812af0996ceSBarry Smith scriptName = os.path.join(self.arch.arch,'lib','petsc','conf', 'reconfigure-'+self.arch.arch+'.py') 813f8833479SBarry Smith args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 814e97fc2efSSatish Balay if 'with-clean' in args: 815e97fc2efSSatish Balay del args['with-clean'] 816*d418e2d7SSatish Balay if 'force' in args: 817*d418e2d7SSatish Balay del args['force'] 818f8833479SBarry Smith if 'configModules' in args: 8191063a081SSatish Balay if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 820f8833479SBarry Smith del args['configModules'] 821f8833479SBarry Smith if 'optionsModule' in args: 82223a19ef1SSatish Balay if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'config.compilerOptions': 823f8833479SBarry Smith del args['optionsModule'] 824f8833479SBarry Smith if not 'PETSC_ARCH' in args: 8251063a081SSatish Balay args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 826c6ef1b5bSJed Brown f = open(scriptName, 'w') 827495bf1a9SSatish Balay f.write('#!'+sys.executable+'\n') 828f8833479SBarry Smith f.write('if __name__ == \'__main__\':\n') 829f8833479SBarry Smith f.write(' import sys\n') 8307561c02cSSatish Balay f.write(' import os\n') 8317561c02cSSatish Balay f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 832f8833479SBarry Smith f.write(' import configure\n') 8331063a081SSatish Balay # pretty print repr(args.values()) 8341063a081SSatish Balay f.write(' configure_options = [\n') 8358bec23c5SJed Brown for itm in sorted(args.values()): 8361063a081SSatish Balay f.write(' \''+str(itm)+'\',\n') 8371063a081SSatish Balay f.write(' ]\n') 838f8833479SBarry Smith f.write(' configure.petsc_configure(configure_options)\n') 839f8833479SBarry Smith f.close() 840f8833479SBarry Smith try: 8415b6bfdb9SJed Brown os.chmod(scriptName, 0o775) 8425b6bfdb9SJed Brown except OSError as e: 843f8833479SBarry Smith self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 844f8833479SBarry Smith self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 845f8833479SBarry Smith return 846f8833479SBarry Smith 847f8833479SBarry Smith def configureInstall(self): 848f8833479SBarry Smith '''Setup the directories for installation''' 849f8833479SBarry Smith if self.framework.argDB['prefix']: 850ede33fe4SSatish Balay self.addMakeRule('print_mesg_after_build','',['-@echo "Now to install the libraries do:"',\ 851d093bd8dSBarry Smith '-@echo "'+self.installdir.installSudo+'make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 852315b77e6SSatish Balay '-@echo "========================================="']) 853f8833479SBarry Smith else: 854ede33fe4SSatish Balay self.addMakeRule('print_mesg_after_build','',['-@echo "Now to check if the libraries are working do:"',\ 8550cd68fe6SJed Brown '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} check"',\ 856315b77e6SSatish Balay '-@echo "========================================="']) 857f8833479SBarry Smith return 858f8833479SBarry Smith 859f8833479SBarry Smith def configureGCOV(self): 860f8833479SBarry Smith if self.framework.argDB['with-gcov']: 861f8833479SBarry Smith self.addDefine('USE_GCOV','1') 862f8833479SBarry Smith return 863f8833479SBarry Smith 86428bb2e72SSatish Balay def postProcessPackages(self): 86528bb2e72SSatish Balay postPackages=[] 86628bb2e72SSatish Balay for i in self.framework.packages: 86728bb2e72SSatish Balay if hasattr(i,'postProcess'): postPackages.append(i) 86828bb2e72SSatish Balay if postPackages: 869e64d19dfSSatish Balay # ctetgen needs petsc conf files. so attempt to create them early 870a77eb93bSSatish Balay self.framework.dumpConfFiles() 871d9293e7bSBarry Smith # tacky fix for dependency of Aluimia on Pflotran; requested via petsc-dev Matt provide a correct fix 872d9293e7bSBarry Smith for i in postPackages: 873d9293e7bSBarry Smith if i.name.upper() in ['PFLOTRAN']: 874d9293e7bSBarry Smith i.postProcess() 875d9293e7bSBarry Smith postPackages.remove(i) 87628bb2e72SSatish Balay for i in postPackages: i.postProcess() 877aa5c8b8eSBarry Smith for i in postPackages: 878aa5c8b8eSBarry Smith if i.installedpetsc: 879aa5c8b8eSBarry Smith self.installed = 1 880aa5c8b8eSBarry Smith break 88128bb2e72SSatish Balay return 882f8833479SBarry Smith 883f8833479SBarry Smith def configure(self): 884f8833479SBarry Smith if not os.path.samefile(self.petscdir.dir, os.getcwd()): 885f8833479SBarry Smith raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 886550489e3SMatthew 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): 8873552d8fbSSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 8888fd0dbdbSBarry Smith if self.framework.argDB['prefix'] and self.framework.argDB['prefix'].find(' ') > -1: 8898fd0dbdbSBarry 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') 890c16c35a9SSatish 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)): 891c16c35a9SSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!') 892f16c1317SJed Brown self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 893f16c1317SJed Brown self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 8949c735a01SStefano Zampini self.framework.pkgheader = os.path.join(self.arch.arch,'include','petscpkg_version.h') 895af0996ceSBarry Smith self.framework.makeMacroHeader = os.path.join(self.arch.arch,'lib','petsc','conf','petscvariables') 896af0996ceSBarry Smith self.framework.makeRuleHeader = os.path.join(self.arch.arch,'lib','petsc','conf','petscrules') 897f8833479SBarry Smith if self.libraries.math is None: 898f8833479SBarry Smith raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 899f8833479SBarry Smith if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 900f8833479SBarry Smith raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 901ed938b00SJed Brown self.executeTest(self.configureRTLDDefault) 902b2843cf1SBarry Smith self.executeTest(self.configurePrefetch) 9032400fdedSBarry Smith self.executeTest(self.configureUnused) 9041ef8df7fSJed Brown self.executeTest(self.configureDeprecated) 90598ed35c3SBarry Smith self.executeTest(self.configureIsatty) 9069800092aSJed Brown self.executeTest(self.configureExpect); 90718f41590SBarry Smith self.executeTest(self.configureAlign); 90853c77d0aSJed Brown self.executeTest(self.configureFunctionName); 909753ebd1dSJed Brown self.executeTest(self.configureIntptrt); 910f8833479SBarry Smith self.executeTest(self.configureSolaris) 911f8833479SBarry Smith self.executeTest(self.configureLinux) 912f8833479SBarry Smith self.executeTest(self.configureWin32) 913b10d012aSSatish Balay self.executeTest(self.configureCygwinBrokenPipe) 914569865ddSSatish Balay self.executeTest(self.configureDefaultArch) 915f8833479SBarry Smith self.executeTest(self.configureScript) 916f8833479SBarry Smith self.executeTest(self.configureInstall) 917f8833479SBarry Smith self.executeTest(self.configureGCOV) 91809bc878fSSatish Balay self.executeTest(self.configureAtoll) 919f8833479SBarry Smith 920f8833479SBarry Smith self.Dump() 921f8833479SBarry Smith self.dumpConfigInfo() 9222a4161d9SMatthew G Knepley self.dumpMachineInfo() 92340277576SBarry Smith # need to save the current state of BuildSystem so that postProcess() packages can read it in and perhaps run make install 92440277576SBarry Smith self.framework.storeSubstitutions(self.framework.argDB) 925492432c8SJed Brown self.framework.argDB['configureCache'] = pickle.dumps(self.framework) 92640277576SBarry Smith self.framework.argDB.save(force = True) 927262119f8SBarry Smith self.DumpPkgconfig() 928351d3a41SMatthew G Knepley self.DumpModule() 929f7ad81e1SBarry Smith self.postProcessPackages() 930f8833479SBarry Smith self.framework.log.write('================================================================================\n') 931f8833479SBarry Smith self.logClear() 932f8833479SBarry Smith return 933