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