1f8833479SBarry Smithimport config.base 2f8833479SBarry Smith 3f8833479SBarry Smithimport os 4f8833479SBarry Smithimport re 5f8833479SBarry Smith 6f8833479SBarry Smithclass Configure(config.base.Configure): 7f8833479SBarry Smith def __init__(self, framework): 8f8833479SBarry Smith config.base.Configure.__init__(self, framework) 9f8833479SBarry Smith self.headerPrefix = 'PETSC' 10f8833479SBarry Smith self.substPrefix = 'PETSC' 11f8833479SBarry Smith return 12f8833479SBarry Smith 137c939e48SSatish Balay def __str2__(self): 147c939e48SSatish Balay desc = [] 15a0022257SSatish Balay desc.append('xxx=========================================================================xxx') 167c939e48SSatish Balay desc.append(' Configure stage complete. Now build PETSc libraries with:') 177c939e48SSatish Balay desc.append(' make PETSC_DIR='+self.petscdir.dir+' PETSC_ARCH='+self.arch.arch+' all') 18a0022257SSatish Balay desc.append('xxx=========================================================================xxx') 197c939e48SSatish Balay return '\n'.join(desc)+'\n' 20f8833479SBarry Smith 21f8833479SBarry Smith def setupHelp(self, help): 22f8833479SBarry Smith import nargs 23ce0b2093SBarry Smith help.addArgument('PETSc', '-prefix=<dir>', nargs.Arg(None, '', 'Specifiy location to install PETSc (eg. /usr/local)')) 24eed94e11SSatish Balay help.addArgument('Windows','-with-windows-graphics=<bool>', nargs.ArgBool(None, 1,'Enable check for Windows Graphics')) 25569865ddSSatish Balay help.addArgument('PETSc', '-with-default-arch=<bool>', nargs.ArgBool(None, 1, 'Allow using the last configured arch without setting PETSC_ARCH')) 2657cb31baSSatish Balay help.addArgument('PETSc','-with-single-library=<bool>', nargs.ArgBool(None, 1,'Put all PETSc code into the single -lpetsc library')) 27ce0b2093SBarry Smith help.addArgument('PETSc', '-with-iphone=<bool>', nargs.ArgBool(None, 0, 'Build an iPhone version of PETSc')) 28f8833479SBarry Smith return 29f8833479SBarry Smith 30f8833479SBarry Smith def setupDependencies(self, framework): 31f8833479SBarry Smith config.base.Configure.setupDependencies(self, framework) 32f8833479SBarry Smith self.setCompilers = framework.require('config.setCompilers', self) 33f8833479SBarry Smith self.arch = framework.require('PETSc.utilities.arch', self.setCompilers) 34f8833479SBarry Smith self.petscdir = framework.require('PETSc.utilities.petscdir', self.setCompilers) 35f8833479SBarry Smith self.languages = framework.require('PETSc.utilities.languages',self.setCompilers) 36f8833479SBarry Smith self.debugging = framework.require('PETSc.utilities.debugging',self.setCompilers) 37a2b1cf82SBarry Smith self.CHUD = framework.require('PETSc.utilities.CHUD', self) 38f8833479SBarry Smith self.compilers = framework.require('config.compilers', self) 39f8833479SBarry Smith self.types = framework.require('config.types', self) 40f8833479SBarry Smith self.headers = framework.require('config.headers', self) 41f8833479SBarry Smith self.functions = framework.require('config.functions', self) 42f8833479SBarry Smith self.libraries = framework.require('config.libraries', self) 43f8833479SBarry Smith if os.path.isdir(os.path.join('config', 'PETSc')): 44f8833479SBarry Smith for d in ['utilities', 'packages']: 45f8833479SBarry Smith for utility in os.listdir(os.path.join('config', 'PETSc', d)): 46f8833479SBarry Smith (utilityName, ext) = os.path.splitext(utility) 47f8833479SBarry Smith if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__': 48f8833479SBarry Smith utilityObj = self.framework.require('PETSc.'+d+'.'+utilityName, self) 49f8833479SBarry Smith utilityObj.headerPrefix = self.headerPrefix 50f1ecedd2SMatthew Knepley utilityObj.archProvider = self.arch 51fdfda77fSMatthew Knepley utilityObj.languageProvider = self.languages 52fdfda77fSMatthew Knepley utilityObj.installDirProvider = self.petscdir 53f8833479SBarry Smith setattr(self, utilityName.lower(), utilityObj) 54e8793464SBarry Smith self.qd = framework.require('PETSc.packages.qd', self) 555389abc2SBarry Smith self.qd.archProvider = self.arch 565389abc2SBarry Smith self.qd.precisionProvider = self.scalartypes 575389abc2SBarry Smith self.qd.installDirProvider= self.petscdir 588cf378d1SBarry Smith 59d37554e4SMatthew G Knepley for package in config.packages.all: 60d37554e4SMatthew G Knepley if not package == 'PETSc': 61d37554e4SMatthew G Knepley packageObj = framework.require('config.packages.'+package, self) 62d37554e4SMatthew G Knepley packageObj.archProvider = self.arch 63d37554e4SMatthew G Knepley packageObj.languageProvider = self.languages 64d37554e4SMatthew G Knepley packageObj.installDirProvider = self.petscdir 65d37554e4SMatthew G Knepley setattr(self, package.lower(), packageObj) 66d37554e4SMatthew G Knepley # Force blaslapack to depend on scalarType so precision is set before BlasLapack is built 678cf378d1SBarry Smith framework.require('PETSc.utilities.scalarTypes', self.blaslapack) 68f8833479SBarry Smith self.blaslapack.precisionProvider = self.scalartypes 69f8833479SBarry Smith 70f8833479SBarry Smith self.compilers.headerPrefix = self.headerPrefix 71f8833479SBarry Smith self.types.headerPrefix = self.headerPrefix 72f8833479SBarry Smith self.headers.headerPrefix = self.headerPrefix 73f8833479SBarry Smith self.functions.headerPrefix = self.headerPrefix 74f8833479SBarry Smith self.libraries.headerPrefix = self.headerPrefix 75f8833479SBarry Smith self.blaslapack.headerPrefix = self.headerPrefix 76f8833479SBarry Smith self.mpi.headerPrefix = self.headerPrefix 77f8833479SBarry Smith headersC = map(lambda name: name+'.h', ['dos', 'endian', 'fcntl', 'float', 'io', 'limits', 'malloc', 'pwd', 'search', 'strings', 78f8833479SBarry Smith 'unistd', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource', 79b4bb646cSSatish Balay 'sys/systeminfo', 'sys/times', 'sys/utsname','string', 'stdlib','memory', 80f8833479SBarry Smith 'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types', 81b014e56cSJed Brown 'WindowsX', 'cxxabi','float','ieeefp','stdint','fenv']) 82f8833479SBarry Smith functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 'getpwuid', 83f8833479SBarry Smith 'gettimeofday', 'getwd', 'memalign', 'memmove', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize', 84a6d0e24fSJed Brown 'readlink', 'realpath', 'sigaction', 'signal', 'sigset', 'nanosleep', 'usleep', 'sleep', '_sleep', 'socket', 85a6d0e24fSJed Brown 'times', 'gethostbyname', 'uname','snprintf','_snprintf','_fullpath','lseek','_lseek','time','fork','stricmp', 86a6d0e24fSJed Brown 'strcasecmp', 'bzero', 'dlopen', 'dlsym', 'dlclose', 'dlerror', 8764ffe704SBarry Smith '_intel_fast_memcpy','_intel_fast_memset'] 88f8833479SBarry Smith libraries1 = [(['socket', 'nsl'], 'socket'), (['fpe'], 'handle_sigfpes')] 89f8833479SBarry Smith self.headers.headers.extend(headersC) 90f8833479SBarry Smith self.functions.functions.extend(functions) 91f8833479SBarry Smith self.libraries.libraries.extend(libraries1) 92f8833479SBarry Smith return 93f8833479SBarry Smith 94f8833479SBarry Smith def Dump(self): 95f8833479SBarry Smith ''' Actually put the values into the configuration files ''' 96f8833479SBarry Smith # eventually everything between -- should be gone 97f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 98f8833479SBarry Smith 99f8833479SBarry Smith # Sometimes we need C compiler, even if built with C++ 100f8833479SBarry Smith self.setCompilers.pushLanguage('C') 101f8833479SBarry Smith self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 102f8833479SBarry Smith self.setCompilers.popLanguage() 103f8833479SBarry Smith 104f8833479SBarry Smith # C preprocessor values 105a2b1cf82SBarry Smith self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS+self.CHUD.CPPFLAGS) 106f8833479SBarry Smith 107f8833479SBarry Smith # compiler values 108f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 109f8833479SBarry Smith self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 110f8833479SBarry Smith self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 111f8833479SBarry Smith self.setCompilers.popLanguage() 112f8833479SBarry Smith # .o or .obj 113f8833479SBarry Smith self.addMakeMacro('CC_SUFFIX','o') 114f8833479SBarry Smith 115f8833479SBarry Smith # executable linker values 116f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 117f8833479SBarry Smith pcc_linker = self.setCompilers.getLinker() 118f8833479SBarry Smith self.addMakeMacro('PCC_LINKER',pcc_linker) 119c84a332bSSatish Balay self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 120f8833479SBarry Smith self.setCompilers.popLanguage() 121f8833479SBarry Smith # '' for Unix, .exe for Windows 122f8833479SBarry Smith self.addMakeMacro('CC_LINKER_SUFFIX','') 123f8833479SBarry Smith 124f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 125f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 126f8833479SBarry Smith # need FPPFLAGS in config/setCompilers 127f8833479SBarry Smith self.addDefine('HAVE_FORTRAN','1') 128f8833479SBarry Smith self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS) 129f8833479SBarry Smith 130f8833479SBarry Smith # compiler values 131f8833479SBarry Smith self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 132f8833479SBarry Smith self.setCompilers.popLanguage() 133f8833479SBarry Smith # .o or .obj 134f8833479SBarry Smith self.addMakeMacro('FC_SUFFIX','o') 135f8833479SBarry Smith 136f8833479SBarry Smith # executable linker values 137f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 138f8833479SBarry Smith # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker 139f8833479SBarry Smith fc_linker = self.setCompilers.getLinker() 140f8833479SBarry Smith if config.setCompilers.Configure.isNAG(fc_linker): 141f8833479SBarry Smith self.addMakeMacro('FC_LINKER',pcc_linker) 142f8833479SBarry Smith else: 143f8833479SBarry Smith self.addMakeMacro('FC_LINKER',fc_linker) 1446d53d35eSSatish Balay self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 1453feacd00SBarry Smith # apple requires this shared library linker flag on SOME versions of the os 1463feacd00SBarry Smith if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 1473feacd00SBarry Smith self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 148bb82cf9cSSatish Balay self.setCompilers.popLanguage() 1495d631499SMatthew Knepley 1505d631499SMatthew Knepley # F90 Modules 1515d631499SMatthew Knepley if self.setCompilers.fortranModuleIncludeFlag: 1525d631499SMatthew Knepley self.addMakeMacro('FC_MODULE_FLAG', self.setCompilers.fortranModuleIncludeFlag) 1536ddd6694SSatish Balay else: # for non-f90 compilers like g77 1546ddd6694SSatish Balay self.addMakeMacro('FC_MODULE_FLAG', '-I') 155a324c51cSMatthew G Knepley if self.setCompilers.fortranModuleIncludeFlag: 156a324c51cSMatthew G Knepley self.addMakeMacro('FC_MODULE_OUTPUT_FLAG', self.setCompilers.fortranModuleOutputFlag) 157f8833479SBarry Smith else: 158f8833479SBarry Smith self.addMakeMacro('FC','') 159f8833479SBarry Smith 16046a3958fSBarry Smith if hasattr(self.compilers, 'CUDAC'): 1617ff2890cSSatish Balay self.setCompilers.pushLanguage('CUDA') 162d93a25ecSSatish Balay self.addMakeMacro('CUDAC_FLAGS',self.setCompilers.getCompilerFlags()) 1637ff2890cSSatish Balay self.setCompilers.popLanguage() 1647ff2890cSSatish Balay 165f8833479SBarry Smith # shared library linker values 166f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 167f8833479SBarry Smith # need to fix BuildSystem to collect these separately 168f8833479SBarry Smith self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 16970db8aa6SSatish Balay self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 170f8833479SBarry Smith self.setCompilers.popLanguage() 171f8833479SBarry Smith # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 172f8833479SBarry Smith # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 173f8833479SBarry Smith if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 174f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', '') 17546bc77b6SBarry Smith self.addDefine('SLSUFFIX','""') 176f8833479SBarry Smith else: 177f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 17846bc77b6SBarry Smith self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"') 179bb82cf9cSSatish Balay 18023e93537SBarry Smith self.addMakeMacro('SL_LINKER_LIBS','${PETSC_EXTERNAL_LIB_BASIC}') 181bb82cf9cSSatish Balay 182f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 183f8833479SBarry Smith 184f8833479SBarry Smith # CONLY or CPP. We should change the PETSc makefiles to do this better 185f8833479SBarry Smith if self.languages.clanguage == 'C': lang = 'CONLY' 186f8833479SBarry Smith else: lang = 'CXXONLY' 187f8833479SBarry Smith self.addMakeMacro('PETSC_LANGUAGE',lang) 188f8833479SBarry Smith 189f8833479SBarry Smith # real or complex 190f8833479SBarry Smith self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 191f8833479SBarry Smith # double or float 192f8833479SBarry Smith self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 193f8833479SBarry Smith 194f8833479SBarry Smith if self.framework.argDB['with-batch']: 195f8833479SBarry Smith self.addMakeMacro('PETSC_WITH_BATCH','1') 196f8833479SBarry Smith 197f8833479SBarry Smith # Test for compiler-specific macros that need to be defined. 198b409243cSBarry Smith if self.setCompilers.isCrayVector('CC'): 199b409243cSBarry Smith self.addDefine('HAVE_CRAY_VECTOR','1') 200f8833479SBarry Smith 201f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 202f8833479SBarry Smith if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket'): 203f8833479SBarry Smith self.addDefine('USE_SOCKET_VIEWER','1') 204f8833479SBarry Smith 205f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 206a6cc6bb1SBarry Smith # print include and lib for makefiles 207f8833479SBarry Smith self.framework.packages.reverse() 208a6cc6bb1SBarry Smith includes = [os.path.join(self.petscdir.dir,'include'),os.path.join(self.petscdir.dir,self.arch.arch,'include')] 209996b3231SBarry Smith libs = [] 210f8833479SBarry Smith for i in self.framework.packages: 211898a086dSBarry Smith if i.useddirectly: 212898a086dSBarry Smith self.addDefine('HAVE_'+i.PACKAGE, 1) # ONLY list package if it is used directly by PETSc (and not only by another package) 213f8833479SBarry Smith if not isinstance(i.lib, list): 214f8833479SBarry Smith i.lib = [i.lib] 215ac9e4c42SSatish Balay libs.extend(i.lib) 21634cdeb2aSSatish Balay self.addMakeMacro(i.PACKAGE+'_LIB', self.libraries.toStringNoDupes(i.lib)) 217f8833479SBarry Smith if hasattr(i,'include'): 218f8833479SBarry Smith if not isinstance(i.include,list): 219f8833479SBarry Smith i.include = [i.include] 220ac9e4c42SSatish Balay includes.extend(i.include) 22134cdeb2aSSatish Balay self.addMakeMacro(i.PACKAGE+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 2222df986feSBarry Smith if self.framework.argDB['with-single-library']: 223ea820d49SSatish Balay self.addMakeMacro('PETSC_WITH_EXTERNAL_LIB',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.split(' '))+self.CHUD.LIBS) 22423e93537SBarry Smith self.addMakeMacro('PETSC_EXTERNAL_LIB_BASIC',self.libraries.toStringNoDupes(libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS) 22523e93537SBarry Smith self.PETSC_EXTERNAL_LIB_BASIC = self.libraries.toStringNoDupes(libs+self.libraries.math+self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS 226a6cc6bb1SBarry Smith self.addMakeMacro('PETSC_CC_INCLUDES',self.headers.toStringNoDupes(includes)) 227a6cc6bb1SBarry Smith self.PETSC_CC_INCLUDES = self.headers.toStringNoDupes(includes) 228cbd5cc15SBarry Smith if hasattr(self.compilers, 'FC'): 229208c3fd5SBarry Smith if self.compilers.fortranIsF90: 23043a63bfbSSatish Balay self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes,includes)) 23130d43657SSatish Balay else: 23230d43657SSatish Balay self.addMakeMacro('PETSC_FC_INCLUDES',self.headers.toStringNoDupes(includes)) 233f8833479SBarry Smith 2341b1e03dfSSatish Balay self.addMakeMacro('DESTDIR',self.installdir) 235c6f99f23SBarry Smith self.addDefine('LIB_DIR','"'+os.path.join(self.installdir,'lib')+'"') 236f8833479SBarry Smith 2370f3b21c2SBarry Smith if self.framework.argDB['with-single-library']: 2380f3b21c2SBarry Smith # overrides the values set in conf/variables 2390f3b21c2SBarry Smith self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 24057cb31baSSatish Balay self.addMakeMacro('SHLIBS','libpetsc') 241bccf1c12SBarry Smith self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 242797063a9SSatish Balay self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 243797063a9SSatish Balay self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 244bb84e0fdSBarry Smith self.addDefine('USE_SINGLE_LIBRARY', '1') 2452df986feSBarry Smith if self.sharedlibraries.useShared: 246ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 247ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 248ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 249ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 250ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 251ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 252ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 253fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 254ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 255ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${C_SH_LIB_PATH} ${PETSC_WITH_EXTERNAL_LIB}') 2562df986feSBarry Smith else: 257ea820d49SSatish Balay self.addMakeMacro('PETSC_SYS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 258ea820d49SSatish Balay self.addMakeMacro('PETSC_VEC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 259ea820d49SSatish Balay self.addMakeMacro('PETSC_MAT_LIB','${PETSC_WITH_EXTERNAL_LIB}') 260ea820d49SSatish Balay self.addMakeMacro('PETSC_DM_LIB','${PETSC_WITH_EXTERNAL_LIB}') 261ea820d49SSatish Balay self.addMakeMacro('PETSC_KSP_LIB','${PETSC_WITH_EXTERNAL_LIB}') 262ea820d49SSatish Balay self.addMakeMacro('PETSC_SNES_LIB','${PETSC_WITH_EXTERNAL_LIB}') 263ea820d49SSatish Balay self.addMakeMacro('PETSC_TS_LIB','${PETSC_WITH_EXTERNAL_LIB}') 264fdb87e33SJed Brown self.addMakeMacro('PETSC_CHARACTERISTIC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 265ea820d49SSatish Balay self.addMakeMacro('PETSC_LIB','${PETSC_WITH_EXTERNAL_LIB}') 266ea820d49SSatish Balay self.addMakeMacro('PETSC_CONTRIB','${PETSC_WITH_EXTERNAL_LIB}') 2670f3b21c2SBarry Smith 268f8833479SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 269f8833479SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 270f8833479SBarry Smith 271f8833479SBarry Smith # add a makefile entry for configure options 272f8833479SBarry Smith self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 273f8833479SBarry Smith return 274f8833479SBarry Smith 275f8833479SBarry Smith def dumpConfigInfo(self): 276f8833479SBarry Smith import time 277f8833479SBarry Smith fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 278f8833479SBarry Smith fd.write('static const char *petscconfigureruntime = "'+time.ctime(time.time())+'";\n') 279f8833479SBarry Smith fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 280f8833479SBarry Smith fd.close() 281f8833479SBarry Smith return 282f8833479SBarry Smith 2832a4161d9SMatthew G Knepley def dumpMachineInfo(self): 2842a4161d9SMatthew G Knepley import platform 2852a4161d9SMatthew G Knepley import time 28640373944SSatish Balay import script 2872a4161d9SMatthew G Knepley fd = file(os.path.join(self.arch.arch,'include','petscmachineinfo.h'),'w') 2882a4161d9SMatthew G Knepley fd.write('static const char *petscmachineinfo = \"\\n\"\n') 2892a4161d9SMatthew G Knepley fd.write('\"-----------------------------------------\\n\"\n') 2902a4161d9SMatthew G Knepley fd.write('\"Libraries compiled on %s on %s \\n\"\n' % (time.ctime(time.time()), platform.node())) 29160acdfe7SSatish Balay fd.write('\"Machine characteristics: %s\\n\"\n' % (platform.platform())) 29260acdfe7SSatish Balay fd.write('\"Using PETSc directory: %s\\n\"\n' % (self.petscdir.dir)) 29360acdfe7SSatish Balay fd.write('\"Using PETSc arch: %s\\n\"\n' % (self.arch.arch)) 294cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 2952a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerinfo = \"\\n\"\n') 2962a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 29760acdfe7SSatish Balay fd.write('\"Using C compiler: %s %s ${COPTFLAGS} ${CFLAGS}\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags())) 2982a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 2998782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 3002a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 30160acdfe7SSatish Balay fd.write('\"Using Fortran compiler: %s %s ${FOPTFLAGS} ${FFLAGS} %s\\n\"\n' % (self.setCompilers.getCompiler(), self.setCompilers.getCompilerFlags(), self.setCompilers.CPPFLAGS)) 3022a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 303cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3042a4161d9SMatthew G Knepley fd.write('static const char *petsccompilerflagsinfo = \"\\n\"\n') 305a6cc6bb1SBarry Smith fd.write('\"Using include paths: %s %s %s\\n\"\n' % ('-I'+os.path.join(self.petscdir.dir, self.arch.arch, 'include'), '-I'+os.path.join(self.petscdir.dir, 'include'), self.PETSC_CC_INCLUDES)) 306cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3072a4161d9SMatthew G Knepley fd.write('static const char *petsclinkerinfo = \"\\n\"\n') 3082a4161d9SMatthew G Knepley self.setCompilers.pushLanguage(self.languages.clanguage) 30960acdfe7SSatish Balay fd.write('\"Using C linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 3102a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 3118782282cSMatthew G Knepley if hasattr(self.compilers, 'FC'): 3122a4161d9SMatthew G Knepley self.setCompilers.pushLanguage('FC') 31360acdfe7SSatish Balay fd.write('\"Using Fortran linker: %s\\n\"\n' % (self.setCompilers.getLinker())) 3142a4161d9SMatthew G Knepley self.setCompilers.popLanguage() 31523e93537SBarry Smith fd.write('\"Using libraries: %s%s -L%s %s %s\\n\"\n' % (self.setCompilers.CSharedLinkerFlag, os.path.join(self.petscdir.dir, self.arch.arch, 'lib'), os.path.join(self.petscdir.dir, self.arch.arch, 'lib'), '-lpetscts -lpetscsnes -lpetscksp -lpetscdm -lpetscmat -lpetscvec -lpetscsys', self.PETSC_EXTERNAL_LIB_BASIC)) 316cdec380aSBarry Smith fd.write('\"-----------------------------------------\\n\";\n') 3172a4161d9SMatthew G Knepley fd.close() 3182a4161d9SMatthew G Knepley return 319b2843cf1SBarry Smith 320511a6afcSJed Brown def dumpCMakeConfig(self): 321511a6afcSJed Brown ''' 32234ed7027SBarry Smith Writes configuration-specific values to ${PETSC_ARCH}/conf/PETScConfig.cmake. 323511a6afcSJed Brown This file is private to PETSc and should not be included by third parties 324511a6afcSJed Brown (a suitable file can be produced later by CMake, but this is not it). 325511a6afcSJed Brown ''' 326511a6afcSJed Brown def cmakeset(fd,key,val=True): 327511a6afcSJed Brown if val == True: val = 'YES' 328511a6afcSJed Brown if val == False: val = 'NO' 329511a6afcSJed Brown fd.write('set (' + key + ' ' + val + ')\n') 330511a6afcSJed Brown def ensurelist(a): 331826d9344SJed Brown if isinstance(a,list): 332826d9344SJed Brown return a 333826d9344SJed Brown else: 334826d9344SJed Brown return [a] 335511a6afcSJed Brown def libpath(lib): 336511a6afcSJed Brown 'Returns a search path if that is what this item provides, else "" which will be cleaned out later' 337511a6afcSJed Brown if lib.startswith('-L'): return lib[2:] 338511a6afcSJed Brown if lib.startswith('-R'): return lib[2:] 339511a6afcSJed Brown if lib.startswith('-Wl,-rpath,'): 340511a6afcSJed Brown # This case occurs when an external package needs a specific system library that is normally provided by the compiler. 341511a6afcSJed Brown # In other words, the -L path is builtin to the wrapper or compiler, here we provide it so that CMake can locate the 342511a6afcSJed Brown # corresponding library. 343511a6afcSJed Brown return lib[len('-Wl,-rpath,'):] 344511a6afcSJed Brown if lib.startswith('-'): return '' 345511a6afcSJed Brown return os.path.dirname(lib) 346511a6afcSJed Brown def cleanlib(lib): 347511a6afcSJed Brown 'Returns a library name if that is what this item provides, else "" which will be cleaned out later' 348511a6afcSJed Brown if lib.startswith('-l'): return lib[2:] 349511a6afcSJed Brown if lib.startswith('-Wl') or lib.startswith('-L'): return '' 350511a6afcSJed Brown lib = os.path.splitext(os.path.basename(lib))[0] 351511a6afcSJed Brown if lib.startswith('lib'): return lib[3:] 352511a6afcSJed Brown return lib 353511a6afcSJed Brown def nub(lst): 354511a6afcSJed Brown unique = [] 355511a6afcSJed Brown for elem in lst: 356511a6afcSJed Brown if elem not in unique and elem != '': 357511a6afcSJed Brown unique.append(elem) 358511a6afcSJed Brown return unique 359511a6afcSJed Brown def cmakeexpand(varname): 360511a6afcSJed Brown return r'"${' + varname + r'}"' 361582751aaSJed Brown def uniqextend(lst,new): 362511a6afcSJed Brown for x in ensurelist(new): 363582751aaSJed Brown if x not in lst: 364582751aaSJed Brown lst.append(x) 365511a6afcSJed Brown def notstandardinclude(path): 366511a6afcSJed Brown return path not in '/usr/include /usr/local/include'.split() 367511a6afcSJed Brown def writeMacroDefinitions(fd): 368511a6afcSJed Brown if self.mpi.usingMPIUni: 369511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_MPIUNI') 370511a6afcSJed Brown for pkg in self.framework.packages: 371511a6afcSJed Brown if pkg.useddirectly: 372511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_' + pkg.PACKAGE) 373511a6afcSJed Brown for name,val in self.functions.defines.items(): 374511a6afcSJed Brown cmakeset(fd,'PETSC_'+name,val) 375511a6afcSJed Brown for dct in [self.defines, self.libraryoptions.defines]: 376511a6afcSJed Brown for k,v in dct.items(): 377511a6afcSJed Brown if k.startswith('USE_'): 378511a6afcSJed Brown cmakeset(fd,'PETSC_' + k, v) 379511a6afcSJed Brown cmakeset(fd,'PETSC_USE_COMPLEX', self.scalartypes.scalartype == 'complex') 380511a6afcSJed Brown cmakeset(fd,'PETSC_USE_SCALAR_' + self.scalartypes.precision.upper()) 381511a6afcSJed Brown cmakeset(fd,'PETSC_CLANGUAGE_'+self.languages.clanguage) 382511a6afcSJed Brown if hasattr(self.compilers, 'FC'): 383511a6afcSJed Brown cmakeset(fd,'PETSC_HAVE_FORTRAN') 384511a6afcSJed Brown if self.compilers.fortranIsF90: 385511a6afcSJed Brown cmakeset(fd,'PETSC_USING_F90') 386511a6afcSJed Brown if self.sharedlibraries.useShared: 387511a6afcSJed Brown cmakeset(fd,'BUILD_SHARED_LIBS') 388511a6afcSJed Brown def writeBuildFlags(fd): 389511a6afcSJed Brown lib_paths = [] 390511a6afcSJed Brown lib_libs = [] 391511a6afcSJed Brown includes = [] 392511a6afcSJed Brown libvars = [] 393511a6afcSJed Brown for pkg in self.framework.packages: 394511a6afcSJed Brown libs = ensurelist(pkg.lib) 395511a6afcSJed Brown lib_paths.extend(map(libpath,libs)) 396511a6afcSJed Brown lib_libs.extend(map(cleanlib,libs)) 397511a6afcSJed Brown uniqextend(includes,pkg.include) 39890dd2285SSatish Balay if self.libraries.math: lib_libs.extend(map(cleanlib,self.libraries.math)) 39990dd2285SSatish Balay if self.libraries.rt: lib_libs.extend(map(cleanlib,self.libraries.rt)) 400511a6afcSJed Brown for libname in nub(lib_libs): 401511a6afcSJed Brown libvar = 'PETSC_' + libname.upper() + '_LIB' 4024c0032a9SSatish Balay addpath = '' 4034c0032a9SSatish Balay for lpath in nub(lib_paths): 4044c0032a9SSatish Balay addpath += '"' + str(lpath) + '" ' 4054c0032a9SSatish Balay fd.write('find_library (' + libvar + ' ' + libname + ' HINTS ' + addpath + ')\n') 406511a6afcSJed Brown libvars.append(libvar) 407511a6afcSJed Brown fd.write('mark_as_advanced (' + ' '.join(libvars) + ')\n') 408511a6afcSJed Brown fd.write('set (PETSC_PACKAGE_LIBS ' + ' '.join(map(cmakeexpand,libvars)) + ')\n') 409511a6afcSJed Brown fd.write('set (PETSC_PACKAGE_INCLUDES ' + ' '.join(map(lambda i: '"'+i+'"',filter(notstandardinclude,includes))) + ')\n') 410511a6afcSJed Brown fd = open(os.path.join(self.arch.arch,'conf','PETScConfig.cmake'), 'w') 411511a6afcSJed Brown writeMacroDefinitions(fd) 412511a6afcSJed Brown writeBuildFlags(fd) 413511a6afcSJed Brown fd.close() 414511a6afcSJed Brown return 415511a6afcSJed Brown 4168b0282a9SJed Brown def dumpCMakeLists(self): 4178b0282a9SJed Brown import sys 4188b0282a9SJed Brown if sys.version_info >= (2,5): 4198b0282a9SJed Brown import cmakegen 4208b0282a9SJed Brown try: 4218b0282a9SJed Brown cmakegen.main(self.petscdir.dir) 4228b0282a9SJed Brown except (OSError), e: 4238b0282a9SJed Brown self.framework.logPrint('Generating CMakeLists.txt failed:\n' + str(e)) 4248b0282a9SJed Brown 4258b0282a9SJed Brown def cmakeBoot(self): 4268b0282a9SJed Brown import sys 4270b7111d2SJed Brown if sys.version_info >= (2,5) and hasattr(self.cmake,'cmake'): 428356464bcSMatthew G Knepley try: 4298b0282a9SJed Brown import cmakeboot 430*7c9cf364SJed Brown cmakeboot.main(petscdir=self.petscdir.dir,petscarch=self.arch.arch,argDB=self.argDB,framework=self.framework,log=self.framework.log) 4318b0282a9SJed Brown except (OSError), e: 4328b0282a9SJed Brown self.framework.logPrint('Booting CMake in PETSC_ARCH failed:\n' + str(e)) 433356464bcSMatthew G Knepley except (ImportError, KeyError), e: 434356464bcSMatthew G Knepley self.framework.logPrint('Importing cmakeboot failed:\n' + str(e)) 435356464bcSMatthew G Knepley return 4368b0282a9SJed Brown 437b2843cf1SBarry Smith def configurePrefetch(self): 438b2843cf1SBarry Smith '''Sees if there are any prefetch functions supported''' 4393649974fSBarry Smith if config.setCompilers.Configure.isSolaris() or self.framework.argDB['with-iphone'] or self.framework.argDB['with-cuda']: 44093f78423SSatish Balay self.addDefine('Prefetch(a,b,c)', ' ') 44193f78423SSatish Balay return 442ec284106SBarry Smith self.pushLanguage(self.languages.clanguage) 44310699583SJed Brown if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,_MM_HINT_NTA);\n'): 44450d8bf02SJed Brown # The Intel Intrinsics manual [1] specifies the prototype 44550d8bf02SJed Brown # 44650d8bf02SJed Brown # void _mm_prefetch(char const *a, int sel); 44750d8bf02SJed Brown # 44850d8bf02SJed Brown # but other vendors seem to insist on using subtly different 44950d8bf02SJed Brown # prototypes, including void* for the pointer, and an enum for 45050d8bf02SJed Brown # sel. These are both reasonable changes, but negatively impact 45150d8bf02SJed Brown # portability. 45250d8bf02SJed Brown # 45350d8bf02SJed Brown # [1] http://software.intel.com/file/6373 45450d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 45550d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(c))') 45650d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 45750d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 45850d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 45950d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 46050d8bf02SJed Brown elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,_MM_HINT_NTA);\n'): 46150d8bf02SJed Brown self.addDefine('HAVE_XMMINTRIN_H', 1) 46250d8bf02SJed Brown self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const void*)(a),(c))') 46350d8bf02SJed Brown self.addDefine('PREFETCH_HINT_NTA', '_MM_HINT_NTA') 46450d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T0', '_MM_HINT_T0') 46550d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T1', '_MM_HINT_T1') 46650d8bf02SJed Brown self.addDefine('PREFETCH_HINT_T2', '_MM_HINT_T2') 46710699583SJed Brown elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 46810699583SJed Brown # From GCC docs: void __builtin_prefetch(const void *addr,int rw,int locality) 46910699583SJed Brown # 47010699583SJed Brown # The value of rw is a compile-time constant one or zero; one 47110699583SJed Brown # means that the prefetch is preparing for a write to the memory 47210699583SJed Brown # address and zero, the default, means that the prefetch is 47310699583SJed Brown # preparing for a read. The value locality must be a compile-time 47410699583SJed Brown # constant integer between zero and three. A value of zero means 47510699583SJed Brown # that the data has no temporal locality, so it need not be left 47610699583SJed Brown # in the cache after the access. A value of three means that the 47710699583SJed Brown # data has a high degree of temporal locality and should be left 47810699583SJed Brown # in all levels of cache possible. Values of one and two mean, 47910699583SJed Brown # respectively, a low or moderate degree of temporal locality. 48010699583SJed Brown # 48110699583SJed Brown # Here we adopt Intel's x86/x86-64 naming scheme for the locality 48210699583SJed Brown # hints. Using macros for these values in necessary since some 48310699583SJed Brown # compilers require an enum. 48410699583SJed Brown self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch((a),(b),(c))') 48510699583SJed Brown self.addDefine('PREFETCH_HINT_NTA', '0') 48610699583SJed Brown self.addDefine('PREFETCH_HINT_T0', '3') 48710699583SJed Brown self.addDefine('PREFETCH_HINT_T1', '2') 48810699583SJed Brown self.addDefine('PREFETCH_HINT_T2', '1') 489b2843cf1SBarry Smith else: 490b2843cf1SBarry Smith self.addDefine('Prefetch(a,b,c)', ' ') 4917d490b44SBarry Smith self.popLanguage() 492b2843cf1SBarry Smith 4932400fdedSBarry Smith def configureUnused(self): 4942400fdedSBarry Smith '''Sees if __attribute((unused)) is supported''' 4952400fdedSBarry Smith if self.framework.argDB['with-iphone'] or self.framework.argDB['with-cuda']: 4962400fdedSBarry Smith self.addDefine('UNUSED', ' ') 4972400fdedSBarry Smith return 4982400fdedSBarry Smith self.pushLanguage(self.languages.clanguage) 4992400fdedSBarry Smith if self.checkLink('__attribute((unused)) static int myfunc(void){ return 1;}', 'int i = myfunc();\n'): 5002400fdedSBarry Smith self.addDefine('UNUSED', '__attribute((unused))') 5012400fdedSBarry Smith else: 5022400fdedSBarry Smith self.addDefine('UNUSED', ' ') 5032400fdedSBarry Smith self.popLanguage() 5042400fdedSBarry Smith 5059800092aSJed Brown def configureExpect(self): 5069800092aSJed Brown '''Sees if the __builtin_expect directive is supported''' 5079800092aSJed Brown self.pushLanguage(self.languages.clanguage) 5089800092aSJed Brown if self.checkLink('', 'if (__builtin_expect(0,1)) return 1;'): 5099800092aSJed Brown self.addDefine('HAVE_BUILTIN_EXPECT', 1) 5109800092aSJed Brown self.popLanguage() 5119800092aSJed Brown 51253c77d0aSJed Brown def configureFunctionName(self): 5131ec50b02SJed Brown '''Sees if the compiler supports __func__ or a variant. Falls back 5141ec50b02SJed Brown on __FUNCT__ which PETSc source defines, but most users do not, thus 5151ec50b02SJed Brown stack traces through user code are better when the compiler's 5161ec50b02SJed Brown variant is used.''' 5171ec50b02SJed Brown def getFunctionName(lang): 5181ec50b02SJed Brown name = '__FUNCT__' 5191ec50b02SJed Brown self.pushLanguage(lang) 52053c77d0aSJed Brown if self.checkLink('', "if (__func__[0] != 'm') return 1;"): 5211ec50b02SJed Brown name = '__func__' 52253c77d0aSJed Brown elif self.checkLink('', "if (__FUNCTION__[0] != 'm') return 1;"): 5231ec50b02SJed Brown name = '__FUNCTION__' 5241ec50b02SJed Brown self.popLanguage() 5251ec50b02SJed Brown return name 5261ec50b02SJed Brown langs = [] 527628773c9SSatish Balay 528628773c9SSatish Balay self.addDefine('FUNCTION_NAME_C', getFunctionName('C')) 529628773c9SSatish Balay if hasattr(self.compilers, 'CXX'): 530628773c9SSatish Balay self.addDefine('FUNCTION_NAME_CXX', getFunctionName('Cxx')) 53112607bf0SSatish Balay else: 53212607bf0SSatish Balay self.addDefine('FUNCTION_NAME_CXX', '__FUNCT__') 53353c77d0aSJed Brown 534753ebd1dSJed Brown def configureIntptrt(self): 535753ebd1dSJed Brown '''Determine what to use for uintptr_t''' 536753ebd1dSJed Brown def staticAssertSizeMatchesVoidStar(inc,typename): 537753ebd1dSJed Brown # The declaration is an error if either array size is negative. 538753ebd1dSJed 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 539d26187a0SJed Brown return self.checkCompile(inc, ('#define STATIC_ASSERT(cond) char negative_length_if_false[2*(!!(cond))-1]\n' 540979939cdSSatish Balay + 'STATIC_ASSERT(sizeof(void*) == sizeof(%s));'%typename)) 541753ebd1dSJed Brown self.pushLanguage(self.languages.clanguage) 542753ebd1dSJed Brown if self.checkCompile('#include <stdint.h>', 'int x; uintptr_t i = (uintptr_t)&x;'): 543753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'uintptr_t') 544753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long long'): 545753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned long long') 546753ebd1dSJed Brown elif staticAssertSizeMatchesVoidStar('#include <stdlib.h>','size_t') or staticAssertSizeMatchesVoidStar('#include <string.h>', 'size_t'): 547753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'size_t') 548c82284b1SJed Brown elif staticAssertSizeMatchesVoidStar('','unsigned long'): 549c82284b1SJed Brown self.addDefine('UINTPTR_T', 'unsigned long') 5502d1b7972SSatish Balay elif staticAssertSizeMatchesVoidStar('','unsigned'): 551753ebd1dSJed Brown self.addDefine('UINTPTR_T', 'unsigned') 552d26187a0SJed Brown else: 553d26187a0SJed Brown raise RuntimeError('Could not find any unsigned integer type matching void*') 554753ebd1dSJed Brown self.popLanguage() 555753ebd1dSJed Brown 556f8833479SBarry Smith def configureInline(self): 557f8833479SBarry Smith '''Get a generic inline keyword, depending on the language''' 558f8833479SBarry Smith if self.languages.clanguage == 'C': 559f8833479SBarry Smith self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword) 560f8833479SBarry Smith self.addDefine('RESTRICT', self.compilers.cRestrict) 561f8833479SBarry Smith elif self.languages.clanguage == 'Cxx': 562f8833479SBarry Smith self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword) 563f8833479SBarry Smith self.addDefine('RESTRICT', self.compilers.cxxRestrict) 564f8833479SBarry Smith return 565f8833479SBarry Smith 566f8833479SBarry Smith def configureSolaris(self): 567f8833479SBarry Smith '''Solaris specific stuff''' 568f8833479SBarry Smith if os.path.isdir(os.path.join('/usr','ucblib')): 569f8833479SBarry Smith try: 570f8833479SBarry Smith flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 571f8833479SBarry Smith except AttributeError: 572f8833479SBarry Smith flag = None 573f8833479SBarry Smith if flag is None: 574f8833479SBarry Smith self.compilers.LIBS += ' -L/usr/ucblib' 575f8833479SBarry Smith else: 576f8833479SBarry Smith self.compilers.LIBS += ' '+flag+'/usr/ucblib' 577f8833479SBarry Smith return 578f8833479SBarry Smith 579f8833479SBarry Smith def configureLinux(self): 580f8833479SBarry Smith '''Linux specific stuff''' 5819f15855cSMatthew G Knepley # TODO: Test for this by mallocing an odd number of floats and checking the address 582f8833479SBarry Smith self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 583f8833479SBarry Smith return 584f8833479SBarry Smith 585f8833479SBarry Smith def configureWin32(self): 586f8833479SBarry Smith '''Win32 non-cygwin specific stuff''' 587f8833479SBarry Smith kernel32=0 588f8833479SBarry Smith if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 589f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 590f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 591f8833479SBarry Smith kernel32=1 592f8833479SBarry Smith elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 593f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 594f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 595f8833479SBarry Smith kernel32=1 596f8833479SBarry Smith if kernel32: 597eed94e11SSatish Balay if self.framework.argDB['with-windows-graphics']: 598eed94e11SSatish Balay self.addDefine('USE_WINDOWS_GRAPHICS',1) 599f8833479SBarry Smith if self.checkLink('#include <Windows.h>','LoadLibrary(0)'): 600f8833479SBarry Smith self.addDefine('HAVE_LOADLIBRARY',1) 601b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'): 602b50f6d9eSLisandro Dalcin self.addDefine('HAVE_GETPROCADDRESS',1) 603b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','FreeLibrary(0)'): 604b50f6d9eSLisandro Dalcin self.addDefine('HAVE_FREELIBRARY',1) 605a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','GetLastError()'): 606a21658a3SLisandro Dalcin self.addDefine('HAVE_GETLASTERROR',1) 607a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','SetLastError(0)'): 608a21658a3SLisandro Dalcin self.addDefine('HAVE_SETLASTERROR',1) 609f8833479SBarry Smith if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'): 610f8833479SBarry Smith self.addDefine('USE_NT_TIME',1) 611f8833479SBarry Smith if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 612f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 613f8833479SBarry Smith elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 614f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 615f8833479SBarry Smith 616f8833479SBarry Smith if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'): 617f8833479SBarry Smith self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);') 618f8833479SBarry Smith if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'): 619f8833479SBarry Smith self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);') 620f8833479SBarry Smith 621f8833479SBarry Smith self.types.check('int32_t', 'int') 622f8833479SBarry Smith if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 623f8833479SBarry Smith self.addTypedef('int', 'uid_t') 624f8833479SBarry Smith self.addTypedef('int', 'gid_t') 625f8833479SBarry Smith if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 626f8833479SBarry Smith self.framework.addDefine('R_OK', '04') 627f8833479SBarry Smith self.framework.addDefine('W_OK', '02') 628f8833479SBarry Smith self.framework.addDefine('X_OK', '01') 629f8833479SBarry Smith if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 630f8833479SBarry Smith self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 631f8833479SBarry Smith self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 632f8833479SBarry Smith if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 633f8833479SBarry Smith self.addDefine('HAVE_LARGE_INTEGER_U',1) 634f8833479SBarry Smith 635f8833479SBarry Smith # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 636f8833479SBarry Smith if self.checkCompile('#include <Windows.h>\n',''): 637f8833479SBarry Smith self.addDefine('HAVE_O_BINARY',1) 638f8833479SBarry Smith 639f8833479SBarry Smith if self.compilers.CC.find('win32fe') >= 0: 640f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\';\'') 641f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'\\\\\'') 642f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 643f8833479SBarry Smith self.addDefine('CANNOT_START_DEBUGGER',1) 644f8833479SBarry Smith else: 645f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\':\'') 646f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 647f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'/\'') 648f8833479SBarry Smith return 649f8833479SBarry Smith 650f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 651569865ddSSatish Balay def configureDefaultArch(self): 652569865ddSSatish Balay conffile = os.path.join('conf', 'petscvariables') 653569865ddSSatish Balay if self.framework.argDB['with-default-arch']: 654569865ddSSatish Balay fd = file(conffile, 'w') 655569865ddSSatish Balay fd.write('PETSC_ARCH='+self.arch.arch+'\n') 656da93591fSBarry Smith fd.write('PETSC_DIR='+self.petscdir.dir+'\n') 657569865ddSSatish Balay fd.write('include ${PETSC_DIR}/${PETSC_ARCH}/conf/petscvariables\n') 658569865ddSSatish Balay fd.close() 659569865ddSSatish Balay self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 660569865ddSSatish Balay elif os.path.isfile(conffile): 661569865ddSSatish Balay try: 662569865ddSSatish Balay os.unlink(conffile) 663569865ddSSatish Balay except: 664569865ddSSatish Balay raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 665569865ddSSatish Balay return 666569865ddSSatish Balay 667569865ddSSatish Balay#----------------------------------------------------------------------------------------------------- 668f8833479SBarry Smith def configureScript(self): 669f8833479SBarry Smith '''Output a script in the conf directory which will reproduce the configuration''' 670f8833479SBarry Smith import nargs 671495bf1a9SSatish Balay import sys 672495bf1a9SSatish Balay scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py') 673f8833479SBarry Smith args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 674f8833479SBarry Smith if 'configModules' in args: 6751063a081SSatish Balay if nargs.Arg.parseArgument(args['configModules'])[1] == 'PETSc.Configure': 676f8833479SBarry Smith del args['configModules'] 677f8833479SBarry Smith if 'optionsModule' in args: 678c1486898SMatthew Knepley if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions': 679f8833479SBarry Smith del args['optionsModule'] 680f8833479SBarry Smith if not 'PETSC_ARCH' in args: 6811063a081SSatish Balay args['PETSC_ARCH'] = 'PETSC_ARCH='+str(self.arch.arch) 682f8833479SBarry Smith f = file(scriptName, 'w') 683495bf1a9SSatish Balay f.write('#!'+sys.executable+'\n') 684f8833479SBarry Smith f.write('if __name__ == \'__main__\':\n') 685f8833479SBarry Smith f.write(' import sys\n') 6867561c02cSSatish Balay f.write(' import os\n') 6877561c02cSSatish Balay f.write(' sys.path.insert(0, os.path.abspath(\'config\'))\n') 688f8833479SBarry Smith f.write(' import configure\n') 6891063a081SSatish Balay # pretty print repr(args.values()) 6901063a081SSatish Balay f.write(' configure_options = [\n') 6911063a081SSatish Balay for itm in args.values(): 6921063a081SSatish Balay f.write(' \''+str(itm)+'\',\n') 6931063a081SSatish Balay f.write(' ]\n') 694f8833479SBarry Smith f.write(' configure.petsc_configure(configure_options)\n') 695f8833479SBarry Smith f.close() 696f8833479SBarry Smith try: 697f8833479SBarry Smith os.chmod(scriptName, 0775) 698f8833479SBarry Smith except OSError, e: 699f8833479SBarry Smith self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 700f8833479SBarry Smith self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 701f8833479SBarry Smith return 702f8833479SBarry Smith 703f8833479SBarry Smith def configureInstall(self): 704f8833479SBarry Smith '''Setup the directories for installation''' 705f8833479SBarry Smith if self.framework.argDB['prefix']: 706f8833479SBarry Smith self.installdir = self.framework.argDB['prefix'] 707824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do:"',\ 708824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} install"',\ 709315b77e6SSatish Balay '-@echo "========================================="']) 710f8833479SBarry Smith else: 711b559b537SSatish Balay self.installdir = os.path.join(self.petscdir.dir,self.arch.arch) 712824e893fSSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do:"',\ 713824e893fSSatish Balay '-@echo "make PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} test"',\ 714315b77e6SSatish Balay '-@echo "========================================="']) 715f8833479SBarry Smith return 716f8833479SBarry Smith 717f8833479SBarry Smith def configureGCOV(self): 718f8833479SBarry Smith if self.framework.argDB['with-gcov']: 719f8833479SBarry Smith self.addDefine('USE_GCOV','1') 720f8833479SBarry Smith return 721f8833479SBarry Smith 722f8833479SBarry Smith def configureFortranFlush(self): 723f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 724f8833479SBarry Smith for baseName in ['flush','flush_']: 725f8833479SBarry Smith if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1): 726f8833479SBarry Smith self.addDefine('HAVE_'+baseName.upper(), 1) 727f8833479SBarry Smith return 728f8833479SBarry Smith 729f8833479SBarry Smith 730f8833479SBarry Smith def configure(self): 731f8833479SBarry Smith if not os.path.samefile(self.petscdir.dir, os.getcwd()): 732f8833479SBarry Smith raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 733550489e3SMatthew 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): 7343552d8fbSSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR!') 735c16c35a9SSatish 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)): 736c16c35a9SSatish Balay raise RuntimeError('Incorrect option --prefix='+self.framework.argDB['prefix']+' specified. It cannot be same as PETSC_DIR/PETSC_ARCH!') 737f16c1317SJed Brown self.framework.header = os.path.join(self.arch.arch,'include','petscconf.h') 738f16c1317SJed Brown self.framework.cHeader = os.path.join(self.arch.arch,'include','petscfix.h') 739f16c1317SJed Brown self.framework.makeMacroHeader = os.path.join(self.arch.arch,'conf','petscvariables') 740f16c1317SJed Brown self.framework.makeRuleHeader = os.path.join(self.arch.arch,'conf','petscrules') 741f8833479SBarry Smith if self.libraries.math is None: 742f8833479SBarry Smith raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 743f8833479SBarry Smith if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 744f8833479SBarry Smith raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 745f8833479SBarry Smith self.executeTest(self.configureInline) 746b2843cf1SBarry Smith self.executeTest(self.configurePrefetch) 7472400fdedSBarry Smith self.executeTest(self.configureUnused) 7489800092aSJed Brown self.executeTest(self.configureExpect); 74953c77d0aSJed Brown self.executeTest(self.configureFunctionName); 750753ebd1dSJed Brown self.executeTest(self.configureIntptrt); 751f8833479SBarry Smith self.executeTest(self.configureSolaris) 752f8833479SBarry Smith self.executeTest(self.configureLinux) 753f8833479SBarry Smith self.executeTest(self.configureWin32) 754569865ddSSatish Balay self.executeTest(self.configureDefaultArch) 755f8833479SBarry Smith self.executeTest(self.configureScript) 756f8833479SBarry Smith self.executeTest(self.configureInstall) 757f8833479SBarry Smith self.executeTest(self.configureGCOV) 758f8833479SBarry Smith self.executeTest(self.configureFortranFlush) 759f8833479SBarry Smith # dummy rules, always needed except for remote builds 760f8833479SBarry Smith self.addMakeRule('remote','') 761f8833479SBarry Smith self.addMakeRule('remoteclean','') 762f8833479SBarry Smith 763f8833479SBarry Smith self.Dump() 764f8833479SBarry Smith self.dumpConfigInfo() 7652a4161d9SMatthew G Knepley self.dumpMachineInfo() 766511a6afcSJed Brown self.dumpCMakeConfig() 7678b0282a9SJed Brown self.dumpCMakeLists() 7688b0282a9SJed Brown self.cmakeBoot() 769f8833479SBarry Smith self.framework.log.write('================================================================================\n') 770f8833479SBarry Smith self.logClear() 771f8833479SBarry Smith return 772