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) 69*4e00a515SSatish Balay self.dataFilesPath = framework.require('PETSc.options.dataFilesPath',self) 706dd73af6SBarry Smith self.scalartypes = framework.require('PETSc.options.scalarTypes', self) 716dd73af6SBarry Smith self.indexTypes = framework.require('PETSc.options.indexTypes', self) 729d310bb7SBarry Smith self.languages = framework.require('PETSc.options.languages', self.setCompilers) 7330b8aa07SMatthew G. Knepley self.indexTypes = framework.require('PETSc.options.indexTypes', self.compilers) 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) 81e6b0c433SBarry Smith self.mpi = framework.require('config.packages.MPI', self) 820542e31aSBarry Smith self.fortran = framework.require('config.compilersFortran', self) 830542e31aSBarry Smith self.externalpackagesdir = framework.require('PETSc.options.externalpackagesdir',self) 8449d43ecaSSatish Balay 8509a6cbfcSBernhard M. Wiedemann for utility in sorted(os.listdir(os.path.join('config','PETSc','options'))): 866dd73af6SBarry Smith self.registerPythonFile(utility,'PETSc.options') 879d310bb7SBarry Smith 8809a6cbfcSBernhard M. Wiedemann for utility in sorted(os.listdir(os.path.join('config','BuildSystem','config','utilities'))): 896dd73af6SBarry Smith self.registerPythonFile(utility,'config.utilities') 9006e08bc7SBarry Smith 9109a6cbfcSBernhard M. Wiedemann for package in sorted(os.listdir(os.path.join('config', 'BuildSystem', 'config', 'packages'))): 9251294b80SMatthew G. Knepley obj = self.registerPythonFile(package,'config.packages') 9351294b80SMatthew G. Knepley if obj: 9451294b80SMatthew G. Knepley obj.archProvider = self.framework.requireModule(obj.archProvider, obj) 9551294b80SMatthew G. Knepley obj.languageProvider = self.framework.requireModule(obj.languageProvider, obj) 9651294b80SMatthew G. Knepley obj.installDirProvider = self.framework.requireModule(obj.installDirProvider, obj) 9751294b80SMatthew G. Knepley obj.externalPackagesDirProvider = self.framework.requireModule(obj.externalPackagesDirProvider, obj) 9851294b80SMatthew G. Knepley obj.precisionProvider = self.framework.requireModule(obj.precisionProvider, obj) 9951294b80SMatthew G. Knepley obj.indexProvider = self.framework.requireModule(obj.indexProvider, obj) 1006dd73af6SBarry Smith 1015faf1eacSMatthew G. Knepley # Force blaslapack and opencl to depend on scalarType so precision is set before BlasLapack is built 1029d310bb7SBarry Smith framework.require('PETSc.options.scalarTypes', self.f2cblaslapack) 1039d310bb7SBarry Smith framework.require('PETSc.options.scalarTypes', self.fblaslapack) 1049d310bb7SBarry Smith framework.require('PETSc.options.scalarTypes', self.blaslapack) 1055faf1eacSMatthew G. Knepley framework.require('PETSc.options.scalarTypes', self.opencl) 106f8833479SBarry Smith 107dca78d2bSSatish Balay self.programs.headerPrefix = self.headerPrefix 108f8833479SBarry Smith self.compilers.headerPrefix = self.headerPrefix 1090542e31aSBarry Smith self.fortran.headerPrefix = self.headerPrefix 110f8833479SBarry Smith self.types.headerPrefix = self.headerPrefix 111f8833479SBarry Smith self.headers.headerPrefix = self.headerPrefix 112f8833479SBarry Smith self.functions.headerPrefix = self.headerPrefix 113f8833479SBarry Smith self.libraries.headerPrefix = self.headerPrefix 1146dd73af6SBarry Smith 1152c30b4dfSSatish Balay # Register user provided package scripts 1162c30b4dfSSatish Balay if 'with-package-scripts' in self.framework.argDB: 1172c30b4dfSSatish Balay for script in self.framework.argDB['with-package-scripts']: 1182c30b4dfSSatish Balay if os.path.splitext(script)[1] != '.py': 1192c30b4dfSSatish Balay raise RuntimeError('Only python scripts compatible with configure package script format should be specified! Invalid option -with-package-scripts='+script) 1202c30b4dfSSatish Balay self.framework.logPrint('User is registering a new package script: '+script) 1212c30b4dfSSatish Balay dname,fname = os.path.split(script) 1222c30b4dfSSatish Balay if dname: sys.path.append(dname) 1232c30b4dfSSatish Balay self.registerPythonFile(fname,'') 1246dd73af6SBarry Smith 1256dd73af6SBarry Smith # test for a variety of basic headers and functions 1264211eb48SBarry Smith headersC = map(lambda name: name+'.h',['setjmp','dos','fcntl','float','io','malloc','pwd','strings', 127ba61063dSBarry Smith 'unistd','sys/sysinfo','machine/endian','sys/param','sys/procfs','sys/resource', 1282475b7caSBarry Smith 'sys/systeminfo','sys/times','sys/utsname', 1297e4f0192SMosè Giordano 'sys/socket','sys/wait','netinet/in','netdb','direct','time','Ws2tcpip','sys/types', 1302475b7caSBarry Smith 'WindowsX','float','ieeefp','stdint','pthread','inttypes','immintrin','zmmintrin']) 13145082d64SJed Brown functions = ['access','_access','clock','drand48','getcwd','_getcwd','getdomainname','gethostname', 1324211eb48SBarry Smith 'getwd','memalign','popen','PXFGETARG','rand','getpagesize', 1334211eb48SBarry Smith 'readlink','realpath','usleep','sleep','_sleep', 1342475b7caSBarry Smith 'uname','snprintf','_snprintf','lseek','_lseek','time','fork','stricmp', 1352475b7caSBarry Smith 'strcasecmp','bzero','dlopen','dlsym','dlclose','dlerror', 136ed50d614Sprj- '_set_output_format','_mkdir','socket','gethostbyname','_pipe'] 137b0651e32SBarry Smith libraries = [(['fpe'],'handle_sigfpes')] 138b0651e32SBarry Smith librariessock = [(['socket','nsl'],'socket')] 139f8833479SBarry Smith self.headers.headers.extend(headersC) 140f8833479SBarry Smith self.functions.functions.extend(functions) 141b0651e32SBarry Smith self.libraries.libraries.extend(libraries) 142b0651e32SBarry Smith if not hasattr(self,'socket'): 143b0651e32SBarry Smith self.libraries.libraries.extend(librariessock) 144f8833479SBarry Smith return 145f8833479SBarry Smith 146262119f8SBarry Smith def DumpPkgconfig(self): 147262119f8SBarry Smith ''' Create a pkg-config file ''' 148262119f8SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')): 149262119f8SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')) 150262119f8SBarry Smith fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig','PETSc.pc'),'w') 1515e3311eeSJed Brown cflags_inc = ['-I${includedir}'] 152262119f8SBarry Smith if self.framework.argDB['prefix']: 1535bb5b263SMatthew G. Knepley fd.write('prefix='+self.installdir.dir+'\n') 154262119f8SBarry Smith else: 155e1e675deSJed Brown fd.write('prefix='+os.path.join(self.petscdir.dir, self.arch.arch)+'\n') 156e1e675deSJed Brown cflags_inc.append('-I' + os.path.join(self.petscdir.dir, 'include')) 157262119f8SBarry Smith fd.write('exec_prefix=${prefix}\n') 158262119f8SBarry Smith fd.write('includedir=${prefix}/include\n') 1595e3311eeSJed Brown fd.write('libdir=${prefix}/lib\n') 160262119f8SBarry Smith 161262119f8SBarry Smith self.setCompilers.pushLanguage('C') 162262119f8SBarry Smith fd.write('ccompiler='+self.setCompilers.getCompiler()+'\n') 163756c7f9fSJed Brown fd.write('cflags_extra='+self.setCompilers.getCompilerFlags().strip()+'\n') 164756c7f9fSJed Brown fd.write('cflags_dep='+self.compilers.dependenciesGenerationFlag.get('C','')+'\n') 165756c7f9fSJed Brown fd.write('ldflag_rpath='+self.setCompilers.CSharedLinkerFlag+'\n') 166262119f8SBarry Smith self.setCompilers.popLanguage() 16703e383c8SJed Brown if hasattr(self.compilers, 'CXX'): 168262119f8SBarry Smith self.setCompilers.pushLanguage('C++') 169262119f8SBarry Smith fd.write('cxxcompiler='+self.setCompilers.getCompiler()+'\n') 170756c7f9fSJed Brown fd.write('cxxflags_extra='+self.setCompilers.getCompilerFlags().strip()+'\n') 171262119f8SBarry Smith self.setCompilers.popLanguage() 172262119f8SBarry Smith if hasattr(self.compilers, 'FC'): 173262119f8SBarry Smith self.setCompilers.pushLanguage('FC') 174262119f8SBarry Smith fd.write('fcompiler='+self.setCompilers.getCompiler()+'\n') 175756c7f9fSJed Brown fd.write('fflags_extra='+self.setCompilers.getCompilerFlags().strip()+'\n') 176262119f8SBarry Smith self.setCompilers.popLanguage() 177262119f8SBarry Smith 178262119f8SBarry Smith fd.write('\n') 179262119f8SBarry Smith fd.write('Name: PETSc\n') 180262119f8SBarry Smith fd.write('Description: Library to solve ODEs and algebraic equations\n') 181351d3a41SMatthew G Knepley fd.write('Version: %s\n' % self.petscdir.version) 1825e3311eeSJed Brown fd.write('Cflags: ' + ' '.join([self.setCompilers.CPPFLAGS] + cflags_inc) + '\n') 18337371b91SJed Brown fd.write('Libs: '+self.libraries.toStringNoDupes(['-L${libdir}', self.petsclib], with_rpath=False)+'\n') 1848ebf8858SJed Brown # Remove RPATH flags from library list. User can add them using 1858ebf8858SJed Brown # pkg-config --variable=ldflag_rpath and pkg-config --libs-only-L 186de8f682fSSatish 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') 187473a3ab2SBarry Smith 188262119f8SBarry Smith fd.close() 189262119f8SBarry Smith return 190262119f8SBarry Smith 191351d3a41SMatthew G Knepley def DumpModule(self): 192351d3a41SMatthew G Knepley ''' Create a module file ''' 193af0996ceSBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules')): 194af0996ceSBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules')) 195af0996ceSBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules','petsc')): 196af0996ceSBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules','petsc')) 197351d3a41SMatthew G Knepley if self.framework.argDB['prefix']: 1985bb5b263SMatthew G. Knepley installdir = self.installdir.dir 19955d606a3SSatish Balay installarch = '' 20055d606a3SSatish Balay installpath = os.path.join(installdir,'bin') 201351d3a41SMatthew G Knepley else: 202351d3a41SMatthew G Knepley installdir = self.petscdir.dir 20355d606a3SSatish Balay installarch = self.arch.arch 20455d606a3SSatish Balay installpath = os.path.join(installdir,installarch,'bin')+':'+os.path.join(installdir,'bin') 205af0996ceSBarry Smith fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','petsc','conf','modules','petsc',self.petscdir.version),'w') 206351d3a41SMatthew G Knepley fd.write('''\ 207351d3a41SMatthew G Knepley#%%Module 208351d3a41SMatthew G Knepley 209351d3a41SMatthew G Knepleyproc ModulesHelp { } { 210351d3a41SMatthew G Knepley puts stderr "This module sets the path and environment variables for petsc-%s" 211a8d69d7bSBarry Smith puts stderr " see https://www.mcs.anl.gov/petsc/ for more information " 212351d3a41SMatthew G Knepley puts stderr "" 213351d3a41SMatthew G Knepley} 214351d3a41SMatthew G Knepleymodule-whatis "PETSc - Portable, Extensible Toolkit for Scientific Computation" 215351d3a41SMatthew G Knepley 216dd486775SJed Brownset petsc_dir "%s" 217dd486775SJed Brownset petsc_arch "%s" 218351d3a41SMatthew G Knepley 219dd486775SJed Brownsetenv PETSC_ARCH "$petsc_arch" 220dd486775SJed Brownsetenv PETSC_DIR "$petsc_dir" 221dd486775SJed Brownprepend-path PATH "%s" 22255d606a3SSatish Balay''' % (self.petscdir.version, installdir, installarch, installpath)) 223351d3a41SMatthew G Knepley fd.close() 224351d3a41SMatthew G Knepley return 225351d3a41SMatthew G Knepley 226f8833479SBarry Smith def Dump(self): 227f8833479SBarry Smith ''' Actually put the values into the configuration files ''' 228f8833479SBarry Smith # eventually everything between -- should be gone 22917f368bcSBarry Smith if self.mpi.usingMPIUni: 23017f368bcSBarry Smith # 23117f368bcSBarry Smith # Remove any MPI/MPICH include files that may have been put here by previous runs of ./configure 2327908f030SMatthew 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) 23317f368bcSBarry Smith 2345f27b2e0SBarry Smith self.setCompilers.pushLanguage('C') 2355f27b2e0SBarry Smith compiler = self.setCompilers.getCompiler() 236c9872b61SBarry Smith if compiler.endswith('mpicc') or compiler.endswith('mpiicc'): 2375f27b2e0SBarry Smith try: 2385f27b2e0SBarry Smith output = self.executeShellCommand(compiler + ' -show', log = self.log)[0] 2395f27b2e0SBarry Smith compiler = output.split(' ')[0] 2405f27b2e0SBarry Smith self.addDefine('MPICC_SHOW','"'+output.strip().replace('\n','\\\\n')+'"') 2415f27b2e0SBarry Smith except: 242c9872b61SBarry Smith self.addDefine('MPICC_SHOW','"Unavailable"') 243c9872b61SBarry Smith else: 244c9872b61SBarry Smith self.addDefine('MPICC_SHOW','"Unavailable"') 2455f27b2e0SBarry Smith self.setCompilers.popLanguage() 246f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 247f8833479SBarry Smith 248f8833479SBarry Smith # Sometimes we need C compiler, even if built with C++ 249f8833479SBarry Smith self.setCompilers.pushLanguage('C') 250f8833479SBarry Smith self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 251f8833479SBarry Smith self.setCompilers.popLanguage() 252f8833479SBarry Smith 25334f774f6SJed Brown # And sometimes we need a C++ compiler even when PETSc is built with C 25434f774f6SJed Brown if hasattr(self.compilers, 'CXX'): 25534f774f6SJed Brown self.setCompilers.pushLanguage('Cxx') 25629921a8fSScott Kruger self.addDefine('HAVE_CXX','1') 2570b119762SSatish Balay self.addMakeMacro('CXXPP_FLAGS',self.setCompilers.CXXPPFLAGS) 25834f774f6SJed Brown self.addMakeMacro('CXX_FLAGS',self.setCompilers.getCompilerFlags()) 2592f4326f3SSatish Balay cxx_linker = self.setCompilers.getLinker() 2602f4326f3SSatish Balay self.addMakeMacro('CXX_LINKER',cxx_linker) 2612f4326f3SSatish Balay self.addMakeMacro('CXX_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 26234f774f6SJed Brown self.setCompilers.popLanguage() 26334f774f6SJed Brown 264f8833479SBarry Smith # C preprocessor values 2651315f054SBarry Smith self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS) 266f8833479SBarry Smith 267f8833479SBarry Smith # compiler values 268f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 269f8833479SBarry Smith self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 270f8833479SBarry Smith self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 2710b119762SSatish Balay self.addMakeMacro('PCPP_FLAGS',getattr(self.setCompilers,self.languages.clanguage.upper()+'PPFLAGS')) 2720b119762SSatish Balay self.addMakeMacro('PFLAGS','${'+self.languages.clanguage.upper()+'FLAGS}') 2730b119762SSatish Balay self.addMakeMacro('PPPFLAGS','${'+self.languages.clanguage.upper()+'PPFLAGS}') 2740b119762SSatish Balay # ugly work-around for python3 distutils parse_makefile() issue with the above 2 lines 2750b119762SSatish Balay self.addMakeMacro('PY_'+self.languages.clanguage.upper()+'FLAGS','') 2760b119762SSatish Balay self.addMakeMacro('PY_'+self.languages.clanguage.upper()+'PPFLAGS','') 277f8833479SBarry Smith self.setCompilers.popLanguage() 278f8833479SBarry Smith # .o or .obj 279f8833479SBarry Smith self.addMakeMacro('CC_SUFFIX','o') 280f8833479SBarry Smith 281f8833479SBarry Smith # executable linker values 282f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 283f8833479SBarry Smith pcc_linker = self.setCompilers.getLinker() 284f8833479SBarry Smith self.addMakeMacro('PCC_LINKER',pcc_linker) 285c84a332bSSatish Balay self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 286f8833479SBarry Smith self.setCompilers.popLanguage() 287f8833479SBarry Smith # '' for Unix, .exe for Windows 288f8833479SBarry Smith self.addMakeMacro('CC_LINKER_SUFFIX','') 289f8833479SBarry Smith 290f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 291cb297985SSatish Balay if self.framework.argDB['with-fortran-bindings']: 292257f4e5aSSatish Balay if not self.fortran.fortranIsF90: 293257f4e5aSSatish Balay raise RuntimeError('Error! Fortran compiler "'+self.compilers.FC+'" does not support F90! PETSc fortran bindings require a F90 compiler') 294cb297985SSatish Balay self.addDefine('HAVE_FORTRAN','1') 295f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 296f8833479SBarry Smith # need FPPFLAGS in config/setCompilers 2970b119762SSatish Balay self.addMakeMacro('FPP_FLAGS',self.setCompilers.FPPFLAGS) 298f8833479SBarry Smith 299f8833479SBarry Smith # compiler values 300f8833479SBarry Smith self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 301f8833479SBarry Smith self.setCompilers.popLanguage() 302f8833479SBarry Smith # .o or .obj 303f8833479SBarry Smith self.addMakeMacro('FC_SUFFIX','o') 304f8833479SBarry Smith 305f8833479SBarry Smith # executable linker values 306f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 307a9acdec7SBarry Smith self.addMakeMacro('FC_LINKER',self.setCompilers.getLinker()) 3086d53d35eSSatish Balay self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 3093feacd00SBarry Smith # apple requires this shared library linker flag on SOME versions of the os 3103feacd00SBarry Smith if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 3113feacd00SBarry Smith self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 312bb82cf9cSSatish Balay self.setCompilers.popLanguage() 3135d631499SMatthew Knepley 3145d631499SMatthew Knepley # F90 Modules 3155d631499SMatthew Knepley if self.setCompilers.fortranModuleIncludeFlag: 3165d631499SMatthew Knepley self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag) 3176ddd6694SSatish Balay else: # for non-f90 compilers like g77 3186ddd6694SSatish Balay self.addMakeMacro('FC_MODULE_FLAG', '-I') 319a324c51cSMatthew G Knepley if self.setCompilers.fortranModuleIncludeFlag: 320a324c51cSMatthew G Knepley self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag) 321f8833479SBarry Smith else: 322f8833479SBarry Smith self.addMakeMacro('FC','') 323f8833479SBarry Smith 32446a3958fSBarry Smith if hasattr(self.compilers, 'CUDAC'): 3257ff2890cSSatish Balay self.setCompilers.pushLanguage('CUDA') 326d93a25ecSSatish Balay self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags()) 3277ff2890cSSatish Balay self.setCompilers.popLanguage() 3287ff2890cSSatish Balay 329f8833479SBarry Smith # shared library linker values 330f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 331f8833479SBarry Smith # need to fix BuildSystem to collect these separately 332f8833479SBarry Smith self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 33370db8aa6SSatish Balay self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 334f8833479SBarry Smith self.setCompilers.popLanguage() 335f8833479SBarry Smith # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 336f8833479SBarry Smith # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 337f8833479SBarry Smith if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 338f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', '') 33946bc77b6SBarry Smith self.addDefine('SLSUFFIX','""') 340f8833479SBarry Smith else: 341f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 34246bc77b6SBarry Smith self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"') 343bb82cf9cSSatish Balay 34423e93537SBarry Smith self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}') 345bb82cf9cSSatish Balay 346f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 347f8833479SBarry Smith 348f8833479SBarry Smith # CONLY or CPP. We should change the PETSc makefiles to do this better 349f8833479SBarry Smith if self.languages.clanguage == 'C': lang = 'CONLY' 350f8833479SBarry Smith else: lang = 'CXXONLY' 351f8833479SBarry Smith self.addMakeMacro('PETSC_LANGUAGE',lang) 352f8833479SBarry Smith 353f8833479SBarry Smith # real or complex 354f8833479SBarry Smith self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 355f8833479SBarry Smith # double or float 356f8833479SBarry Smith self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 357f8833479SBarry Smith 358f8833479SBarry Smith if self.framework.argDB['with-batch']: 359f8833479SBarry Smith self.addMakeMacro('PETSC_WITH_BATCH','1') 360f8833479SBarry Smith 361f8833479SBarry Smith # Test for compiler-specific macros that need to be defined. 3627fca349cSMatthew G. Knepley if self.setCompilers.isCrayVector('CC', self.log): 363b409243cSBarry Smith self.addDefine('HAVE_CRAY_VECTOR','1') 364f8833479SBarry Smith 365f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 366df1a78b3SMatthew G Knepley if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket') and self.headers.haveHeader('netinet/in.h'): 367f8833479SBarry Smith self.addDefine('USE_SOCKET_VIEWER','1') 36880e3883bSBarry Smith if self.checkCompile('#include <sys/socket.h>','setsockopt(0,SOL_SOCKET,SO_REUSEADDR,0,0)'): 36980e3883bSBarry Smith self.addDefine('HAVE_SO_REUSEADDR','1') 370f8833479SBarry Smith 371f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 372a6cc6bb1SBarry Smith # print include and lib for makefiles 373f8833479SBarry Smith self.framework.packages.reverse() 3745a21677cSJed Brown petscincludes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')] 3755a21677cSJed Brown petscincludes_install = [os.path.join(self.installdir.dir, 'include')] if self.framework.argDB['prefix'] else petscincludes 3765a21677cSJed Brown includes = [] 377de8f682fSSatish Balay self.packagelibs = [] 378f8833479SBarry Smith for i in self.framework.packages: 3797f0ff1afSBarry Smith if not i.required: 380eeb16384SBarry Smith self.addDefine('HAVE_'+i.PACKAGE.replace('-','_'), 1) # ONLY list package if it is used directly by PETSc (and not only by another package) 381f8833479SBarry Smith if not isinstance(i.lib, list): 382f8833479SBarry Smith i.lib = [i.lib] 383de8f682fSSatish Balay if i.linkedbypetsc: self.packagelibs.extend(i.lib) 384eeb16384SBarry Smith self.addMakeMacro(i.PACKAGE.replace('-','_')+'_LIB', self.libraries.toStringNoDupes(i.lib)) 385f8833479SBarry Smith if hasattr(i,'include'): 386f8833479SBarry Smith if not isinstance(i.include,list): 387f8833479SBarry Smith i.include = [i.include] 388ac9e4c42SSatish Balay includes.extend(i.include) 389eeb16384SBarry Smith self.addMakeMacro(i.PACKAGE.replace('-','_')+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 3902df986feSBarry Smith if self.framework.argDB['with-single-library']: 391e282ce78SJed Brown self.petsclib = '-lpetsc' 39291bb3077SSatish Balay else: 393e282ce78SJed Brown self.petsclib = '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys' 394de8f682fSSatish Balay self.complibs = self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split() 3955a21677cSJed Brown self.PETSC_WITH_EXTERNAL_LIB = self.libraries.toStringNoDupes(['-L${PETSC_DIR}/${PETSC_ARCH}/lib', self.petsclib]+self.packagelibs+self.complibs) 396de8f682fSSatish Balay self.PETSC_EXTERNAL_LIB_BASIC = self.libraries.toStringNoDupes(self.packagelibs+self.complibs) 397de8f682fSSatish Balay 398de8f682fSSatish Balay self.addMakeMacro('PETSC_EXTERNAL_LIB_BASIC',self.PETSC_EXTERNAL_LIB_BASIC) 3995a21677cSJed Brown allincludes = petscincludes + includes 4005a21677cSJed Brown allincludes_install = petscincludes_install + includes 4015a21677cSJed Brown self.PETSC_CC_INCLUDES = self.headers.toStringNoDupes(allincludes) 4025a21677cSJed Brown self.PETSC_CC_INCLUDES_INSTALL = self.headers.toStringNoDupes(allincludes_install) 4035a21677cSJed Brown self.addMakeMacro('PETSC_CC_INCLUDES',self.PETSC_CC_INCLUDES) 4045a21677cSJed Brown self.addMakeMacro('PETSC_CC_INCLUDES_INSTALL', self.PETSC_CC_INCLUDES_INSTALL) 405cbd5cc15SBarry Smith if hasattr(self.compilers, 'FC'): 4065a21677cSJed Brown def modinc(includes): 4070542e31aSBarry Smith return includes if self.fortran.fortranIsF90 else [] 4085a21677cSJed Brown self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(allincludes,modinc(allincludes))) 4095a21677cSJed Brown self.addMakeMacro('PETSC_FC_INCLUDES_INSTALL',self.headers.toStringNoDupes(allincludes_install,modinc(allincludes_install))) 410f8833479SBarry Smith 4115bb5b263SMatthew G. Knepley self.addDefine('LIB_DIR','"'+os.path.join(self.installdir.dir,'lib')+'"') 412f8833479SBarry Smith 4130f3b21c2SBarry Smith if self.framework.argDB['with-single-library']: 4140f3b21c2SBarry Smith # overrides the values set in conf/variables 4150f3b21c2SBarry Smith self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 41657cb31baSSatish Balay self.addMakeMacro('SHLIBS','libpetsc') 417bccf1c12SBarry Smith self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 418797063a9SSatish Balay self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 419797063a9SSatish Balay self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 420b0a7d7e7SSatish Balay self.addMakeMacro('PETSC_TAO_LIB_BASIC','-lpetsc') 421de8f682fSSatish Balay self.addMakeMacro('PETSC_WITH_EXTERNAL_LIB',self.PETSC_WITH_EXTERNAL_LIB) 422bb84e0fdSBarry Smith self.addDefine('USE_SINGLE_LIBRARY', '1') 4232df986feSBarry Smith if self.sharedlibraries.useShared: 424ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 425ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 426ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 427ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 428ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 429ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 430ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 431b0a7d7e7SSatish Balay self.addMakeMacro('PETSC_TAO_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 432fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 433ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 434ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 4352df986feSBarry Smith else: 436ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 437ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 438ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}') 439ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}') 440ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}') 441ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}') 442ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 443b0a7d7e7SSatish Balay self.addMakeMacro('PETSC_TAO_LIB','${PETSC_WITH_EXTERNAL_LIB}') 444fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 445ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 446ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}') 4470f3b21c2SBarry Smith 448f8833479SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 449f8833479SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 450f8833479SBarry Smith 45113f9d092SSatish Balay# add a makefile endtry for display 45213f9d092SSatish Balay if self.framework.argDB['with-display']: 45313f9d092SSatish Balay self.addMakeMacro('DISPLAY',self.framework.argDB['with-display']) 45413f9d092SSatish Balay 455f8833479SBarry Smith # add a makefile entry for configure options 456f8833479SBarry Smith self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 457f8833479SBarry Smith return 458f8833479SBarry Smith 459f8833479SBarry Smith def dumpConfigInfo(self): 460f8833479SBarry Smith import time 461c6ef1b5bSJed Brown fd = open(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 462f8833479SBarry Smith fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 463f8833479SBarry Smith fd.close() 464f8833479SBarry Smith return 465f8833479SBarry Smith 4662a4161d9SMatthew G Knepley def dumpMachineInfo(self): 4672a4161d9SMatthew G Knepley import platform 468a970bd74SBernhard M. Wiedemann import datetime 4692a4161d9SMatthew G Knepley import time 47040373944SSatish Balay import script 471ca77dbeeSGeoffrey Irving def escape(s): 472e08ecd42SSatish Balay return s.replace('"',r'\"').replace(r'\ ',r'\\ ') # novermin 473c6ef1b5bSJed Brown fd = open(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w') 4742a4161d9SMatthew G Knepley fd.write('static const char *petscmachineinfo = \"\\n\"\n') 4752a4161d9SMatthew G Knepley fd.write('\"-----------------------------------------\\n\"\n') 476a970bd74SBernhard M. Wiedemann buildhost = platform.node() 477a970bd74SBernhard M. Wiedemann if os.environ.get('SOURCE_DATE_EPOCH'): 478a970bd74SBernhard M. Wiedemann buildhost = "reproducible" 479a970bd74SBernhard M. Wiedemann buildtime = datetime.datetime.utcfromtimestamp(int(os.environ.get('SOURCE_DATE_EPOCH', time.time()))) 480a970bd74SBernhard M. Wiedemann fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (buildtime, buildhost)) 48160acdfe7SSatish Balay fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform())) 4825188cb68SSatish Balay fd.write('\"Using PETSc directory: %s\\n\"\n' % (escape(self.installdir.petscDir))) 4835188cb68SSatish Balay fd.write('\"Using PETSc arch: %s\\n\"\n' % (escape(self.installdir.petscArch))) 484cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4852a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerinfo = \"\\n\"\n') 4862a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 4875f27b2e0SBarry Smith fd.write('\"Using C compiler: %s %s \\n\"\n' % (escape(self.setCompilers.getCompiler()), escape(self.setCompilers.getCompilerFlags()))) 4882a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 4898782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 4902a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 4915f27b2e0SBarry Smith fd.write('\"Using Fortran compiler: %s %s %s\\n\"\n' % (escape(self.setCompilers.getCompiler()), escape(self.setCompilers.getCompilerFlags()), escape(self.setCompilers.CPPFLAGS))) 4922a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 493cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4942a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n') 4955a21677cSJed Brown fd.write('\"Using include paths: %s\\n\"\n' % (escape(self.PETSC_CC_INCLUDES_INSTALL.replace('${PETSC_DIR}', self.installdir.petscDir)))) 496cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4972a4161d9SMatthew G Knepley fd.write('static const char *petsclinkerinfo = \"\\n\"\n') 4982a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 499ca77dbeeSGeoffrey Irving fd.write('\"Using C linker: %s\\n\"\n' % (escape(self.setCompilers.getLinker()))) 5002a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 5018782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 5022a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 503ca77dbeeSGeoffrey Irving fd.write('\"Using Fortran linker: %s\\n\"\n' % (escape(self.setCompilers.getLinker()))) 5042a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 5055188cb68SSatish 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))) 506cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 5072a4161d9SMatthew G Knepley fd.close() 5082a4161d9SMatthew G Knepley return 509b2843cf1SBarry Smith 510b2843cf1SBarry Smith def configurePrefetch(self): 511b2843cf1SBarry Smith '''Sees if there are any prefetch functions supported''' 5127fca349cSMatthew G. Knepley if config.setCompilers.Configure.isSolaris(self.log) or self.framework.argDB['with-ios'] or not self.framework.argDB['with-prefetch']: 51393f78423SSatish Balay self.addDefine('Prefetch(a,b,c)', ' ') 51493f78423SSatish Balay return 515ec284106SBarry Smith self.pushLanguage(self.languages.clanguage) 51610699583SJed Brown if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'): 51750d8bf02SJed Brown # The Intel Intrinsics manual [1] specifies the prototype 51850d8bf02SJed Brown # 51950d8bf02SJed Brown # void _mm_prefetch(char const *a, int sel); 52050d8bf02SJed Brown # 52150d8bf02SJed Brown # but other vendors seem to insist on using subtly different 52250d8bf02SJed Brown # prototypes, including void* for the pointer, and an enum for 52350d8bf02SJed Brown # sel. These are both reasonable changes, but negatively impact 52450d8bf02SJed Brown # portability. 52550d8bf02SJed Brown # 526a8d69d7bSBarry Smith # [1] https://software.intel.com/file/6373 52750d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 52850d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))') 52950d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 53050d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 53150d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 53250d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 53350d8bf02SJed Brown elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'): 53450d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 53550d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))') 53650d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 53750d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 53850d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 53950d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 54010699583SJed Brown elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 54110699583SJed Brown # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality) 54210699583SJed Brown # 54310699583SJed Brown # The value of rw is a compile-time constant one or zero; one 54410699583SJed Brown # means that the prefetch is preparing for a write to the memory 54510699583SJed Brown # address and zero, the default, means that the prefetch is 54610699583SJed Brown # preparing for a read. The value locality must be a compile-time 54710699583SJed Brown # constant integer between zero and three. A value of zero means 54810699583SJed Brown # that the data has no temporal locality, so it need not be left 54910699583SJed Brown # in the cache after the access. A value of three means that the 55010699583SJed Brown # data has a high degree of temporal locality and should be left 55110699583SJed Brown # in all levels of cache possible. Values of one and two mean, 55210699583SJed Brown # respectively, a low or moderate degree of temporal locality. 55310699583SJed Brown # 55410699583SJed Brown # Here we adopt Intel's x86/x86-64 naming scheme for the locality 55510699583SJed Brown # hints. Using macros for these values in necessary since some 55610699583SJed Brown # compilers require an enum. 55710699583SJed Brown self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))') 55810699583SJed Brown self.addDefine('PREFETCH_HINT_NTA', '0') 55910699583SJed Brown self.addDefine('PREFETCH_HINT_T0', '3') 56010699583SJed Brown self.addDefine('PREFETCH_HINT_T1', '2') 56110699583SJed Brown self.addDefine('PREFETCH_HINT_T2', '1') 562b2843cf1SBarry Smith else: 563b2843cf1SBarry Smith self.addDefine('Prefetch(a,b,c)', ' ') 5647d490b44SBarry Smith self.popLanguage() 565b2843cf1SBarry Smith 56609bc878fSSatish Balay def configureAtoll(self): 56709bc878fSSatish Balay '''Checks if atoll exists''' 568436b02dcSSatish 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")'): 56909bc878fSSatish Balay self.addDefine('HAVE_ATOLL', '1') 57009bc878fSSatish Balay 5712400fdedSBarry Smith def configureUnused(self): 5722400fdedSBarry Smith '''Sees if __attribute((unused)) is supported''' 5731adaff47SSean Farley if self.framework.argDB['with-ios']: 5742400fdedSBarry Smith self.addDefine('UNUSED', ' ') 5752400fdedSBarry Smith return 5762400fdedSBarry Smith self.pushLanguage(self.languages.clanguage) 577edf21b64SSatish 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'): 5782400fdedSBarry Smith self.addDefine('UNUSED', '__attribute((unused))') 5792400fdedSBarry Smith else: 5802400fdedSBarry Smith self.addDefine('UNUSED', ' ') 5812400fdedSBarry Smith self.popLanguage() 5822400fdedSBarry Smith 58398ed35c3SBarry Smith def configureIsatty(self): 58498ed35c3SBarry Smith '''Check if the Unix C function isatty() works correctly 58598ed35c3SBarry Smith Actually just assumes it does not work correctly on batch systems''' 58698ed35c3SBarry Smith if not self.framework.argDB['with-batch']: 58798ed35c3SBarry Smith self.addDefine('USE_ISATTY',1) 58898ed35c3SBarry Smith 5891ef8df7fSJed Brown def configureDeprecated(self): 5901ef8df7fSJed Brown '''Check if __attribute((deprecated)) is supported''' 5911ef8df7fSJed Brown self.pushLanguage(self.languages.clanguage) 59259a26b54SJed Brown ## Recent versions of gcc and clang support __attribute((deprecated("string argument"))), which is very useful, but 59359a26b54SJed Brown ## Intel has conspired to make a supremely environment-sensitive compiler. The Intel compiler looks at the gcc 59459a26b54SJed Brown ## executable in the environment to determine the language compatibility that it should attempt to emulate. Some 59559a26b54SJed Brown ## important Cray installations have built PETSc using the Intel compiler, but with a newer gcc module loaded (e.g., 596df3898eeSBarry Smith ## 4.7). Thus at PETSc configure time, the Intel compiler decides to support the string argument, but the gcc 59759a26b54SJed Brown ## found in the default user environment is older and does not support the argument. If GCC and Intel were cool 59859a26b54SJed Brown ## like Clang and supported __has_attribute, we could avoid configure tests entirely, but they don't. And that is 59959a26b54SJed Brown ## why we can't have nice things. 60059a26b54SJed Brown # 60159a26b54SJed Brown # if self.checkCompile("""__attribute((deprecated("Why you shouldn't use myfunc"))) static int myfunc(void) { return 1;}""", ''): 60225ef9dfeSBarry Smith # self.addDefine('DEPRECATED_FUNCTION(why)', '__attribute((deprecated(why)))') 60325ef9dfeSBarry Smith # self.addDefine('DEPRECATED_TYPEDEF(why)', '__attribute((deprecated(why)))') 60459a26b54SJed Brown if self.checkCompile("""__attribute((deprecated)) static int myfunc(void) { return 1;}""", ''): 60525ef9dfeSBarry Smith self.addDefine('DEPRECATED_FUNCTION(why)', '__attribute((deprecated))') 60625ef9dfeSBarry Smith self.addDefine('DEPRECATED_TYPEDEF(why)', '__attribute((deprecated))') 6071ef8df7fSJed Brown else: 60825ef9dfeSBarry Smith self.addDefine('DEPRECATED_FUNCTION(why)', ' ') 60925ef9dfeSBarry Smith self.addDefine('DEPRECATED_TYPEDEF(why)', ' ') 610a8678870SSatish Balay if self.checkCompile("""enum E {oldval __attribute((deprecated)), newval };""", ''): 611933a48e8SSatish Balay self.addDefine('DEPRECATED_ENUM(why)', '__attribute((deprecated))') 612933a48e8SSatish Balay else: 613933a48e8SSatish Balay self.addDefine('DEPRECATED_ENUM(why)', ' ') 6148e5aa403SBarry Smith # I was unable to make a CPP macro that takes the old and new values as separate arguments and builds the message needed by _Pragma 61505de396fSBarry Smith # hence the deprecation message is handled as it is 61605de396fSBarry Smith if self.checkCompile('#define TEST _Pragma("GCC warning \"Testing _Pragma\"") value'): 61705de396fSBarry Smith self.addDefine('DEPRECATED_MACRO(why)', '_Pragma(why)') 61805de396fSBarry Smith else: 61905de396fSBarry Smith self.addDefine('DEPRECATED_MACRO(why)', ' ') 6201ef8df7fSJed Brown self.popLanguage() 6211ef8df7fSJed Brown 62218f41590SBarry Smith def configureAlign(self): 6237b7fc14bSLisandro Dalcin '''Check if __attribute(aligned) is supported''' 6247b7fc14bSLisandro Dalcin code = '''\ 625752d89a4SSatish Balaystruct mystruct {int myint;} __attribute((aligned(16))); 6267b7fc14bSLisandro Dalcinchar assert_aligned[(sizeof(struct mystruct)==16)*2-1]; 627752d89a4SSatish Balay''' 628752d89a4SSatish Balay self.pushLanguage(self.languages.clanguage) 6297b7fc14bSLisandro Dalcin if self.checkCompile(code): 630752d89a4SSatish Balay self.addDefine('ATTRIBUTEALIGNED(size)', '__attribute((aligned(size)))') 631752d89a4SSatish Balay self.addDefine('HAVE_ATTRIBUTEALIGNED', 1) 632752d89a4SSatish Balay else: 6337b7fc14bSLisandro Dalcin self.framework.logPrint('Incorrect attribute(aligned)') 634752d89a4SSatish Balay self.addDefine('ATTRIBUTEALIGNED(size)', ' ') 6357b7fc14bSLisandro Dalcin self.popLanguage() 636752d89a4SSatish Balay return 63718f41590SBarry Smith 6389800092aSJed Brown def configureExpect(self): 6399800092aSJed Brown '''Sees if the __builtin_expect directive is supported''' 6409800092aSJed Brown self.pushLanguage(self.languages.clanguage) 6419800092aSJed Brown if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'): 6429800092aSJed Brown self.addDefine('HAVE_BUILTIN_EXPECT', 1) 6439800092aSJed Brown self.popLanguage() 6449800092aSJed Brown 64553c77d0aSJed Brown def configureFunctionName(self): 646fbfcfee5SBarry Smith '''Sees if the compiler supports __func__ or a variant.''' 6471ec50b02SJed Brown def getFunctionName(lang): 648fbfcfee5SBarry Smith name = '"unknown"' 6491ec50b02SJed Brown self.pushLanguage(lang) 650b6ff4c76SKarl Rupp for fname in ['__func__','__FUNCTION__','__extension__ __func__']: 6510117e5a1SSatish Balay code = "if ("+fname+"[0] != 'm') return 1;" 6520117e5a1SSatish Balay if self.checkCompile('',code) and self.checkLink('',code): 6530117e5a1SSatish Balay name = fname 6540117e5a1SSatish Balay break 6551ec50b02SJed Brown self.popLanguage() 6561ec50b02SJed Brown return name 6571ec50b02SJed Brown langs = [] 658628773c9SSatish Balay 659628773c9SSatish Balay self.addDefine('FUNCTION_NAME_C', getFunctionName('C')) 6605f6e5f85SSatish Balay if hasattr(self.compilers, 'CXX'): 661628773c9SSatish Balay self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx')) 66253c77d0aSJed Brown 663753ebd1dSJed Brown def configureIntptrt(self): 664753ebd1dSJed Brown '''Determine what to use for uintptr_t''' 665753ebd1dSJed Brown def staticAssertSizeMatchesVoidStar(inc,typename): 666753ebd1dSJed Brown # The declaration is an error if either array size is negative. 667753ebd1dSJed 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 668d26187a0SJed Brown return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n' 669979939cdSSatish Balay + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename)) 670753ebd1dSJed Brown self.pushLanguage(self.languages.clanguage) 671753ebd1dSJed Brown if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'): 672753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'uintptr_t') 673753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long long'): 674753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned long long') 675753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'): 676753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'size_t') 677c82284b1SJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long'): 678c82284b1SJed Brown self.addDefine('UINTPTR_T', 'unsigned long') 6792d1b7972SSatish Balay elif staticAssertSizeMatchesVoidStar('','unsigned'): 680753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned') 681d26187a0SJed Brown else: 682d26187a0SJed Brown raise RuntimeError('Could not find any unsigned integer type matching void*') 683753ebd1dSJed Brown self.popLanguage() 684753ebd1dSJed Brown 685ed938b00SJed Brown def configureRTLDDefault(self): 686bfef2c86SBarry Smith if self.checkCompile('#include <dlfcn.h>\n void *ptr = RTLD_DEFAULT;'): 687bfef2c86SBarry Smith self.addDefine('RTLD_DEFAULT','1') 688f8833479SBarry Smith return 689f8833479SBarry Smith 690f8833479SBarry Smith def configureSolaris(self): 691f8833479SBarry Smith '''Solaris specific stuff''' 692f8833479SBarry Smith if os.path.isdir(os.path.join('/usr','ucblib')): 693f8833479SBarry Smith try: 694f8833479SBarry Smith flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 695f8833479SBarry Smith except AttributeError: 696f8833479SBarry Smith flag = None 697f8833479SBarry Smith if flag is None: 698f8833479SBarry Smith self.compilers.LIBS += ' -L/usr/ucblib' 699f8833479SBarry Smith else: 700f8833479SBarry Smith self.compilers.LIBS += ' '+flag+'/usr/ucblib' 701f8833479SBarry Smith return 702f8833479SBarry Smith 703f8833479SBarry Smith def configureLinux(self): 704f8833479SBarry Smith '''Linux specific stuff''' 7059f15855cSMatthew G Knepley # TODO: Test for this by mallocing an odd number of floats and checking the address 706f8833479SBarry Smith self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 707f8833479SBarry Smith return 708f8833479SBarry Smith 709f8833479SBarry Smith def configureWin32(self): 710f8833479SBarry Smith '''Win32 non-cygwin specific stuff''' 711f8833479SBarry Smith kernel32=0 7124e8afd12SMosè Giordano if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <windows.h>', call='GetComputerName(NULL,NULL);'): 713f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 714f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 715f8833479SBarry Smith kernel32=1 7164e8afd12SMosè Giordano elif self.libraries.add('kernel32','GetComputerName',prototype='#include <windows.h>', call='GetComputerName(NULL,NULL);'): 717f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 718f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 719f8833479SBarry Smith kernel32=1 720f8833479SBarry Smith if kernel32: 721eed94e11SSatish Balay if self.framework.argDB['with-windows-graphics']: 722eed94e11SSatish Balay self.addDefine('USE_WINDOWS_GRAPHICS',1) 7234e8afd12SMosè Giordano if self.checkLink('#include <windows.h>','LoadLibrary(0)'): 724f8833479SBarry Smith self.addDefine('HAVE_LOADLIBRARY',1) 7254e8afd12SMosè Giordano if self.checkLink('#include <windows.h>','GetProcAddress(0,0)'): 726b50f6d9eSLisandro Dalcin self.addDefine('HAVE_GETPROCADDRESS',1) 7274e8afd12SMosè Giordano if self.checkLink('#include <windows.h>','FreeLibrary(0)'): 728b50f6d9eSLisandro Dalcin self.addDefine('HAVE_FREELIBRARY',1) 7294e8afd12SMosè Giordano if self.checkLink('#include <windows.h>','GetLastError()'): 730a21658a3SLisandro Dalcin self.addDefine('HAVE_GETLASTERROR',1) 7314e8afd12SMosè Giordano if self.checkLink('#include <windows.h>','SetLastError(0)'): 732a21658a3SLisandro Dalcin self.addDefine('HAVE_SETLASTERROR',1) 7334e8afd12SMosè Giordano if self.checkLink('#include <windows.h>\n','QueryPerformanceCounter(0);\n'): 734bea725cfSBarry Smith self.addDefine('USE_MICROSOFT_TIME',1) 7354e8afd12SMosè Giordano if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <windows.h>', call='GetUserName(NULL,NULL);'): 736f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 7374e8afd12SMosè Giordano elif self.libraries.add('advapi32','GetUserName',prototype='#include <windows.h>', call='GetUserName(NULL,NULL);'): 738f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 739f8833479SBarry Smith 7404e8afd12SMosè Giordano if not self.libraries.add('User32.lib','GetDC',prototype='#include <windows.h>',call='GetDC(0);'): 7414e8afd12SMosè Giordano self.libraries.add('user32','GetDC',prototype='#include <windows.h>',call='GetDC(0);') 7424e8afd12SMosè Giordano if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <windows.h>',call='CreateCompatibleDC(0);'): 7434e8afd12SMosè Giordano self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <windows.h>',call='CreateCompatibleDC(0);') 744f8833479SBarry Smith 745f8833479SBarry Smith self.types.check('int32_t', 'int') 746f8833479SBarry Smith if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 747f8833479SBarry Smith self.addTypedef('int', 'uid_t') 748f8833479SBarry Smith self.addTypedef('int', 'gid_t') 749f8833479SBarry Smith if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 750f8833479SBarry Smith self.framework.addDefine('R_OK', '04') 751f8833479SBarry Smith self.framework.addDefine('W_OK', '02') 752f8833479SBarry Smith self.framework.addDefine('X_OK', '01') 753f8833479SBarry Smith if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 754f8833479SBarry Smith self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 755f8833479SBarry Smith self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 7564e8afd12SMosè Giordano if self.checkCompile('#include <windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 757f8833479SBarry Smith self.addDefine('HAVE_LARGE_INTEGER_U',1) 758f8833479SBarry Smith 759f8833479SBarry Smith # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 7604e8afd12SMosè Giordano if self.checkCompile('#include <windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'): 761f8833479SBarry Smith self.addDefine('HAVE_O_BINARY',1) 762f8833479SBarry Smith 763f8833479SBarry Smith if self.compilers.CC.find('win32fe') >= 0: 764ad4212abSSatish Balay self.addDefine('HAVE_WINDOWS_COMPILERS',1) 765f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'\\\\\'') 766f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 767f8833479SBarry Smith self.addDefine('CANNOT_START_DEBUGGER',1) 7685188cb68SSatish Balay (petscdir,error,status) = self.executeShellCommand('cygpath -w '+self.installdir.petscDir, log = self.log) 76934531a4dSSatish Balay self.addDefine('DIR','"'+petscdir.replace('\\','\\\\')+'"') 7705188cb68SSatish Balay (petscdir,error,status) = self.executeShellCommand('cygpath -m '+self.installdir.petscDir, log = self.log) 771e433681fSSatish Balay self.addMakeMacro('wPETSC_DIR',petscdir) 772*4e00a515SSatish Balay if self.dataFilesPath.datafilespath: 773*4e00a515SSatish Balay (datafilespath,error,status) = self.executeShellCommand('cygpath -m '+self.dataFilesPath.datafilespath, log = self.log) 774*4e00a515SSatish Balay self.addMakeMacro('DATAFILESPATH',datafilespath) 775*4e00a515SSatish Balay 776f8833479SBarry Smith else: 777f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 778f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'/\'') 7795188cb68SSatish Balay self.addDefine('DIR','"'+self.installdir.petscDir+'"') 7805188cb68SSatish Balay self.addMakeMacro('wPETSC_DIR',self.installdir.petscDir) 781*4e00a515SSatish Balay if self.dataFilesPath.datafilespath: 782*4e00a515SSatish Balay self.addMakeMacro('DATAFILESPATH',self.dataFilesPath.datafilespath) 7835188cb68SSatish Balay self.addDefine('ARCH','"'+self.installdir.petscArch+'"') 784f8833479SBarry Smith return 785f8833479SBarry Smith 786f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 787b10d012aSSatish Balay def configureCygwinBrokenPipe(self): 788b10d012aSSatish Balay '''Cygwin version <= 1.7.18 had issues with pipes and long commands invoked from gnu-make 789b10d012aSSatish Balay http://cygwin.com/ml/cygwin/2013-05/msg00340.html ''' 7907fca349cSMatthew G. Knepley if config.setCompilers.Configure.isCygwin(self.log): 791b10d012aSSatish Balay import platform 792b10d012aSSatish Balay import re 793b10d012aSSatish Balay r=re.compile("([0-9]+).([0-9]+).([0-9]+)") 794b10d012aSSatish Balay m=r.match(platform.release()) 795b10d012aSSatish Balay major=int(m.group(1)) 796b10d012aSSatish Balay minor=int(m.group(2)) 797b10d012aSSatish Balay subminor=int(m.group(3)) 798b10d012aSSatish Balay if ((major < 1) or (major == 1 and minor < 7) or (major == 1 and minor == 7 and subminor <= 18)): 799b10d012aSSatish Balay self.addMakeMacro('PETSC_CYGWIN_BROKEN_PIPE','1') 800b10d012aSSatish Balay return 801b10d012aSSatish Balay 802b10d012aSSatish Balay#----------------------------------------------------------------------------------------------------- 803569865ddSSatish Balay def configureDefaultArch(self): 804af0996ceSBarry Smith conffile = os.path.join('lib','petsc','conf', 'petscvariables') 805569865ddSSatish Balay if self.framework.argDB['with-default-arch']: 806c6ef1b5bSJed Brown fd = open(conffile, 'w') 807569865ddSSatish Balay fd.write('PETSC_ARCH='+self.arch.arch+'\n') 808da93591fSBarry Smith fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 809b9b902edSJed Brown fd.write('include '+os.path.join('$(PETSC_DIR)','$(PETSC_ARCH)','lib','petsc','conf','petscvariables')+'\n') 810569865ddSSatish Balay fd.close() 811569865ddSSatish Balay self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 812569865ddSSatish Balay elif os.path.isfile(conffile): 813569865ddSSatish Balay try: 814569865ddSSatish Balay os.unlink(conffile) 815569865ddSSatish Balay except: 816569865ddSSatish Balay raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 817569865ddSSatish Balay return 818569865ddSSatish Balay 819569865ddSSatish Balay#----------------------------------------------------------------------------------------------------- 820f8833479SBarry Smith def configureScript(self): 821f8833479SBarry Smith '''Output a script in the conf directory which will reproduce the configuration''' 822f8833479SBarry Smith import nargs 823495bf1a9SSatish Balay import sys 824af0996ceSBarry Smith scriptName = os.path.join(self.arch.arch,'lib','petsc','conf', 'reconfigure-'+self.arch.arch+'.py') 825f8833479SBarry Smith args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 826e97fc2efSSatish Balay if 'with-clean' in args: 827e97fc2efSSatish Balay del args['with-clean'] 828d418e2d7SSatish Balay if 'force' in args: 829d418e2d7SSatish Balay del args['force'] 830f8833479SBarry Smith if 'configModules' in args: 8311063a081SSatish Balay if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 832f8833479SBarry Smith del args['configModules'] 833f8833479SBarry Smith if 'optionsModule' in args: 83423a19ef1SSatish Balay if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'config.compilerOptions': 835f8833479SBarry Smith del args['optionsModule'] 836f8833479SBarry Smith if not 'PETSC_ARCH' in args: 8371063a081SSatish Balay args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 838c6ef1b5bSJed Brown f = open(scriptName, 'w') 839495bf1a9SSatish Balay f.write('#!'+sys.executable+'\n') 840f8833479SBarry Smith f.write('if __name__ == \'__main__\':\n') 841f8833479SBarry Smith f.write(' import sys\n') 8427561c02cSSatish Balay f.write(' import os\n') 8437561c02cSSatish Balay f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 844f8833479SBarry Smith f.write(' import configure\n') 8451063a081SSatish Balay # pretty print repr(args.values()) 8461063a081SSatish Balay f.write(' configure_options = [\n') 8478bec23c5SJed Brown for itm in sorted(args.values()): 8481063a081SSatish Balay f.write(' \''+str(itm)+'\',\n') 8491063a081SSatish Balay f.write(' ]\n') 850f8833479SBarry Smith f.write(' configure.petsc_configure(configure_options)\n') 851f8833479SBarry Smith f.close() 852f8833479SBarry Smith try: 8535b6bfdb9SJed Brown os.chmod(scriptName, 0o775) 8545b6bfdb9SJed Brown except OSError as e: 855f8833479SBarry Smith self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 856f8833479SBarry Smith self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 857f8833479SBarry Smith return 858f8833479SBarry Smith 859f8833479SBarry Smith def configureInstall(self): 860f8833479SBarry Smith '''Setup the directories for installation''' 861f8833479SBarry Smith if self.framework.argDB['prefix']: 862ede33fe4SSatish Balay self.addMakeRule('print_mesg_after_build','',['-@echo "Now to install the libraries do:"',\ 863d093bd8dSBarry Smith '-@echo "'+self.installdir.installSudo+'make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 864315b77e6SSatish Balay '-@echo "========================================="']) 865f8833479SBarry Smith else: 866ede33fe4SSatish Balay self.addMakeRule('print_mesg_after_build','',['-@echo "Now to check if the libraries are working do:"',\ 8670cd68fe6SJed Brown '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} check"',\ 868315b77e6SSatish Balay '-@echo "========================================="']) 869f8833479SBarry Smith return 870f8833479SBarry Smith 871f8833479SBarry Smith def configureGCOV(self): 872f8833479SBarry Smith if self.framework.argDB['with-gcov']: 873f8833479SBarry Smith self.addDefine('USE_GCOV','1') 874f8833479SBarry Smith return 875f8833479SBarry Smith 87628bb2e72SSatish Balay def postProcessPackages(self): 87728bb2e72SSatish Balay postPackages=[] 87828bb2e72SSatish Balay for i in self.framework.packages: 87928bb2e72SSatish Balay if hasattr(i,'postProcess'): postPackages.append(i) 88028bb2e72SSatish Balay if postPackages: 881e64d19dfSSatish Balay # ctetgen needs petsc conf files. so attempt to create them early 882a77eb93bSSatish Balay self.framework.dumpConfFiles() 883d9293e7bSBarry Smith # tacky fix for dependency of Aluimia on Pflotran; requested via petsc-dev Matt provide a correct fix 884d9293e7bSBarry Smith for i in postPackages: 885d9293e7bSBarry Smith if i.name.upper() in ['PFLOTRAN']: 886d9293e7bSBarry Smith i.postProcess() 887d9293e7bSBarry Smith postPackages.remove(i) 88828bb2e72SSatish Balay for i in postPackages: i.postProcess() 889aa5c8b8eSBarry Smith for i in postPackages: 890aa5c8b8eSBarry Smith if i.installedpetsc: 891aa5c8b8eSBarry Smith self.installed = 1 892aa5c8b8eSBarry Smith break 89328bb2e72SSatish Balay return 894f8833479SBarry Smith 895f8833479SBarry Smith def configure(self): 896bf3e94a3SBarry Smith if 'package-prefix-hash' in self.argDB: 897bf3e94a3SBarry Smith # turn off prefix if it was only used to for installing external packages. 898bf3e94a3SBarry Smith self.framework.argDB['prefix'] = '' 899bf3e94a3SBarry Smith self.dir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 900bf3e94a3SBarry Smith self.installdir.dir = self.dir 901bf3e94a3SBarry Smith self.installdir.petscDir = self.petscdir.dir 902bf3e94a3SBarry Smith self.petscDir = self.petscdir.dir 903bf3e94a3SBarry Smith self.petscArch = self.arch.arch 904bf3e94a3SBarry Smith self.addMakeMacro('PREFIXDIR',self.dir) 905bf3e94a3SBarry Smith self.confDir = os.path.abspath(os.path.join(self.petscdir.dir, self.arch.arch)) 906bf3e94a3SBarry Smith 907f8833479SBarry Smith if not os.path.samefile(self.petscdir.dir, os.getcwd()): 908f8833479SBarry Smith raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 909550489e3SMatthew 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): 9103552d8fbSSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 9118fd0dbdbSBarry Smith if self.framework.argDB['prefix'] and self.framework.argDB['prefix'].find(' ') > -1: 9128fd0dbdbSBarry 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') 913c16c35a9SSatish 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)): 914c16c35a9SSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!') 915f16c1317SJed Brown self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 916f16c1317SJed Brown self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 9179c735a01SStefano Zampini self.framework.pkgheader = os.path.join(self.arch.arch,'include','petscpkg_version.h') 918af0996ceSBarry Smith self.framework.makeMacroHeader = os.path.join(self.arch.arch,'lib','petsc','conf','petscvariables') 919af0996ceSBarry Smith self.framework.makeRuleHeader = os.path.join(self.arch.arch,'lib','petsc','conf','petscrules') 920f8833479SBarry Smith if self.libraries.math is None: 921f8833479SBarry Smith raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 922f8833479SBarry Smith if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 923f8833479SBarry Smith raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 924ed938b00SJed Brown self.executeTest(self.configureRTLDDefault) 925b2843cf1SBarry Smith self.executeTest(self.configurePrefetch) 9262400fdedSBarry Smith self.executeTest(self.configureUnused) 9271ef8df7fSJed Brown self.executeTest(self.configureDeprecated) 92898ed35c3SBarry Smith self.executeTest(self.configureIsatty) 9299800092aSJed Brown self.executeTest(self.configureExpect); 93018f41590SBarry Smith self.executeTest(self.configureAlign); 93153c77d0aSJed Brown self.executeTest(self.configureFunctionName); 932753ebd1dSJed Brown self.executeTest(self.configureIntptrt); 933f8833479SBarry Smith self.executeTest(self.configureSolaris) 934f8833479SBarry Smith self.executeTest(self.configureLinux) 935f8833479SBarry Smith self.executeTest(self.configureWin32) 936b10d012aSSatish Balay self.executeTest(self.configureCygwinBrokenPipe) 937569865ddSSatish Balay self.executeTest(self.configureDefaultArch) 938f8833479SBarry Smith self.executeTest(self.configureScript) 939f8833479SBarry Smith self.executeTest(self.configureInstall) 940f8833479SBarry Smith self.executeTest(self.configureGCOV) 94109bc878fSSatish Balay self.executeTest(self.configureAtoll) 942f8833479SBarry Smith 943f8833479SBarry Smith self.Dump() 944f8833479SBarry Smith self.dumpConfigInfo() 9452a4161d9SMatthew G Knepley self.dumpMachineInfo() 94640277576SBarry Smith # need to save the current state of BuildSystem so that postProcess() packages can read it in and perhaps run make install 94740277576SBarry Smith self.framework.storeSubstitutions(self.framework.argDB) 948492432c8SJed Brown self.framework.argDB['configureCache'] = pickle.dumps(self.framework) 94940277576SBarry Smith self.framework.argDB.save(force = True) 950262119f8SBarry Smith self.DumpPkgconfig() 951351d3a41SMatthew G Knepley self.DumpModule() 952f7ad81e1SBarry Smith self.postProcessPackages() 953f8833479SBarry Smith self.framework.log.write('================================================================================\n') 954f8833479SBarry Smith self.logClear() 955f8833479SBarry Smith return 956