2010-03-28 07:09:36 +04:00
# functions to support bundled libraries
from Configure import conf
2011-01-05 14:16:15 +03:00
import sys , Logs
2010-03-28 07:09:36 +04:00
from samba_utils import *
2010-11-05 02:33:51 +03:00
def PRIVATE_NAME ( bld , name , private_extension , private_library ) :
2010-03-28 07:09:36 +04:00
''' possibly rename a library to include a bundled extension '''
2011-01-19 03:04:05 +03:00
# we now use the same private name for libraries as the public name.
# see http://git.samba.org/?p=tridge/junkcode.git;a=tree;f=shlib for a
# demonstration that this is the right thing to do
# also see http://lists.samba.org/archive/samba-technical/2011-January/075816.html
2010-03-28 07:09:36 +04:00
return name
2010-04-06 13:31:39 +04:00
def target_in_list ( target , lst , default ) :
for l in lst :
if target == l :
return True
if ' ! ' + target == l :
return False
if l == ' ALL ' :
return True
if l == ' NONE ' :
return False
return default
2010-03-28 07:09:36 +04:00
def BUILTIN_LIBRARY ( bld , name ) :
''' return True if a library should be builtin
instead of being built as a shared lib '''
2010-04-06 13:31:39 +04:00
return target_in_list ( name , bld . env . BUILTIN_LIBRARIES , False )
2010-04-18 06:43:15 +04:00
Build . BuildContext . BUILTIN_LIBRARY = BUILTIN_LIBRARY
2010-03-28 08:41:49 +04:00
def BUILTIN_DEFAULT ( opt , builtins ) :
''' set a comma separated default list of builtin libraries for this package '''
if ' BUILTIN_LIBRARIES_DEFAULT ' in Options . options :
return
Options . options [ ' BUILTIN_LIBRARIES_DEFAULT ' ] = builtins
Options . Handler . BUILTIN_DEFAULT = BUILTIN_DEFAULT
2010-10-24 01:26:43 +04:00
def PRIVATE_EXTENSION_DEFAULT ( opt , extension , noextension = ' ' ) :
''' set a default private library extension '''
if ' PRIVATE_EXTENSION_DEFAULT ' in Options . options :
2010-03-28 08:41:49 +04:00
return
2010-10-24 01:26:43 +04:00
Options . options [ ' PRIVATE_EXTENSION_DEFAULT ' ] = extension
Options . options [ ' PRIVATE_EXTENSION_EXCEPTION ' ] = noextension
Options . Handler . PRIVATE_EXTENSION_DEFAULT = PRIVATE_EXTENSION_DEFAULT
2010-03-28 09:38:27 +04:00
2010-04-12 03:49:56 +04:00
def minimum_library_version ( conf , libname , default ) :
''' allow override of mininum system library version '''
minlist = Options . options . MINIMUM_LIBRARY_VERSION
if not minlist :
return default
for m in minlist . split ( ' , ' ) :
a = m . split ( ' : ' )
if len ( a ) != 2 :
Logs . error ( " Bad syntax for --minimum-library-version of %s " % m )
sys . exit ( 1 )
if a [ 0 ] == libname :
return a [ 1 ]
return default
2010-03-28 15:01:04 +04:00
2010-06-19 15:47:11 +04:00
@conf
def LIB_MAY_BE_BUNDLED ( conf , libname ) :
return ( ' NONE ' not in conf . env . BUNDLED_LIBS and
' ! %s ' % libname not in conf . env . BUNDLED_LIBS )
@conf
def LIB_MUST_BE_BUNDLED ( conf , libname ) :
2012-09-27 20:30:47 +04:00
return ( ' ALL ' in conf . env . BUNDLED_LIBS or
2010-06-19 15:47:11 +04:00
libname in conf . env . BUNDLED_LIBS )
2012-04-19 09:34:48 +04:00
@conf
def LIB_MUST_BE_PRIVATE ( conf , libname ) :
return ( ' ALL ' in conf . env . PRIVATE_LIBS or
libname in conf . env . PRIVATE_LIBS )
2010-06-19 15:47:11 +04:00
2011-11-12 19:35:11 +04:00
@conf
def CHECK_PREREQUISITES ( conf , prereqs ) :
2012-04-03 18:12:54 +04:00
missing = [ ]
2011-11-12 19:35:11 +04:00
for syslib in TO_LIST ( prereqs ) :
f = ' FOUND_SYSTEMLIB_ %s ' % syslib
if not f in conf . env :
2012-04-03 18:12:54 +04:00
missing . append ( syslib )
2012-04-08 05:56:24 +04:00
return missing
2011-11-12 19:35:11 +04:00
@runonce
@conf
def CHECK_BUNDLED_SYSTEM_PKG ( conf , libname , minversion = ' 0.0.0 ' ,
onlyif = None , implied_deps = None , pkg = None ) :
''' check if a library is available as a system library.
This only tries using pkg - config
'''
if conf . LIB_MUST_BE_BUNDLED ( libname ) :
return False
found = ' FOUND_SYSTEMLIB_ %s ' % libname
if found in conf . env :
return conf . env [ found ]
# see if the library should only use a system version if another dependent
# system version is found. That prevents possible use of mixed library
# versions
if onlyif :
2012-04-03 18:12:54 +04:00
missing = conf . CHECK_PREREQUISITES ( onlyif )
if missing :
2011-11-12 19:35:11 +04:00
if not conf . LIB_MAY_BE_BUNDLED ( libname ) :
2012-04-03 18:12:54 +04:00
Logs . error ( ' ERROR: Use of system library %s depends on missing system library/libraries %r ' % ( libname , missing ) )
2011-11-12 19:35:11 +04:00
sys . exit ( 1 )
conf . env [ found ] = False
return False
minversion = minimum_library_version ( conf , libname , minversion )
msg = ' Checking for system %s ' % libname
if minversion != ' 0.0.0 ' :
msg + = ' >= %s ' % minversion
if pkg is None :
pkg = libname
if conf . check_cfg ( package = pkg ,
2011-11-12 19:56:01 +04:00
args = ' " %s >= %s " --cflags --libs ' % ( pkg , minversion ) ,
2011-11-14 01:15:49 +04:00
msg = msg , uselib_store = libname . upper ( ) ) :
2011-11-12 19:35:11 +04:00
conf . SET_TARGET_TYPE ( libname , ' SYSLIB ' )
conf . env [ found ] = True
if implied_deps :
conf . SET_SYSLIB_DEPS ( libname , implied_deps )
return True
conf . env [ found ] = False
if not conf . LIB_MAY_BE_BUNDLED ( libname ) :
Logs . error ( ' ERROR: System library %s of version %s not found, and bundling disabled ' % ( libname , minversion ) )
sys . exit ( 1 )
return False
2010-03-28 10:05:30 +04:00
@runonce
2010-03-28 09:38:27 +04:00
@conf
2010-03-28 10:05:30 +04:00
def CHECK_BUNDLED_SYSTEM ( conf , libname , minversion = ' 0.0.0 ' ,
2010-03-29 15:27:17 +04:00
checkfunctions = None , headers = None ,
2010-03-30 15:06:32 +04:00
onlyif = None , implied_deps = None ,
2014-03-14 12:52:51 +04:00
require_headers = True , pkg = None ) :
2010-03-28 15:01:04 +04:00
''' check if a library is available as a system library.
this first tries via pkg - config , then if that fails
tries by testing for a specified function in the specified lib
'''
2010-06-19 15:47:11 +04:00
if conf . LIB_MUST_BE_BUNDLED ( libname ) :
2010-03-28 09:38:27 +04:00
return False
2010-03-28 10:05:30 +04:00
found = ' FOUND_SYSTEMLIB_ %s ' % libname
if found in conf . env :
return conf . env [ found ]
2010-03-28 17:08:38 +04:00
2010-10-06 08:23:58 +04:00
def check_functions_headers ( ) :
''' helper function for CHECK_BUNDLED_SYSTEM '''
if checkfunctions is None :
return True
2010-10-16 02:41:34 +04:00
if require_headers and headers and not conf . CHECK_HEADERS ( headers , lib = libname ) :
2010-10-06 08:23:58 +04:00
return False
return conf . CHECK_FUNCS_IN ( checkfunctions , libname , headers = headers ,
empty_decl = False , set_target = False )
2010-03-28 17:08:38 +04:00
# see if the library should only use a system version if another dependent
# system version is found. That prevents possible use of mixed library
# versions
if onlyif :
2012-04-03 18:12:54 +04:00
missing = conf . CHECK_PREREQUISITES ( onlyif )
if missing :
2011-11-12 19:35:11 +04:00
if not conf . LIB_MAY_BE_BUNDLED ( libname ) :
2012-04-03 18:12:54 +04:00
Logs . error ( ' ERROR: Use of system library %s depends on missing system library/libraries %r ' % ( libname , missing ) )
2011-11-12 19:35:11 +04:00
sys . exit ( 1 )
conf . env [ found ] = False
return False
2010-03-28 17:08:38 +04:00
2010-04-12 03:49:56 +04:00
minversion = minimum_library_version ( conf , libname , minversion )
2011-01-25 04:15:49 +03:00
msg = ' Checking for system %s ' % libname
if minversion != ' 0.0.0 ' :
msg + = ' >= %s ' % minversion
2014-03-14 12:52:51 +04:00
uselib_store = libname . upper ( )
if pkg is None :
pkg = libname
2010-03-28 10:05:30 +04:00
# try pkgconfig first
2014-03-14 12:52:51 +04:00
if ( conf . check_cfg ( package = pkg ,
args = ' " %s >= %s " --cflags --libs ' % ( pkg , minversion ) ,
msg = msg , uselib_store = uselib_store ) and
2010-10-06 08:23:58 +04:00
check_functions_headers ( ) ) :
2010-03-28 09:38:27 +04:00
conf . SET_TARGET_TYPE ( libname , ' SYSLIB ' )
2010-03-28 10:05:30 +04:00
conf . env [ found ] = True
2010-03-29 15:27:17 +04:00
if implied_deps :
conf . SET_SYSLIB_DEPS ( libname , implied_deps )
2010-03-28 09:38:27 +04:00
return True
2010-03-28 10:05:30 +04:00
if checkfunctions is not None :
2010-10-06 08:23:58 +04:00
if check_functions_headers ( ) :
2010-03-28 10:05:30 +04:00
conf . env [ found ] = True
2010-03-29 15:27:17 +04:00
if implied_deps :
conf . SET_SYSLIB_DEPS ( libname , implied_deps )
2010-10-06 08:23:58 +04:00
conf . SET_TARGET_TYPE ( libname , ' SYSLIB ' )
2010-03-28 10:05:30 +04:00
return True
conf . env [ found ] = False
2010-06-19 16:02:18 +04:00
if not conf . LIB_MAY_BE_BUNDLED ( libname ) :
2010-04-09 15:12:02 +04:00
Logs . error ( ' ERROR: System library %s of version %s not found, and bundling disabled ' % ( libname , minversion ) )
2010-03-28 09:38:27 +04:00
sys . exit ( 1 )
return False
2010-04-12 03:49:56 +04:00
2010-10-04 15:38:25 +04:00
2012-04-10 02:45:20 +04:00
def tuplize_version ( version ) :
2012-04-09 22:05:06 +04:00
return tuple ( [ int ( x ) for x in version . split ( " . " ) ] )
2010-10-04 15:38:25 +04:00
@runonce
@conf
def CHECK_BUNDLED_SYSTEM_PYTHON ( conf , libname , modulename , minversion = ' 0.0.0 ' ) :
''' check if a python module is available on the system and
has the specified minimum version .
'''
if conf . LIB_MUST_BE_BUNDLED ( libname ) :
return False
# see if the library should only use a system version if another dependent
# system version is found. That prevents possible use of mixed library
# versions
minversion = minimum_library_version ( conf , libname , minversion )
try :
m = __import__ ( modulename )
except ImportError :
found = False
else :
try :
version = m . __version__
except AttributeError :
found = False
else :
2012-04-09 22:05:06 +04:00
found = tuplize_version ( version ) > = tuplize_version ( minversion )
2010-10-04 15:38:25 +04:00
if not found and not conf . LIB_MAY_BE_BUNDLED ( libname ) :
Logs . error ( ' ERROR: Python module %s of version %s not found, and bundling disabled ' % ( libname , minversion ) )
sys . exit ( 1 )
return found
2010-04-21 11:13:16 +04:00
def NONSHARED_BINARY ( bld , name ) :
''' return True if a binary should be built without non-system shared libs '''
return target_in_list ( name , bld . env . NONSHARED_BINARIES , False )
Build . BuildContext . NONSHARED_BINARY = NONSHARED_BINARY