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