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