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