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 self.framework.argDB['with-shared-libraries'] and not self.framework.argDB['with-pic'] and 'with-pic' in self.framework.clArgDB: 38 raise RuntimeError('If you use --with-shared-libraries you cannot disable --with-pic') 39 40 # default with-shared-libraries=1 => --with-pic=1 41 # Note: there is code in setCompilers.py that uses this as default. 42 if self.framework.argDB['with-shared-libraries'] and not self.framework.argDB['with-pic']: self.framework.argDB['with-pic'] = 1 43 return 44 45 46 def configureSharedLibraries(self): 47 '''Checks whether shared libraries should be used, for which you must 48 - Specify --with-shared-libraries 49 - Have found a working shared linker 50 Defines PETSC_USE_SHARED_LIBRARIES if they are used''' 51 import sys 52 53 self.useShared = self.framework.argDB['with-shared-libraries'] and not self.setCompilers.staticLibraries 54 55 if self.useShared: 56 #if config.setCompilers.Configure.isSolaris(self.log) and config.setCompilers.Configure.isGNU(self.framework.getCompiler(),self.log): 57 # self.addMakeRule('shared_arch','shared_'+self.arch.hostOsBase+'gnu') 58 #elif '-qmkshrobj' in self.setCompilers.sharedLibraryFlags: 59 # self.addMakeRule('shared_arch','shared_linux_ibm') 60 #else: 61 # self.addMakeRule('shared_arch','shared_'+self.arch.hostOsBase) 62 63 # Linux is the default 64 if self.setCompilers.isDarwin(self.log): 65 self.addMakeRule('shared_arch','shared_darwin') 66 self.addMakeMacro('SONAME_FUNCTION', '$(1).$(2).dylib') 67 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') 68 elif self.setCompilers.CC.find('win32fe') >=0: 69 self.addMakeMacro('SONAME_FUNCTION', '$(1).dll') 70 self.addMakeMacro('SL_LINKER_FUNCTION', '-LD') 71 self.addMakeMacro('PETSC_DLL_EXPORTS', '1') 72 else: 73 # TODO: check that -Wl,-soname,${LIBNAME}.${SL_LINKER_SUFFIX} can be passed (might fail on Intel) 74 # TODO: check whether to use -qmkshrobj or -shared (maybe we can just use self.setCompilers.sharedLibraryFlags) 75 # TODO: check whether we need to specify dependent libraries on the link line (long test) 76 self.addMakeRule('shared_arch','shared_linux') 77 self.addMakeMacro('SONAME_FUNCTION', '$(1).so.$(2)') 78 self.addMakeMacro('SL_LINKER_FUNCTION', '-shared -Wl,-soname,$(call SONAME_FUNCTION,$(notdir $(1)),$(2))') 79 if config.setCompilers.Configure.isMINGW(self.framework.getCompiler(),self.log): 80 self.addMakeMacro('PETSC_DLL_EXPORTS', '1') 81 self.addMakeMacro('BUILDSHAREDLIB','yes') 82 else: 83 self.addMakeRule('shared_arch','') 84 self.addMakeMacro('BUILDSHAREDLIB','no') 85 if self.useShared: 86 self.addDefine('USE_SHARED_LIBRARIES', 1) 87 else: 88 self.logPrint('Shared libraries - disabled') 89 return 90 91 def configureDynamicLibraries(self): 92 '''Checks whether dynamic loading is available (with dlfcn.h and libdl)''' 93 if self.setCompilers.dynamicLibraries: 94 self.addDefine('HAVE_DYNAMIC_LIBRARIES', 1) 95 return 96 97 def configureSerializedFunctions(self): 98 ''' 99 Defines PETSC_SERIALIZE_FUNCTIONS if they are used 100 Requires shared libraries''' 101 import sys 102 103 if self.framework.argDB['with-serialize-functions'] and self.setCompilers.dynamicLibraries: 104 self.addDefine('SERIALIZE_FUNCTIONS', 1) 105 106 107 def configure(self): 108 self.executeTest(self.checkSharedDynamicPicOptions) 109 self.executeTest(self.configureSharedLibraries) 110 self.executeTest(self.configureDynamicLibraries) 111 self.executeTest(self.configureSerializedFunctions) 112 return 113