1#!/usr/bin/env python
2from __future__ import generators
3import config.base
4
5class Configure(config.base.Configure):
6  def __init__(self, framework):
7    config.base.Configure.__init__(self, framework)
8    self.headerPrefix = ''
9    self.substPrefix  = ''
10    self.useShared    = 0
11    return
12
13  def __str1__(self):
14    txt =  '  Single library: %s\n' % ('yes' if self.framework.argDB['with-single-library'] else 'no')
15    txt += '  Shared libraries: %s\n' % ('yes' if self.useShared else 'no')
16    return txt
17
18  def setupHelp(self, help):
19    import nargs
20    help.addArgument('PETSc', '-with-shared-libraries=<bool>', nargs.ArgBool(None, 1, 'Make PETSc libraries shared -- libpetsc.so (Unix/Linux) or libpetsc.dylib (Mac)'))
21    help.addArgument('PETSc', '-with-serialize-functions=<bool>', nargs.ArgBool(None, 0, 'Allows function pointers to be serialized to binary files with string representations'))
22    return
23
24  def setupDependencies(self, framework):
25    config.base.Configure.setupDependencies(self, framework)
26    self.arch         = framework.require('PETSc.options.arch', self)
27    self.debuggers    = framework.require('config.utilities.debuggers', self)
28    self.setCompilers = framework.require('config.setCompilers', self)
29    return
30
31  def checkSharedDynamicPicOptions(self):
32    # uf user specified 'with-shared' or 'with-dynamic' - flag an error
33    if 'with-shared' in self.framework.argDB:
34      raise RuntimeError('Option "--with-shared" no longer exists. Use "--with-shared-libraries".')
35    if 'with-dynamic' in self.framework.argDB or 'with-dynamic-loading' in self.framework.argDB:
36      raise RuntimeError('Option "--with-dynamic" and "--with-dynamic-loading" no longer exist.')
37    # if user specifies inconsistant 'with-dynamic-loading with-shared-libraries with-pic' options - flag error
38    if self.framework.argDB['with-shared-libraries'] and not self.framework.argDB['with-pic'] and 'with-pic' in self.framework.clArgDB:
39      raise RuntimeError('If you use --with-shared-libraries you cannot disable --with-pic')
40
41    # default with-shared-libraries=1 => --with-pic=1
42    # Note: there is code in setCompilers.py that uses this as default.
43    if self.framework.argDB['with-shared-libraries'] and not self.framework.argDB['with-pic']: self.framework.argDB['with-pic'] = 1
44    return
45
46
47  def configureSharedLibraries(self):
48    '''Checks whether shared libraries should be used, for which you must
49      - Specify --with-shared-libraries
50      - Have found a working shared linker
51    Defines PETSC_USE_SHARED_LIBRARIES if they are used'''
52    import sys
53
54    self.useShared = self.framework.argDB['with-shared-libraries'] and not self.setCompilers.staticLibraries
55
56    if self.useShared:
57      #if config.setCompilers.Configure.isSolaris(self.log) and config.setCompilers.Configure.isGNU(self.framework.getCompiler(),self.log):
58      #  self.addMakeRule('shared_arch','shared_'+self.arch.hostOsBase+'gnu')
59      #elif '-qmkshrobj' in self.setCompilers.sharedLibraryFlags:
60      #  self.addMakeRule('shared_arch','shared_linux_ibm')
61      #else:
62      #  self.addMakeRule('shared_arch','shared_'+self.arch.hostOsBase)
63
64      # Linux is the default
65      if self.setCompilers.isDarwin(self.log):
66        self.addMakeRule('shared_arch','shared_darwin')
67        self.addMakeMacro('SONAME_FUNCTION', '$(1).$(2).dylib')
68        self.addMakeMacro('SL_LINKER_FUNCTION', '-dynamiclib -install_name $(call SONAME_FUNCTION,$(1),$(2)) -compatibility_version $(2) -current_version $(3) -single_module -multiply_defined suppress -undefined dynamic_lookup')
69      elif self.setCompilers.CC.find('win32fe') >=0:
70        self.addMakeMacro('SONAME_FUNCTION', '$(1).dll')
71        self.addMakeMacro('SL_LINKER_FUNCTION', '-LD')
72        self.addMakeMacro('PETSC_DLL_EXPORTS', '1')
73      else:
74        # TODO: check that -Wl,-soname,${LIBNAME}.${SL_LINKER_SUFFIX} can be passed (might fail on Intel)
75        # TODO: check whether to use -qmkshrobj or -shared (maybe we can just use self.setCompilers.sharedLibraryFlags)
76        # TODO: check whether we need to specify dependent libraries on the link line (long test)
77        self.addMakeRule('shared_arch','shared_linux')
78        self.addMakeMacro('SONAME_FUNCTION', '$(1).so.$(2)')
79        self.addMakeMacro('SL_LINKER_FUNCTION', '-shared -Wl,-soname,$(call SONAME_FUNCTION,$(notdir $(1)),$(2))')
80        if config.setCompilers.Configure.isMINGW(self.framework.getCompiler(),self.log):
81          self.addMakeMacro('PETSC_DLL_EXPORTS', '1')
82      self.addMakeMacro('BUILDSHAREDLIB','yes')
83    else:
84      self.addMakeRule('shared_arch','')
85      self.addMakeMacro('BUILDSHAREDLIB','no')
86    if self.useShared:
87      self.addDefine('USE_SHARED_LIBRARIES', 1)
88    else:
89      self.logPrint('Shared libraries - disabled')
90    return
91
92  def configureDynamicLibraries(self):
93    '''Checks whether dynamic loading is available (with dlfcn.h and libdl)'''
94    if self.setCompilers.dynamicLibraries:
95      self.addDefine('HAVE_DYNAMIC_LIBRARIES', 1)
96    return
97
98  def configureSerializedFunctions(self):
99    '''
100    Defines PETSC_SERIALIZE_FUNCTIONS if they are used
101    Requires shared libraries'''
102    import sys
103
104    if self.framework.argDB['with-serialize-functions'] and self.setCompilers.dynamicLibraries:
105      self.addDefine('SERIALIZE_FUNCTIONS', 1)
106
107
108  def configure(self):
109    self.executeTest(self.checkSharedDynamicPicOptions)
110    self.executeTest(self.configureSharedLibraries)
111    self.executeTest(self.configureDynamicLibraries)
112    self.executeTest(self.configureSerializedFunctions)
113    return
114