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