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