1f8833479SBarry Smithimport config.base 2f8833479SBarry Smith 3f8833479SBarry Smithimport os 4f8833479SBarry Smithimport re 5f8833479SBarry Smith 68bec23c5SJed Brown# The sorted() builtin is not available with python-2.3 78bec23c5SJed Browntry: sorted 88bec23c5SJed Brownexcept NameError: 98bec23c5SJed Brown def sorted(lst): 108bec23c5SJed Brown lst.sort() 118bec23c5SJed Brown return lst 128bec23c5SJed Brown 13f8833479SBarry Smithclass Configure(config.base.Configure): 14f8833479SBarry Smith def __init__(self, framework): 15f8833479SBarry Smith config.base.Configure.__init__(self, framework) 16f8833479SBarry Smith self.headerPrefix = 'PETSC' 17f8833479SBarry Smith self.substPrefix = 'PETSC' 18f8833479SBarry Smith return 19f8833479SBarry Smith 207c939e48SSatish Balay def __str2__(self): 217c939e48SSatish Balay desc = [] 22a0022257SSatish Balay desc.append('xxx=========================================================================xxx') 23ac1d0f13SJed Brown if self.make.getMakeMacro('MAKE_IS_GNUMAKE'): 249481793eSSatish Balay build_type = 'gnumake build' 259481793eSSatish Balay elif self.getMakeMacro('PETSC_BUILD_USING_CMAKE'): 26b3618d6dSSatish Balay build_type = 'cmake build' 27b3618d6dSSatish Balay else: 28b3618d6dSSatish Balay build_type = 'legacy build' 29b3618d6dSSatish Balay desc.append(' Configure stage complete. Now build PETSc libraries with (%s):' % build_type) 30b3618d6dSSatish Balay desc.append(' make PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' all') 31a0022257SSatish Balay desc.append('xxx=========================================================================xxx') 327c939e48SSatish Balay return '\n'.join(desc)+'\n' 33f8833479SBarry Smith 34f8833479SBarry Smith def setupHelp(self, help): 35f8833479SBarry Smith import nargs 36ce0b2093SBarry Smith help.addArgument('PETSc', '-prefix=<dir>', nargs.Arg(None, '', 'Specifiy location to install PETSc (eg. /usr/local)')) 37eed94e11SSatish Balay help.addArgument('Windows','-with-windows-graphics=<bool>', nargs.ArgBool(None, 1,'Enable check for Windows Graphics')) 38569865ddSSatish Balay help.addArgument('PETSc', '-with-default-arch=<bool>', nargs.ArgBool(None, 1, 'Allow using the last configured arch without setting PETSC_ARCH')) 3957cb31baSSatish Balay help.addArgument('PETSc','-with-single-library=<bool>', nargs.ArgBool(None, 1,'Put all PETSc code into the single -lpetsc library')) 40525d6f2eSBarry Smith help.addArgument('PETSc', '-with-ios=<bool>', nargs.ArgBool(None, 0, 'Build an iPhone/iPad version of PETSc library')) 41f8833479SBarry Smith return 42f8833479SBarry Smith 43f8833479SBarry Smith def setupDependencies(self, framework): 44f8833479SBarry Smith config.base.Configure.setupDependencies(self, framework) 45dca78d2bSSatish Balay self.programs = framework.require('config.programs', self) 46f8833479SBarry Smith self.setCompilers = framework.require('config.setCompilers', self) 47f8833479SBarry Smith self.arch = framework.require('PETSc.utilities.arch', self.setCompilers) 4835bdbb6bSSatish Balay self.petscdir = framework.require('PETSc.utilities.petscdir', self.arch) 49edb8ae0cSSatish Balay self.installdir = framework.require('PETSc.utilities.installDir',self) 50f8833479SBarry Smith self.languages = framework.require('PETSc.utilities.languages', self.setCompilers) 51f8833479SBarry Smith self.debugging = framework.require('PETSc.utilities.debugging', self.setCompilers) 52a2b1cf82SBarry Smith self.CHUD = framework.require('PETSc.utilities.CHUD', self) 53f8833479SBarry Smith self.compilers = framework.require('config.compilers', self) 54f8833479SBarry Smith self.types = framework.require('config.types', self) 55f8833479SBarry Smith self.headers = framework.require('config.headers', self) 56f8833479SBarry Smith self.functions = framework.require('config.functions', self) 57f8833479SBarry Smith self.libraries = framework.require('config.libraries', self) 58cd37d877SShri Abhyankar self.atomics = framework.require('config.atomics', self) 599481793eSSatish Balay self.make = framework.require('config.packages.make', self) 609552296fSBarry Smith self.blasLapack = framework.require('config.packages.BlasLapack',self) 61*06e08bc7SBarry Smith self.cmake = framework.require('config.packages.cmake',self) 6249d43ecaSSatish Balay self.externalpackagesdir = framework.require('PETSc.utilities.externalpackagesdir',self) 63e6b0c433SBarry Smith self.mpi = framework.require('config.packages.MPI',self) 6449d43ecaSSatish Balay 65*06e08bc7SBarry Smith for utility in os.listdir(os.path.join('config','PETSc','utilities')): 66f8833479SBarry Smith (utilityName, ext) = os.path.splitext(utility) 67f8833479SBarry Smith if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__': 68*06e08bc7SBarry Smith utilityObj = self.framework.require('PETSc.utilities.'+utilityName, self) 69*06e08bc7SBarry Smith utilityObj.headerPrefix = self.headerPrefix 70*06e08bc7SBarry Smith utilityObj.archProvider = self.arch 71*06e08bc7SBarry Smith utilityObj.languageProvider = self.languages 72*06e08bc7SBarry Smith utilityObj.installDirProvider = self.installdir 73*06e08bc7SBarry Smith utilityObj.externalPackagesDirProvider = self.externalpackagesdir 74*06e08bc7SBarry Smith setattr(self, utilityName.lower(), utilityObj) 75*06e08bc7SBarry Smith 76*06e08bc7SBarry Smith for utility in os.listdir(os.path.join('config','BuildSystem','config','packages')): 77*06e08bc7SBarry Smith (utilityName, ext) = os.path.splitext(utility) 78*06e08bc7SBarry Smith if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__': 79*06e08bc7SBarry Smith utilityObj = self.framework.require('config.packages.'+utilityName, self) 80f8833479SBarry Smith utilityObj.headerPrefix = self.headerPrefix 81f1ecedd2SMatthew Knepley utilityObj.archProvider = self.arch 82fdfda77fSMatthew Knepley utilityObj.languageProvider = self.languages 83edb8ae0cSSatish Balay utilityObj.installDirProvider = self.installdir 8449d43ecaSSatish Balay utilityObj.externalPackagesDirProvider = self.externalpackagesdir 85f8833479SBarry Smith setattr(self, utilityName.lower(), utilityObj) 868cf378d1SBarry Smith 87d37554e4SMatthew G Knepley for package in config.packages.all: 88d37554e4SMatthew G Knepley if not package == 'PETSc': 89d37554e4SMatthew G Knepley packageObj = framework.require('config.packages.'+package, self) 90d37554e4SMatthew G Knepley packageObj.archProvider = self.arch 91d37554e4SMatthew G Knepley packageObj.languageProvider = self.languages 92339e8cb0SBarry Smith packageObj.precisionProvider = self.scalartypes 93edb8ae0cSSatish Balay packageObj.installDirProvider = self.installdir 9449d43ecaSSatish Balay packageObj.externalPackagesDirProvider = self.externalpackagesdir 95d37554e4SMatthew G Knepley setattr(self, package.lower(), packageObj) 96d37554e4SMatthew G Knepley # Force blaslapack to depend on scalarType so precision is set before BlasLapack is built 976d2d6fe1SBarry Smith framework.require('PETSc.utilities.scalarTypes', self.f2cblaslapack) 98d5510768SBarry Smith framework.require('PETSc.utilities.scalarTypes', self.fblaslapack) 998cf378d1SBarry Smith framework.require('PETSc.utilities.scalarTypes', self.blaslapack) 100f8833479SBarry Smith 101dca78d2bSSatish Balay self.programs.headerPrefix = self.headerPrefix 102f8833479SBarry Smith self.compilers.headerPrefix = self.headerPrefix 103f8833479SBarry Smith self.types.headerPrefix = self.headerPrefix 104f8833479SBarry Smith self.headers.headerPrefix = self.headerPrefix 105f8833479SBarry Smith self.functions.headerPrefix = self.headerPrefix 106f8833479SBarry Smith self.libraries.headerPrefix = self.headerPrefix 107f8833479SBarry Smith self.blaslapack.headerPrefix = self.headerPrefix 108f8833479SBarry Smith self.mpi.headerPrefix = self.headerPrefix 109a8b45ee7SBarry Smith headersC = map(lambda name: name+'.h', ['setjmp','dos', 'endian', 'fcntl', 'float', 'io', 'limits', 'malloc', 'pwd', 'search', 'strings', 110ba61063dSBarry Smith 'unistd', 'sys/sysinfo', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource', 111a3aaec0aSJed Brown 'sys/systeminfo', 'sys/times', 'sys/utsname','string', 'stdlib', 112f8833479SBarry Smith 'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types', 113e4773d96SSatish Balay 'WindowsX', 'cxxabi','float','ieeefp','stdint','sched','pthread','mathimf']) 11445082d64SJed Brown functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 115f8833479SBarry Smith 'gettimeofday', 'getwd', 'memalign', 'memmove', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize', 11638ecfe64SSatish Balay 'readlink', 'realpath', 'sigaction', 'signal', 'sigset', 'usleep', 'sleep', '_sleep', 'socket', 117473bb0d5SSatish Balay 'times', 'gethostbyname', 'uname','snprintf','_snprintf','lseek','_lseek','time','fork','stricmp', 118ac7218bbSSatish Balay 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror','get_nprocs','sysctlbyname', 119363c94ceSSatish Balay '_set_output_format'] 120f8833479SBarry Smith libraries1 = [(['socket', 'nsl'], 'socket'), (['fpe'], 'handle_sigfpes')] 121f8833479SBarry Smith self.headers.headers.extend(headersC) 122f8833479SBarry Smith self.functions.functions.extend(functions) 123f8833479SBarry Smith self.libraries.libraries.extend(libraries1) 1247d421530SBarry Smith 125f8833479SBarry Smith return 126f8833479SBarry Smith 127262119f8SBarry Smith def DumpPkgconfig(self): 128262119f8SBarry Smith ''' Create a pkg-config file ''' 129262119f8SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')): 130262119f8SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig')) 131262119f8SBarry Smith fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','pkgconfig','PETSc.pc'),'w') 132262119f8SBarry Smith if self.framework.argDB['prefix']: 133262119f8SBarry Smith installdir = self.framework.argDB['prefix'] 134262119f8SBarry Smith fd.write('prefix='+installdir+'\n') 135262119f8SBarry Smith fd.write('exec_prefix=${prefix}\n') 136262119f8SBarry Smith fd.write('includedir=${prefix}/include\n') 137262119f8SBarry Smith fd.write('libdir='+os.path.join(installdir,'lib')+'\n') 138262119f8SBarry Smith else: 139262119f8SBarry Smith fd.write('prefix='+self.petscdir.dir+'\n') 140262119f8SBarry Smith fd.write('exec_prefix=${prefix}\n') 141262119f8SBarry Smith fd.write('includedir=${prefix}/include\n') 142262119f8SBarry Smith fd.write('libdir='+os.path.join(self.petscdir.dir,self.arch.arch,'lib')+'\n') 143262119f8SBarry Smith 144262119f8SBarry Smith self.setCompilers.pushLanguage('C') 145262119f8SBarry Smith fd.write('ccompiler='+self.setCompilers.getCompiler()+'\n') 146262119f8SBarry Smith self.setCompilers.popLanguage() 147262119f8SBarry Smith if hasattr(self.compilers, 'C++'): 148262119f8SBarry Smith self.setCompilers.pushLanguage('C++') 149262119f8SBarry Smith fd.write('cxxcompiler='+self.setCompilers.getCompiler()+'\n') 150262119f8SBarry Smith self.setCompilers.popLanguage() 151262119f8SBarry Smith if hasattr(self.compilers, 'FC'): 152262119f8SBarry Smith self.setCompilers.pushLanguage('FC') 153262119f8SBarry Smith fd.write('fcompiler='+self.setCompilers.getCompiler()+'\n') 154262119f8SBarry Smith self.setCompilers.popLanguage() 1559552296fSBarry Smith fd.write('blaslapacklibs='+self.libraries.toStringNoDupes(self.blaslapack.lib)+'\n') 156262119f8SBarry Smith 157262119f8SBarry Smith fd.write('\n') 158262119f8SBarry Smith fd.write('Name: PETSc\n') 159262119f8SBarry Smith fd.write('Description: Library to solve ODEs and algebraic equations\n') 160351d3a41SMatthew G Knepley fd.write('Version: %s\n' % self.petscdir.version) 161262119f8SBarry Smith 162262119f8SBarry Smith fd.write('Cflags: '+self.allincludes+'\n') 163262119f8SBarry Smith 164473a3ab2SBarry Smith plibs = self.libraries.toStringNoDupes(['-L'+os.path.join(self.petscdir.dir,self.arch.arch,'lib'),' -lpetsc']) 165262119f8SBarry Smith if self.framework.argDB['prefix']: 166473a3ab2SBarry Smith fd.write('Libs: '+plibs.replace(os.path.join(self.petscdir.dir,self.arch.arch),self.framework.argDB['prefix'])+'\n') 167262119f8SBarry Smith else: 168473a3ab2SBarry Smith fd.write('Libs: '+plibs+'\n') 169ad5be379SSatish Balay fd.write('Libs.private: '+' '.join(self.packagelibs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs)+' '+self.compilers.LIBS) 170473a3ab2SBarry Smith 171262119f8SBarry Smith fd.close() 172262119f8SBarry Smith return 173262119f8SBarry Smith 174351d3a41SMatthew G Knepley def DumpModule(self): 175351d3a41SMatthew G Knepley ''' Create a module file ''' 176351d3a41SMatthew G Knepley if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib','modules')): 177351d3a41SMatthew G Knepley os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib','modules')) 178351d3a41SMatthew G Knepley if self.framework.argDB['prefix']: 179351d3a41SMatthew G Knepley installdir = self.framework.argDB['prefix'] 18055d606a3SSatish Balay installarch = '' 18155d606a3SSatish Balay installpath = os.path.join(installdir,'bin') 1820a8310baSBarry Smith fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','modules',self.petscdir.version),'w') 183351d3a41SMatthew G Knepley else: 184351d3a41SMatthew G Knepley installdir = self.petscdir.dir 18555d606a3SSatish Balay installarch = self.arch.arch 18655d606a3SSatish Balay installpath = os.path.join(installdir,installarch,'bin')+':'+os.path.join(installdir,'bin') 18755d606a3SSatish Balay fd = open(os.path.join(self.petscdir.dir,self.arch.arch,'lib','modules',self.petscdir.version+'-'+self.arch.arch),'w') 188351d3a41SMatthew G Knepley fd.write('''\ 189351d3a41SMatthew G Knepley#%%Module 190351d3a41SMatthew G Knepley 191351d3a41SMatthew G Knepleyproc ModulesHelp { } { 192351d3a41SMatthew G Knepley puts stderr "This module sets the path and environment variables for petsc-%s" 193351d3a41SMatthew G Knepley puts stderr " see http://www.mcs.anl.gov/petsc/ for more information " 194351d3a41SMatthew G Knepley puts stderr "" 195351d3a41SMatthew G Knepley} 196351d3a41SMatthew G Knepleymodule-whatis "PETSc - Portable, Extensible Toolkit for Scientific Computation" 197351d3a41SMatthew G Knepley 198351d3a41SMatthew G Knepleyset petsc_dir %s 199351d3a41SMatthew G Knepleyset petsc_arch %s 200351d3a41SMatthew G Knepley 201351d3a41SMatthew G Knepleysetenv PETSC_ARCH $petsc_arch 202351d3a41SMatthew G Knepleysetenv PETSC_DIR $petsc_dir 20355d606a3SSatish Balayprepend-path PATH %s 20455d606a3SSatish Balay''' % (self.petscdir.version, installdir, installarch, installpath)) 205351d3a41SMatthew G Knepley fd.close() 206351d3a41SMatthew G Knepley return 207351d3a41SMatthew G Knepley 208f8833479SBarry Smith def Dump(self): 209f8833479SBarry Smith ''' Actually put the values into the configuration files ''' 210f8833479SBarry Smith # eventually everything between -- should be gone 21117f368bcSBarry Smith if self.mpi.usingMPIUni: 21217f368bcSBarry Smith # 21317f368bcSBarry Smith # Remove any MPI/MPICH include files that may have been put here by previous runs of ./configure 21417f368bcSBarry Smith 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*')) 21517f368bcSBarry Smith 216f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 217f8833479SBarry Smith 218f8833479SBarry Smith # Sometimes we need C compiler, even if built with C++ 219f8833479SBarry Smith self.setCompilers.pushLanguage('C') 220f8833479SBarry Smith self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 221f8833479SBarry Smith self.setCompilers.popLanguage() 222f8833479SBarry Smith 22334f774f6SJed Brown # And sometimes we need a C++ compiler even when PETSc is built with C 22434f774f6SJed Brown if hasattr(self.compilers, 'CXX'): 22534f774f6SJed Brown self.setCompilers.pushLanguage('Cxx') 22634f774f6SJed Brown self.addMakeMacro('CXX_FLAGS',self.setCompilers.getCompilerFlags()) 22734f774f6SJed Brown self.setCompilers.popLanguage() 22834f774f6SJed Brown 229f8833479SBarry Smith # C preprocessor values 230a2b1cf82SBarry Smith self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS+self.CHUD.CPPFLAGS) 231f8833479SBarry Smith 232f8833479SBarry Smith # compiler values 233f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 234f8833479SBarry Smith self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 235f8833479SBarry Smith self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 236f8833479SBarry Smith self.setCompilers.popLanguage() 237f8833479SBarry Smith # .o or .obj 238f8833479SBarry Smith self.addMakeMacro('CC_SUFFIX','o') 239f8833479SBarry Smith 240f8833479SBarry Smith # executable linker values 241f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 242f8833479SBarry Smith pcc_linker = self.setCompilers.getLinker() 243f8833479SBarry Smith self.addMakeMacro('PCC_LINKER',pcc_linker) 244c84a332bSSatish Balay self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 245f8833479SBarry Smith self.setCompilers.popLanguage() 246f8833479SBarry Smith # '' for Unix, .exe for Windows 247f8833479SBarry Smith self.addMakeMacro('CC_LINKER_SUFFIX','') 248f8833479SBarry Smith 249f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 250f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 251f8833479SBarry Smith # need FPPFLAGS in config/setCompilers 252f8833479SBarry Smith self.addDefine('HAVE_FORTRAN','1') 253f8833479SBarry Smith self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS) 254f8833479SBarry Smith 255f8833479SBarry Smith # compiler values 256f8833479SBarry Smith self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 257f8833479SBarry Smith self.setCompilers.popLanguage() 258f8833479SBarry Smith # .o or .obj 259f8833479SBarry Smith self.addMakeMacro('FC_SUFFIX','o') 260f8833479SBarry Smith 261f8833479SBarry Smith # executable linker values 262f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 263f8833479SBarry Smith # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker 264f8833479SBarry Smith fc_linker = self.setCompilers.getLinker() 265f8833479SBarry Smith if config.setCompilers.Configure.isNAG(fc_linker): 266f8833479SBarry Smith self.addMakeMacro('FC_LINKER',pcc_linker) 267f8833479SBarry Smith else: 268f8833479SBarry Smith self.addMakeMacro('FC_LINKER',fc_linker) 2696d53d35eSSatish Balay self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 2703feacd00SBarry Smith # apple requires this shared library linker flag on SOME versions of the os 2713feacd00SBarry Smith if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 2723feacd00SBarry Smith self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 273bb82cf9cSSatish Balay self.setCompilers.popLanguage() 2745d631499SMatthew Knepley 2755d631499SMatthew Knepley # F90 Modules 2765d631499SMatthew Knepley if self.setCompilers.fortranModuleIncludeFlag: 2775d631499SMatthew Knepley self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag) 2786ddd6694SSatish Balay else: # for non-f90 compilers like g77 2796ddd6694SSatish Balay self.addMakeMacro('FC_MODULE_FLAG', '-I') 280a324c51cSMatthew G Knepley if self.setCompilers.fortranModuleIncludeFlag: 281a324c51cSMatthew G Knepley self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag) 282f8833479SBarry Smith else: 283f8833479SBarry Smith self.addMakeMacro('FC','') 284f8833479SBarry Smith 28546a3958fSBarry Smith if hasattr(self.compilers, 'CUDAC'): 2867ff2890cSSatish Balay self.setCompilers.pushLanguage('CUDA') 287d93a25ecSSatish Balay self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags()) 2887ff2890cSSatish Balay self.setCompilers.popLanguage() 2897ff2890cSSatish Balay 290f8833479SBarry Smith # shared library linker values 291f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 292f8833479SBarry Smith # need to fix BuildSystem to collect these separately 293f8833479SBarry Smith self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 29470db8aa6SSatish Balay self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 295f8833479SBarry Smith self.setCompilers.popLanguage() 296f8833479SBarry Smith # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 297f8833479SBarry Smith # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 298f8833479SBarry Smith if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 299f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', '') 30046bc77b6SBarry Smith self.addDefine('SLSUFFIX','""') 301f8833479SBarry Smith else: 302f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 30346bc77b6SBarry Smith self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"') 304bb82cf9cSSatish Balay 30523e93537SBarry Smith self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}') 306bb82cf9cSSatish Balay 307f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 308f8833479SBarry Smith 309f8833479SBarry Smith # CONLY or CPP. We should change the PETSc makefiles to do this better 310f8833479SBarry Smith if self.languages.clanguage == 'C': lang = 'CONLY' 311f8833479SBarry Smith else: lang = 'CXXONLY' 312f8833479SBarry Smith self.addMakeMacro('PETSC_LANGUAGE',lang) 313f8833479SBarry Smith 314f8833479SBarry Smith # real or complex 315f8833479SBarry Smith self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 316f8833479SBarry Smith # double or float 317f8833479SBarry Smith self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 318f8833479SBarry Smith 319f8833479SBarry Smith if self.framework.argDB['with-batch']: 320f8833479SBarry Smith self.addMakeMacro('PETSC_WITH_BATCH','1') 321f8833479SBarry Smith 322f8833479SBarry Smith # Test for compiler-specific macros that need to be defined. 323b409243cSBarry Smith if self.setCompilers.isCrayVector('CC'): 324b409243cSBarry Smith self.addDefine('HAVE_CRAY_VECTOR','1') 325f8833479SBarry Smith 326f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 327df1a78b3SMatthew G Knepley if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket') and self.headers.haveHeader('netinet/in.h'): 328f8833479SBarry Smith self.addDefine('USE_SOCKET_VIEWER','1') 32980e3883bSBarry Smith if self.checkCompile('#include <sys/socket.h>','setsockopt(0,SOL_SOCKET,SO_REUSEADDR,0,0)'): 33080e3883bSBarry Smith self.addDefine('HAVE_SO_REUSEADDR','1') 331f8833479SBarry Smith 332f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 333a6cc6bb1SBarry Smith # print include and lib for makefiles 334f8833479SBarry Smith self.framework.packages.reverse() 335a6cc6bb1SBarry Smith includes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')] 336996b3231SBarry Smith libs = [] 337f8833479SBarry Smith for i in self.framework.packages: 338898a086dSBarry Smith if i.useddirectly: 339eeb16384SBarry Smith self.addDefine('HAVE_'+i.PACKAGE.replace('-','_'), 1) # ONLY list package if it is used directly by PETSc (and not only by another package) 340f8833479SBarry Smith if not isinstance(i.lib, list): 341f8833479SBarry Smith i.lib = [i.lib] 342ac9e4c42SSatish Balay libs.extend(i.lib) 343eeb16384SBarry Smith self.addMakeMacro(i.PACKAGE.replace('-','_')+'_LIB', self.libraries.toStringNoDupes(i.lib)) 344f8833479SBarry Smith if hasattr(i,'include'): 345f8833479SBarry Smith if not isinstance(i.include,list): 346f8833479SBarry Smith i.include = [i.include] 347ac9e4c42SSatish Balay includes.extend(i.include) 348eeb16384SBarry Smith self.addMakeMacro(i.PACKAGE.replace('-','_')+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 349473a3ab2SBarry Smith self.packagelibs = libs 3502df986feSBarry Smith if self.framework.argDB['with-single-library']: 351ad5be379SSatish Balay self.alllibs = self.libraries.toStringNoDupes(['-L'+os.path.join(self.petscdir.dir,self.arch.arch,'lib'),' -lpetsc']+libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs)+' '+self.compilers.LIBS+self.CHUD.LIBS 352262119f8SBarry Smith self.addMakeMacro('PETSC_WITH_EXTERNAL_LIB',self.alllibs) 35391bb3077SSatish Balay else: 354ad5be379SSatish Balay self.alllibs = self.libraries.toStringNoDupes(['-L'+os.path.join(self.petscdir.dir,self.arch.arch,'lib'),'-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys']+libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs)+' '+self.compilers.LIBS+self.CHUD.LIBS 355ad5be379SSatish Balay self.PETSC_EXTERNAL_LIB_BASIC = self.libraries.toStringNoDupes(libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs)+' '+self.compilers.LIBS+self.CHUD.LIBS 3561026b6b4SSatish Balay if self.framework.argDB['prefix'] and self.setCompilers.CSharedLinkerFlag not in ['-L']: 3571026b6b4SSatish Balay installdir = self.framework.argDB['prefix'] 3581026b6b4SSatish Balay lib_basic = self.PETSC_EXTERNAL_LIB_BASIC.replace(self.setCompilers.CSharedLinkerFlag+os.path.join(self.petscdir.dir,self.arch.arch,'lib'),self.setCompilers.CSharedLinkerFlag+os.path.join(installdir,'lib')) 3591026b6b4SSatish Balay else: 3601026b6b4SSatish Balay lib_basic = self.PETSC_EXTERNAL_LIB_BASIC 3611026b6b4SSatish Balay self.addMakeMacro('PETSC_EXTERNAL_LIB_BASIC',lib_basic) 362262119f8SBarry Smith self.allincludes = self.headers.toStringNoDupes(includes) 363262119f8SBarry Smith self.addMakeMacro('PETSC_CC_INCLUDES',self.allincludes) 364262119f8SBarry Smith self.PETSC_CC_INCLUDES = self.allincludes 365cbd5cc15SBarry Smith if hasattr(self.compilers, 'FC'): 366208c3fd5SBarry Smith if self.compilers.fortranIsF90: 36743a63bfbSSatish Balay self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes,includes)) 36830d43657SSatish Balay else: 36930d43657SSatish Balay self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes)) 370f8833479SBarry Smith 3711b1e03dfSSatish Balay self.addMakeMacro('DESTDIR',self.installdir) 372c6f99f23SBarry Smith self.addDefine('LIB_DIR','"'+os.path.join(self.installdir,'lib')+'"') 373f8833479SBarry Smith 3740f3b21c2SBarry Smith if self.framework.argDB['with-single-library']: 3750f3b21c2SBarry Smith # overrides the values set in conf/variables 3760f3b21c2SBarry Smith self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 37757cb31baSSatish Balay self.addMakeMacro('SHLIBS','libpetsc') 378bccf1c12SBarry Smith self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 379797063a9SSatish Balay self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 380797063a9SSatish Balay self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 381b0a7d7e7SSatish Balay self.addMakeMacro('PETSC_TAO_LIB_BASIC','-lpetsc') 382bb84e0fdSBarry Smith self.addDefine('USE_SINGLE_LIBRARY', '1') 3832df986feSBarry Smith if self.sharedlibraries.useShared: 384ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 385ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 386ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 387ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 388ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 389ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 390ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 391b0a7d7e7SSatish Balay self.addMakeMacro('PETSC_TAO_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 392fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 393ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 394ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 3952df986feSBarry Smith else: 396ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 397ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 398ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}') 399ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}') 400ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}') 401ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}') 402ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 403b0a7d7e7SSatish Balay self.addMakeMacro('PETSC_TAO_LIB','${PETSC_WITH_EXTERNAL_LIB}') 404fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 405ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 406ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}') 4070f3b21c2SBarry Smith 408f8833479SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 409f8833479SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 410f8833479SBarry Smith 411f8833479SBarry Smith # add a makefile entry for configure options 412f8833479SBarry Smith self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 413f8833479SBarry Smith return 414f8833479SBarry Smith 415f8833479SBarry Smith def dumpConfigInfo(self): 416f8833479SBarry Smith import time 417f8833479SBarry Smith fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 418f8833479SBarry Smith fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 419f8833479SBarry Smith fd.close() 420f8833479SBarry Smith return 421f8833479SBarry Smith 4222a4161d9SMatthew G Knepley def dumpMachineInfo(self): 4232a4161d9SMatthew G Knepley import platform 4242a4161d9SMatthew G Knepley import time 42540373944SSatish Balay import script 426ca77dbeeSGeoffrey Irving def escape(s): 427ca77dbeeSGeoffrey Irving return s.replace('"',r'\"').replace(r'\ ',r'\\ ') 4282a4161d9SMatthew G Knepley fd = file(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w') 4292a4161d9SMatthew G Knepley fd.write('static const char *petscmachineinfo = \"\\n\"\n') 4302a4161d9SMatthew G Knepley fd.write('\"-----------------------------------------\\n\"\n') 4312a4161d9SMatthew G Knepley fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (time.ctime(time.time()), platform.node())) 43260acdfe7SSatish Balay fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform())) 433ca77dbeeSGeoffrey Irving fd.write('\"Using PETSc directory: %s\\n\"\n' % (escape(self.petscdir.dir))) 434ca77dbeeSGeoffrey Irving fd.write('\"Using PETSc arch: %s\\n\"\n' % (escape(self.arch.arch))) 435cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4362a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerinfo = \"\\n\"\n') 4372a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 438ca77dbeeSGeoffrey Irving fd.write('\"Using C compiler: %s %s ${COPTFLAGS} ${CFLAGS}\\n\"\n' % (escape(self.setCompilers.getCompiler()), escape(self.setCompilers.getCompilerFlags()))) 4392a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 4408782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 4412a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 442ca77dbeeSGeoffrey Irving fd.write('\"Using Fortran compiler: %s %s ${FOPTFLAGS} ${FFLAGS} %s\\n\"\n' % (escape(self.setCompilers.getCompiler()), escape(self.setCompilers.getCompilerFlags()), escape(self.setCompilers.CPPFLAGS))) 4432a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 444cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4452a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n') 446ca77dbeeSGeoffrey Irving fd.write('\"Using include paths: %s %s %s\\n\"\n' % ('-I'+escape(os.path.join(self.petscdir.dir, self.arch.arch, 'include')), '-I'+escape(os.path.join(self.petscdir.dir, 'include')), escape(self.PETSC_CC_INCLUDES))) 447cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4482a4161d9SMatthew G Knepley fd.write('static const char *petsclinkerinfo = \"\\n\"\n') 4492a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 450ca77dbeeSGeoffrey Irving fd.write('\"Using C linker: %s\\n\"\n' % (escape(self.setCompilers.getLinker()))) 4512a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 4528782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 4532a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 454ca77dbeeSGeoffrey Irving fd.write('\"Using Fortran linker: %s\\n\"\n' % (escape(self.setCompilers.getLinker()))) 4552a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 456ad782ac6SSatish Balay if self.framework.argDB['with-single-library']: 457ad782ac6SSatish Balay petsclib = '-lpetsc' 458ad782ac6SSatish Balay else: 459ad782ac6SSatish Balay petsclib = '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys' 460ca77dbeeSGeoffrey Irving fd.write('\"Using libraries: %s%s -L%s %s %s\\n\"\n' % (escape(self.setCompilers.CSharedLinkerFlag), escape(os.path.join(self.petscdir.dir, self.arch.arch, 'lib')), escape(os.path.join(self.petscdir.dir, self.arch.arch, 'lib')), escape(petsclib), escape(self.PETSC_EXTERNAL_LIB_BASIC))) 461cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 4622a4161d9SMatthew G Knepley fd.close() 4632a4161d9SMatthew G Knepley return 464b2843cf1SBarry Smith 465511a6afcSJed Brown def dumpCMakeConfig(self): 466511a6afcSJed Brown ''' 46734ed7027SBarry Smith Writes configuration-specific values to ${PETSC_ARCH}/conf/PETScConfig.cmake. 468511a6afcSJed Brown This file is private to PETSc and should not be included by third parties 469511a6afcSJed Brown (a suitable file can be produced later by CMake, but this is not it). 470511a6afcSJed Brown ''' 471511a6afcSJed Brown def cmakeset(fd,key,val=True): 472511a6afcSJed Brown if val == True: val = 'YES' 473511a6afcSJed Brown if val == False: val = 'NO' 474511a6afcSJed Brown fd.write('set (' + key + ' ' + val + ')\n') 475511a6afcSJed Brown def ensurelist(a): 476826d9344SJed Brown if isinstance(a,list): 477826d9344SJed Brown return a 478826d9344SJed Brown else: 479826d9344SJed Brown return [a] 480511a6afcSJed Brown def libpath(lib): 481511a6afcSJed Brown 'Returns a search path if that is what this item provides, else "" which will be cleaned out later' 4821b1c0b30SJed Brown if not isinstance(lib,str): return '' 483511a6afcSJed Brown if lib.startswith('-L'): return lib[2:] 484511a6afcSJed Brown if lib.startswith('-R'): return lib[2:] 485511a6afcSJed Brown if lib.startswith('-Wl,-rpath,'): 486511a6afcSJed Brown # This case occurs when an external package needs a specific system library that is normally provided by the compiler. 487511a6afcSJed Brown # In other words, the -L path is builtin to the wrapper or compiler, here we provide it so that CMake can locate the 488511a6afcSJed Brown # corresponding library. 489511a6afcSJed Brown return lib[len('-Wl,-rpath,'):] 490511a6afcSJed Brown if lib.startswith('-'): return '' 491511a6afcSJed Brown return os.path.dirname(lib) 492511a6afcSJed Brown def cleanlib(lib): 493511a6afcSJed Brown 'Returns a library name if that is what this item provides, else "" which will be cleaned out later' 49442e8629dSMatthew G Knepley if not isinstance(lib,str): return '' 495511a6afcSJed Brown if lib.startswith('-l'): return lib[2:] 496511a6afcSJed Brown if lib.startswith('-Wl') or lib.startswith('-L'): return '' 497511a6afcSJed Brown lib = os.path.splitext(os.path.basename(lib))[0] 498511a6afcSJed Brown if lib.startswith('lib'): return lib[3:] 499511a6afcSJed Brown return lib 500511a6afcSJed Brown def nub(lst): 50106e8c1ddSJed Brown 'Return a list containing the first occurrence of each unique element' 502511a6afcSJed Brown unique = [] 503511a6afcSJed Brown for elem in lst: 504511a6afcSJed Brown if elem not in unique and elem != '': 505511a6afcSJed Brown unique.append(elem) 506511a6afcSJed Brown return unique 50750937898SJed Brown try: reversed # reversed was added in Python-2.4 50850937898SJed Brown except NameError: 50950937898SJed Brown def reversed(lst): return lst[::-1] 51006e8c1ddSJed Brown def nublast(lst): 51106e8c1ddSJed Brown 'Return a list containing the last occurrence of each unique entry in a list' 51250937898SJed Brown return reversed(nub(reversed(lst))) 513511a6afcSJed Brown def cmakeexpand(varname): 514511a6afcSJed Brown return r'"${' + varname + r'}"' 515582751aaSJed Brown def uniqextend(lst,new): 516511a6afcSJed Brown for x in ensurelist(new): 517582751aaSJed Brown if x not in lst: 518582751aaSJed Brown lst.append(x) 519511a6afcSJed Brown def notstandardinclude(path): 520040257f2SJed Brown return path not in '/usr/include'.split() # /usr/local/include is not automatically included on FreeBSD 521511a6afcSJed Brown def writeMacroDefinitions(fd): 522511a6afcSJed Brown if self.mpi.usingMPIUni: 523511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_MPIUNI') 524511a6afcSJed Brown for pkg in self.framework.packages: 525511a6afcSJed Brown if pkg.useddirectly: 526eeb16384SBarry Smith cmakeset(fd,'PETSC_HAVE_' + pkg.PACKAGE.replace('-','_')) 527a23e9343SMatthew G Knepley for pair in pkg.defines.items(): 528440af75fSJed Brown if pair[0].startswith('HAVE_') and pair[1]: 529a23e9343SMatthew G Knepley cmakeset(fd, self.framework.getFullDefineName(pkg, pair[0]), pair[1]) 530511a6afcSJed Brown for name,val in self.functions.defines.items(): 531511a6afcSJed Brown cmakeset(fd,'PETSC_'+name,val) 532511a6afcSJed Brown for dct in [self.defines, self.libraryoptions.defines]: 533511a6afcSJed Brown for k,v in dct.items(): 534511a6afcSJed Brown if k.startswith('USE_'): 535511a6afcSJed Brown cmakeset(fd,'PETSC_' + k, v) 536511a6afcSJed Brown cmakeset(fd,'PETSC_USE_COMPLEX', self.scalartypes.scalartype == 'complex') 537ce63c4c1SBarry Smith cmakeset(fd,'PETSC_USE_REAL_' + self.scalartypes.precision.upper()) 538511a6afcSJed Brown cmakeset(fd,'PETSC_CLANGUAGE_'+self.languages.clanguage) 539511a6afcSJed Brown if hasattr(self.compilers, 'FC'): 540511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_FORTRAN') 541511a6afcSJed Brown if self.compilers.fortranIsF90: 542511a6afcSJed Brown cmakeset(fd,'PETSC_USING_F90') 543876d5c60SBarry Smith if self.compilers.fortranIsF2003: 544876d5c60SBarry Smith cmakeset(fd,'PETSC_USING_F2003') 54513c0a95cSJed Brown if hasattr(self.compilers, 'CXX'): 54613c0a95cSJed Brown cmakeset(fd,'PETSC_HAVE_CXX') 547511a6afcSJed Brown if self.sharedlibraries.useShared: 548511a6afcSJed Brown cmakeset(fd,'BUILD_SHARED_LIBS') 549511a6afcSJed Brown def writeBuildFlags(fd): 55006e8c1ddSJed Brown def extendby(lib): 55106e8c1ddSJed Brown libs = ensurelist(lib) 55206e8c1ddSJed Brown lib_paths.extend(map(libpath,libs)) 55306e8c1ddSJed Brown lib_libs.extend(map(cleanlib,libs)) 554511a6afcSJed Brown lib_paths = [] 555511a6afcSJed Brown lib_libs = [] 556511a6afcSJed Brown includes = [] 557511a6afcSJed Brown libvars = [] 558511a6afcSJed Brown for pkg in self.framework.packages: 55906e8c1ddSJed Brown extendby(pkg.lib) 560040257f2SJed Brown uniqextend(includes,pkg.include) 56106e8c1ddSJed Brown extendby(self.libraries.math) 56206e8c1ddSJed Brown extendby(self.libraries.rt) 56306e8c1ddSJed Brown extendby(self.compilers.flibs) 56406e8c1ddSJed Brown extendby(self.compilers.cxxlibs) 56506e8c1ddSJed Brown extendby(self.compilers.LIBS.split()) 56606e8c1ddSJed Brown for libname in nublast(lib_libs): 567511a6afcSJed Brown libvar = 'PETSC_' + libname.upper() + '_LIB' 5684c0032a9SSatish Balay addpath = '' 56906e8c1ddSJed Brown for lpath in nublast(lib_paths): 5704c0032a9SSatish Balay addpath += '"' + str(lpath) + '" ' 5714c0032a9SSatish Balay fd.write('find_library (' + libvar + ' ' + libname + ' HINTS ' + addpath + ')\n') 572511a6afcSJed Brown libvars.append(libvar) 573511a6afcSJed Brown fd.write('mark_as_advanced (' + ' '.join(libvars) + ')\n') 574511a6afcSJed Brown fd.write('set (PETSC_PACKAGE_LIBS ' + ' '.join(map(cmakeexpand,libvars)) + ')\n') 575040257f2SJed Brown includes = filter(notstandardinclude,includes) 576040257f2SJed Brown fd.write('set (PETSC_PACKAGE_INCLUDES ' + ' '.join(map(lambda i: '"'+i+'"',includes)) + ')\n') 577511a6afcSJed Brown fd = open(os.path.join(self.arch.arch,'conf','PETScConfig.cmake'), 'w') 578511a6afcSJed Brown writeMacroDefinitions(fd) 579511a6afcSJed Brown writeBuildFlags(fd) 580511a6afcSJed Brown fd.close() 581511a6afcSJed Brown return 582511a6afcSJed Brown 5838b0282a9SJed Brown def dumpCMakeLists(self): 5848b0282a9SJed Brown import sys 585994b4dadSSatish Balay if sys.version_info >= (2,4): 5868b0282a9SJed Brown import cmakegen 5878b0282a9SJed Brown try: 588a98e69d2SJed Brown cmakegen.main(self.petscdir.dir, log=self.framework.log) 5898b0282a9SJed Brown except (OSError), e: 5908b0282a9SJed Brown self.framework.logPrint('Generating CMakeLists.txt failed:\n' + str(e)) 591aac20692SSatish Balay else: 592aac20692SSatish Balay self.framework.logPrint('Skipping cmakegen due to old python version: ' +str(sys.version_info) ) 5938b0282a9SJed Brown 5948b0282a9SJed Brown def cmakeBoot(self): 5958b0282a9SJed Brown import sys 596ae937f1dSJed Brown self.cmakeboot_success = False 597994b4dadSSatish Balay if sys.version_info >= (2,4) and hasattr(self.cmake,'cmake'): 598356464bcSMatthew G Knepley try: 5998b0282a9SJed Brown import cmakeboot 600ae937f1dSJed Brown self.cmakeboot_success = cmakeboot.main(petscdir=self.petscdir.dir,petscarch=self.arch.arch,argDB=self.argDB,framework=self.framework,log=self.framework.log) 6018b0282a9SJed Brown except (OSError), e: 6028b0282a9SJed Brown self.framework.logPrint('Booting CMake in PETSC_ARCH failed:\n' + str(e)) 603356464bcSMatthew G Knepley except (ImportError, KeyError), e: 604356464bcSMatthew G Knepley self.framework.logPrint('Importing cmakeboot failed:\n' + str(e)) 6059b12c9c7SJed Brown if self.cmakeboot_success: 6062f730bc2SKarl Rupp if hasattr(self.compilers, 'FC') and self.compilers.fortranIsF90 and not self.setCompilers.fortranModuleOutputFlag: 60791f9b906SSatish Balay self.framework.logPrint('CMake configured successfully, but could not be used by default because of missing fortranModuleOutputFlag\n') 6089b12c9c7SJed Brown else: 6099b12c9c7SJed Brown self.framework.logPrint('CMake configured successfully, using as default build\n') 610f7b66a64SJed Brown self.addMakeMacro('PETSC_BUILD_USING_CMAKE',1) 611aac20692SSatish Balay else: 6129b12c9c7SJed Brown self.framework.logPrint('CMake configuration was unsuccessful\n') 6139b12c9c7SJed Brown else: 614aac20692SSatish Balay self.framework.logPrint('Skipping cmakeboot due to old python version: ' +str(sys.version_info) ) 615356464bcSMatthew G Knepley return 6168b0282a9SJed Brown 617b2843cf1SBarry Smith def configurePrefetch(self): 618b2843cf1SBarry Smith '''Sees if there are any prefetch functions supported''' 619525d6f2eSBarry Smith if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-ios']: 62093f78423SSatish Balay self.addDefine('Prefetch(a,b,c)', ' ') 62193f78423SSatish Balay return 622ec284106SBarry Smith self.pushLanguage(self.languages.clanguage) 62310699583SJed Brown if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'): 62450d8bf02SJed Brown # The Intel Intrinsics manual [1] specifies the prototype 62550d8bf02SJed Brown # 62650d8bf02SJed Brown # void _mm_prefetch(char const *a, int sel); 62750d8bf02SJed Brown # 62850d8bf02SJed Brown # but other vendors seem to insist on using subtly different 62950d8bf02SJed Brown # prototypes, including void* for the pointer, and an enum for 63050d8bf02SJed Brown # sel. These are both reasonable changes, but negatively impact 63150d8bf02SJed Brown # portability. 63250d8bf02SJed Brown # 63350d8bf02SJed Brown # [1] http://software.intel.com/file/6373 63450d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 63550d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))') 63650d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 63750d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 63850d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 63950d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 64050d8bf02SJed Brown elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'): 64150d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 64250d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))') 64350d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 64450d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 64550d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 64650d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 64710699583SJed Brown elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 64810699583SJed Brown # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality) 64910699583SJed Brown # 65010699583SJed Brown # The value of rw is a compile-time constant one or zero; one 65110699583SJed Brown # means that the prefetch is preparing for a write to the memory 65210699583SJed Brown # address and zero, the default, means that the prefetch is 65310699583SJed Brown # preparing for a read. The value locality must be a compile-time 65410699583SJed Brown # constant integer between zero and three. A value of zero means 65510699583SJed Brown # that the data has no temporal locality, so it need not be left 65610699583SJed Brown # in the cache after the access. A value of three means that the 65710699583SJed Brown # data has a high degree of temporal locality and should be left 65810699583SJed Brown # in all levels of cache possible. Values of one and two mean, 65910699583SJed Brown # respectively, a low or moderate degree of temporal locality. 66010699583SJed Brown # 66110699583SJed Brown # Here we adopt Intel's x86/x86-64 naming scheme for the locality 66210699583SJed Brown # hints. Using macros for these values in necessary since some 66310699583SJed Brown # compilers require an enum. 66410699583SJed Brown self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))') 66510699583SJed Brown self.addDefine('PREFETCH_HINT_NTA', '0') 66610699583SJed Brown self.addDefine('PREFETCH_HINT_T0', '3') 66710699583SJed Brown self.addDefine('PREFETCH_HINT_T1', '2') 66810699583SJed Brown self.addDefine('PREFETCH_HINT_T2', '1') 669b2843cf1SBarry Smith else: 670b2843cf1SBarry Smith self.addDefine('Prefetch(a,b,c)', ' ') 6717d490b44SBarry Smith self.popLanguage() 672b2843cf1SBarry Smith 67309bc878fSSatish Balay def configureAtoll(self): 67409bc878fSSatish Balay '''Checks if atoll exists''' 675436b02dcSSatish 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")'): 67609bc878fSSatish Balay self.addDefine('HAVE_ATOLL', '1') 67709bc878fSSatish Balay 6782400fdedSBarry Smith def configureUnused(self): 6792400fdedSBarry Smith '''Sees if __attribute((unused)) is supported''' 6801adaff47SSean Farley if self.framework.argDB['with-ios']: 6812400fdedSBarry Smith self.addDefine('UNUSED', ' ') 6822400fdedSBarry Smith return 6832400fdedSBarry Smith self.pushLanguage(self.languages.clanguage) 684edf21b64SSatish 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'): 6852400fdedSBarry Smith self.addDefine('UNUSED', '__attribute((unused))') 6862400fdedSBarry Smith else: 6872400fdedSBarry Smith self.addDefine('UNUSED', ' ') 6882400fdedSBarry Smith self.popLanguage() 6892400fdedSBarry Smith 69098ed35c3SBarry Smith def configureIsatty(self): 69198ed35c3SBarry Smith '''Check if the Unix C function isatty() works correctly 69298ed35c3SBarry Smith Actually just assumes it does not work correctly on batch systems''' 69398ed35c3SBarry Smith if not self.framework.argDB['with-batch']: 69498ed35c3SBarry Smith self.addDefine('USE_ISATTY',1) 69598ed35c3SBarry Smith 6961ef8df7fSJed Brown def configureDeprecated(self): 6971ef8df7fSJed Brown '''Check if __attribute((deprecated)) is supported''' 6981ef8df7fSJed Brown self.pushLanguage(self.languages.clanguage) 69959a26b54SJed Brown ## Recent versions of gcc and clang support __attribute((deprecated("string argument"))), which is very useful, but 70059a26b54SJed Brown ## Intel has conspired to make a supremely environment-sensitive compiler. The Intel compiler looks at the gcc 70159a26b54SJed Brown ## executable in the environment to determine the language compatibility that it should attempt to emulate. Some 70259a26b54SJed Brown ## important Cray installations have built PETSc using the Intel compiler, but with a newer gcc module loaded (e.g., 703df3898eeSBarry Smith ## 4.7). Thus at PETSc configure time, the Intel compiler decides to support the string argument, but the gcc 70459a26b54SJed Brown ## found in the default user environment is older and does not support the argument. If GCC and Intel were cool 70559a26b54SJed Brown ## like Clang and supported __has_attribute, we could avoid configure tests entirely, but they don't. And that is 70659a26b54SJed Brown ## why we can't have nice things. 70759a26b54SJed Brown # 70859a26b54SJed Brown # if self.checkCompile("""__attribute((deprecated("Why you shouldn't use myfunc"))) static int myfunc(void) { return 1;}""", ''): 70959a26b54SJed Brown # self.addDefine('DEPRECATED(why)', '__attribute((deprecated(why)))') 71059a26b54SJed Brown if self.checkCompile("""__attribute((deprecated)) static int myfunc(void) { return 1;}""", ''): 71159a26b54SJed Brown self.addDefine('DEPRECATED(why)', '__attribute((deprecated))') 7121ef8df7fSJed Brown else: 71347644db9SJed Brown self.addDefine('DEPRECATED(why)', ' ') 7141ef8df7fSJed Brown self.popLanguage() 7151ef8df7fSJed Brown 7169800092aSJed Brown def configureExpect(self): 7179800092aSJed Brown '''Sees if the __builtin_expect directive is supported''' 7189800092aSJed Brown self.pushLanguage(self.languages.clanguage) 7199800092aSJed Brown if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'): 7209800092aSJed Brown self.addDefine('HAVE_BUILTIN_EXPECT', 1) 7219800092aSJed Brown self.popLanguage() 7229800092aSJed Brown 72353c77d0aSJed Brown def configureFunctionName(self): 7241ec50b02SJed Brown '''Sees if the compiler supports __func__ or a variant. Falls back 7251ec50b02SJed Brown on __FUNCT__ which PETSc source defines, but most users do not, thus 7261ec50b02SJed Brown stack traces through user code are better when the compiler's 7271ec50b02SJed Brown variant is used.''' 7281ec50b02SJed Brown def getFunctionName(lang): 7291ec50b02SJed Brown name = '__FUNCT__' 7301ec50b02SJed Brown self.pushLanguage(lang) 73153c77d0aSJed Brown if self.checkLink('', "if (__func__[0] != 'm') return 1;"): 7321ec50b02SJed Brown name = '__func__' 73353c77d0aSJed Brown elif self.checkLink('', "if (__FUNCTION__[0] != 'm') return 1;"): 7341ec50b02SJed Brown name = '__FUNCTION__' 7351ec50b02SJed Brown self.popLanguage() 7361ec50b02SJed Brown return name 7371ec50b02SJed Brown langs = [] 738628773c9SSatish Balay 739628773c9SSatish Balay self.addDefine('FUNCTION_NAME_C', getFunctionName('C')) 740628773c9SSatish Balay if hasattr(self.compilers, 'CXX'): 741628773c9SSatish Balay self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx')) 74212607bf0SSatish Balay else: 74312607bf0SSatish Balay self.addDefine('FUNCTION_NAME_CXX', '__FUNCT__') 74453c77d0aSJed Brown 745753ebd1dSJed Brown def configureIntptrt(self): 746753ebd1dSJed Brown '''Determine what to use for uintptr_t''' 747753ebd1dSJed Brown def staticAssertSizeMatchesVoidStar(inc,typename): 748753ebd1dSJed Brown # The declaration is an error if either array size is negative. 749753ebd1dSJed 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 750d26187a0SJed Brown return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n' 751979939cdSSatish Balay + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename)) 752753ebd1dSJed Brown self.pushLanguage(self.languages.clanguage) 753753ebd1dSJed Brown if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'): 754753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'uintptr_t') 755753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long long'): 756753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned long long') 757753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'): 758753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'size_t') 759c82284b1SJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long'): 760c82284b1SJed Brown self.addDefine('UINTPTR_T', 'unsigned long') 7612d1b7972SSatish Balay elif staticAssertSizeMatchesVoidStar('','unsigned'): 762753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned') 763d26187a0SJed Brown else: 764d26187a0SJed Brown raise RuntimeError('Could not find any unsigned integer type matching void*') 765753ebd1dSJed Brown self.popLanguage() 766753ebd1dSJed Brown 767ed938b00SJed Brown def configureRTLDDefault(self): 768bfef2c86SBarry Smith if self.checkCompile('#include <dlfcn.h>\n void *ptr = RTLD_DEFAULT;'): 769bfef2c86SBarry Smith self.addDefine('RTLD_DEFAULT','1') 770f8833479SBarry Smith return 771f8833479SBarry Smith 772f8833479SBarry Smith def configureSolaris(self): 773f8833479SBarry Smith '''Solaris specific stuff''' 774f8833479SBarry Smith if os.path.isdir(os.path.join('/usr','ucblib')): 775f8833479SBarry Smith try: 776f8833479SBarry Smith flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 777f8833479SBarry Smith except AttributeError: 778f8833479SBarry Smith flag = None 779f8833479SBarry Smith if flag is None: 780f8833479SBarry Smith self.compilers.LIBS += ' -L/usr/ucblib' 781f8833479SBarry Smith else: 782f8833479SBarry Smith self.compilers.LIBS += ' '+flag+'/usr/ucblib' 783f8833479SBarry Smith return 784f8833479SBarry Smith 785f8833479SBarry Smith def configureLinux(self): 786f8833479SBarry Smith '''Linux specific stuff''' 7879f15855cSMatthew G Knepley # TODO: Test for this by mallocing an odd number of floats and checking the address 788f8833479SBarry Smith self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 789f8833479SBarry Smith return 790f8833479SBarry Smith 791f8833479SBarry Smith def configureWin32(self): 792f8833479SBarry Smith '''Win32 non-cygwin specific stuff''' 793f8833479SBarry Smith kernel32=0 794f8833479SBarry Smith if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 795f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 796f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 797f8833479SBarry Smith kernel32=1 798f8833479SBarry Smith elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 799f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 800f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 801f8833479SBarry Smith kernel32=1 802f8833479SBarry Smith if kernel32: 803eed94e11SSatish Balay if self.framework.argDB['with-windows-graphics']: 804eed94e11SSatish Balay self.addDefine('USE_WINDOWS_GRAPHICS',1) 805f8833479SBarry Smith if self.checkLink('#include <Windows.h>','LoadLibrary(0)'): 806f8833479SBarry Smith self.addDefine('HAVE_LOADLIBRARY',1) 807b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'): 808b50f6d9eSLisandro Dalcin self.addDefine('HAVE_GETPROCADDRESS',1) 809b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','FreeLibrary(0)'): 810b50f6d9eSLisandro Dalcin self.addDefine('HAVE_FREELIBRARY',1) 811a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','GetLastError()'): 812a21658a3SLisandro Dalcin self.addDefine('HAVE_GETLASTERROR',1) 813a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','SetLastError(0)'): 814a21658a3SLisandro Dalcin self.addDefine('HAVE_SETLASTERROR',1) 815f8833479SBarry Smith if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'): 816bea725cfSBarry Smith self.addDefine('USE_MICROSOFT_TIME',1) 817f8833479SBarry Smith if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 818f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 819f8833479SBarry Smith elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 820f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 821f8833479SBarry Smith 822f8833479SBarry Smith if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'): 823f8833479SBarry Smith self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);') 824f8833479SBarry Smith if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'): 825f8833479SBarry Smith self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);') 826f8833479SBarry Smith 827f8833479SBarry Smith self.types.check('int32_t', 'int') 828f8833479SBarry Smith if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 829f8833479SBarry Smith self.addTypedef('int', 'uid_t') 830f8833479SBarry Smith self.addTypedef('int', 'gid_t') 831f8833479SBarry Smith if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 832f8833479SBarry Smith self.framework.addDefine('R_OK', '04') 833f8833479SBarry Smith self.framework.addDefine('W_OK', '02') 834f8833479SBarry Smith self.framework.addDefine('X_OK', '01') 835f8833479SBarry Smith if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 836f8833479SBarry Smith self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 837f8833479SBarry Smith self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 838f8833479SBarry Smith if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 839f8833479SBarry Smith self.addDefine('HAVE_LARGE_INTEGER_U',1) 840f8833479SBarry Smith 841f8833479SBarry Smith # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 842ef2cfba3SSatish Balay if self.checkCompile('#include <Windows.h>\n#include <fcntl.h>\n', 'int flags = O_BINARY;'): 843f8833479SBarry Smith self.addDefine('HAVE_O_BINARY',1) 844f8833479SBarry Smith 845f8833479SBarry Smith if self.compilers.CC.find('win32fe') >= 0: 846f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\';\'') 847f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'\\\\\'') 848f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 849f8833479SBarry Smith self.addDefine('CANNOT_START_DEBUGGER',1) 85034531a4dSSatish Balay (petscdir,error,status) = self.executeShellCommand('cygpath -w '+self.petscdir.dir) 85134531a4dSSatish Balay self.addDefine('DIR','"'+petscdir.replace('\\','\\\\')+'"') 852f8833479SBarry Smith else: 853f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\':\'') 854f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 855f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'/\'') 85634531a4dSSatish Balay self.addDefine('DIR', '"'+self.petscdir.dir+'"') 857bfef2c86SBarry Smith 858f8833479SBarry Smith return 859f8833479SBarry Smith 860f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 861b10d012aSSatish Balay def configureCygwinBrokenPipe(self): 862b10d012aSSatish Balay '''Cygwin version <= 1.7.18 had issues with pipes and long commands invoked from gnu-make 863b10d012aSSatish Balay http://cygwin.com/ml/cygwin/2013-05/msg00340.html ''' 864b10d012aSSatish Balay if config.setCompilers.Configure.isCygwin(): 865b10d012aSSatish Balay import platform 866b10d012aSSatish Balay import re 867b10d012aSSatish Balay r=re.compile("([0-9]+).([0-9]+).([0-9]+)") 868b10d012aSSatish Balay m=r.match(platform.release()) 869b10d012aSSatish Balay major=int(m.group(1)) 870b10d012aSSatish Balay minor=int(m.group(2)) 871b10d012aSSatish Balay subminor=int(m.group(3)) 872b10d012aSSatish Balay if ((major < 1) or (major == 1 and minor < 7) or (major == 1 and minor == 7 and subminor <= 18)): 873b10d012aSSatish Balay self.addMakeMacro('PETSC_CYGWIN_BROKEN_PIPE','1') 874b10d012aSSatish Balay return 875b10d012aSSatish Balay 876b10d012aSSatish Balay#----------------------------------------------------------------------------------------------------- 877569865ddSSatish Balay def configureDefaultArch(self): 878569865ddSSatish Balay conffile = os.path.join('conf', 'petscvariables') 879569865ddSSatish Balay if self.framework.argDB['with-default-arch']: 880569865ddSSatish Balay fd = file(conffile, 'w') 881569865ddSSatish Balay fd.write('PETSC_ARCH='+self.arch.arch+'\n') 882da93591fSBarry Smith fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 8833435dde8SSatish Balay fd.write('include '+os.path.join(self.petscdir.dir,self.arch.arch,'conf','petscvariables')+'\n') 884569865ddSSatish Balay fd.close() 885569865ddSSatish Balay self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 886569865ddSSatish Balay elif os.path.isfile(conffile): 887569865ddSSatish Balay try: 888569865ddSSatish Balay os.unlink(conffile) 889569865ddSSatish Balay except: 890569865ddSSatish Balay raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 891569865ddSSatish Balay return 892569865ddSSatish Balay 893569865ddSSatish Balay#----------------------------------------------------------------------------------------------------- 894f8833479SBarry Smith def configureScript(self): 895f8833479SBarry Smith '''Output a script in the conf directory which will reproduce the configuration''' 896f8833479SBarry Smith import nargs 897495bf1a9SSatish Balay import sys 898495bf1a9SSatish Balay scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py') 899f8833479SBarry Smith args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 900e97fc2efSSatish Balay if 'with-clean' in args: 901e97fc2efSSatish Balay del args['with-clean'] 902f8833479SBarry Smith if 'configModules' in args: 9031063a081SSatish Balay if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 904f8833479SBarry Smith del args['configModules'] 905f8833479SBarry Smith if 'optionsModule' in args: 906c1486898SMatthew Knepley if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions': 907f8833479SBarry Smith del args['optionsModule'] 908f8833479SBarry Smith if not 'PETSC_ARCH' in args: 9091063a081SSatish Balay args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 910f8833479SBarry Smith f = file(scriptName, 'w') 911495bf1a9SSatish Balay f.write('#!'+sys.executable+'\n') 912f8833479SBarry Smith f.write('if __name__ == \'__main__\':\n') 913f8833479SBarry Smith f.write(' import sys\n') 9147561c02cSSatish Balay f.write(' import os\n') 9157561c02cSSatish Balay f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 916f8833479SBarry Smith f.write(' import configure\n') 9171063a081SSatish Balay # pretty print repr(args.values()) 9181063a081SSatish Balay f.write(' configure_options = [\n') 9198bec23c5SJed Brown for itm in sorted(args.values()): 9201063a081SSatish Balay f.write(' \''+str(itm)+'\',\n') 9211063a081SSatish Balay f.write(' ]\n') 922f8833479SBarry Smith f.write(' configure.petsc_configure(configure_options)\n') 923f8833479SBarry Smith f.close() 924f8833479SBarry Smith try: 925f8833479SBarry Smith os.chmod(scriptName, 0775) 926f8833479SBarry Smith except OSError, e: 927f8833479SBarry Smith self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 928f8833479SBarry Smith self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 929f8833479SBarry Smith return 930f8833479SBarry Smith 931f8833479SBarry Smith def configureInstall(self): 932f8833479SBarry Smith '''Setup the directories for installation''' 933f8833479SBarry Smith if self.framework.argDB['prefix']: 934824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\ 935d093bd8dSBarry Smith '-@echo "'+self.installdir.installSudo+'make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 936315b77e6SSatish Balay '-@echo "========================================="']) 937d093bd8dSBarry Smith self.installdir = self.framework.argDB['prefix'] 938f8833479SBarry Smith else: 939824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\ 940824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\ 941315b77e6SSatish Balay '-@echo "========================================="']) 942d093bd8dSBarry Smith self.installdir = os.path.join(self.petscdir.dir,self.arch.arch) 943f8833479SBarry Smith return 944f8833479SBarry Smith 945f8833479SBarry Smith def configureGCOV(self): 946f8833479SBarry Smith if self.framework.argDB['with-gcov']: 947f8833479SBarry Smith self.addDefine('USE_GCOV','1') 948f8833479SBarry Smith return 949f8833479SBarry Smith 950f8833479SBarry Smith def configureFortranFlush(self): 951f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 952f8833479SBarry Smith for baseName in ['flush','flush_']: 953f8833479SBarry Smith if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1): 954f8833479SBarry Smith self.addDefine('HAVE_'+baseName.upper(), 1) 955f8833479SBarry Smith return 956f8833479SBarry Smith 95728bb2e72SSatish Balay def postProcessPackages(self): 95828bb2e72SSatish Balay postPackages=[] 95928bb2e72SSatish Balay for i in self.framework.packages: 96028bb2e72SSatish Balay if hasattr(i,'postProcess'): postPackages.append(i) 96128bb2e72SSatish Balay if postPackages: 962e64d19dfSSatish Balay # ctetgen needs petsc conf files. so attempt to create them early 963a77eb93bSSatish Balay self.framework.dumpConfFiles() 96428bb2e72SSatish Balay for i in postPackages: i.postProcess() 96528bb2e72SSatish Balay return 966f8833479SBarry Smith 967f8833479SBarry Smith def configure(self): 968f8833479SBarry Smith if not os.path.samefile(self.petscdir.dir, os.getcwd()): 969f8833479SBarry Smith raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 970550489e3SMatthew 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): 9713552d8fbSSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 972c16c35a9SSatish 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)): 973c16c35a9SSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!') 974f16c1317SJed Brown self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 975f16c1317SJed Brown self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 976f16c1317SJed Brown self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables') 977f16c1317SJed Brown self.framework.makeRuleHeader = os.path.join(self.arch.arch,'conf','petscrules') 978f8833479SBarry Smith if self.libraries.math is None: 979f8833479SBarry Smith raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 980f8833479SBarry Smith if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 981f8833479SBarry Smith raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 982ed938b00SJed Brown self.executeTest(self.configureRTLDDefault) 983b2843cf1SBarry Smith self.executeTest(self.configurePrefetch) 9842400fdedSBarry Smith self.executeTest(self.configureUnused) 9851ef8df7fSJed Brown self.executeTest(self.configureDeprecated) 98698ed35c3SBarry Smith self.executeTest(self.configureIsatty) 9879800092aSJed Brown self.executeTest(self.configureExpect); 98853c77d0aSJed Brown self.executeTest(self.configureFunctionName); 989753ebd1dSJed Brown self.executeTest(self.configureIntptrt); 990f8833479SBarry Smith self.executeTest(self.configureSolaris) 991f8833479SBarry Smith self.executeTest(self.configureLinux) 992f8833479SBarry Smith self.executeTest(self.configureWin32) 993b10d012aSSatish Balay self.executeTest(self.configureCygwinBrokenPipe) 994569865ddSSatish Balay self.executeTest(self.configureDefaultArch) 995f8833479SBarry Smith self.executeTest(self.configureScript) 996f8833479SBarry Smith self.executeTest(self.configureInstall) 997f8833479SBarry Smith self.executeTest(self.configureGCOV) 998f8833479SBarry Smith self.executeTest(self.configureFortranFlush) 99909bc878fSSatish Balay self.executeTest(self.configureAtoll) 1000f8833479SBarry Smith # dummy rules, always needed except for remote builds 1001f8833479SBarry Smith self.addMakeRule('remote','') 1002f8833479SBarry Smith self.addMakeRule('remoteclean','') 1003f8833479SBarry Smith 1004f8833479SBarry Smith self.Dump() 1005f8833479SBarry Smith self.dumpConfigInfo() 10062a4161d9SMatthew G Knepley self.dumpMachineInfo() 100728bb2e72SSatish Balay self.postProcessPackages() 1008511a6afcSJed Brown self.dumpCMakeConfig() 10098b0282a9SJed Brown self.dumpCMakeLists() 10108b0282a9SJed Brown self.cmakeBoot() 1011262119f8SBarry Smith self.DumpPkgconfig() 1012351d3a41SMatthew G Knepley self.DumpModule() 1013f8833479SBarry Smith self.framework.log.write('================================================================================\n') 1014f8833479SBarry Smith self.logClear() 1015f8833479SBarry Smith return 1016