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 self.defineAutoconfMacros() 12f8833479SBarry Smith return 13f8833479SBarry Smith 14f8833479SBarry Smith def __str__(self): 15f8833479SBarry Smith return '' 16f8833479SBarry Smith 17f8833479SBarry Smith def setupHelp(self, help): 18f8833479SBarry Smith import nargs 19f8833479SBarry Smith help.addArgument('PETSc', '-prefix=<path>', nargs.Arg(None, '', 'Specifiy location to install PETSc (eg. /usr/local)')) 20eed94e11SSatish Balay help.addArgument('Windows','-with-windows-graphics=<bool>', nargs.ArgBool(None, 1,'Enable check for Windows Graphics')) 21569865ddSSatish Balay help.addArgument('PETSc', '-with-default-arch=<bool>', nargs.ArgBool(None, 1, 'Allow using the last configured arch without setting PETSC_ARCH')) 220f3b21c2SBarry Smith help.addArgument('PETSc','-with-single-library=<bool>', nargs.ArgBool(None, 0,'Put all PETSc code into the single -lpetsc library')) 23eed94e11SSatish Balay 24f8833479SBarry Smith return 25f8833479SBarry Smith 26f8833479SBarry Smith def setupDependencies(self, framework): 27f8833479SBarry Smith config.base.Configure.setupDependencies(self, framework) 28f8833479SBarry Smith self.setCompilers = framework.require('config.setCompilers', self) 29f8833479SBarry Smith self.arch = framework.require('PETSc.utilities.arch', self.setCompilers) 30f8833479SBarry Smith self.petscdir = framework.require('PETSc.utilities.petscdir', self.setCompilers) 31f8833479SBarry Smith self.languages = framework.require('PETSc.utilities.languages',self.setCompilers) 32f8833479SBarry Smith self.debugging = framework.require('PETSc.utilities.debugging',self.setCompilers) 338397fe1aSBarry Smith self.make = framework.require('PETSc.utilities.Make', self) 34a2b1cf82SBarry Smith self.CHUD = framework.require('PETSc.utilities.CHUD', self) 35f8833479SBarry Smith self.compilers = framework.require('config.compilers', self) 36f8833479SBarry Smith self.types = framework.require('config.types', self) 37f8833479SBarry Smith self.headers = framework.require('config.headers', self) 38f8833479SBarry Smith self.functions = framework.require('config.functions', self) 39f8833479SBarry Smith self.libraries = framework.require('config.libraries', self) 40f8833479SBarry Smith if os.path.isdir(os.path.join('config', 'PETSc')): 41f8833479SBarry Smith for d in ['utilities', 'packages']: 42f8833479SBarry Smith for utility in os.listdir(os.path.join('config', 'PETSc', d)): 43f8833479SBarry Smith (utilityName, ext) = os.path.splitext(utility) 44f8833479SBarry Smith if not utilityName.startswith('.') and not utilityName.startswith('#') and ext == '.py' and not utilityName == '__init__': 45f8833479SBarry Smith utilityObj = self.framework.require('PETSc.'+d+'.'+utilityName, self) 46f8833479SBarry Smith utilityObj.headerPrefix = self.headerPrefix 47f8833479SBarry Smith ##utilityObj.languageProvider = self.languages 48f8833479SBarry Smith setattr(self, utilityName.lower(), utilityObj) 49f8833479SBarry Smith self.blaslapack = framework.require('config.packages.BlasLapack', self) 50f8833479SBarry Smith self.blaslapack.archProvider = self.arch 51f8833479SBarry Smith self.blaslapack.precisionProvider = self.scalartypes 52f8833479SBarry Smith self.blaslapack.installDirProvider= self.petscdir 53f8833479SBarry Smith self.mpi = framework.require('config.packages.MPI', self) 54f8833479SBarry Smith self.mpi.archProvider = self.arch 55f8833479SBarry Smith self.mpi.languageProvider = self.languages 56f8833479SBarry Smith self.mpi.installDirProvider = self.petscdir 57f8833479SBarry Smith self.umfpack = framework.require('config.packages.UMFPACK', self) 58f8833479SBarry Smith self.umfpack.archProvider = self.arch 59f8833479SBarry Smith self.umfpack.languageProvider = self.languages 60f8833479SBarry Smith self.umfpack.installDirProvider = self.petscdir 61d5b93044SMatthew Knepley self.Boost = framework.require('config.packages.Boost', self) 62d5b93044SMatthew Knepley self.Boost.archProvider = self.arch 63d5b93044SMatthew Knepley self.Boost.languageProvider = self.languages 64d5b93044SMatthew Knepley self.Boost.installDirProvider = self.petscdir 65d5b93044SMatthew Knepley self.Fiat = framework.require('config.packages.Fiat', self) 66d5b93044SMatthew Knepley self.Fiat.archProvider = self.arch 67d5b93044SMatthew Knepley self.Fiat.languageProvider = self.languages 68d5b93044SMatthew Knepley self.Fiat.installDirProvider = self.petscdir 69*7da8077dSMatthew Knepley self.ExodusII = framework.require('config.packages.ExodusII', self) 70*7da8077dSMatthew Knepley self.ExodusII.archProvider = self.arch 71*7da8077dSMatthew Knepley self.ExodusII.languageProvider = self.languages 72*7da8077dSMatthew Knepley self.ExodusII.installDirProvider = self.petscdir 73f8833479SBarry Smith 74f8833479SBarry Smith self.compilers.headerPrefix = self.headerPrefix 75f8833479SBarry Smith self.types.headerPrefix = self.headerPrefix 76f8833479SBarry Smith self.headers.headerPrefix = self.headerPrefix 77f8833479SBarry Smith self.functions.headerPrefix = self.headerPrefix 78f8833479SBarry Smith self.libraries.headerPrefix = self.headerPrefix 79f8833479SBarry Smith self.blaslapack.headerPrefix = self.headerPrefix 80f8833479SBarry Smith self.mpi.headerPrefix = self.headerPrefix 81f8833479SBarry Smith headersC = map(lambda name: name+'.h', ['dos', 'endian', 'fcntl', 'float', 'io', 'limits', 'malloc', 'pwd', 'search', 'strings', 82f8833479SBarry Smith 'unistd', 'machine/endian', 'sys/param', 'sys/procfs', 'sys/resource', 83b4bb646cSSatish Balay 'sys/systeminfo', 'sys/times', 'sys/utsname','string', 'stdlib','memory', 84f8833479SBarry Smith 'sys/socket','sys/wait','netinet/in','netdb','Direct','time','Ws2tcpip','sys/types', 85ec284106SBarry Smith 'WindowsX', 'cxxabi','float','ieeefp','xmmintrin']) 86f8833479SBarry Smith functions = ['access', '_access', 'clock', 'drand48', 'getcwd', '_getcwd', 'getdomainname', 'gethostname', 'getpwuid', 87f8833479SBarry Smith 'gettimeofday', 'getwd', 'memalign', 'memmove', 'mkstemp', 'popen', 'PXFGETARG', 'rand', 'getpagesize', 88f8833479SBarry Smith 'readlink', 'realpath', 'sigaction', 'signal', 'sigset', 'sleep', '_sleep', 'socket', 'times', 'gethostbyname', 89a21658a3SLisandro Dalcin 'uname','snprintf','_snprintf','_fullpath','lseek','_lseek','time','fork','stricmp','strcasecmp','bzero', 90a21658a3SLisandro Dalcin 'dlopen', 'dlsym', 'dlclose', 'dlerror', 91b68d8666SSatish Balay '_intel_fast_memcpy','_intel_fast_memset','isinf','isnan','_finite','_isnan'] 92f8833479SBarry Smith libraries1 = [(['socket', 'nsl'], 'socket'), (['fpe'], 'handle_sigfpes')] 93f8833479SBarry Smith self.headers.headers.extend(headersC) 94f8833479SBarry Smith self.functions.functions.extend(functions) 95f8833479SBarry Smith self.libraries.libraries.extend(libraries1) 96f8833479SBarry Smith return 97f8833479SBarry Smith 98f8833479SBarry Smith def defineAutoconfMacros(self): 99f8833479SBarry Smith self.hostMacro = 'dnl Version: 2.13\ndnl Variable: host_cpu\ndnl Variable: host_vendor\ndnl Variable: host_os\nAC_CANONICAL_HOST' 100f8833479SBarry Smith return 101f8833479SBarry Smith 102f8833479SBarry Smith def Dump(self): 103f8833479SBarry Smith ''' Actually put the values into the configuration files ''' 104f8833479SBarry Smith # eventually everything between -- should be gone 105f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 106f8833479SBarry Smith 107f8833479SBarry Smith # Sometimes we need C compiler, even if built with C++ 108f8833479SBarry Smith self.setCompilers.pushLanguage('C') 109f8833479SBarry Smith self.addMakeMacro('CC_FLAGS',self.setCompilers.getCompilerFlags()) 110f8833479SBarry Smith self.setCompilers.popLanguage() 111f8833479SBarry Smith 112f8833479SBarry Smith # C preprocessor values 113a2b1cf82SBarry Smith self.addMakeMacro('CPP_FLAGS',self.setCompilers.CPPFLAGS+self.CHUD.CPPFLAGS) 114f8833479SBarry Smith 115f8833479SBarry Smith # compiler values 116f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 117f8833479SBarry Smith self.addMakeMacro('PCC',self.setCompilers.getCompiler()) 118f8833479SBarry Smith self.addMakeMacro('PCC_FLAGS',self.setCompilers.getCompilerFlags()) 119f8833479SBarry Smith self.setCompilers.popLanguage() 120f8833479SBarry Smith # .o or .obj 121f8833479SBarry Smith self.addMakeMacro('CC_SUFFIX','o') 122f8833479SBarry Smith 123f8833479SBarry Smith # executable linker values 124f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 125f8833479SBarry Smith pcc_linker = self.setCompilers.getLinker() 126f8833479SBarry Smith self.addMakeMacro('PCC_LINKER',pcc_linker) 127c84a332bSSatish Balay self.addMakeMacro('PCC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 128f8833479SBarry Smith self.setCompilers.popLanguage() 129f8833479SBarry Smith # '' for Unix, .exe for Windows 130f8833479SBarry Smith self.addMakeMacro('CC_LINKER_SUFFIX','') 131a2b1cf82SBarry Smith self.addMakeMacro('PCC_LINKER_LIBS',self.libraries.toStringNoDupes(self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))+self.CHUD.LIBS) 132f8833479SBarry Smith 133f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 134f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 135f8833479SBarry Smith # need FPPFLAGS in config/setCompilers 136f8833479SBarry Smith self.addDefine('HAVE_FORTRAN','1') 137f8833479SBarry Smith self.addMakeMacro('FPP_FLAGS',self.setCompilers.CPPFLAGS) 138f8833479SBarry Smith 139f8833479SBarry Smith # compiler values 140f8833479SBarry Smith self.addMakeMacro('FC_FLAGS',self.setCompilers.getCompilerFlags()) 141f8833479SBarry Smith self.setCompilers.popLanguage() 142f8833479SBarry Smith # .o or .obj 143f8833479SBarry Smith self.addMakeMacro('FC_SUFFIX','o') 144f8833479SBarry Smith 145f8833479SBarry Smith # executable linker values 146f8833479SBarry Smith self.setCompilers.pushLanguage('FC') 147f8833479SBarry Smith # Cannot have NAG f90 as the linker - so use pcc_linker as fc_linker 148f8833479SBarry Smith fc_linker = self.setCompilers.getLinker() 149f8833479SBarry Smith if config.setCompilers.Configure.isNAG(fc_linker): 150f8833479SBarry Smith self.addMakeMacro('FC_LINKER',pcc_linker) 151f8833479SBarry Smith else: 152f8833479SBarry Smith self.addMakeMacro('FC_LINKER',fc_linker) 1536d53d35eSSatish Balay self.addMakeMacro('FC_LINKER_FLAGS',self.setCompilers.getLinkerFlags()) 1543feacd00SBarry Smith # apple requires this shared library linker flag on SOME versions of the os 1553feacd00SBarry Smith if self.setCompilers.getLinkerFlags().find('-Wl,-commons,use_dylibs') > -1: 1563feacd00SBarry Smith self.addMakeMacro('DARWIN_COMMONS_USE_DYLIBS',' -Wl,-commons,use_dylibs ') 157bb82cf9cSSatish Balay self.setCompilers.popLanguage() 158f8833479SBarry Smith else: 159f8833479SBarry Smith self.addMakeMacro('FC','') 160f8833479SBarry Smith 161f8833479SBarry Smith # shared library linker values 162f8833479SBarry Smith self.setCompilers.pushLanguage(self.languages.clanguage) 163f8833479SBarry Smith # need to fix BuildSystem to collect these separately 164f8833479SBarry Smith self.addMakeMacro('SL_LINKER',self.setCompilers.getLinker()) 16570db8aa6SSatish Balay self.addMakeMacro('SL_LINKER_FLAGS','${PCC_LINKER_FLAGS}') 166f8833479SBarry Smith self.setCompilers.popLanguage() 167f8833479SBarry Smith # One of 'a', 'so', 'lib', 'dll', 'dylib' (perhaps others also?) depending on the library generator and architecture 168f8833479SBarry Smith # Note: . is not included in this macro, consistent with AR_LIB_SUFFIX 169f8833479SBarry Smith if self.setCompilers.sharedLibraryExt == self.setCompilers.AR_LIB_SUFFIX: 170f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', '') 171f8833479SBarry Smith else: 172f8833479SBarry Smith self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt) 173bb82cf9cSSatish Balay 174bb82cf9cSSatish Balay #SL_LINKER_LIBS is currently same as PCC_LINKER_LIBS - so simplify 175bb82cf9cSSatish Balay self.addMakeMacro('SL_LINKER_LIBS','${PCC_LINKER_LIBS}') 176bb82cf9cSSatish Balay #self.addMakeMacro('SL_LINKER_LIBS',self.libraries.toStringNoDupes(self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' '))) 177bb82cf9cSSatish Balay 178f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 179f8833479SBarry Smith 180f8833479SBarry Smith # CONLY or CPP. We should change the PETSc makefiles to do this better 181f8833479SBarry Smith if self.languages.clanguage == 'C': lang = 'CONLY' 182f8833479SBarry Smith else: lang = 'CXXONLY' 183f8833479SBarry Smith self.addMakeMacro('PETSC_LANGUAGE',lang) 184f8833479SBarry Smith 185f8833479SBarry Smith # real or complex 186f8833479SBarry Smith self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype) 187f8833479SBarry Smith # double or float 188f8833479SBarry Smith self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision) 189f8833479SBarry Smith 190f8833479SBarry Smith if self.framework.argDB['with-batch']: 191f8833479SBarry Smith self.addMakeMacro('PETSC_WITH_BATCH','1') 192f8833479SBarry Smith 193f8833479SBarry Smith # Test for compiler-specific macros that need to be defined. 194f8833479SBarry Smith if self.setCompilers.isCray('CC'): 195f8833479SBarry Smith self.addDefine('HAVE_CRAYC','1') 196f8833479SBarry Smith 197f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 198f8833479SBarry Smith if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket'): 199f8833479SBarry Smith self.addDefine('USE_SOCKET_VIEWER','1') 200f8833479SBarry Smith 201f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 202f8833479SBarry Smith # print include and lib for external packages 203f8833479SBarry Smith self.framework.packages.reverse() 204996b3231SBarry Smith includes = [] 205996b3231SBarry Smith libs = [] 206f8833479SBarry Smith for i in self.framework.packages: 207f8833479SBarry Smith self.addDefine('HAVE_'+i.PACKAGE, 1) 208f8833479SBarry Smith if not isinstance(i.lib, list): 209f8833479SBarry Smith i.lib = [i.lib] 210ac9e4c42SSatish Balay libs.extend(i.lib) 21134cdeb2aSSatish Balay self.addMakeMacro(i.PACKAGE+'_LIB', self.libraries.toStringNoDupes(i.lib)) 212f8833479SBarry Smith if hasattr(i,'include'): 213f8833479SBarry Smith if not isinstance(i.include,list): 214f8833479SBarry Smith i.include = [i.include] 215ac9e4c42SSatish Balay includes.extend(i.include) 21634cdeb2aSSatish Balay self.addMakeMacro(i.PACKAGE+'_INCLUDE',self.headers.toStringNoDupes(i.include)) 217ac9e4c42SSatish Balay self.addMakeMacro('PACKAGES_LIBS',self.libraries.toStringNoDupes(libs+self.libraries.math)) 218ac9e4c42SSatish Balay self.addMakeMacro('PACKAGES_INCLUDES',self.headers.toStringNoDupes(includes)) 219f8833479SBarry Smith 220f8833479SBarry Smith self.addMakeMacro('INSTALL_DIR',self.installdir) 221f8833479SBarry Smith 2220f3b21c2SBarry Smith if self.framework.argDB['with-single-library']: 2230f3b21c2SBarry Smith # overrides the values set in conf/variables 2240f3b21c2SBarry Smith self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}') 2250f3b21c2SBarry Smith self.addMakeMacro('PETSC_SYS_LIB_BASIC','-lpetsc') 2260f3b21c2SBarry Smith self.addMakeMacro('PETSC_VEC_LIB_BASIC','-lpetsc') 2270f3b21c2SBarry Smith self.addMakeMacro('PETSC_MAT_LIB_BASIC','-lpetsc') 2280f3b21c2SBarry Smith self.addMakeMacro('PETSC_DM_LIB_BASIC','-lpetsc') 2290f3b21c2SBarry Smith self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc') 2300f3b21c2SBarry Smith self.addMakeMacro('PETSC_SNES_LIB_BASIC','-lpetsc') 2310f3b21c2SBarry Smith self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc') 2320f3b21c2SBarry Smith self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc') 2330f3b21c2SBarry Smith self.addMakeMacro('PETSC_CONTRIB_BASIC','-lpetsc') 234bb84e0fdSBarry Smith self.addDefine('USE_SINGLE_LIBRARY', '1') 2350f3b21c2SBarry Smith 236f8833479SBarry Smith if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')): 237f8833479SBarry Smith os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib')) 238f8833479SBarry Smith 239f8833479SBarry Smith # add a makefile entry for configure options 240f8833479SBarry Smith self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')) 241f8833479SBarry Smith return 242f8833479SBarry Smith 243f8833479SBarry Smith def dumpConfigInfo(self): 244f8833479SBarry Smith import time 245f8833479SBarry Smith fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w') 246f8833479SBarry Smith fd.write('static const char *petscconfigureruntime = "'+time.ctime(time.time())+'";\n') 247f8833479SBarry Smith fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n') 248f8833479SBarry Smith fd.close() 249f8833479SBarry Smith return 250f8833479SBarry Smith 251b2843cf1SBarry Smith 252b2843cf1SBarry Smith def configurePrefetch(self): 253b2843cf1SBarry Smith '''Sees if there are any prefetch functions supported''' 254ec284106SBarry Smith self.pushLanguage(self.languages.clanguage) 2550d79d417SBarry Smith if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,(enum _mm_hint)0);\n'): 25647980e60SBarry Smith self.addDefine('HAVE_XMMINTRIN_H', 1) 2570d79d417SBarry Smith self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((void*)(a),(enum _mm_hint)c)') 2581d9cd9bfSBarry Smith elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,(enum _mm_hint)0);\n'): 2591d9cd9bfSBarry Smith self.addDefine('HAVE_XMMINTRIN_H', 1) 2601d9cd9bfSBarry Smith self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(enum _mm_hint)c)') 2611c3996cdSBarry Smith elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'): 262b2843cf1SBarry Smith self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch(a,b,c)') 263b2843cf1SBarry Smith else: 264b2843cf1SBarry Smith self.addDefine('Prefetch(a,b,c)', ' ') 2657d490b44SBarry Smith self.popLanguage() 266b2843cf1SBarry Smith 267f8833479SBarry Smith def configureInline(self): 268f8833479SBarry Smith '''Get a generic inline keyword, depending on the language''' 269f8833479SBarry Smith if self.languages.clanguage == 'C': 270f8833479SBarry Smith self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword) 271f8833479SBarry Smith self.addDefine('RESTRICT', self.compilers.cRestrict) 272f8833479SBarry Smith elif self.languages.clanguage == 'Cxx': 273f8833479SBarry Smith self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword) 274f8833479SBarry Smith self.addDefine('RESTRICT', self.compilers.cxxRestrict) 275f8833479SBarry Smith return 276f8833479SBarry Smith 277f8833479SBarry Smith def configureSolaris(self): 278f8833479SBarry Smith '''Solaris specific stuff''' 279f8833479SBarry Smith if self.arch.hostOsBase.startswith('solaris'): 280f8833479SBarry Smith if os.path.isdir(os.path.join('/usr','ucblib')): 281f8833479SBarry Smith try: 282f8833479SBarry Smith flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag') 283f8833479SBarry Smith except AttributeError: 284f8833479SBarry Smith flag = None 285f8833479SBarry Smith if flag is None: 286f8833479SBarry Smith self.compilers.LIBS += ' -L/usr/ucblib' 287f8833479SBarry Smith else: 288f8833479SBarry Smith self.compilers.LIBS += ' '+flag+'/usr/ucblib' 289f8833479SBarry Smith return 290f8833479SBarry Smith 291f8833479SBarry Smith def configureLinux(self): 292f8833479SBarry Smith '''Linux specific stuff''' 293f8833479SBarry Smith if self.arch.hostOsBase == 'linux': 294f8833479SBarry Smith self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1) 295f8833479SBarry Smith return 296f8833479SBarry Smith 297f8833479SBarry Smith def configureWin32(self): 298f8833479SBarry Smith '''Win32 non-cygwin specific stuff''' 299f8833479SBarry Smith kernel32=0 300f8833479SBarry Smith if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 301f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 302f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 303f8833479SBarry Smith kernel32=1 304f8833479SBarry Smith elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'): 305f8833479SBarry Smith self.addDefine('HAVE_WINDOWS_H',1) 306f8833479SBarry Smith self.addDefine('HAVE_GETCOMPUTERNAME',1) 307f8833479SBarry Smith kernel32=1 308f8833479SBarry Smith if kernel32: 309eed94e11SSatish Balay if self.framework.argDB['with-windows-graphics']: 310eed94e11SSatish Balay self.addDefine('USE_WINDOWS_GRAPHICS',1) 311f8833479SBarry Smith if self.checkLink('#include <Windows.h>','LoadLibrary(0)'): 312f8833479SBarry Smith self.addDefine('HAVE_LOADLIBRARY',1) 313b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'): 314b50f6d9eSLisandro Dalcin self.addDefine('HAVE_GETPROCADDRESS',1) 315b50f6d9eSLisandro Dalcin if self.checkLink('#include <Windows.h>','FreeLibrary(0)'): 316b50f6d9eSLisandro Dalcin self.addDefine('HAVE_FREELIBRARY',1) 317a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','GetLastError()'): 318a21658a3SLisandro Dalcin self.addDefine('HAVE_GETLASTERROR',1) 319a21658a3SLisandro Dalcin if self.checkLink('#include <Windows.h>','SetLastError(0)'): 320a21658a3SLisandro Dalcin self.addDefine('HAVE_SETLASTERROR',1) 321f8833479SBarry Smith if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'): 322f8833479SBarry Smith self.addDefine('USE_NT_TIME',1) 323f8833479SBarry Smith if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 324f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 325f8833479SBarry Smith elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'): 326f8833479SBarry Smith self.addDefine('HAVE_GET_USER_NAME',1) 327f8833479SBarry Smith 328f8833479SBarry Smith if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'): 329f8833479SBarry Smith self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);') 330f8833479SBarry Smith if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'): 331f8833479SBarry Smith self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);') 332f8833479SBarry Smith 333f8833479SBarry Smith self.types.check('int32_t', 'int') 334f8833479SBarry Smith if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'): 335f8833479SBarry Smith self.addTypedef('int', 'uid_t') 336f8833479SBarry Smith self.addTypedef('int', 'gid_t') 337f8833479SBarry Smith if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'): 338f8833479SBarry Smith self.framework.addDefine('R_OK', '04') 339f8833479SBarry Smith self.framework.addDefine('W_OK', '02') 340f8833479SBarry Smith self.framework.addDefine('X_OK', '01') 341f8833479SBarry Smith if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'): 342f8833479SBarry Smith self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)') 343f8833479SBarry Smith self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)') 344f8833479SBarry Smith if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'): 345f8833479SBarry Smith self.addDefine('HAVE_LARGE_INTEGER_U',1) 346f8833479SBarry Smith 347f8833479SBarry Smith # Windows requires a Binary file creation flag when creating/opening binary files. Is a better test in order? 348f8833479SBarry Smith if self.checkCompile('#include <Windows.h>\n',''): 349f8833479SBarry Smith self.addDefine('HAVE_O_BINARY',1) 350f8833479SBarry Smith 351f8833479SBarry Smith if self.compilers.CC.find('win32fe') >= 0: 352f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\';\'') 353f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'\\\\\'') 354f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'') 355f8833479SBarry Smith self.addDefine('CANNOT_START_DEBUGGER',1) 356f8833479SBarry Smith else: 357f8833479SBarry Smith self.addDefine('PATH_SEPARATOR','\':\'') 358f8833479SBarry Smith self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'') 359f8833479SBarry Smith self.addDefine('DIR_SEPARATOR','\'/\'') 360f8833479SBarry Smith return 361f8833479SBarry Smith 362f8833479SBarry Smith#----------------------------------------------------------------------------------------------------- 363569865ddSSatish Balay def configureDefaultArch(self): 364569865ddSSatish Balay conffile = os.path.join('conf', 'petscvariables') 365569865ddSSatish Balay if self.framework.argDB['with-default-arch']: 366569865ddSSatish Balay fd = file(conffile, 'w') 367569865ddSSatish Balay fd.write('PETSC_ARCH='+self.arch.arch+'\n') 368569865ddSSatish Balay fd.write('include ${PETSC_DIR}/${PETSC_ARCH}/conf/petscvariables\n') 369569865ddSSatish Balay fd.close() 370569865ddSSatish Balay self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile) 371569865ddSSatish Balay elif os.path.isfile(conffile): 372569865ddSSatish Balay try: 373569865ddSSatish Balay os.unlink(conffile) 374569865ddSSatish Balay except: 375569865ddSSatish Balay raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?') 376569865ddSSatish Balay return 377569865ddSSatish Balay 378569865ddSSatish Balay#----------------------------------------------------------------------------------------------------- 379f8833479SBarry Smith def configureScript(self): 380f8833479SBarry Smith '''Output a script in the conf directory which will reproduce the configuration''' 381f8833479SBarry Smith import nargs 382495bf1a9SSatish Balay import sys 383495bf1a9SSatish Balay scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py') 384f8833479SBarry Smith args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs]) 385f8833479SBarry Smith if 'configModules' in args: 386c1486898SMatthew Knepley if nargs.Arg.parseArgument(args['configModules'])[1] == ['PETSc.Configure']: 387f8833479SBarry Smith del args['configModules'] 388f8833479SBarry Smith if 'optionsModule' in args: 389c1486898SMatthew Knepley if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions': 390f8833479SBarry Smith del args['optionsModule'] 391f8833479SBarry Smith if not 'PETSC_ARCH' in args: 392f8833479SBarry Smith args['PETSC_ARCH'] = '-PETSC_ARCH='+str(self.arch.arch) 393f8833479SBarry Smith f = file(scriptName, 'w') 394495bf1a9SSatish Balay f.write('#!'+sys.executable+'\n') 395f8833479SBarry Smith f.write('if __name__ == \'__main__\':\n') 396f8833479SBarry Smith f.write(' import sys\n') 397f8833479SBarry Smith f.write(' sys.path.insert(0, '+repr(os.path.join(self.petscdir.dir, 'config'))+')\n') 398f8833479SBarry Smith f.write(' import configure\n') 399f8833479SBarry Smith f.write(' configure_options = '+repr(args.values())+'\n') 400f8833479SBarry Smith f.write(' configure.petsc_configure(configure_options)\n') 401f8833479SBarry Smith f.close() 402f8833479SBarry Smith try: 403f8833479SBarry Smith os.chmod(scriptName, 0775) 404f8833479SBarry Smith except OSError, e: 405f8833479SBarry Smith self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e)) 406f8833479SBarry Smith self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration') 407f8833479SBarry Smith return 408f8833479SBarry Smith 409f8833479SBarry Smith def configureInstall(self): 410f8833479SBarry Smith '''Setup the directories for installation''' 411f8833479SBarry Smith if self.framework.argDB['prefix']: 412f8833479SBarry Smith self.installdir = self.framework.argDB['prefix'] 41310b521ebSBarry Smith self.addMakeRule('shared_nomesg_noinstall','') 414315b77e6SSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do: make install"',\ 415315b77e6SSatish Balay '-@echo "========================================="']) 416f8833479SBarry Smith else: 417b559b537SSatish Balay self.installdir = os.path.join(self.petscdir.dir,self.arch.arch) 41810b521ebSBarry Smith self.addMakeRule('shared_nomesg_noinstall','shared_nomesg') 419315b77e6SSatish Balay self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do: make test"',\ 420315b77e6SSatish Balay '-@echo "========================================="']) 421f8833479SBarry Smith return 422f8833479SBarry Smith 423f8833479SBarry Smith def configureGCOV(self): 424f8833479SBarry Smith if self.framework.argDB['with-gcov']: 425f8833479SBarry Smith self.addDefine('USE_GCOV','1') 426f8833479SBarry Smith return 427f8833479SBarry Smith 428f8833479SBarry Smith def configureFortranFlush(self): 429f8833479SBarry Smith if hasattr(self.compilers, 'FC'): 430f8833479SBarry Smith for baseName in ['flush','flush_']: 431f8833479SBarry Smith if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1): 432f8833479SBarry Smith self.addDefine('HAVE_'+baseName.upper(), 1) 433f8833479SBarry Smith return 434f8833479SBarry Smith 435f8833479SBarry Smith 436f8833479SBarry Smith def configure(self): 437f8833479SBarry Smith if not os.path.samefile(self.petscdir.dir, os.getcwd()): 438f8833479SBarry Smith raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n Configure invoked in: '+os.path.realpath(os.getcwd())) 439f8833479SBarry Smith self.framework.header = self.arch.arch+'/include/petscconf.h' 440f8833479SBarry Smith self.framework.cHeader = self.arch.arch+'/include/petscfix.h' 4419275508cSBarry Smith self.framework.makeMacroHeader = self.arch.arch+'/conf/petscvariables' 442f8833479SBarry Smith self.framework.makeRuleHeader = self.arch.arch+'/conf/petscrules' 443f8833479SBarry Smith if self.libraries.math is None: 444f8833479SBarry Smith raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.') 445f8833479SBarry Smith if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'): 446f8833479SBarry Smith raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.') 447f8833479SBarry Smith self.executeTest(self.configureInline) 448b2843cf1SBarry Smith self.executeTest(self.configurePrefetch) 449f8833479SBarry Smith self.executeTest(self.configureSolaris) 450f8833479SBarry Smith self.executeTest(self.configureLinux) 451f8833479SBarry Smith self.executeTest(self.configureWin32) 452569865ddSSatish Balay self.executeTest(self.configureDefaultArch) 453f8833479SBarry Smith self.executeTest(self.configureScript) 454f8833479SBarry Smith self.executeTest(self.configureInstall) 455f8833479SBarry Smith self.executeTest(self.configureGCOV) 456f8833479SBarry Smith self.executeTest(self.configureFortranFlush) 457f8833479SBarry Smith # dummy rules, always needed except for remote builds 458f8833479SBarry Smith self.addMakeRule('remote','') 459f8833479SBarry Smith self.addMakeRule('remoteclean','') 460f8833479SBarry Smith 461f8833479SBarry Smith self.Dump() 462f8833479SBarry Smith self.dumpConfigInfo() 463f8833479SBarry Smith self.framework.log.write('================================================================================\n') 464f8833479SBarry Smith self.logClear() 465f8833479SBarry Smith return 466