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