xref: /petsc/config/PETSc/Configure.py (revision 46bc77b6d550debde283362c0c819c2f2ba7ff30)
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', '')
177*46bc77b6SBarry Smith      self.addDefine('SLSUFFIX','""')
178f8833479SBarry Smith    else:
179f8833479SBarry Smith      self.addMakeMacro('SL_LINKER_SUFFIX', self.setCompilers.sharedLibraryExt)
180*46bc77b6SBarry Smith      self.addDefine('SLSUFFIX','"'+self.setCompilers.sharedLibraryExt+'"')
181bb82cf9cSSatish Balay
182bb82cf9cSSatish Balay    #SL_LINKER_LIBS is currently same as PCC_LINKER_LIBS - so simplify
183bb82cf9cSSatish Balay    self.addMakeMacro('SL_LINKER_LIBS','${PCC_LINKER_LIBS}')
184bb82cf9cSSatish Balay    #self.addMakeMacro('SL_LINKER_LIBS',self.libraries.toStringNoDupes(self.compilers.flibs+self.compilers.cxxlibs+self.compilers.LIBS.split(' ')))
185bb82cf9cSSatish Balay
186f8833479SBarry Smith#-----------------------------------------------------------------------------------------------------
187f8833479SBarry Smith
188f8833479SBarry Smith    # CONLY or CPP. We should change the PETSc makefiles to do this better
189f8833479SBarry Smith    if self.languages.clanguage == 'C': lang = 'CONLY'
190f8833479SBarry Smith    else: lang = 'CXXONLY'
191f8833479SBarry Smith    self.addMakeMacro('PETSC_LANGUAGE',lang)
192f8833479SBarry Smith
193f8833479SBarry Smith    # real or complex
194f8833479SBarry Smith    self.addMakeMacro('PETSC_SCALAR',self.scalartypes.scalartype)
195f8833479SBarry Smith    # double or float
196f8833479SBarry Smith    self.addMakeMacro('PETSC_PRECISION',self.scalartypes.precision)
197f8833479SBarry Smith
198f8833479SBarry Smith    if self.framework.argDB['with-batch']:
199f8833479SBarry Smith      self.addMakeMacro('PETSC_WITH_BATCH','1')
200f8833479SBarry Smith
201f8833479SBarry Smith    # Test for compiler-specific macros that need to be defined.
202f8833479SBarry Smith    if self.setCompilers.isCray('CC'):
203f8833479SBarry Smith      self.addDefine('HAVE_CRAYC','1')
204f8833479SBarry Smith
205f8833479SBarry Smith#-----------------------------------------------------------------------------------------------------
206f8833479SBarry Smith    if self.functions.haveFunction('gethostbyname') and self.functions.haveFunction('socket'):
207f8833479SBarry Smith      self.addDefine('USE_SOCKET_VIEWER','1')
208f8833479SBarry Smith
209f8833479SBarry Smith#-----------------------------------------------------------------------------------------------------
210f8833479SBarry Smith    # print include and lib for external packages
211f8833479SBarry Smith    self.framework.packages.reverse()
212996b3231SBarry Smith    includes = []
213996b3231SBarry Smith    libs = []
214f8833479SBarry Smith    for i in self.framework.packages:
215f8833479SBarry Smith      self.addDefine('HAVE_'+i.PACKAGE, 1)
216f8833479SBarry Smith      if not isinstance(i.lib, list):
217f8833479SBarry Smith        i.lib = [i.lib]
218ac9e4c42SSatish Balay      libs.extend(i.lib)
21934cdeb2aSSatish Balay      self.addMakeMacro(i.PACKAGE+'_LIB', self.libraries.toStringNoDupes(i.lib))
220f8833479SBarry Smith      if hasattr(i,'include'):
221f8833479SBarry Smith        if not isinstance(i.include,list):
222f8833479SBarry Smith          i.include = [i.include]
223ac9e4c42SSatish Balay        includes.extend(i.include)
22434cdeb2aSSatish Balay        self.addMakeMacro(i.PACKAGE+'_INCLUDE',self.headers.toStringNoDupes(i.include))
225ac9e4c42SSatish Balay    self.addMakeMacro('PACKAGES_LIBS',self.libraries.toStringNoDupes(libs+self.libraries.math))
226ac9e4c42SSatish Balay    self.addMakeMacro('PACKAGES_INCLUDES',self.headers.toStringNoDupes(includes))
227f8833479SBarry Smith
228f8833479SBarry Smith    self.addMakeMacro('INSTALL_DIR',self.installdir)
229c6f99f23SBarry Smith    self.addDefine('LIB_DIR','"'+os.path.join(self.installdir,'lib')+'"')
230f8833479SBarry Smith
2310f3b21c2SBarry Smith    if self.framework.argDB['with-single-library']:
2320f3b21c2SBarry Smith      # overrides the values set in conf/variables
2330f3b21c2SBarry Smith      self.addMakeMacro('LIBNAME','${INSTALL_LIB_DIR}/libpetsc.${AR_LIB_SUFFIX}')
2340f3b21c2SBarry Smith      self.addMakeMacro('PETSC_SYS_LIB_BASIC','-lpetsc')
2350f3b21c2SBarry Smith      self.addMakeMacro('PETSC_VEC_LIB_BASIC','-lpetsc')
2360f3b21c2SBarry Smith      self.addMakeMacro('PETSC_MAT_LIB_BASIC','-lpetsc')
2370f3b21c2SBarry Smith      self.addMakeMacro('PETSC_DM_LIB_BASIC','-lpetsc')
2380f3b21c2SBarry Smith      self.addMakeMacro('PETSC_KSP_LIB_BASIC','-lpetsc')
2390f3b21c2SBarry Smith      self.addMakeMacro('PETSC_SNES_LIB_BASIC','-lpetsc')
2400f3b21c2SBarry Smith      self.addMakeMacro('PETSC_TS_LIB_BASIC','-lpetsc')
2410f3b21c2SBarry Smith      self.addMakeMacro('PETSC_LIB_BASIC','-lpetsc')
2420f3b21c2SBarry Smith      self.addMakeMacro('PETSC_CONTRIB_BASIC','-lpetsc')
243bb84e0fdSBarry Smith      self.addDefine('USE_SINGLE_LIBRARY', '1')
2440f3b21c2SBarry Smith
245f8833479SBarry Smith    if not os.path.exists(os.path.join(self.petscdir.dir,self.arch.arch,'lib')):
246f8833479SBarry Smith      os.makedirs(os.path.join(self.petscdir.dir,self.arch.arch,'lib'))
247f8833479SBarry Smith
248f8833479SBarry Smith    # add a makefile entry for configure options
249f8833479SBarry Smith    self.addMakeMacro('CONFIGURE_OPTIONS', self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"'))
250f8833479SBarry Smith    return
251f8833479SBarry Smith
252f8833479SBarry Smith  def dumpConfigInfo(self):
253f8833479SBarry Smith    import time
254f8833479SBarry Smith    fd = file(os.path.join(self.arch.arch,'include','petscconfiginfo.h'),'w')
255f8833479SBarry Smith    fd.write('static const char *petscconfigureruntime = "'+time.ctime(time.time())+'";\n')
256f8833479SBarry Smith    fd.write('static const char *petscconfigureoptions = "'+self.framework.getOptionsString(['configModules', 'optionsModule']).replace('\"','\\"')+'";\n')
257f8833479SBarry Smith    fd.close()
258f8833479SBarry Smith    return
259f8833479SBarry Smith
260b2843cf1SBarry Smith
261b2843cf1SBarry Smith  def configurePrefetch(self):
262b2843cf1SBarry Smith    '''Sees if there are any prefetch functions supported'''
263ec284106SBarry Smith    self.pushLanguage(self.languages.clanguage)
2640d79d417SBarry Smith    if self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch(v,(enum _mm_hint)0);\n'):
26547980e60SBarry Smith      self.addDefine('HAVE_XMMINTRIN_H', 1)
2660d79d417SBarry Smith      self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((void*)(a),(enum _mm_hint)c)')
2671d9cd9bfSBarry Smith    elif self.checkLink('#include <xmmintrin.h>', 'void *v = 0;_mm_prefetch((const char*)v,(enum _mm_hint)0);\n'):
2681d9cd9bfSBarry Smith      self.addDefine('HAVE_XMMINTRIN_H', 1)
2691d9cd9bfSBarry Smith      self.addDefine('Prefetch(a,b,c)', '_mm_prefetch((const char*)(a),(enum _mm_hint)c)')
2701c3996cdSBarry Smith    elif self.checkLink('', 'void *v = 0;__builtin_prefetch(v,0,0);\n'):
271b2843cf1SBarry Smith      self.addDefine('Prefetch(a,b,c)', '__builtin_prefetch(a,b,c)')
272b2843cf1SBarry Smith    else:
273b2843cf1SBarry Smith      self.addDefine('Prefetch(a,b,c)', ' ')
2747d490b44SBarry Smith    self.popLanguage()
275b2843cf1SBarry Smith
276f8833479SBarry Smith  def configureInline(self):
277f8833479SBarry Smith    '''Get a generic inline keyword, depending on the language'''
278f8833479SBarry Smith    if self.languages.clanguage == 'C':
279f8833479SBarry Smith      self.addDefine('STATIC_INLINE', self.compilers.cStaticInlineKeyword)
280f8833479SBarry Smith      self.addDefine('RESTRICT', self.compilers.cRestrict)
281f8833479SBarry Smith    elif self.languages.clanguage == 'Cxx':
282f8833479SBarry Smith      self.addDefine('STATIC_INLINE', self.compilers.cxxStaticInlineKeyword)
283f8833479SBarry Smith      self.addDefine('RESTRICT', self.compilers.cxxRestrict)
284f8833479SBarry Smith    return
285f8833479SBarry Smith
286f8833479SBarry Smith  def configureSolaris(self):
287f8833479SBarry Smith    '''Solaris specific stuff'''
288f8833479SBarry Smith    if self.arch.hostOsBase.startswith('solaris'):
289f8833479SBarry Smith      if os.path.isdir(os.path.join('/usr','ucblib')):
290f8833479SBarry Smith        try:
291f8833479SBarry Smith          flag = getattr(self.setCompilers, self.language[-1]+'SharedLinkerFlag')
292f8833479SBarry Smith        except AttributeError:
293f8833479SBarry Smith          flag = None
294f8833479SBarry Smith        if flag is None:
295f8833479SBarry Smith          self.compilers.LIBS += ' -L/usr/ucblib'
296f8833479SBarry Smith        else:
297f8833479SBarry Smith          self.compilers.LIBS += ' '+flag+'/usr/ucblib'
298f8833479SBarry Smith    return
299f8833479SBarry Smith
300f8833479SBarry Smith  def configureLinux(self):
301f8833479SBarry Smith    '''Linux specific stuff'''
302f8833479SBarry Smith    if self.arch.hostOsBase == 'linux':
303f8833479SBarry Smith      self.addDefine('HAVE_DOUBLE_ALIGN_MALLOC', 1)
304f8833479SBarry Smith    return
305f8833479SBarry Smith
306f8833479SBarry Smith  def configureWin32(self):
307f8833479SBarry Smith    '''Win32 non-cygwin specific stuff'''
308f8833479SBarry Smith    kernel32=0
309f8833479SBarry Smith    if self.libraries.add('Kernel32.lib','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'):
310f8833479SBarry Smith      self.addDefine('HAVE_WINDOWS_H',1)
311f8833479SBarry Smith      self.addDefine('HAVE_GETCOMPUTERNAME',1)
312f8833479SBarry Smith      kernel32=1
313f8833479SBarry Smith    elif self.libraries.add('kernel32','GetComputerName',prototype='#include <Windows.h>', call='GetComputerName(NULL,NULL);'):
314f8833479SBarry Smith      self.addDefine('HAVE_WINDOWS_H',1)
315f8833479SBarry Smith      self.addDefine('HAVE_GETCOMPUTERNAME',1)
316f8833479SBarry Smith      kernel32=1
317f8833479SBarry Smith    if kernel32:
318eed94e11SSatish Balay      if self.framework.argDB['with-windows-graphics']:
319eed94e11SSatish Balay        self.addDefine('USE_WINDOWS_GRAPHICS',1)
320f8833479SBarry Smith      if self.checkLink('#include <Windows.h>','LoadLibrary(0)'):
321f8833479SBarry Smith        self.addDefine('HAVE_LOADLIBRARY',1)
322b50f6d9eSLisandro Dalcin      if self.checkLink('#include <Windows.h>','GetProcAddress(0,0)'):
323b50f6d9eSLisandro Dalcin        self.addDefine('HAVE_GETPROCADDRESS',1)
324b50f6d9eSLisandro Dalcin      if self.checkLink('#include <Windows.h>','FreeLibrary(0)'):
325b50f6d9eSLisandro Dalcin        self.addDefine('HAVE_FREELIBRARY',1)
326a21658a3SLisandro Dalcin      if self.checkLink('#include <Windows.h>','GetLastError()'):
327a21658a3SLisandro Dalcin        self.addDefine('HAVE_GETLASTERROR',1)
328a21658a3SLisandro Dalcin      if self.checkLink('#include <Windows.h>','SetLastError(0)'):
329a21658a3SLisandro Dalcin        self.addDefine('HAVE_SETLASTERROR',1)
330f8833479SBarry Smith      if self.checkLink('#include <Windows.h>\n','QueryPerformanceCounter(0);\n'):
331f8833479SBarry Smith        self.addDefine('USE_NT_TIME',1)
332f8833479SBarry Smith    if self.libraries.add('Advapi32.lib','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'):
333f8833479SBarry Smith      self.addDefine('HAVE_GET_USER_NAME',1)
334f8833479SBarry Smith    elif self.libraries.add('advapi32','GetUserName',prototype='#include <Windows.h>', call='GetUserName(NULL,NULL);'):
335f8833479SBarry Smith      self.addDefine('HAVE_GET_USER_NAME',1)
336f8833479SBarry Smith
337f8833479SBarry Smith    if not self.libraries.add('User32.lib','GetDC',prototype='#include <Windows.h>',call='GetDC(0);'):
338f8833479SBarry Smith      self.libraries.add('user32','GetDC',prototype='#include <Windows.h>',call='GetDC(0);')
339f8833479SBarry Smith    if not self.libraries.add('Gdi32.lib','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);'):
340f8833479SBarry Smith      self.libraries.add('gdi32','CreateCompatibleDC',prototype='#include <Windows.h>',call='CreateCompatibleDC(0);')
341f8833479SBarry Smith
342f8833479SBarry Smith    self.types.check('int32_t', 'int')
343f8833479SBarry Smith    if not self.checkCompile('#include <sys/types.h>\n','uid_t u;\n'):
344f8833479SBarry Smith      self.addTypedef('int', 'uid_t')
345f8833479SBarry Smith      self.addTypedef('int', 'gid_t')
346f8833479SBarry Smith    if not self.checkLink('#if defined(PETSC_HAVE_UNISTD_H)\n#include <unistd.h>\n#endif\n','int a=R_OK;\n'):
347f8833479SBarry Smith      self.framework.addDefine('R_OK', '04')
348f8833479SBarry Smith      self.framework.addDefine('W_OK', '02')
349f8833479SBarry Smith      self.framework.addDefine('X_OK', '01')
350f8833479SBarry Smith    if not self.checkLink('#include <sys/stat.h>\n','int a=0;\nif (S_ISDIR(a)){}\n'):
351f8833479SBarry Smith      self.framework.addDefine('S_ISREG(a)', '(((a)&_S_IFMT) == _S_IFREG)')
352f8833479SBarry Smith      self.framework.addDefine('S_ISDIR(a)', '(((a)&_S_IFMT) == _S_IFDIR)')
353f8833479SBarry Smith    if self.checkCompile('#include <Windows.h>\n','LARGE_INTEGER a;\nDWORD b=a.u.HighPart;\n'):
354f8833479SBarry Smith      self.addDefine('HAVE_LARGE_INTEGER_U',1)
355f8833479SBarry Smith
356f8833479SBarry Smith    # Windows requires a Binary file creation flag when creating/opening binary files.  Is a better test in order?
357f8833479SBarry Smith    if self.checkCompile('#include <Windows.h>\n',''):
358f8833479SBarry Smith      self.addDefine('HAVE_O_BINARY',1)
359f8833479SBarry Smith
360f8833479SBarry Smith    if self.compilers.CC.find('win32fe') >= 0:
361f8833479SBarry Smith      self.addDefine('PATH_SEPARATOR','\';\'')
362f8833479SBarry Smith      self.addDefine('DIR_SEPARATOR','\'\\\\\'')
363f8833479SBarry Smith      self.addDefine('REPLACE_DIR_SEPARATOR','\'/\'')
364f8833479SBarry Smith      self.addDefine('CANNOT_START_DEBUGGER',1)
365f8833479SBarry Smith    else:
366f8833479SBarry Smith      self.addDefine('PATH_SEPARATOR','\':\'')
367f8833479SBarry Smith      self.addDefine('REPLACE_DIR_SEPARATOR','\'\\\\\'')
368f8833479SBarry Smith      self.addDefine('DIR_SEPARATOR','\'/\'')
369f8833479SBarry Smith    return
370f8833479SBarry Smith
371f8833479SBarry Smith#-----------------------------------------------------------------------------------------------------
372569865ddSSatish Balay  def configureDefaultArch(self):
373569865ddSSatish Balay    conffile = os.path.join('conf', 'petscvariables')
374569865ddSSatish Balay    if self.framework.argDB['with-default-arch']:
375569865ddSSatish Balay      fd = file(conffile, 'w')
376569865ddSSatish Balay      fd.write('PETSC_ARCH='+self.arch.arch+'\n')
377569865ddSSatish Balay      fd.write('include ${PETSC_DIR}/${PETSC_ARCH}/conf/petscvariables\n')
378569865ddSSatish Balay      fd.close()
379569865ddSSatish Balay      self.framework.actions.addArgument('PETSc', 'Build', 'Set default architecture to '+self.arch.arch+' in '+conffile)
380569865ddSSatish Balay    elif os.path.isfile(conffile):
381569865ddSSatish Balay      try:
382569865ddSSatish Balay        os.unlink(conffile)
383569865ddSSatish Balay      except:
384569865ddSSatish Balay        raise RuntimeError('Unable to remove file '+conffile+'. Did a different user create it?')
385569865ddSSatish Balay    return
386569865ddSSatish Balay
387569865ddSSatish Balay#-----------------------------------------------------------------------------------------------------
388f8833479SBarry Smith  def configureScript(self):
389f8833479SBarry Smith    '''Output a script in the conf directory which will reproduce the configuration'''
390f8833479SBarry Smith    import nargs
391495bf1a9SSatish Balay    import sys
392495bf1a9SSatish Balay    scriptName = os.path.join(self.arch.arch,'conf', 'reconfigure-'+self.arch.arch+'.py')
393f8833479SBarry Smith    args = dict([(nargs.Arg.parseArgument(arg)[0], arg) for arg in self.framework.clArgs])
394f8833479SBarry Smith    if 'configModules' in args:
395c1486898SMatthew Knepley      if nargs.Arg.parseArgument(args['configModules'])[1] == ['PETSc.Configure']:
396f8833479SBarry Smith        del args['configModules']
397f8833479SBarry Smith    if 'optionsModule' in args:
398c1486898SMatthew Knepley      if nargs.Arg.parseArgument(args['optionsModule'])[1] == 'PETSc.compilerOptions':
399f8833479SBarry Smith        del args['optionsModule']
400f8833479SBarry Smith    if not 'PETSC_ARCH' in args:
401f8833479SBarry Smith      args['PETSC_ARCH'] = '-PETSC_ARCH='+str(self.arch.arch)
402f8833479SBarry Smith    f = file(scriptName, 'w')
403495bf1a9SSatish Balay    f.write('#!'+sys.executable+'\n')
404f8833479SBarry Smith    f.write('if __name__ == \'__main__\':\n')
405f8833479SBarry Smith    f.write('  import sys\n')
406f8833479SBarry Smith    f.write('  sys.path.insert(0, '+repr(os.path.join(self.petscdir.dir, 'config'))+')\n')
407f8833479SBarry Smith    f.write('  import configure\n')
408f8833479SBarry Smith    f.write('  configure_options = '+repr(args.values())+'\n')
409f8833479SBarry Smith    f.write('  configure.petsc_configure(configure_options)\n')
410f8833479SBarry Smith    f.close()
411f8833479SBarry Smith    try:
412f8833479SBarry Smith      os.chmod(scriptName, 0775)
413f8833479SBarry Smith    except OSError, e:
414f8833479SBarry Smith      self.framework.logPrint('Unable to make reconfigure script executable:\n'+str(e))
415f8833479SBarry Smith    self.framework.actions.addArgument('PETSc', 'File creation', 'Created '+scriptName+' for automatic reconfiguration')
416f8833479SBarry Smith    return
417f8833479SBarry Smith
418f8833479SBarry Smith  def configureInstall(self):
419f8833479SBarry Smith    '''Setup the directories for installation'''
420f8833479SBarry Smith    if self.framework.argDB['prefix']:
421f8833479SBarry Smith      self.installdir = self.framework.argDB['prefix']
42210b521ebSBarry Smith      self.addMakeRule('shared_nomesg_noinstall','')
423315b77e6SSatish Balay      self.addMakeRule('shared_install','',['-@echo "Now to install the libraries do: make install"',\
424315b77e6SSatish Balay                                              '-@echo "========================================="'])
425f8833479SBarry Smith    else:
426b559b537SSatish Balay      self.installdir = os.path.join(self.petscdir.dir,self.arch.arch)
42710b521ebSBarry Smith      self.addMakeRule('shared_nomesg_noinstall','shared_nomesg')
428315b77e6SSatish Balay      self.addMakeRule('shared_install','',['-@echo "Now to check if the libraries are working do: make test"',\
429315b77e6SSatish Balay                                              '-@echo "========================================="'])
430f8833479SBarry Smith      return
431f8833479SBarry Smith
432f8833479SBarry Smith  def configureGCOV(self):
433f8833479SBarry Smith    if self.framework.argDB['with-gcov']:
434f8833479SBarry Smith      self.addDefine('USE_GCOV','1')
435f8833479SBarry Smith    return
436f8833479SBarry Smith
437f8833479SBarry Smith  def configureFortranFlush(self):
438f8833479SBarry Smith    if hasattr(self.compilers, 'FC'):
439f8833479SBarry Smith      for baseName in ['flush','flush_']:
440f8833479SBarry Smith        if self.libraries.check('', baseName, otherLibs = self.compilers.flibs, fortranMangle = 1):
441f8833479SBarry Smith          self.addDefine('HAVE_'+baseName.upper(), 1)
442f8833479SBarry Smith          return
443f8833479SBarry Smith
444f8833479SBarry Smith
445f8833479SBarry Smith  def configure(self):
446f8833479SBarry Smith    if not os.path.samefile(self.petscdir.dir, os.getcwd()):
447f8833479SBarry Smith      raise RuntimeError('Wrong PETSC_DIR option specified: '+str(self.petscdir.dir) + '\n  Configure invoked in: '+os.path.realpath(os.getcwd()))
448f8833479SBarry Smith    self.framework.header          = self.arch.arch+'/include/petscconf.h'
449f8833479SBarry Smith    self.framework.cHeader         = self.arch.arch+'/include/petscfix.h'
4509275508cSBarry Smith    self.framework.makeMacroHeader = self.arch.arch+'/conf/petscvariables'
451f8833479SBarry Smith    self.framework.makeRuleHeader  = self.arch.arch+'/conf/petscrules'
452f8833479SBarry Smith    if self.libraries.math is None:
453f8833479SBarry Smith      raise RuntimeError('PETSc requires a functional math library. Please send configure.log to petsc-maint@mcs.anl.gov.')
454f8833479SBarry Smith    if self.languages.clanguage == 'Cxx' and not hasattr(self.compilers, 'CXX'):
455f8833479SBarry Smith      raise RuntimeError('Cannot set C language to C++ without a functional C++ compiler.')
456f8833479SBarry Smith    self.executeTest(self.configureInline)
457b2843cf1SBarry Smith    self.executeTest(self.configurePrefetch)
458f8833479SBarry Smith    self.executeTest(self.configureSolaris)
459f8833479SBarry Smith    self.executeTest(self.configureLinux)
460f8833479SBarry Smith    self.executeTest(self.configureWin32)
461569865ddSSatish Balay    self.executeTest(self.configureDefaultArch)
462f8833479SBarry Smith    self.executeTest(self.configureScript)
463f8833479SBarry Smith    self.executeTest(self.configureInstall)
464f8833479SBarry Smith    self.executeTest(self.configureGCOV)
465f8833479SBarry Smith    self.executeTest(self.configureFortranFlush)
466f8833479SBarry Smith    # dummy rules, always needed except for remote builds
467f8833479SBarry Smith    self.addMakeRule('remote','')
468f8833479SBarry Smith    self.addMakeRule('remoteclean','')
469f8833479SBarry Smith
470f8833479SBarry Smith    self.Dump()
471f8833479SBarry Smith    self.dumpConfigInfo()
472f8833479SBarry Smith    self.framework.log.write('================================================================================\n')
473f8833479SBarry Smith    self.logClear()
474f8833479SBarry Smith    return
475